SF.net SVN: geany:[3700] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Wed Apr 8 12:25:48 UTC 2009


Revision: 3700
          http://geany.svn.sourceforge.net/geany/?rev=3700&view=rev
Author:   ntrel
Date:     2009-04-08 12:25:47 +0000 (Wed, 08 Apr 2009)

Log Message:
-----------
Sort Configuration Files menu.
Add ui_menu_sort_by_label().
Add foreach_list() macro.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/ui_utils.c
    trunk/src/ui_utils.h
    trunk/src/utils.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-04-07 22:09:23 UTC (rev 3699)
+++ trunk/ChangeLog	2009-04-08 12:25:47 UTC (rev 3700)
@@ -1,3 +1,11 @@
+2009-04-08  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * src/ui_utils.h, src/utils.h, src/ui_utils.c:
+   Sort Configuration Files menu.
+   Add ui_menu_sort_by_label().
+   Add foreach_list() macro.
+
+
 2009-04-07  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * src/main.c:

Modified: trunk/src/ui_utils.c
===================================================================
--- trunk/src/ui_utils.c	2009-04-07 22:09:23 UTC (rev 3699)
+++ trunk/src/ui_utils.c	2009-04-08 12:25:47 UTC (rev 3700)
@@ -1723,6 +1723,13 @@
 }
 
 
+static gboolean sort_menu(gpointer data)
+{
+	ui_menu_sort_by_label(GTK_MENU(data));
+	return FALSE;
+}
+
+
 static void create_config_files_menu(void)
 {
 	GtkWidget *menu, *item;
@@ -1733,6 +1740,9 @@
 	gtk_widget_show(item);
 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
 	gtk_container_add(GTK_CONTAINER(main_widgets.tools_menu), item);
+
+	/* sort menu after all items added */
+	g_idle_add(sort_menu, widgets.config_files_menu);
 }
 
 
@@ -1994,3 +2004,38 @@
 	}
 }
 
+
+static gint compare_menu_item_labels(gconstpointer a, gconstpointer b)
+{
+	GtkMenuItem *item_a = GTK_MENU_ITEM(a);
+	GtkMenuItem *item_b = GTK_MENU_ITEM(b);
+	gchar *sa, *sb;
+	gint result;
+
+	sa = ui_menu_item_get_text(item_a);
+	sb = ui_menu_item_get_text(item_b);
+	result = utils_str_casecmp(sa, sb);
+	g_free(sa);
+	g_free(sb);
+	return result;
+}
+
+
+/* Currently @a menu should contain only GtkMenuItems with labels. */
+void ui_menu_sort_by_label(GtkMenu *menu)
+{
+	GList *list = gtk_container_get_children(GTK_CONTAINER(menu));
+	GList *node;
+	GtkWidget *child;
+	gint pos;
+
+	list = g_list_sort(list, compare_menu_item_labels);
+	pos = 0;
+	foreach_list(child, node, list)
+	{
+		gtk_menu_reorder_child(menu, child, pos);
+		pos++;
+	}
+	g_list_free(list);
+}
+

Modified: trunk/src/ui_utils.h
===================================================================
--- trunk/src/ui_utils.h	2009-04-07 22:09:23 UTC (rev 3699)
+++ trunk/src/ui_utils.h	2009-04-08 12:25:47 UTC (rev 3700)
@@ -164,6 +164,8 @@
 
 void ui_widget_modify_font_from_string(GtkWidget *wid, const gchar *str);
 
+void ui_menu_sort_by_label(GtkMenu *menu);
+
 gchar *ui_menu_item_get_text(GtkMenuItem *menu_item);
 
 GtkWidget *ui_frame_new_with_alignment(const gchar *label_text, GtkWidget **alignment);
@@ -197,7 +199,7 @@
 
 void ui_entry_add_clear_icon(GtkWidget *entry);
 
-/* End of 'generic' functions */
+/* End of general widget functions */
 
 
 void ui_init(void);

Modified: trunk/src/utils.h
===================================================================
--- trunk/src/utils.h	2009-04-07 22:09:23 UTC (rev 3699)
+++ trunk/src/utils.h	2009-04-08 12:25:47 UTC (rev 3700)
@@ -62,7 +62,12 @@
 	for (node = list, data_ptr = node ? node->data : NULL; node != NULL; \
 		node = g_slist_next(node), data_ptr = node ? node->data : NULL)
 
+/* @param node should be a (GList*), needed for implementation. */
+#define foreach_list(data_ptr, node, list) \
+	for (node = list, data_ptr = node ? node->data : NULL; node != NULL; \
+		node = g_list_next(node), data_ptr = node ? node->data : NULL)
 
+
 void utils_open_browser(const gchar *uri);
 
 gint utils_get_line_endings(const gchar* buffer, glong size);


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