SF.net SVN: geany: [2036] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Thu Nov 8 15:58:12 UTC 2007
Revision: 2036
http://geany.svn.sourceforge.net/geany/?rev=2036&view=rev
Author: ntrel
Date: 2007-11-08 07:58:11 -0800 (Thu, 08 Nov 2007)
Log Message:
-----------
Separate keybindings tree setup code from prefs_init_dialog(); use
enum for tree model columns.
Ask the user whether to override an existing keybinding when setting
a combination that is already in use.
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/prefs.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-11-08 12:48:20 UTC (rev 2035)
+++ trunk/ChangeLog 2007-11-08 15:58:11 UTC (rev 2036)
@@ -1,3 +1,12 @@
+2007-11-08 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/prefs.c:
+ Separate keybindings tree setup code from prefs_init_dialog(); use
+ enum for tree model columns.
+ Ask the user whether to override an existing keybinding when setting
+ a combination that is already in use.
+
+
2007-11-08 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/editor.c, src/utils.c, src/utils.h:
Modified: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c 2007-11-08 12:48:20 UTC (rev 2035)
+++ trunk/src/prefs.c 2007-11-08 15:58:11 UTC (rev 2036)
@@ -80,6 +80,74 @@
static void on_openfiles_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data);
+enum
+{
+ KB_TREE_ACTION,
+ KB_TREE_SHORTCUT,
+ KB_TREE_INDEX,
+};
+
+static void init_kb_tree()
+{
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ tree = GTK_TREE_VIEW(lookup_widget(ui_widgets.prefs_dialog, "treeview7"));
+ //g_object_set(tree, "vertical-separator", 6, NULL);
+
+ store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
+ gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
+
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(_("Action"), renderer, "text", KB_TREE_ACTION, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
+
+ renderer = gtk_cell_renderer_text_new();
+ g_object_set(renderer, "editable", TRUE, NULL);
+ column = gtk_tree_view_column_new_with_attributes(_("Shortcut"), renderer, "text", KB_TREE_SHORTCUT, NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
+
+ // set policy settings for the scollwedwindow around the treeview again, because glade
+ // doesn't keep the settings
+ gtk_scrolled_window_set_policy(
+ GTK_SCROLLED_WINDOW(lookup_widget(ui_widgets.prefs_dialog, "scrolledwindow8")),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+ g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(on_cell_edited), NULL);
+ g_signal_connect(G_OBJECT(tree), "button-press-event",
+ G_CALLBACK(on_tree_view_button_press_event), NULL);
+ g_signal_connect(G_OBJECT(lookup_widget(ui_widgets.prefs_dialog, "button2")), "clicked",
+ G_CALLBACK(on_tree_view_button_press_event), NULL);
+}
+
+
+static void init_keybindings()
+{
+ GtkTreeIter parent, iter;
+ gint i;
+ gchar *key_string;
+
+ if (store == NULL)
+ init_kb_tree();
+
+ for (i = 0; i < GEANY_MAX_KEYS; i++)
+ {
+ if (keys[i]->section != NULL)
+ {
+ gtk_tree_store_append(store, &parent, NULL);
+ gtk_tree_store_set(store, &parent, KB_TREE_ACTION, keys[i]->section, -1);
+ }
+
+ key_string = gtk_accelerator_name(keys[i]->key, keys[i]->mods);
+ gtk_tree_store_append(store, &iter, &parent);
+ gtk_tree_store_set(store, &iter, KB_TREE_ACTION, keys[i]->label,
+ KB_TREE_SHORTCUT, key_string, KB_TREE_INDEX, i, -1);
+ g_free(key_string);
+ }
+ gtk_tree_view_expand_all(GTK_TREE_VIEW(tree));
+}
+
+
void prefs_init_dialog(void)
{
GtkWidget *widget;
@@ -370,60 +438,8 @@
// Keybindings
- if (store == NULL)
- {
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *column;
+ init_keybindings();
- tree = GTK_TREE_VIEW(lookup_widget(ui_widgets.prefs_dialog, "treeview7"));
- //g_object_set(tree, "vertical-separator", 6, NULL);
-
- store = gtk_tree_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
- gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store));
-
- renderer = gtk_cell_renderer_text_new();
- column = gtk_tree_view_column_new_with_attributes(_("Action"), renderer, "text", 0, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
-
- renderer = gtk_cell_renderer_text_new();
- g_object_set(renderer, "editable", TRUE, NULL);
- column = gtk_tree_view_column_new_with_attributes(_("Shortcut"), renderer, "text", 1, NULL);
- gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
-
- // set policy settings for the scollwedwindow around the treeview again, because glade
- // doesn't keep the settings
- gtk_scrolled_window_set_policy(
- GTK_SCROLLED_WINDOW(lookup_widget(ui_widgets.prefs_dialog, "scrolledwindow8")),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-
- g_signal_connect(G_OBJECT(renderer), "edited", G_CALLBACK(on_cell_edited), NULL);
- g_signal_connect(G_OBJECT(tree), "button-press-event",
- G_CALLBACK(on_tree_view_button_press_event), NULL);
- g_signal_connect(G_OBJECT(lookup_widget(ui_widgets.prefs_dialog, "button2")), "clicked",
- G_CALLBACK(on_tree_view_button_press_event), NULL);
- }
-
- {
- GtkTreeIter parent, iter;
- gint i;
- gchar *key_string;
-
- for (i = 0; i < GEANY_MAX_KEYS; i++)
- {
- if (keys[i]->section != NULL)
- {
- gtk_tree_store_append(store, &parent, NULL);
- gtk_tree_store_set(store, &parent, 0, keys[i]->section, -1);
- }
-
- key_string = gtk_accelerator_name(keys[i]->key, keys[i]->mods);
- gtk_tree_store_append(store, &iter, &parent);
- gtk_tree_store_set(store, &iter, 0, keys[i]->label, 1, key_string, 2, i, -1);
- g_free(key_string);
- }
- }
- gtk_tree_view_expand_all(GTK_TREE_VIEW(tree));
-
#ifndef HAVE_PLUGINS
gtk_widget_set_sensitive(lookup_widget(ui_widgets.prefs_dialog, "check_plugins"), FALSE);
#endif
@@ -1078,6 +1094,34 @@
}
+static gboolean find_iter(guint i, GtkTreeIter *iter)
+{
+ GtkTreeModel *model = GTK_TREE_MODEL(store);
+ guint idx;
+ GtkTreeIter parent;
+
+ if (! gtk_tree_model_get_iter_first(model, &parent))
+ return FALSE; // no items
+
+ while (TRUE)
+ {
+ if (! gtk_tree_model_iter_children(model, iter, &parent))
+ return FALSE;
+
+ while (TRUE)
+ {
+ gtk_tree_model_get(model, iter, 2, &idx, -1);
+ if (idx == i)
+ return TRUE;
+ if (! gtk_tree_model_iter_next(model, iter))
+ break;
+ }
+ if (! gtk_tree_model_iter_next(model, &parent))
+ return FALSE;
+ }
+}
+
+
// test if the entered key combination is already used
static gboolean find_duplicate(guint idx, guint key, GdkModifierType mods, const gchar *action)
{
@@ -1092,9 +1136,19 @@
if (keys[i]->key == key && keys[i]->mods == mods
&& ! (keys[i]->key == keys[idx]->key && keys[i]->mods == keys[idx]->mods))
{
- dialogs_show_msgbox(GTK_MESSAGE_ERROR,
- _("The combination '%s' is already used for \"%s\". Please choose another one."),
- action, keys[i]->label);
+ if (dialogs_show_question_full(app->window, _("_Override"), GTK_STOCK_CANCEL,
+ _("Override that keybinding?"),
+ _("The combination '%s' is already used for \"%s\"."),
+ action, keys[i]->label))
+ {
+ GtkTreeIter iter;
+
+ keys[i]->key = 0;
+ keys[i]->mods = 0;
+ if (find_iter(i, &iter))
+ gtk_tree_store_set(store, &iter, 1, NULL, -1); // clear item
+ continue;
+ }
return TRUE;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list