[Gnucash-changes] r13385 - gnucash/trunk - Remember the order in which the notebook tabs are referenced. When

David Hampton hampton at cvs.gnucash.org
Sat Feb 25 03:18:39 EST 2006


Author: hampton
Date: 2006-02-25 03:18:39 -0500 (Sat, 25 Feb 2006)
New Revision: 13385
Trac: http://svn.gnucash.org/trac/changeset/13385

Modified:
   gnucash/trunk/ChangeLog
   gnucash/trunk/src/gnome-utils/gnc-main-window.c
Log:
Remember the order in which the notebook tabs are referenced. When
closing a tab, switch to the tab that was previously in front, not the
first tab in the notebook.


Modified: gnucash/trunk/ChangeLog
===================================================================
--- gnucash/trunk/ChangeLog	2006-02-24 23:17:10 UTC (rev 13384)
+++ gnucash/trunk/ChangeLog	2006-02-25 08:18:39 UTC (rev 13385)
@@ -1,3 +1,10 @@
+2006-02-25  David Hampton  <hampton at employees.org>
+
+	* src/gnome-utils/gnc-main-window.c: Remember the order in which
+	the notebook tabs are referenced. When closing a tab, switch to
+	the tab that was previously in front, not the first tab in the
+	notebook. Fixes 332355.
+
 2006-02-24  David Hampton  <hampton at employees.org>
 
 	* src/register/register-gnome/gnucash-sheet.[ch]:

Modified: gnucash/trunk/src/gnome-utils/gnc-main-window.c
===================================================================
--- gnucash/trunk/src/gnome-utils/gnc-main-window.c	2006-02-24 23:17:10 UTC (rev 13384)
+++ gnucash/trunk/src/gnome-utils/gnc-main-window.c	2006-02-25 08:18:39 UTC (rev 13385)
@@ -173,6 +173,8 @@
 
 	/** A list of all pages that are installed in this window. */
 	GList *installed_pages;
+	/** A list of pages in order of use (most recent -> least recent) */
+	GList *usage_order;
 	/** The currently selected page. */
 	GncPluginPage *current_page;
 	/** The identifier for this window's engine event handler. */
@@ -398,6 +400,7 @@
 #define WINDOW_MAXIMIZED	"Window Maximized"
 #define WINDOW_FIRSTPAGE	"First Page"
 #define WINDOW_PAGECOUNT	"Page Count"
+#define WINDOW_PAGEORDER	"Page Order"
 #define PAGE_TYPE		"Page Type"
 #define PAGE_NAME		"Page Name"
 #define PAGE_STRING		"Page %d"
@@ -499,7 +502,8 @@
 static void
 gnc_main_window_restore_window (GncMainWindow *window, GncMainWindowSaveData *data)
 {
-  gint *pos, *geom;
+  GncMainWindowPrivate *priv;
+  gint *pos, *geom, *order;
   gsize length;
   gboolean max;
   gchar *window_group;
@@ -509,6 +513,7 @@
   /* Setup */
   ENTER("window %p, data %p (key file %p, window %d)",
 	window, data, data->key_file, data->window_num);
+  priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
   window_group = g_strdup_printf(WINDOW_STRING, data->window_num + 1);
 
   /* Get this window's notebook info */
@@ -556,6 +561,9 @@
     gtk_window_move(GTK_WINDOW(window), pos[0], pos[1]);
     DEBUG("window (%p) position %dx%d", window, pos[0], pos[1]);
   }
+  if (pos) {
+    g_free(pos);
+  }
 
   geom = g_key_file_get_integer_list(data->key_file, window_group,
 				     WINDOW_GEOMETRY, &length, &error);
@@ -571,6 +579,9 @@
     gtk_window_resize(GTK_WINDOW(window), geom[0], geom[1]);
     DEBUG("window (%p) size %dx%d", window, geom[0], geom[1]);
   }
+  if (geom) {
+    g_free(geom);
+  }
 
   max = g_key_file_get_boolean(data->key_file, window_group,
 			       WINDOW_MAXIMIZED, &error);
@@ -588,8 +599,43 @@
     data->page_offset = page_start;
     data->page_num = i;
     gnc_main_window_restore_page(window, data);
+
+    /* give the page a chance to display */
+    while (gtk_events_pending ())
+      gtk_main_iteration ();
   }
 
