gnucash maint: Multiple changes pushed

John Ralls jralls at code.gnucash.org
Fri Mar 3 13:24:25 EST 2023


Updated	 via  https://github.com/Gnucash/gnucash/commit/f18fd609 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/8c613ff7 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/672cfddd (commit)
	 via  https://github.com/Gnucash/gnucash/commit/747b5582 (commit)
	from  https://github.com/Gnucash/gnucash/commit/c3989833 (commit)



commit f18fd609f86a691352f2f8da82015cb453339de5
Merge: c3989833a 8c613ff7a
Author: John Ralls <jralls at ceridwen.us>
Date:   Fri Mar 3 10:21:35 2023 -0800

    Merge Bob Fewell's 'bug798759' into maint.


commit 8c613ff7ab5fdb2b29fa4022e11207372916e1da
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Mar 3 13:40:05 2023 +0000

    Fix the register sheet insensitive when in reverse order

diff --git a/gnucash/register/ledger-core/split-register-load.c b/gnucash/register/ledger-core/split-register-load.c
index 7448cca54..5c8ea5e99 100644
--- a/gnucash/register/ledger-core/split-register-load.c
+++ b/gnucash/register/ledger-core/split-register-load.c
@@ -644,6 +644,9 @@ gnc_split_register_load (SplitRegister* reg, GList* slist,
                     save_loc.phys_col_offset = 0;
                 }
 
