// 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"
// =============================================================================
// Misc stuff
-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_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, 2 );
- 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);
}
-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 );
+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);
}
-GtkCheckMenuItem* create_check_menu_item_with_mnemonic( GtkMenu* 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 );
+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);
}
-GtkMenuItem* create_menu_item_with_mnemonic( GtkMenu* 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 );
+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);
}
-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::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));
}
-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::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::Window 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::Window::from(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(G_OBJECT(dlg), "ok-button", &ok_button, "cancel-button", &cancel_button, nullptr);
+ ui::Widget::from(ok_button).connect("clicked", G_CALLBACK(dialog_button_ok), &dialog);
+ ui::Widget::from(cancel_button).connect("clicked", G_CALLBACK(dialog_button_cancel), &dialog);
+
+ if (parent) {
+ gtk_window_set_transient_for(dlg, parent);
+ }
+
+ bool ok = modal_dialog_show(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 ) );
+void button_clicked_entry_browse_file(ui::Widget widget, ui::Entry entry)
+{
+ const char *filename = widget.file_dialog(TRUE, "Choose File", gtk_entry_get_text(entry));
- if ( filename != 0 ) {
- gtk_entry_set_text( entry, filename );
- }
+ if (filename != 0) {
+ entry.text(filename);
+ }
}
-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 );
- }
+void button_clicked_entry_browse_directory(ui::Widget widget, ui::Entry entry)
+{
+ const char *text = gtk_entry_get_text(entry);
+ char *dir = dir_dialog(widget.window(), "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);
+ }
}