]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/gtkmisc.cpp
Wrap more GTK
[xonotic/netradiant.git] / radiant / gtkmisc.cpp
index f317525965dab6949423bd9ddbe5e83087dde825..0f210221993c8277a9489872749bae7bf0a5fc59 100644 (file)
@@ -1,41 +1,41 @@
 /*
-Copyright (c) 2001, Loki software, inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, 
-are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list 
-of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this
-list of conditions and the following disclaimer in the documentation and/or
-other materials provided with the distribution.
-
-Neither the name of Loki software nor the names of its contributors may be used 
-to endorse or promote products derived from this software without specific prior 
-written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY 
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
-*/
+   Copyright (c) 2001, Loki software, inc.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without modification,
+   are permitted provided that the following conditions are met:
+
+   Redistributions of source code must retain the above copyright notice, this list
+   of conditions and the following disclaimer.
+
+   Redistributions in binary form must reproduce the above copyright notice, this
+   list of conditions and the following disclaimer in the documentation and/or
+   other materials provided with the distribution.
+
+   Neither the name of Loki software nor the names of its contributors may be used
+   to endorse or promote products derived from this software without specific prior
+   written permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+   DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+   DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
 //
 // Small functions to help with GTK
 //
 
+#include <gtk/gtk.h>
 #include "gtkmisc.h"
 
-#include <gtk/gtkcolorseldialog.h>
-#include <gtk/gtkentry.h>
+#include "uilib/uilib.h"
 
 #include "math/vector.h"
 #include "os/path.h"
@@ -50,115 +50,98 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // =============================================================================
 // Misc stuff
 
-void command_connect_accelerator(const char* name)
-{
-  const Command& command = GlobalCommands_find(name);
-  GlobalShortcuts_register(name);
-  global_accel_group_connect(command.m_accelerator, command.m_callback);
+void command_connect_accelerator( const char* name ){
+       const Command& command = GlobalCommands_find( name );
+       GlobalShortcuts_register( name, 1 );
+       global_accel_group_connect( command.m_accelerator, command.m_callback );
 }
 
-void command_disconnect_accelerator(const char* name)
-{
-  const Command& command = GlobalCommands_find(name);
-  global_accel_group_disconnect(command.m_accelerator, command.m_callback);
+void command_disconnect_accelerator( const char* name ){
+       const Command& command = GlobalCommands_find( name );
+       global_accel_group_disconnect( command.m_accelerator, command.m_callback );
 }
 
-void toggle_add_accelerator(const char* name)
-{
-  const Toggle& toggle = GlobalToggles_find(name);
-  GlobalShortcuts_register(name);
-  global_accel_group_connect(toggle.m_command.m_accelerator, toggle.m_command.m_callback);
+void toggle_add_accelerator( const char* name ){
+       const Toggle& toggle = GlobalToggles_find( name );
+       GlobalShortcuts_register( name, 2 );
+       global_accel_group_connect( toggle.m_command.m_accelerator, toggle.m_command.m_callback );
 }
 
-GtkCheckMenuItem* create_check_menu_item_with_mnemonic(GtkMenu* menu, const char* mnemonic, const char* commandName)
-{
-  GlobalShortcuts_register(commandName);
-  const Toggle& toggle = GlobalToggles_find(commandName);
-  global_accel_group_connect(toggle.m_command.m_accelerator, toggle.m_command.m_callback);
-  return create_check_menu_item_with_mnemonic(menu, mnemonic, toggle);
+void toggle_remove_accelerator( const char* name ){
+       const Toggle& toggle = GlobalToggles_find( name );
+       global_accel_group_disconnect( toggle.m_command.m_accelerator, toggle.m_command.m_callback );
 }
 
-GtkMenuItem* create_menu_item_with_mnemonic(GtkMenu* menu, const char *mnemonic, const char* commandName)
-{
-  GlobalShortcuts_register(commandName);
-  const Command& command = GlobalCommands_find(commandName);
-  global_accel_group_connect(command.m_accelerator, command.m_callback);
-  return create_menu_item_with_mnemonic(menu, mnemonic, command);
+ui::CheckMenuItem create_check_menu_item_with_mnemonic( ui::Menu menu, const char* mnemonic, const char* commandName ){
+       GlobalShortcuts_register( commandName, 2 );
+       const Toggle& toggle = GlobalToggles_find( commandName );
+       global_accel_group_connect( toggle.m_command.m_accelerator, toggle.m_command.m_callback );
+       return create_check_menu_item_with_mnemonic( menu, mnemonic, toggle );
 }
 
-GtkButton* toolbar_append_button(GtkToolbar* toolbar, const char* description, const char* icon, const char* commandName)
-{
-  return toolbar_append_button(toolbar, description, icon, GlobalCommands_find(commandName));
+ui::MenuItem create_menu_item_with_mnemonic( ui::Menu menu, const char *mnemonic, const char* commandName ){
+       GlobalShortcuts_register( commandName, 1 );
+       const Command& command = GlobalCommands_find( commandName );
+       global_accel_group_connect( command.m_accelerator, command.m_callback );
+       return create_menu_item_with_mnemonic( menu, mnemonic, command );
 }
 
-GtkToggleButton* toolbar_append_toggle_button(GtkToolbar* toolbar, const char* description, const char* icon, const char* commandName)
-{
-  return toolbar_append_toggle_button(toolbar, description, icon, GlobalToggles_find(commandName));
+ui::ToolButton toolbar_append_button( ui::Toolbar toolbar, const char* description, const char* icon, const char* commandName ){
+       return toolbar_append_button( toolbar, description, icon, GlobalCommands_find( commandName ) );
+}
+
+ui::ToggleToolButton toolbar_append_toggle_button( ui::Toolbar toolbar, const char* description, const char* icon, const char* commandName ){
+       return toolbar_append_toggle_button( toolbar, description, icon, GlobalToggles_find( commandName ) );
 }
 
 // =============================================================================
 // File dialog
 
-bool color_dialog (GtkWidget *parent, Vector3& color, const char* title)
-{
-  GtkWidget* dlg;
-  double clr[3];
-  ModalDialog dialog;
-
-  clr[0] = color[0];
-  clr[1] = color[1];
-  clr[2] = color[2];
-
-  dlg = gtk_color_selection_dialog_new (title);
-  gtk_color_selection_set_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), clr);
-  g_signal_connect(G_OBJECT(dlg), "delete_event", G_CALLBACK(dialog_delete_callback), &dialog);
-  g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(dlg)->ok_button), "clicked", G_CALLBACK(dialog_button_ok), &dialog);
-  g_signal_connect(G_OBJECT(GTK_COLOR_SELECTION_DIALOG(dlg)->cancel_button), "clicked", G_CALLBACK(dialog_button_cancel), &dialog);
-
-  if (parent != 0)
-    gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (parent));
-
-  bool ok = modal_dialog_show(GTK_WINDOW(dlg), dialog) == eIDOK;
-  if(ok)
-  {
-    GdkColor gdkcolor;
-    gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), &gdkcolor);
-    clr[0] = gdkcolor.red / 65535.0;
-    clr[1] = gdkcolor.green / 65535.0;
-    clr[2] = gdkcolor.blue / 65535.0;
-
-    color[0] = (float)clr[0];
-    color[1] = (float)clr[1];
-    color[2] = (float)clr[2];
-  }
-
-  gtk_widget_destroy(dlg);
-
-  return ok;
+bool color_dialog( ui::Widget parent, Vector3& color, const char* title ){
+       GdkColor clr = { 0, guint16(color[0] * 65535), guint16(color[1] * 65535), guint16(color[2] * 65535) };
+       ModalDialog dialog;
+
+       auto dlg = ui::Widget(gtk_color_selection_dialog_new( title ));
+       gtk_color_selection_set_current_color( GTK_COLOR_SELECTION( gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG( dlg )) ), &clr );
+       dlg.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), &dialog );
+       GtkWidget *ok_button, *cancel_button;
+       g_object_get(dlg, "ok-button", &ok_button, "cancel-button", &cancel_button, nullptr);
+       ui::Widget(ok_button).connect( "clicked", G_CALLBACK( dialog_button_ok ), &dialog );
+       ui::Widget(cancel_button).connect( "clicked", G_CALLBACK( dialog_button_cancel ), &dialog );
+
+       if ( parent ) {
+               gtk_window_set_transient_for( GTK_WINDOW( dlg ), GTK_WINDOW( parent ) );
+       }
+
+       bool ok = modal_dialog_show( ui::Window(GTK_WINDOW( dlg )), dialog ) == eIDOK;
+       if ( ok ) {
+               gtk_color_selection_get_current_color( GTK_COLOR_SELECTION( gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG( dlg )) ), &clr );
+               color[0] = clr.red / 65535.0f;
+               color[1] = clr.green / 65535.0f;
+               color[2] = clr.blue / 65535.0f;
+       }
+
+       dlg.destroy();
+
+       return ok;
 }
 
