SF.net SVN: geany:[3880] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sat Jun 20 16:52:58 UTC 2009


Revision: 3880
          http://geany.svn.sourceforge.net/geany/?rev=3880&view=rev
Author:   eht16
Date:     2009-06-20 16:52:58 +0000 (Sat, 20 Jun 2009)

Log Message:
-----------
Add a popup menu for the keybinding list in the preferences dialog to easily expand and collapse all groups.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/prefs.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-06-20 16:52:44 UTC (rev 3879)
+++ trunk/ChangeLog	2009-06-20 16:52:58 UTC (rev 3880)
@@ -18,6 +18,9 @@
    Properly clean up the logging mechanism.
  * src/build.c:
    Fix LaTeX view commands on Windows (part of #2807688).
+ * src/prefs.c:
+   Add a popup menu for the keybinding list in the preferences dialog
+   to easily expand and collapse all groups.
 
 
 2009-06-18  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c	2009-06-20 16:52:44 UTC (rev 3879)
+++ trunk/src/prefs.c	2009-06-20 16:52:58 UTC (rev 3880)
@@ -129,6 +129,61 @@
 	KB_TREE_INDEX
 };
 
+
+static void on_expand_collapse(GtkWidget *item, gpointer user_data)
+{
+	if (user_data != NULL)
+		gtk_tree_view_expand_all(tree);
+	else
+		gtk_tree_view_collapse_all(tree);
+}
+
+
+static void kb_show_popup_menu(GtkWidget *widget, GdkEventButton *event)
+{
+	GtkWidget *item;
+	static GtkWidget *menu = NULL;
+	gint button, event_time;
+
+	if (menu == NULL)
+	{
+		menu = gtk_menu_new();
+
+		item = ui_image_menu_item_new(GTK_STOCK_ADD, _("_Expand All"));
+		gtk_widget_show(item);
+		gtk_container_add(GTK_CONTAINER(menu), item);
+		g_signal_connect(item, "activate", G_CALLBACK(on_expand_collapse), GINT_TO_POINTER(TRUE));
+
+		item = ui_image_menu_item_new(GTK_STOCK_REMOVE, _("_Collapse All"));
+		gtk_widget_show(item);
+		gtk_container_add(GTK_CONTAINER(menu), item);
+		g_signal_connect(item, "activate", G_CALLBACK(on_expand_collapse), NULL);
+
+		gtk_menu_attach_to_widget(GTK_MENU(menu), widget, NULL);
+	}
+
+	if (event != NULL)
+	{
+		button = event->button;
+		event_time = event->time;
+	}
+	else
+	{
+		button = 0;
+		event_time = gtk_get_current_event_time();
+	}
+
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, event_time);
+}
+
+
+static gboolean kb_popup_menu_cb(GtkWidget *widget, gpointer data)
+{
+	kb_show_popup_menu(widget, NULL);
+	return TRUE;
+}
+
+
 static void init_kb_tree(void)
 {
 	GtkCellRenderer *renderer;
@@ -157,6 +212,7 @@
 
 	g_signal_connect(renderer, "edited", G_CALLBACK(on_cell_edited), NULL);
 	g_signal_connect(tree, "button-press-event", G_CALLBACK(on_tree_view_button_press_event), NULL);
+	g_signal_connect(tree, "popup-menu", G_CALLBACK(kb_popup_menu_cb), NULL);
 	g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "button2"), "clicked",
 				G_CALLBACK(on_tree_view_button_press_event), NULL);
 }
@@ -1109,61 +1165,67 @@
 	GtkTreeSelection *selection;
 	gchar *name;
 