+  /* Restore page ordering within the notebook. Use +1 notation so the
+   * numbers in the page order match the page sections, at least for
+   * the one window case. */
+  order = g_key_file_get_integer_list(data->key_file, window_group,
+ 				      WINDOW_PAGEORDER, &length, &error);
+  if (error) {
+    g_warning("error reading group %s key %s: %s",
+ 	      window_group, WINDOW_PAGEORDER, error->message);
+    g_error_free(error);
+    error = NULL;
+  } else if (length != page_count) {
+    g_warning("%s key %s length %d differs from window page count %d",
+ 	      window_group, WINDOW_PAGEORDER, length, page_count);
+  } else {
+    /* Dump any list that might exist */
+    g_list_free(priv->usage_order);
+    priv->usage_order = NULL;
+    /* Now rebuild the list from the key file. */
+    for (i = 0; i < length; i++) {
+      gpointer page = g_list_nth_data(priv->installed_pages, order[i] - 1);
+      if (page) {
+ 	priv->usage_order = g_list_append(priv->usage_order, page);
+      }
+    }
+    gtk_notebook_set_current_page (GTK_NOTEBOOK(priv->notebook),
+ 				   order[0] - 1);
+  }
+  if (order) {
+    g_free(order);
+  }
+
   LEAVE("window %p", window);
  cleanup:
   if (error)
@@ -620,11 +666,13 @@
 
   /* Restore all state information on the open windows.  Window
      numbers in state file are 1-based. GList indices are 0-based. */
+  gnc_set_busy_cursor (NULL, TRUE);
   for (i = 0; i < window_count; i++) {
     data.window_num = i;
     window = g_list_nth_data(active_windows, i);
     gnc_main_window_restore_window(window, &data);
   }
+  gnc_unset_busy_cursor (NULL);
 }
 
 void
@@ -686,7 +734,7 @@
 gnc_main_window_save_window (GncMainWindow *window, GncMainWindowSaveData *data)
 {
   GncMainWindowPrivate *priv;
-  gint num_pages, coords[4];
+  gint i, num_pages, coords[4], *order;
   gboolean maximized;
   gchar *window_group;
 
@@ -709,6 +757,18 @@
   g_key_file_set_integer(data->key_file, window_group,
 			 WINDOW_FIRSTPAGE, data->page_num);
 
+  /* Save page ordering within the notebook. Use +1 notation so the
+   * numbers in the page order match the page sections, at least for
+   * the one window case. */
+  order = malloc(sizeof(gint) * num_pages);
+  for (i = 0; i < num_pages; i++) {
+    gpointer page = g_list_nth_data(priv->usage_order, i);
+    order[i] = g_list_index(priv->installed_pages, page) + 1;
+  }
+  g_key_file_set_integer_list(data->key_file, window_group,
+			      WINDOW_PAGEORDER, order, num_pages);
+  g_free(order);
+
   /* Save the window coordinates, etc. */
   gtk_window_get_position(GTK_WINDOW(window), &coords[0], &coords[1]);
   gtk_window_get_size(GTK_WINDOW(window), &coords[2], &coords[3]);
@@ -1690,6 +1750,7 @@
 	priv = GNC_MAIN_WINDOW_GET_PRIVATE(window);
 	notebook = GTK_NOTEBOOK (priv->notebook);
 	priv->installed_pages = g_list_append (priv->installed_pages, page);
+	priv->usage_order = g_list_prepend (priv->usage_order, page);
 	gtk_notebook_append_page_menu (notebook, page->notebook_page,
 				       tab_hbox, menu_label);
 	gnc_plugin_page_inserted (page);
@@ -1724,6 +1785,7 @@
 {
 	GncMainWindowPrivate *priv;
 	GtkNotebook *notebook;
+	GncPluginPage *new_page;
 	gint page_num;
 
 	/* Disconnect the callbacks */
@@ -1742,10 +1804,17 @@
 
 	/* Remove it from the list of pages in the window */
 	priv->installed_pages = g_list_remove (priv->installed_pages, page);
+	priv->usage_order = g_list_remove (priv->usage_order, page);
 
+	/* Switch to the last recently used page */
+	notebook = GTK_NOTEBOOK (priv->notebook);
+	new_page = g_list_nth_data (priv->usage_order, 0);
+	if (new_page) {
+	  page_num =  gtk_notebook_page_num(notebook, new_page->notebook_page);
+	  gtk_notebook_set_current_page(notebook, page_num);
+	}
 
 	/* Remove the page from the notebook */
-	notebook = GTK_NOTEBOOK (priv->notebook);
 	page_num =  gtk_notebook_page_num(notebook, page->notebook_page);
 	gtk_notebook_remove_page (notebook, page_num);
 
@@ -2612,6 +2681,10 @@
 		/* Allow page specific actions */
 		gnc_plugin_page_selected (page);
 		gnc_window_update_status (GNC_WINDOW(window), page);
+
+		/* Update the page reference info */
+		priv->usage_order = g_list_remove (priv->usage_order, page);
+		priv->usage_order = g_list_prepend (priv->usage_order, page);
 	}
 
 	/* Update the menus based upon whether this is an "immutable" page. */



More information about the gnucash-changes mailing list