[genius] Sun Nov 07 11:39:40 2010 Jiri (George) Lebl <jirka 5z com>



commit 1050966b11fc2c161875869c356363455f23acfd
Author: Jiri (George) Lebl <jirka 5z com>
Date:   Sun Nov 7 11:39:48 2010 -0800

    Sun Nov 07 11:39:40 2010  Jiri (George) Lebl <jirka 5z com>
    
    	* src/gnome-genius.c: add recent files menu

 ChangeLog          |    4 ++
 src/gnome-genius.c |   87 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 90 insertions(+), 1 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 30b571c..03d829f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sun Nov 07 11:39:40 2010  Jiri (George) Lebl <jirka 5z com>
+
+	* src/gnome-genius.c: add recent files menu
+
 Tue Nov 02 11:44:08 2010  Jiri (George) Lebl <jirka 5z com>
 
 	* src/Makefile.am: Add the self test files that were missing to
diff --git a/src/gnome-genius.c b/src/gnome-genius.c
index dff8ce4..9676f2b 100644
--- a/src/gnome-genius.c
+++ b/src/gnome-genius.c
@@ -111,6 +111,7 @@ static GtkWidget *term = NULL;
 static GtkWidget *notebook = NULL;
 static GString *errors = NULL;
 static GString *infos = NULL;
+static GtkRecentManager *recent_manager;
 
 static char *clipboard_str = NULL;
 
@@ -248,6 +249,8 @@ static void actually_open_help (const char *id);
 
 static void fork_helper_setup_comm (void);
 
+static void new_program (const char *filename);
+
 static GtkActionEntry entries[] = {
   { "FileMenu", NULL, N_("_File") },		/* name, stock id, label */
   { "EditMenu", NULL, N_("_Edit") },		/* name, stock id, label */
@@ -272,6 +275,7 @@ static GtkActionEntry entries[] = {
     N_("Open"), "",
     N_("Open a file"),
     G_CALLBACK (open_callback) }, 
+  { "OpenRecent", NULL, N_("Open R_ecent") },	/* name, stock id, label */
   { "Save", GTK_STOCK_SAVE,                    /* name, stock id */
     N_("_Save"), "<control>S",                      /* label, accelerator */     
     N_("Save current file"),                       /* tooltip */
@@ -417,6 +421,7 @@ static const gchar *ui_info =
 "    <menu action='FileMenu'>"
 "      <menuitem action='New'/>"
 "      <menuitem action='Open'/>"
+"      <menuitem action='OpenRecent'/>"
 "      <menuitem action='Save'/>"
 "      <menuitem action='SaveAll'/>"
 "      <menuitem action='SaveAs'/>"
@@ -600,10 +605,78 @@ stock_init (void)
 	g_object_unref (factory);
 }
 
+GtkWidget *
+recent_create_menu (void)
+{
+        GtkWidget *recent_menu;
+        GtkRecentFilter *recent_filter;
+
+        recent_menu  =
+                gtk_recent_chooser_menu_new_for_manager (recent_manager);
+        gtk_recent_chooser_set_show_icons
+		(GTK_RECENT_CHOOSER (recent_menu), TRUE);
+        gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (recent_menu), 10);
+        gtk_recent_chooser_set_sort_type (GTK_RECENT_CHOOSER (recent_menu),
+					  GTK_RECENT_SORT_MRU);
+
+        recent_filter = gtk_recent_filter_new ();
+        gtk_recent_filter_add_mime_type (recent_filter,
+					 "text/x-genius");
+        gtk_recent_chooser_set_filter (GTK_RECENT_CHOOSER (recent_menu),
+				       recent_filter);
+
+        return recent_menu;
+}
+
+void 
+file_open_recent (GtkRecentChooser *chooser, gpointer data)
+{
+        GtkRecentInfo *item;
+	const char *uri;
+
+        g_return_if_fail (chooser && GTK_IS_RECENT_CHOOSER(chooser));
+
+        item = gtk_recent_chooser_get_current_item (chooser);
+        if (item == NULL)
+                return;
+
+        uri = gtk_recent_info_get_uri (item);
+
+	new_program (uri);
+
+        gtk_recent_info_unref (item);
+}
+
+void
+recent_add (const char *uri)
+{
+	GtkRecentData *data;
+
+        static gchar *groups[2] = {
+                "gnome-genius",
+                NULL
+        };
+
+	data = g_slice_new0 (GtkRecentData);
+
+        data->display_name = NULL;
+        data->description = NULL;
+        data->mime_type = "text/x-genius";
+        data->app_name = (gchar *) g_get_application_name ();
+        data->app_exec = g_strconcat (g_get_prgname (), " %u", NULL);
+        data->groups = groups;
+        data->is_private = FALSE;
+
+	gtk_recent_manager_add_full (recent_manager, uri, data);
+
+        g_free (data->app_exec);
+	g_slice_free (GtkRecentData, data);
+}
+
 static void
 add_main_window_contents (GtkWidget *window, GtkWidget *notebook)
 {
-	GtkWidget *box1;
+	GtkWidget *box1, *recent_menu;
 	GtkActionGroup *actions;
 	GError *error = NULL;
 	GtkAction *act;
@@ -662,6 +735,14 @@ add_main_window_contents (GtkWidget *window, GtkWidget *notebook)
 
 	gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (genius_window_statusbar), TRUE);
 	gtk_box_pack_start (GTK_BOX (box1), genius_window_statusbar, FALSE, TRUE, 0);
+
+        recent_menu  = recent_create_menu ();
+	g_signal_connect (G_OBJECT (recent_menu), "item-activated",
+			  G_CALLBACK (file_open_recent), NULL);
+	gtk_menu_item_set_submenu
+		(GTK_MENU_ITEM (gtk_ui_manager_get_widget (genius_ui, "/MenuBar/FileMenu/OpenRecent")),
+		 recent_menu);
+
 }
 
 
@@ -3391,6 +3472,7 @@ new_program (const char *filename)
 		cnt++;
 	} else {
 		char *contents;
+		recent_add (filename);
 		p->name = g_strdup (filename);
 		if (file_exists (filename)) { 
 			p->readonly = ! file_is_writable (filename);
@@ -3549,6 +3631,8 @@ save_program (Program *p, const char *new_fname)
 		return FALSE;
 	}
 
+	recent_add (fname);
+
 	if (p->name != fname) {
 		g_free (p->name);
 		p->name = g_strdup (fname);
@@ -4812,6 +4896,7 @@ main (int argc, char *argv[])
 		gtk_window_set_default_icon_from_file (file, NULL);
 	g_free (file);
 
+	recent_manager = gtk_recent_manager_get_default ();
 	
 	/* create our notebook and setup toplevel window */
 	notebook = gtk_notebook_new ();



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]