-	/* discard click events in the tree unless it is a double click */
-	if (widget == (GtkWidget*)tree && event->type != GDK_2BUTTON_PRESS)
-		return FALSE;
-
-	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
-	if (gtk_tree_selection_get_selected(selection, &model, &g_iter))
+	if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
 	{
-		if (gtk_tree_model_iter_has_child(model, &g_iter))
-		{	/* double click on a section to expand or collapse it */
-			GtkTreePath *path = gtk_tree_model_get_path(model, &g_iter);
+		kb_show_popup_menu(widget, event);
+		return TRUE;
+	}
+	else if (event->type == GDK_2BUTTON_PRESS)
+	{
 
-			if (gtk_tree_view_row_expanded(tree, path))
-				gtk_tree_view_collapse_row(tree, path);
-			else
-				gtk_tree_view_expand_row(tree, path, FALSE);
+		selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+		if (gtk_tree_selection_get_selected(selection, &model, &g_iter))
+		{
+			if (gtk_tree_model_iter_has_child(model, &g_iter))
+			{	/* double click on a section to expand or collapse it */
+				GtkTreePath *path = gtk_tree_model_get_path(model, &g_iter);
 
-			gtk_tree_path_free(path);
-			return TRUE;
-		}
+				if (gtk_tree_view_row_expanded(tree, path))
+					gtk_tree_view_collapse_row(tree, path);
+				else
+					gtk_tree_view_expand_row(tree, path, FALSE);
 
-		gtk_tree_model_get(model, &g_iter, KB_TREE_ACTION, &name, -1);
-		if (name != NULL)
-		{
-			GtkWidget *dialog;
-			GtkWidget *label;
-			gchar *str;
+				gtk_tree_path_free(path);
+				return TRUE;
+			}
 
-			dialog = gtk_dialog_new_with_buttons(_("Grab Key"), GTK_WINDOW(ui_widgets.prefs_dialog),
-					GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
-					GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-					GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
+			gtk_tree_model_get(model, &g_iter, KB_TREE_ACTION, &name, -1);
+			if (name != NULL)
+			{
+				GtkWidget *dialog;
+				GtkWidget *label;
+				gchar *str;
 
-			str = g_strdup_printf(
-					_("Press the combination of the keys you want to use for \"%s\"."), name);
-			label = gtk_label_new(str);
-			gtk_misc_set_padding(GTK_MISC(label), 5, 10);
-			gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
+				dialog = gtk_dialog_new_with_buttons(_("Grab Key"), GTK_WINDOW(ui_widgets.prefs_dialog),
+						GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR,
+						GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+						GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
 
-			dialog_label = gtk_label_new("");
-			gtk_misc_set_padding(GTK_MISC(dialog_label), 5, 10);
-			gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), dialog_label);
+				str = g_strdup_printf(
+						_("Press the combination of the keys you want to use for \"%s\"."), name);
+				label = gtk_label_new(str);
+				gtk_misc_set_padding(GTK_MISC(label), 5, 10);
+				gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
 
-			g_signal_connect(dialog, "key-press-event",
-								G_CALLBACK(on_keytype_dialog_response), NULL);
-			g_signal_connect(dialog, "response", G_CALLBACK(on_dialog_response), NULL);
+				dialog_label = gtk_label_new("");
+				gtk_misc_set_padding(GTK_MISC(dialog_label), 5, 10);
+				gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), dialog_label);
 
-			/* copy name to global variable to hold it, will be freed in on_dialog_response() */
-			dialog_key_name = g_strdup(name);
+				g_signal_connect(dialog, "key-press-event",
+									G_CALLBACK(on_keytype_dialog_response), NULL);
+				g_signal_connect(dialog, "response", G_CALLBACK(on_dialog_response), NULL);
 
-			gtk_widget_show_all(dialog);
-			g_free(str);
-			g_free(name);
+				/* copy name to global variable to hold it, will be freed in on_dialog_response() */
+				dialog_key_name = g_strdup(name);
+
+				gtk_widget_show_all(dialog);
+				g_free(str);
+				g_free(name);
+			}
 		}
+		return TRUE;
 	}
-	return TRUE;
+	return FALSE;
 }
 
 


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