SF.net SVN: geany:[4278] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Thu Oct 1 11:56:09 UTC 2009


Revision: 4278
          http://geany.svn.sourceforge.net/geany/?rev=4278&view=rev
Author:   ntrel
Date:     2009-10-01 11:56:04 +0000 (Thu, 01 Oct 2009)

Log Message:
-----------
Group 'New with template' items by filetype submenu (currently only for
toolbar menu).
Show custom file template items before filetype template items.

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

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-10-01 11:18:26 UTC (rev 4277)
+++ trunk/ChangeLog	2009-10-01 11:56:04 UTC (rev 4278)
@@ -5,6 +5,10 @@
    filetypes.
  * src/highlighting.c:
    Use jscript_keyword for SCE_HB[A]_WORD markup styles.
+ * src/templates.c:
+   Group 'New with template' items by filetype submenu (currently only for
+   toolbar menu).
+   Show custom file template items before filetype template items.
 
 
 2009-09-30  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>

Modified: trunk/src/templates.c
===================================================================
--- trunk/src/templates.c	2009-10-01 11:18:26 UTC (rev 4277)
+++ trunk/src/templates.c	2009-10-01 11:56:04 UTC (rev 4278)
@@ -258,9 +258,10 @@
 
 
 /* template items for the new file menu */
-static void create_new_filetype_items(void)
+static gboolean create_new_filetype_items(void)
 {
 	GSList *node;
+	gboolean ret = FALSE;
 
 	foreach_slist(node, filetypes_by_title)
 	{
@@ -280,7 +281,10 @@
 		gtk_widget_show(tmp_button);
 		gtk_container_add(GTK_CONTAINER(toolbar_new_file_menu), tmp_button);
 		g_signal_connect(tmp_button, "activate", G_CALLBACK(on_new_with_filetype_template), ft);
+
+		ret = TRUE;
 	}
+	return ret;
 }
 
 
@@ -346,14 +350,15 @@
 }
 
 
-static void add_file_item(gpointer data, gpointer user_data)
+static void add_file_item(const gchar *fname, GtkWidget *menu)
 {
 	GtkWidget *tmp_menu, *tmp_button;
 	gchar *label;
 
-	g_return_if_fail(data);
+	g_return_if_fail(fname);
+	g_return_if_fail(menu);
 
-	label = utils_get_utf8_from_locale(data);
+	label = utils_get_utf8_from_locale(fname);
 
 	tmp_menu = gtk_menu_item_new_with_label(label);
 	gtk_widget_show(tmp_menu);
@@ -362,13 +367,42 @@
 
 	tmp_button = gtk_menu_item_new_with_label(label);
 	gtk_widget_show(tmp_button);
-	gtk_container_add(GTK_CONTAINER(toolbar_new_file_menu), tmp_button);
+	gtk_container_add(GTK_CONTAINER(menu), tmp_button);
 	g_signal_connect(tmp_button, "activate", G_CALLBACK(on_new_with_file_template), NULL);
 
 	g_free(label);
 }
 
 
+static void add_file_items(GSList *list)
+{
+	GSList *node;
+	gsize size = sizeof(GtkWidget*) * filetypes_array->len;
+	GtkWidget **menus = g_alloca(size);
+
+	memset(menus, 0, size);	/* if only we had g_newa0() */
+
+	foreach_slist(node, list)
+	{
+		const gchar *fname = node->data;
+		GeanyFiletype *ft = filetypes_detect_from_extension(fname);
+		GtkWidget *menu = menus[ft->id];
+		GtkWidget *item;
+
+		if (!menu)
+		{
+			item = gtk_menu_item_new_with_label(ft->name);
+			menu = gtk_menu_new();
+			gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), menu);
+			gtk_widget_show_all(item);
+			gtk_container_add(GTK_CONTAINER(toolbar_new_file_menu), item);
+			menus[ft->id] = menu;
+		}
+		add_file_item(fname, menu);
+	}
+}
+
+
 static gint compare_filenames_by_filetype(gconstpointer a, gconstpointer b)
 {
 	GeanyFiletype *ft_a = filetypes_detect_from_extension(a);
@@ -427,7 +461,7 @@
 			utils_slist_remove_next(node);
 		}
 	}
-	g_slist_foreach(list, add_file_item, NULL);
+	add_file_items(list);
 	g_slist_foreach(list, (GFunc) g_free, NULL);
 	g_slist_free(list);
 	g_free(path);
@@ -437,26 +471,25 @@
 
 static void create_file_template_menus(void)
 {
-	GtkWidget *sep1, *sep2 = NULL;
+	GtkWidget *sep1 = NULL, *sep2 = NULL;
 
 	new_with_template_menu = ui_lookup_widget(main_widgets.window, "menu_new_with_template1_menu");
 	toolbar_new_file_menu = gtk_menu_new();
 	/* we hold our own ref on the menu in case it is not used in the toolbar */
 	g_object_ref(toolbar_new_file_menu);
 
-	create_new_filetype_items();
-
-	sep1 = gtk_separator_menu_item_new();
-	gtk_container_add(GTK_CONTAINER(new_with_template_menu), sep1);
-	sep2 = gtk_separator_menu_item_new();
-	gtk_container_add(GTK_CONTAINER(toolbar_new_file_menu), sep2);
-
 	if (add_custom_template_items())
 	{
+		sep1 = gtk_separator_menu_item_new();
+		gtk_container_add(GTK_CONTAINER(new_with_template_menu), sep1);
+		sep2 = gtk_separator_menu_item_new();
+		gtk_container_add(GTK_CONTAINER(toolbar_new_file_menu), sep2);
+	}
+	if (create_new_filetype_items() && sep1)
+	{
 		gtk_widget_show(sep1);
 		gtk_widget_show(sep2);
 	}
-
 	geany_menu_button_action_set_menu(GEANY_MENU_BUTTON_ACTION(
 		toolbar_get_action_by_name("New")), toolbar_new_file_menu);
 }


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