+                // used in the setting the rows insensitive
+                table->model->blank_trans_row = vcell_loc.virt_row;
+
                 gnc_split_register_add_transaction (reg,
                                                     blank_trans, blank_split,
                                                     lead_cursor, split_cursor,
@@ -726,6 +729,9 @@ gnc_split_register_load (SplitRegister* reg, GList* slist,
             save_loc.phys_col_offset = 0;
         }
 
+        // used in the setting the rows insensitive
+        table->model->blank_trans_row = vcell_loc.virt_row;
+
         gnc_split_register_add_transaction (reg, blank_trans, blank_split,
                                             lead_cursor, split_cursor,
                                             multi_line, start_primary_color,
diff --git a/gnucash/register/register-core/table-model.c b/gnucash/register/register-core/table-model.c
index 627a2e59a..ebbb8fa85 100644
--- a/gnucash/register/register-core/table-model.c
+++ b/gnucash/register/register-core/table-model.c
@@ -145,6 +145,8 @@ gnc_table_model_new (void)
     model->dividing_row = -1;
     model->dividing_row_lower = -1;
 
+    model->blank_trans_row = -1;
+
     return model;
 }
 
diff --git a/gnucash/register/register-core/table-model.h b/gnucash/register/register-core/table-model.h
index 94abd5074..184ed3a33 100644
--- a/gnucash/register/register-core/table-model.h
+++ b/gnucash/register/register-core/table-model.h
@@ -136,6 +136,9 @@ typedef struct
      * be visually distinguished. */
     int dividing_row_lower;
 
+    /* If positive, denotes the row position of the blank trans */
+    int blank_trans_row;
+
     VirtCellDataAllocator cell_data_allocator;
     VirtCellDataDeallocator cell_data_deallocator;
     VirtCellDataCopy cell_data_copy;
diff --git a/gnucash/register/register-gnome/gnucash-sheet-private.c b/gnucash/register/register-gnome/gnucash-sheet-private.c
index 07723e296..33b4b9c8b 100644
--- a/gnucash/register/register-gnome/gnucash-sheet-private.c
+++ b/gnucash/register/register-gnome/gnucash-sheet-private.c
@@ -374,6 +374,13 @@ draw_divider_line (cairo_t *cr, VirtualLocation virt_loc,
     cairo_stroke (cr);
 }
 
+static void
+set_cell_insensitive (GtkStyleContext *stylectxt)
+{
+    if (!gtk_style_context_has_class (stylectxt, GTK_STYLE_CLASS_BACKGROUND))
+        gtk_style_context_set_state (stylectxt, GTK_STATE_FLAG_INSENSITIVE);
+}
+
 static void
 draw_cell (GnucashSheet *sheet, SheetBlock *block,
            VirtualLocation virt_loc, cairo_t *cr,
@@ -409,10 +416,7 @@ draw_cell (GnucashSheet *sheet, SheetBlock *block,
     gnucash_get_style_classes (sheet, stylectxt, color_type, use_neg_class);
 
     if (sheet->read_only)
-    {
-        if (!gtk_style_context_has_class (stylectxt, GTK_STYLE_CLASS_BACKGROUND))
-            gtk_style_context_set_state (stylectxt, GTK_STATE_FLAG_INSENSITIVE);
-    }
+        set_cell_insensitive (stylectxt);
     else
     {
         if (gtk_style_context_has_class (stylectxt, GTK_STYLE_CLASS_BACKGROUND))
@@ -421,11 +425,27 @@ draw_cell (GnucashSheet *sheet, SheetBlock *block,
 
     // Are we in a read-only row? Then make the background color somewhat more grey.
     if ((virt_loc.phys_row_offset < block->style->nrows)
-                && (table->model->dividing_row_upper >= 0)
-                && (virt_loc.vcell_loc.virt_row < table->model->dividing_row_upper))
+         && (table->model->dividing_row_upper >= 0))
     {
-        if (!gtk_style_context_has_class (stylectxt, GTK_STYLE_CLASS_BACKGROUND))
-            gtk_style_context_set_state (stylectxt, GTK_STATE_FLAG_INSENSITIVE);
+        if (table->model->reverse_sort)
+        {
+            if ((table->model->blank_trans_row < table->model->dividing_row_upper)
+                 && (virt_loc.vcell_loc.virt_row >= table->model->dividing_row_upper))
+            {
+                set_cell_insensitive (stylectxt); // future trans after blank
+            }
+
+            if ((virt_loc.vcell_loc.virt_row >= table->model->dividing_row_upper)
+                 && (virt_loc.vcell_loc.virt_row < table->model->blank_trans_row))
+            {
+                set_cell_insensitive (stylectxt);
+            }
+        }
+        else // normal order
+        {
+            if (virt_loc.vcell_loc.virt_row < table->model->dividing_row_upper)
+                set_cell_insensitive (stylectxt);
+        }
     }
 
     gtk_render_background (stylectxt, cr, x, y, width, height);

commit 672cfddd6930f63aef530faf3573f75ac1417572
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Mar 3 13:20:54 2023 +0000

    Modify commit de9c0eb to not use xaccAccountSetSortReversed
    
    Account sort order / sort by and filter by are all stored in the
    register with the account functions in the process of being depreciated
    so instead get the sort order from a new value added to SplitRegister.
    
    Also in the general ledger, there is no default account and so was
    causing an error in the trace file.

diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 354576786..ba26f38e7 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -2152,11 +2152,14 @@ gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh
      *       In other words, qof_query_set_sort_increasing should
      *       always use the inverse of rev.
      */
+    SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger);
     Query *query = gnc_ledger_display_get_query( gsr->ledger );
+
+    gnc_split_register_set_reverse_sort (reg, rev);
+
     qof_query_set_sort_increasing (query, !rev, !rev, !rev);
     gsr->sort_rev = rev;
-    Account *acct = gnc_ledger_display_leader (gsr->ledger);
-    xaccAccountSetSortReversed(acct, rev);
+
     if (refresh)
         gnc_ledger_display_refresh( gsr->ledger );
 }
diff --git a/gnucash/register/ledger-core/split-register-load.c b/gnucash/register/ledger-core/split-register-load.c
index 99d8df6bd..7448cca54 100644
--- a/gnucash/register/ledger-core/split-register-load.c
+++ b/gnucash/register/ledger-core/split-register-load.c
@@ -377,7 +377,6 @@ gnc_split_register_load (SplitRegister* reg, GList* slist,
     gboolean need_divider_upper = FALSE;
     gboolean found_divider_upper = FALSE;
     gboolean found_divider = FALSE;
-    bool reverse_sort = xaccAccountGetSortReversed(default_account);
     gboolean has_last_num = FALSE;
     gboolean multi_line;
     gboolean dynamic;
@@ -610,8 +609,8 @@ gnc_split_register_load (SplitRegister* reg, GList* slist,
             use_autoreadonly &&
             !found_divider_upper)
         {
-            if (((reverse_sort && xaccTransGetDate(trans) < autoreadonly_time) ||
-                 (!reverse_sort && xaccTransGetDate (trans) >= autoreadonly_time)))
+            if (((table->model->reverse_sort && xaccTransGetDate(trans) < autoreadonly_time) ||
+                 (!table->model->reverse_sort && xaccTransGetDate (trans) >= autoreadonly_time)))
             {
                 table->model->dividing_row_upper = vcell_loc.virt_row;
                 found_divider_upper = TRUE;
@@ -623,8 +622,8 @@ gnc_split_register_load (SplitRegister* reg, GList* slist,
         }
 
         if (info->show_present_divider && !found_divider &&
-            ((reverse_sort && xaccTransGetDate(trans) < present) ||
-             (!reverse_sort && xaccTransGetDate (trans) > present)))
+            ((table->model->reverse_sort && xaccTransGetDate (trans) < present) ||
+             (!table->model->reverse_sort && xaccTransGetDate (trans) > present)))
         {
             table->model->dividing_row = vcell_loc.virt_row;
             found_divider = TRUE;
diff --git a/gnucash/register/ledger-core/split-register.c b/gnucash/register/ledger-core/split-register.c
index 6c0bfa4a1..0d6a2f867 100644
--- a/gnucash/register/ledger-core/split-register.c
+++ b/gnucash/register/ledger-core/split-register.c
@@ -2942,6 +2942,13 @@ gnc_split_register_config (SplitRegister* reg,
     gnc_table_realize_gui (reg->table);
 }
 
+void
+gnc_split_register_set_reverse_sort (SplitRegister* reg, gboolean reverse_sort)
+{
+    g_return_if_fail (reg);
+    gnc_table_model_set_reverse_sort (reg->table->model, reverse_sort);
+}
+
 void
 gnc_split_register_set_auto_complete (SplitRegister* reg,
                                       gboolean do_auto_complete)
diff --git a/gnucash/register/ledger-core/split-register.h b/gnucash/register/ledger-core/split-register.h
index 4bcfe8e06..5274c6aae 100644
--- a/gnucash/register/ledger-core/split-register.h
+++ b/gnucash/register/ledger-core/split-register.h
@@ -323,6 +323,15 @@ void gnc_split_register_config (SplitRegister* reg,
                                 SplitRegisterStyle style,
                                 gboolean use_double_line);
 
+/** Sets a split register's reverse sort order based on register
+ *
+ *  @param reg a ::SplitRegister
+ *
+ *  @param reverse_sort @c TRUE reverse sort order, @c FALSE default
+ */
+void gnc_split_register_set_reverse_sort (SplitRegister* reg,
+                                          gboolean reverse_sort);
+
 /** Sets whether a register uses auto-completion.
  *
  *  @param reg a ::SplitRegister
diff --git a/gnucash/register/register-core/table-model.c b/gnucash/register/register-core/table-model.c
index b2952634e..627a2e59a 100644
--- a/gnucash/register/register-core/table-model.c
+++ b/gnucash/register/register-core/table-model.c
@@ -199,6 +199,14 @@ gnc_table_model_read_only (TableModel *model)
     return model->read_only;
 }
 
+void
+gnc_table_model_set_reverse_sort (TableModel *model,
+                                  gboolean reverse_sort)
+{
+    g_return_if_fail (model);
+    model->reverse_sort = reverse_sort;
+}
+
 void
 gnc_table_model_set_entry_handler (TableModel *model,
                                    TableGetEntryHandler entry_handler,
diff --git a/gnucash/register/register-core/table-model.h b/gnucash/register/register-core/table-model.h
index 55aee0b38..94abd5074 100644
--- a/gnucash/register/register-core/table-model.h
+++ b/gnucash/register/register-core/table-model.h
@@ -122,6 +122,10 @@ typedef struct
      * and edits should not be allowed. */
     gboolean read_only;
 
+    /* If true, denotes that this table is being displayed
+     * in the reverse direction. */
+    gboolean reverse_sort;
+
     /* If positive, denotes a row that marks a boundary that should
      * be visually distinguished. */
     int dividing_row;
@@ -145,6 +149,9 @@ void         gnc_table_model_set_read_only (TableModel *model,
         gboolean read_only);
 gboolean     gnc_table_model_read_only (TableModel *model);
 
+void         gnc_table_model_set_reverse_sort (TableModel *model,
+                                               gboolean read_only);
+
 void gnc_table_model_set_entry_handler
 (TableModel *model,
  TableGetEntryHandler entry_handler,

commit 747b558216a61ac782106c9f5b3157e02d4daad3
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Fri Mar 3 13:19:00 2023 +0000

    Bug 798759 - Register widths for 'with sub-account' not saved
    
    Register widths are saved in the .gcm file under sections based on the
    account guid. When you have for example an 'Assets' register open and
    the 'with sub-account' register page 'Assets+' open, they will both
    save there settings to the same section as there is only one guid.
    
    To fix this, add a '+' to the end of the guid for the sub-account
    section as done for the title.

diff --git a/gnucash/gnome/gnc-plugin-page-register.c b/gnucash/gnome/gnc-plugin-page-register.c
index 72ebe469b..5ea8635f9 100644
--- a/gnucash/gnome/gnc-plugin-page-register.c
+++ b/gnucash/gnome/gnc-plugin-page-register.c
@@ -2145,17 +2145,15 @@ gnc_plugin_page_register_check_for_empty_group (GKeyFile *state_file, const gcha
 }
 
 static gchar*
-gnc_plugin_page_register_get_filter_gcm (Account* leader)
+gnc_plugin_page_register_get_filter_gcm (GNCSplitReg *gsr)
 {
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
     GError* error = NULL;
     char* filter = NULL;
 
     // get the filter from the .gcm file
-    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    state_section = gsr_get_register_state_section (gsr);
     filter = g_key_file_get_string (state_file, state_section,
                                     KEY_PAGE_FILTER, &error);
 
@@ -2173,7 +2171,6 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
 {
     GncPluginPageRegisterPrivate* priv;
     GNCLedgerDisplayType ledger_type;
-    Account* leader;
     char* filter = NULL;
 
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
@@ -2182,10 +2179,9 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
 
     ledger_type = gnc_ledger_display_type (priv->ledger);
-    leader = gnc_ledger_display_leader (priv->ledger);
 
     // load from gcm file
-    filter = gnc_plugin_page_register_get_filter_gcm (leader);
+    filter = gnc_plugin_page_register_get_filter_gcm (priv->gsr);
 
     if (filter)
         return filter;
@@ -2195,17 +2191,15 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
 }
 
 static void
-gnc_plugin_page_register_set_filter_gcm (Account* leader, const gchar* filter,
+gnc_plugin_page_register_set_filter_gcm (GNCSplitReg *gsr, const gchar* filter,
                                          gchar* default_filter)
 {
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section;
     gchar* filter_text;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     // save the filter to the .gcm file also
-    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    state_section = gsr_get_register_state_section (gsr);
     if (!filter || (g_strcmp0 (filter, default_filter) == 0))
     {
         if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, NULL))
@@ -2230,37 +2224,33 @@ gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
 {
     GncPluginPageRegisterPrivate* priv;
     GNCLedgerDisplayType ledger_type;
-    Account* leader;
     gchar* default_filter;
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
 
     ledger_type = gnc_ledger_display_type (priv->ledger);
-    leader = gnc_ledger_display_leader (priv->ledger);
 
     default_filter = g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER,
                                       "0", "0", get_filter_default_num_of_days (ledger_type));
 
     // save to gcm file
-    gnc_plugin_page_register_set_filter_gcm (leader, filter, default_filter);
+    gnc_plugin_page_register_set_filter_gcm (priv->gsr, filter, default_filter);
 
     g_free (default_filter);
     return;
 }
 
 static gchar*
-gnc_plugin_page_register_get_sort_order_gcm (Account* leader)
+gnc_plugin_page_register_get_sort_order_gcm (GNCSplitReg *gsr)
 {
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section;
     gchar* sort_text;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
     GError* error = NULL;
     char* sort_order = NULL;
 
     // get the sort_order from the .gcm file
-    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    state_section = gsr_get_register_state_section (gsr);
     sort_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_SORT,
                                        &error);
 
@@ -2279,7 +2269,6 @@ static gchar*
 gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
 {
     GncPluginPageRegisterPrivate* priv;
-    Account* leader;
     char* sort_order = NULL;
 
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
@@ -2287,26 +2276,21 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
 
-    leader = gnc_ledger_display_leader (priv->ledger);
-
     // load from gcm file
-    sort_order = gnc_plugin_page_register_get_sort_order_gcm (leader);
-
+    sort_order = gnc_plugin_page_register_get_sort_order_gcm (priv->gsr);
 
     return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
 }
 
 static void
-gnc_plugin_page_register_set_sort_order_gcm (Account* leader,
+gnc_plugin_page_register_set_sort_order_gcm (GNCSplitReg *gsr,
                                              const gchar* sort_order)
 {
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     // save sort_order to the .gcm file also
-    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    state_section = gsr_get_register_state_section (gsr);
     if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
     {
         if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, NULL))
@@ -2324,28 +2308,23 @@ gnc_plugin_page_register_set_sort_order (GncPluginPage* plugin_page,
                                          const gchar* sort_order)
 {
     GncPluginPageRegisterPrivate* priv;
-    Account* leader;
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
 
-    leader = gnc_ledger_display_leader (priv->ledger);
-
     // save to gcm file
-    gnc_plugin_page_register_set_sort_order_gcm (leader, sort_order);
+    gnc_plugin_page_register_set_sort_order_gcm (priv->gsr, sort_order);
 }
 
 static gboolean
-gnc_plugin_page_register_get_sort_reversed_gcm (Account* leader)
+gnc_plugin_page_register_get_sort_reversed_gcm (GNCSplitReg *gsr)
 {
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
     GError* error = NULL;
     gboolean sort_reversed = FALSE;
 
     // get the sort_reversed from the .gcm file
-    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    state_section = gsr_get_register_state_section (gsr);
     sort_reversed = g_key_file_get_boolean (state_file, state_section,
                                             KEY_PAGE_SORT_REV, &error);
 
@@ -2360,31 +2339,27 @@ static gboolean
 gnc_plugin_page_register_get_sort_reversed (GncPluginPage* plugin_page)
 {
     GncPluginPageRegisterPrivate* priv;
-    Account* leader;
     gboolean sort_reversed = FALSE;
 
     g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), FALSE);
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
 
-    leader = gnc_ledger_display_leader (priv->ledger);
-
     // load from gcm file
-    sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (leader);
+    sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (priv->gsr);
     return sort_reversed;
 }
 
 static void
-gnc_plugin_page_register_set_sort_reversed_gcm (Account* leader,
+gnc_plugin_page_register_set_sort_reversed_gcm (GNCSplitReg *gsr,
                                                 gboolean reverse_order)
 {
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section;
-    gchar acct_guid[GUID_ENCODING_LENGTH + 1];
 
     // save reverse_order to the .gcm file also
-    guid_to_string_buff (xaccAccountGetGUID (leader), acct_guid);
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", acct_guid, NULL);
+    state_section = gsr_get_register_state_section (gsr);
+
     if (!reverse_order)
     {
         if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL))
@@ -2404,13 +2379,11 @@ gnc_plugin_page_register_set_sort_reversed (GncPluginPage* plugin_page,
                                             gboolean reverse_order)
 {
     GncPluginPageRegisterPrivate* priv;
-    Account* leader;
 
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
-    leader = gnc_ledger_display_leader (priv->ledger);
 
     // save to gcm file
-    gnc_plugin_page_register_set_sort_reversed_gcm (leader, reverse_order);
+    gnc_plugin_page_register_set_sort_reversed_gcm (priv->gsr, reverse_order);
 }
 
 static gchar*
@@ -5264,7 +5237,7 @@ gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
     }
 
     // only update status text if on current page
-    if (GNC_IS_MAIN_WINDOW(window) && (gnc_main_window_get_current_page 
+    if (GNC_IS_MAIN_WINDOW(window) && (gnc_main_window_get_current_page
        (GNC_MAIN_WINDOW(window)) != GNC_PLUGIN_PAGE(register_page)))
        return;
 
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 38cf709a7..354576786 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -454,22 +454,36 @@ gsr_move_sort_and_filter_to_state_file (GNCSplitReg *gsr, GKeyFile* state_file,
     }
 }
 
+gchar *
+gsr_get_register_state_section (GNCSplitReg *gsr)
+{
+    GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
+    Account *account = gnc_ledger_display_leader (gsr->ledger);
+    const GncGUID *guid = xaccAccountGetGUID (account);
+    gchar guidstr[GUID_ENCODING_LENGTH+1];
+    gchar *register_state_section;
+
+    guid_to_string_buff (guid, guidstr);
+
+    if (ledger_type == LD_SUBACCOUNT)
+        register_state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", guidstr, "+", NULL);
+    else
+        register_state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", guidstr, NULL);
+
+    return register_state_section;
+}
+
 static
 void
 gsr_create_table( GNCSplitReg *gsr )
 {
     GtkWidget *register_widget = NULL;
     SplitRegister *sr = NULL;
-
-    Account * account = gnc_ledger_display_leader(gsr->ledger);
-    const GncGUID * guid = xaccAccountGetGUID(account);
-    gchar guidstr[GUID_ENCODING_LENGTH+1];
     GKeyFile* state_file = gnc_state_get_current();
     gchar *register_state_section;
 
-    guid_to_string_buff (guid, guidstr);
-
-    register_state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", guidstr, NULL);
+    /* register_state_section is used to store per register state: column widths, sort order,... */
+    register_state_section = gsr_get_register_state_section (gsr);
 
     ENTER("gsr=%p", gsr);
 
@@ -786,29 +800,22 @@ static void
 gnc_split_reg_ld_destroy( GNCLedgerDisplay *ledger )
 {
     GNCSplitReg *gsr = gnc_ledger_display_get_user_data( ledger );
-    Account * account = gnc_ledger_display_leader(ledger);
-    const GncGUID * guid = xaccAccountGetGUID(account);
-    gchar guidstr[GUID_ENCODING_LENGTH+1];
-    gchar *state_section;
-    guid_to_string_buff(guid, guidstr);
-
-    state_section = g_strconcat (STATE_SECTION_REG_PREFIX, " ", guidstr, NULL);
 
     if (gsr)
     {
-        SplitRegister *reg;
-
-        reg = gnc_ledger_display_get_split_register (ledger);
+        /* register_state_section is used to store per register state: column widths, sort order,... */
+        gchar *register_state_section = gsr_get_register_state_section (gsr);
+        SplitRegister *reg = gnc_ledger_display_get_split_register (ledger);
 
         if (reg && reg->table)
-            gnc_table_save_state (reg->table, state_section);
+            gnc_table_save_state (reg->table, register_state_section);
 
         /*
          * Don't destroy the window here any more.  The register no longer
          * owns it.
          */
+        g_free (register_state_section);
     }
-    g_free (state_section);
 
     gnc_ledger_display_set_user_data (ledger, NULL);
     g_object_unref (gsr);
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index d19d0956e..c1fcb5a08 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -299,6 +299,14 @@ void gsr_default_reinit_handler( GNCSplitReg *gsr, gpointer data );
 void gsr_default_expand_handler( GNCSplitReg *gsr, gpointer data );
 void gsr_default_schedule_handler( GNCSplitReg *gsr, gpointer data );
 
+/** Get the register state section
+ *
+ *  @param gsr A pointer to GNCSplitReg
+ * 
+ *  @return The register state section, to be freed by caller
+ **/
+gchar *gsr_get_register_state_section (GNCSplitReg *gsr);
+
 void gnc_split_reg_set_moved_cb( GNCSplitReg *gsr, GFunc cb, gpointer cb_data );
 
 #endif /* GNC_SPLIT_REG_H */



Summary of changes:
 gnucash/gnome/gnc-plugin-page-register.c           | 67 +++++++---------------
 gnucash/gnome/gnc-split-reg.c                      | 52 ++++++++++-------
 gnucash/gnome/gnc-split-reg.h                      |  8 +++
 gnucash/register/ledger-core/split-register-load.c | 15 +++--
 gnucash/register/ledger-core/split-register.c      |  7 +++
 gnucash/register/ledger-core/split-register.h      |  9 +++
 gnucash/register/register-core/table-model.c       | 10 ++++
 gnucash/register/register-core/table-model.h       | 10 ++++
 .../register-gnome/gnucash-sheet-private.c         | 36 +++++++++---
 9 files changed, 133 insertions(+), 81 deletions(-)



More information about the gnucash-changes mailing list