Skip to content

Commit

Permalink
Bug 798759 - Register widths for 'with sub-account' not saved
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Bob-IT committed Mar 3, 2023
1 parent 855e455 commit 747b558
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 66 deletions.
67 changes: 20 additions & 47 deletions gnucash/gnome/gnc-plugin-page-register.c
Expand Up @@ -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);

Expand All @@ -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),
Expand All @@ -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;
Expand All @@ -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))
Expand All @@ -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);

Expand All @@ -2279,34 +2269,28 @@ 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),
_ ("unknown"));

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))
Expand All @@ -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);

Expand All @@ -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))
Expand All @@ -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*
Expand Down Expand Up @@ -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;

Expand Down
45 changes: 26 additions & 19 deletions gnucash/gnome/gnc-split-reg.c
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions gnucash/gnome/gnc-split-reg.h
Expand Up @@ -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 */

0 comments on commit 747b558

Please sign in to comment.