-void button_clicked_entry_browse_file(GtkWidget* widget, GtkEntry* entry)
-{
-  const char *filename = file_dialog(gtk_widget_get_toplevel(widget), TRUE, "Choose File", gtk_entry_get_text(entry));
-  
-  if(filename != 0)
-  {
-    gtk_entry_set_text(entry, filename);
-  }
-}
+void button_clicked_entry_browse_file( ui::Widget widget, ui::Entry entry ){
+       const char *filename = ui::Widget(gtk_widget_get_toplevel( widget )).file_dialog( TRUE, "Choose File", gtk_entry_get_text( entry ) );
 
-void button_clicked_entry_browse_directory(GtkWidget* widget, GtkEntry* entry)
-{
-  const char* text = gtk_entry_get_text(entry);
-  char *dir = dir_dialog(gtk_widget_get_toplevel(widget), "Choose Directory", path_is_absolute(text) ? text : "" );
-  
-  if(dir != 0)
-  {
-    gchar* converted = g_filename_to_utf8(dir, -1, 0, 0, 0);
-    gtk_entry_set_text(entry, converted);
-    g_free(dir);
-    g_free(converted);
-  }
+       if ( filename != 0 ) {
+               entry.text(filename);
+       }
 }
 
+void button_clicked_entry_browse_directory( ui::Widget widget, ui::Entry entry ){
+       const char* text = gtk_entry_get_text( entry );
+       char *dir = dir_dialog( ui::Widget(gtk_widget_get_toplevel( widget )), "Choose Directory", path_is_absolute( text ) ? text : "" );
 
+       if ( dir != 0 ) {
+               gchar* converted = g_filename_to_utf8( dir, -1, 0, 0, 0 );
+               entry.text(converted);
+               g_free( dir );
+               g_free( converted );
+       }
+}