X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fcommands.cpp;h=9c1b7682246febb16f70c082faba1da1b418dbd2;hb=852882b1cfbbcf418e7b4753ed90c0e911d3f4e1;hp=f608ea49709348fbc4574bdb7d062ccd7312b18f;hpb=dac8329952745dbb494bad1c301e44bab05ec0db;p=xonotic%2Fnetradiant.git diff --git a/radiant/commands.cpp b/radiant/commands.cpp index f608ea49..9c1b7682 100644 --- a/radiant/commands.cpp +++ b/radiant/commands.cpp @@ -21,16 +21,14 @@ #include "commands.h" +#include "gtk/gtk.h" #include "debugging/debugging.h" #include "warnings.h" #include #include "string/string.h" #include "versionlib.h" -#include "gtkutil/accelerator.h" #include "gtkutil/messagebox.h" -#include -#include #include "gtkmisc.h" typedef std::pair ShortcutValue; // accelerator, isRegistered @@ -73,7 +71,7 @@ typedef std::map Commands; Commands g_commands; -void GlobalCommands_insert( const char* name, const Callback& callback, const Accelerator& accelerator ){ +void GlobalCommands_insert( const char* name, const Callback& callback, const Accelerator& accelerator ){ bool added = g_commands.insert( Commands::value_type( name, Command( callback, GlobalShortcuts_insert( name, accelerator ) ) ) ).second; ASSERT_MESSAGE( added, "command already registered: " << makeQuoted( name ) ); } @@ -89,7 +87,7 @@ typedef std::map Toggles; Toggles g_toggles; -void GlobalToggles_insert( const char* name, const Callback& callback, const BoolExportCallback& exportCallback, const Accelerator& accelerator ){ +void GlobalToggles_insert( const char* name, const Callback& callback, const Callback &)>& exportCallback, const Accelerator& accelerator ){ bool added = g_toggles.insert( Toggles::value_type( name, Toggle( callback, GlobalShortcuts_insert( name, accelerator ), exportCallback ) ) ).second; ASSERT_MESSAGE( added, "toggle already registered: " << makeQuoted( name ) ); } @@ -104,7 +102,7 @@ typedef std::map KeyEvents; KeyEvents g_keyEvents; -void GlobalKeyEvents_insert( const char* name, const Accelerator& accelerator, const Callback& keyDown, const Callback& keyUp ){ +void GlobalKeyEvents_insert( const char* name, const Accelerator& accelerator, const Callback& keyDown, const Callback& keyUp ){ bool added = g_keyEvents.insert( KeyEvents::value_type( name, KeyEvent( GlobalShortcuts_insert( name, accelerator ), keyDown, keyUp ) ) ).second; ASSERT_MESSAGE( added, "command already registered: " << makeQuoted( name ) ); } @@ -150,13 +148,8 @@ void connect_accelerator( const char *name ){ } -#include - -#include -#include -#include -#include -#include +#include +#include #include "gtkutil/dialog.h" #include "mainframe.h" @@ -168,29 +161,29 @@ void connect_accelerator( const char *name ){ struct command_list_dialog_t : public ModalDialog { command_list_dialog_t() - : m_close_button( *this, eIDCANCEL ), m_list( NULL ), m_command_iter(), m_model( NULL ), m_waiting_for_key( false ){ + : m_close_button( *this, eIDCANCEL ), m_list( ui::null ), m_command_iter(), m_model( ui::null ), m_waiting_for_key( false ){ } ModalDialogButton m_close_button; - GtkTreeView *m_list; + ui::TreeView m_list; GtkTreeIter m_command_iter; - GtkTreeModel *m_model; + ui::TreeModel m_model; bool m_waiting_for_key; }; -void accelerator_clear_button_clicked( GtkButton *btn, gpointer dialogptr ){ +void accelerator_clear_button_clicked( ui::Button btn, gpointer dialogptr ){ command_list_dialog_t &dialog = *(command_list_dialog_t *) dialogptr; if ( dialog.m_waiting_for_key ) { // just unhighlight, user wanted to cancel dialog.m_waiting_for_key = false; - gtk_list_store_set( GTK_LIST_STORE( dialog.m_model ), &dialog.m_command_iter, 2, false, -1 ); - gtk_widget_set_sensitive( GTK_WIDGET( dialog.m_list ), true ); - dialog.m_model = NULL; + gtk_list_store_set( ui::ListStore::from( dialog.m_model ), &dialog.m_command_iter, 2, false, -1 ); + gtk_widget_set_sensitive( dialog.m_list , true ); + dialog.m_model = ui::TreeModel(ui::null); return; } - GtkTreeSelection *sel = gtk_tree_view_get_selection( dialog.m_list ); + auto sel = gtk_tree_view_get_selection( dialog.m_list ); GtkTreeModel *model; GtkTreeIter iter; if ( !gtk_tree_selection_get_selected( sel, &model, &iter ) ) { @@ -199,7 +192,7 @@ void accelerator_clear_button_clicked( GtkButton *btn, gpointer dialogptr ){ GValue val; memset( &val, 0, sizeof( val ) ); - gtk_tree_model_get_value( GTK_TREE_MODEL( model ), &iter, 0, &val ); + gtk_tree_model_get_value(model, &iter, 0, &val ); const char *commandName = g_value_get_string( &val );; // clear the ACTUAL accelerator too! @@ -211,35 +204,35 @@ void accelerator_clear_button_clicked( GtkButton *btn, gpointer dialogptr ){ } thisShortcutIterator->second.first = accelerator_null(); - gtk_list_store_set( GTK_LIST_STORE( model ), &iter, 1, "", -1 ); + gtk_list_store_set( ui::ListStore::from( model ), &iter, 1, "", -1 ); g_value_unset( &val ); } -void accelerator_edit_button_clicked( GtkButton *btn, gpointer dialogptr ){ +void accelerator_edit_button_clicked( ui::Button btn, gpointer dialogptr ){ command_list_dialog_t &dialog = *(command_list_dialog_t *) dialogptr; // 1. find selected row - GtkTreeSelection *sel = gtk_tree_view_get_selection( dialog.m_list ); + auto sel = gtk_tree_view_get_selection( dialog.m_list ); GtkTreeModel *model; GtkTreeIter iter; if ( !gtk_tree_selection_get_selected( sel, &model, &iter ) ) { return; } dialog.m_command_iter = iter; - dialog.m_model = model; + dialog.m_model = ui::TreeModel::from(model); // 2. disallow changing the row - //gtk_widget_set_sensitive(GTK_WIDGET(dialog.m_list), false); + //gtk_widget_set_sensitive(dialog.m_list, false); // 3. highlight the row - gtk_list_store_set( GTK_LIST_STORE( model ), &iter, 2, true, -1 ); + gtk_list_store_set( ui::ListStore::from( model ), &iter, 2, true, -1 ); // 4. grab keyboard focus dialog.m_waiting_for_key = true; } -gboolean accelerator_window_key_press( GtkWidget *widget, GdkEventKey *event, gpointer dialogptr ){ +bool accelerator_window_key_press( ui::Window widget, GdkEventKey *event, gpointer dialogptr ){ command_list_dialog_t &dialog = *(command_list_dialog_t *) dialogptr; if ( !dialog.m_waiting_for_key ) { @@ -253,20 +246,20 @@ gboolean accelerator_window_key_press( GtkWidget *widget, GdkEventKey *event, gp #else switch ( event->keyval ) { - case GDK_Shift_L: - case GDK_Shift_R: - case GDK_Control_L: - case GDK_Control_R: - case GDK_Caps_Lock: - case GDK_Shift_Lock: - case GDK_Meta_L: - case GDK_Meta_R: - case GDK_Alt_L: - case GDK_Alt_R: - case GDK_Super_L: - case GDK_Super_R: - case GDK_Hyper_L: - case GDK_Hyper_R: + case GDK_KEY_Shift_L: + case GDK_KEY_Shift_R: + case GDK_KEY_Control_L: + case GDK_KEY_Control_R: + case GDK_KEY_Caps_Lock: + case GDK_KEY_Shift_Lock: + case GDK_KEY_Meta_L: + case GDK_KEY_Meta_R: + case GDK_KEY_Alt_L: + case GDK_KEY_Alt_R: + case GDK_KEY_Super_L: + case GDK_KEY_Super_R: + case GDK_KEY_Hyper_L: + case GDK_KEY_Hyper_R: return false; } #endif @@ -276,12 +269,12 @@ gboolean accelerator_window_key_press( GtkWidget *widget, GdkEventKey *event, gp // 7. find the name of the accelerator GValue val; memset( &val, 0, sizeof( val ) ); - gtk_tree_model_get_value( GTK_TREE_MODEL( dialog.m_model ), &dialog.m_command_iter, 0, &val ); + gtk_tree_model_get_value(dialog.m_model, &dialog.m_command_iter, 0, &val ); const char *commandName = g_value_get_string( &val );; Shortcuts::iterator thisShortcutIterator = g_shortcuts.find( commandName ); if ( thisShortcutIterator == g_shortcuts.end() ) { - gtk_list_store_set( GTK_LIST_STORE( dialog.m_model ), &dialog.m_command_iter, 2, false, -1 ); - gtk_widget_set_sensitive( GTK_WIDGET( dialog.m_list ), true ); + gtk_list_store_set( ui::ListStore::from( dialog.m_model ), &dialog.m_command_iter, 2, false, -1 ); + gtk_widget_set_sensitive( dialog.m_list , true ); return true; } @@ -293,11 +286,11 @@ gboolean accelerator_window_key_press( GtkWidget *widget, GdkEventKey *event, gp { const char *commandName; const Accelerator &newAccel; - GtkWidget *widget; - GtkTreeModel *model; + ui::Widget widget; + ui::TreeModel model; public: bool allow; - VerifyAcceleratorNotTaken( const char *name, const Accelerator &accelerator, GtkWidget *w, GtkTreeModel *m ) : commandName( name ), newAccel( accelerator ), widget( w ), model( m ), allow( true ){ + VerifyAcceleratorNotTaken( const char *name, const Accelerator &accelerator, ui::Widget w, ui::TreeModel m ) : commandName( name ), newAccel( accelerator ), widget( w ), model( m ), allow( true ){ } void visit( const char* name, Accelerator& accelerator ){ if ( !strcmp( name, commandName ) ) { @@ -313,32 +306,32 @@ public: StringOutputStream msg; msg << "The command " << name << " is already assigned to the key " << accelerator << ".\n\n" << "Do you want to unassign " << name << " first?"; - EMessageBoxReturn r = gtk_MessageBox( widget, msg.c_str(), "Key already used", eMB_YESNOCANCEL ); - if ( r == eIDYES ) { + auto r = ui::alert( widget.window(), msg.c_str(), "Key already used", ui::alert_type::YESNOCANCEL ); + if ( r == ui::alert_response::YES ) { // clear the ACTUAL accelerator too! disconnect_accelerator( name ); // delete the modifier accelerator = accelerator_null(); // empty the cell of the key binds dialog GtkTreeIter i; - if ( gtk_tree_model_get_iter_first( GTK_TREE_MODEL( model ), &i ) ) { + if ( gtk_tree_model_get_iter_first(model, &i ) ) { for (;; ) { GValue val; memset( &val, 0, sizeof( val ) ); - gtk_tree_model_get_value( GTK_TREE_MODEL( model ), &i, 0, &val ); + gtk_tree_model_get_value(model, &i, 0, &val ); const char *thisName = g_value_get_string( &val );; if ( !strcmp( thisName, name ) ) { - gtk_list_store_set( GTK_LIST_STORE( model ), &i, 1, "", -1 ); + gtk_list_store_set( ui::ListStore::from( model ), &i, 1, "", -1 ); } g_value_unset( &val ); - if ( !gtk_tree_model_iter_next( GTK_TREE_MODEL( model ), &i ) ) { + if ( !gtk_tree_model_iter_next(model, &i ) ) { break; } } } } - else if ( r == eIDCANCEL ) { + else if ( r == ui::alert_response::CANCEL ) { // aborted allow = false; } @@ -347,8 +340,8 @@ public: } verify_visitor( commandName, newAccel, widget, dialog.m_model ); GlobalShortcuts_foreach( verify_visitor ); - gtk_list_store_set( GTK_LIST_STORE( dialog.m_model ), &dialog.m_command_iter, 2, false, -1 ); - gtk_widget_set_sensitive( GTK_WIDGET( dialog.m_list ), true ); + gtk_list_store_set( ui::ListStore::from( dialog.m_model ), &dialog.m_command_iter, 2, false, -1 ); + gtk_widget_set_sensitive( dialog.m_list , true ); if ( verify_visitor.allow ) { // clear the ACTUAL accelerator first @@ -359,7 +352,7 @@ public: // write into the cell StringOutputStream modifiers; modifiers << newAccel; - gtk_list_store_set( GTK_LIST_STORE( dialog.m_model ), &dialog.m_command_iter, 1, modifiers.c_str(), -1 ); + gtk_list_store_set( ui::ListStore::from( dialog.m_model ), &dialog.m_command_iter, 1, modifiers.c_str(), -1 ); // set the ACTUAL accelerator too! connect_accelerator( commandName ); @@ -367,7 +360,7 @@ public: g_value_unset( &val ); - dialog.m_model = NULL; + dialog.m_model = ui::TreeModel(ui::null); return true; } @@ -376,9 +369,9 @@ public: GtkTreeIter row; GValue val; if(!model) {g_error("Unable to get model from cell renderer");} - gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(model), &row, path_string); + gtk_tree_model_get_iter_from_string(model, &row, path_string); - gtk_tree_model_get_value(GTK_TREE_MODEL(model), &row, 0, &val); + gtk_tree_model_get_value(model, &row, 0, &val); const char *name = g_value_get_string(&val); Shortcuts::iterator i = g_shortcuts.find(name); if(i != g_shortcuts.end()) @@ -386,7 +379,7 @@ public: accelerator_parse(i->second.first, new_text); StringOutputStream modifiers; modifiers << i->second.first; - gtk_list_store_set(GTK_LIST_STORE(model), &row, 1, modifiers.c_str(), -1); + gtk_list_store_set(ui::ListStore::from(model), &row, 1, modifiers.c_str(), -1); } }; */ @@ -394,41 +387,43 @@ public: void DoCommandListDlg(){ command_list_dialog_t dialog; - GtkWindow* window = create_modal_dialog_window( MainFrame_getWindow(), "Mapped Commands", dialog, -1, 400 ); - g_signal_connect( G_OBJECT( window ), "key-press-event", (GCallback) accelerator_window_key_press, &dialog ); + ui::Window window = MainFrame_getWindow().create_modal_dialog_window("Mapped Commands", dialog, -1, 400); + window.on_key_press([](ui::Widget widget, GdkEventKey *event, gpointer dialogptr) { + return accelerator_window_key_press(ui::Window::from(widget), event, dialogptr); + }, &dialog); - GtkAccelGroup* accel = gtk_accel_group_new(); - gtk_window_add_accel_group( window, accel ); + auto accel = ui::AccelGroup(ui::New); + window.add_accel_group( accel ); - GtkHBox* hbox = create_dialog_hbox( 4, 4 ); - gtk_container_add( GTK_CONTAINER( window ), GTK_WIDGET( hbox ) ); + auto hbox = create_dialog_hbox( 4, 4 ); + window.add(hbox); { - GtkScrolledWindow* scr = create_scrolled_window( GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); - gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( scr ), TRUE, TRUE, 0 ); + auto scr = create_scrolled_window( ui::Policy::NEVER, ui::Policy::AUTOMATIC ); + hbox.pack_start( scr, TRUE, TRUE, 0 ); { - GtkListStore* store = gtk_list_store_new( 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT ); + auto store = ui::ListStore::from(gtk_list_store_new( 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_INT )); - GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) ); - dialog.m_list = GTK_TREE_VIEW( view ); + auto view = ui::TreeView(ui::TreeModel::from(store._handle)); + dialog.m_list = view; - gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), false ); // annoying + gtk_tree_view_set_enable_search(view, false ); // annoying { - GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); - GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( "Command", renderer, "text", 0, "weight-set", 2, "weight", 3, NULL ); - gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column ); + auto renderer = ui::CellRendererText(ui::New); + auto column = ui::TreeViewColumn( "Command", renderer, {{"text", 0}, {"weight-set", 2}, {"weight", 3}} ); + gtk_tree_view_append_column(view, column ); } { - GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); - GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( "Key", renderer, "text", 1, "weight-set", 2, "weight", 3, NULL ); - gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column ); + auto renderer = ui::CellRendererText(ui::New); + auto column = ui::TreeViewColumn( "Key", renderer, {{"text", 1}, {"weight-set", 2}, {"weight", 3}} ); + gtk_tree_view_append_column(view, column ); } - gtk_widget_show( view ); - gtk_container_add( GTK_CONTAINER( scr ), view ); + view.show(); + scr.add(view); { // Initialize dialog @@ -438,19 +433,15 @@ void DoCommandListDlg(){ class BuildCommandList : public CommandVisitor { TextFileOutputStream m_commandList; - GtkListStore* m_store; + ui::ListStore m_store; public: - BuildCommandList( const char* filename, GtkListStore* store ) : m_commandList( filename ), m_store( store ){ + BuildCommandList( const char* filename, ui::ListStore store ) : m_commandList( filename ), m_store( store ){ } void visit( const char* name, Accelerator& accelerator ){ StringOutputStream modifiers; modifiers << accelerator; - { - GtkTreeIter iter; - gtk_list_store_append( m_store, &iter ); - gtk_list_store_set( m_store, &iter, 0, name, 1, modifiers.c_str(), 2, false, 3, 800, -1 ); - } + m_store.append(0, name, 1, modifiers.c_str(), 2, false, 3, 800); if ( !m_commandList.failed() ) { int l = strlen( name ); @@ -465,33 +456,33 @@ public: GlobalShortcuts_foreach( visitor ); } - g_object_unref( G_OBJECT( store ) ); + store.unref(); } } - GtkVBox* vbox = create_dialog_vbox( 4 ); - gtk_box_pack_start( GTK_BOX( hbox ), GTK_WIDGET( vbox ), TRUE, TRUE, 0 ); + auto vbox = create_dialog_vbox( 4 ); + hbox.pack_start( vbox, TRUE, TRUE, 0 ); { - GtkButton* editbutton = create_dialog_button( "Edit", (GCallback) accelerator_edit_button_clicked, &dialog ); - gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( editbutton ), FALSE, FALSE, 0 ); - - GtkButton* clearbutton = create_dialog_button( "Clear", (GCallback) accelerator_clear_button_clicked, &dialog ); - gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( clearbutton ), FALSE, FALSE, 0 ); - - GtkWidget *spacer = gtk_image_new(); - gtk_widget_show( spacer ); - gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( spacer ), TRUE, TRUE, 0 ); - - GtkButton* button = create_modal_dialog_button( "Close", dialog.m_close_button ); - gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( button ), FALSE, FALSE, 0 ); - widget_make_default( GTK_WIDGET( button ) ); - gtk_widget_grab_default( GTK_WIDGET( button ) ); - gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Return, (GdkModifierType)0, (GtkAccelFlags)0 ); - gtk_widget_add_accelerator( GTK_WIDGET( button ), "clicked", accel, GDK_Escape, (GdkModifierType)0, (GtkAccelFlags)0 ); + auto editbutton = create_dialog_button( "Edit", (GCallback) accelerator_edit_button_clicked, &dialog ); + vbox.pack_start( editbutton, FALSE, FALSE, 0 ); + + auto clearbutton = create_dialog_button( "Clear", (GCallback) accelerator_clear_button_clicked, &dialog ); + vbox.pack_start( clearbutton, FALSE, FALSE, 0 ); + + ui::Widget spacer = ui::Image(ui::New); + spacer.show(); + vbox.pack_start( spacer, TRUE, TRUE, 0 ); + + auto button = create_modal_dialog_button( "Close", dialog.m_close_button ); + vbox.pack_start( button, FALSE, FALSE, 0 ); + widget_make_default( button ); + gtk_widget_grab_default( button ); + gtk_widget_add_accelerator( button , "clicked", accel, GDK_KEY_Return, (GdkModifierType)0, (GtkAccelFlags)0 ); + gtk_widget_add_accelerator( button , "clicked", accel, GDK_KEY_Escape, (GdkModifierType)0, (GtkAccelFlags)0 ); } modal_dialog_show( window, dialog ); - gtk_widget_destroy( GTK_WIDGET( window ) ); + window.destroy(); } #include "profile/profile.h"