Complete the move of saving register filter/sort to .gcm

This commit changes the saving of register filter and sort information
from KVP entries to using the .gcm file. On register load these
settings are transferred to the .gcm file and the KVP entries removed.
A feature flag is also set when the first register is loaded by this
version.
This commit is contained in:
Robert Fewell 2020-05-02 14:45:14 +01:00
parent bf9c44416e
commit 6fb50d227a
3 changed files with 140 additions and 104 deletions

View File

@ -730,6 +730,10 @@ gnc_plugin_page_register_new_common (GNCLedgerDisplay* ledger)
gchar* label_color;
QofQuery* q;
// added for version 4.0 onwards
if (!gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
gnc_features_set_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER);
/* Is there an existing page? */
gsr = gnc_ledger_display_get_user_data (ledger);
if (gsr)
@ -1656,10 +1660,6 @@ static const gchar* style_names[] =
#define KEY_REGISTER_STYLE "RegisterStyle"
#define KEY_DOUBLE_LINE "DoubleLineMode"
#define KEY_PAGE_SORT "register_order"
#define KEY_PAGE_SORT_REV "register_reversed"
#define KEY_PAGE_FILTER "register_filter"
#define LABEL_ACCOUNT "Account"
#define LABEL_SUBACCOUNT "SubAccount"
#define LABEL_GL "GL"
@ -2061,6 +2061,18 @@ gnc_plugin_page_register_get_tab_color (GncPluginPage* plugin_page)
return g_strdup (color ? color : "Not Set");
}
static void
gnc_plugin_page_register_check_for_empty_group (GKeyFile *state_file, const gchar *state_section)
{
gsize num_keys;
gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys, NULL);
if (num_keys == 0)
gnc_state_drop_sections_for (state_section);
g_strfreev (keys);
}
static const gchar*
gnc_plugin_page_register_get_filter_gcm (Account* leader)
{
@ -2094,7 +2106,6 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
{
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
Account* leader;
const char* filter = NULL;
@ -2102,19 +2113,12 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
_ ("unknown"));
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
ledger_type = gnc_ledger_display_type (ld);
leader = gnc_ledger_display_leader (ld);
// load from gcm file for LD_GL or when feature is set
if (ledger_type == LD_GL ||
gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
filter = gnc_plugin_page_register_get_filter_gcm (leader);
else // load from kvp
{
if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
filter = xaccAccountGetFilter (leader);
}
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);
return filter ? g_strdup (filter) : g_strdup_printf ("%s,%s,%s,%s",
DEFAULT_FILTER,
@ -2137,6 +2141,8 @@ gnc_plugin_page_register_set_filter_gcm (Account* leader, const gchar* filter,
{
if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, NULL))
g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, NULL);
gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
}
else
{
@ -2156,32 +2162,20 @@ gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
{
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
Account* leader;
gchar* default_filter;
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
ledger_type = gnc_ledger_display_type (ld);
leader = gnc_ledger_display_leader (ld);
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 for LD_GL or when feature is set
if (ledger_type == LD_GL ||
gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
gnc_plugin_page_register_set_filter_gcm (leader, filter, default_filter);
else // save to kvp
{
if (leader != NULL)
{
if (!filter || (g_strcmp0 (filter, default_filter) == 0))
xaccAccountSetFilter (leader, NULL);
else
xaccAccountSetFilter (leader, filter);
}
}
// save to gcm file
gnc_plugin_page_register_set_filter_gcm (leader, filter, default_filter);
g_free (default_filter);
return;
}
@ -2217,8 +2211,6 @@ static gchar*
gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
{
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
Account* leader;
const char* sort_order = NULL;
@ -2226,19 +2218,12 @@ gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
_ ("unknown"));
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
ledger_type = gnc_ledger_display_type (ld);
leader = gnc_ledger_display_leader (ld);
// load from gcm file for LD_GL or when feature is set
if (ledger_type == LD_GL ||
gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
sort_order = gnc_plugin_page_register_get_sort_order_gcm (leader);
else // load from kvp
{
if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
sort_order = xaccAccountGetSortOrder (leader);
}
leader = gnc_ledger_display_leader (priv->ledger);
// load from gcm file
sort_order = gnc_plugin_page_register_get_sort_order_gcm (leader);
return g_strdup (sort_order ? sort_order : DEFAULT_SORT_ORDER);
}
@ -2257,6 +2242,8 @@ gnc_plugin_page_register_set_sort_order_gcm (Account* leader,
{
if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, NULL))
g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, NULL);
gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
}
else
g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
@ -2268,30 +2255,14 @@ gnc_plugin_page_register_set_sort_order (GncPluginPage* plugin_page,
const gchar* sort_order)
{
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
Account* leader;
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
ledger_type = gnc_ledger_display_type (ld);
leader = gnc_ledger_display_leader (ld);
// save to gcm file for LD_GL or when feature is set
if (ledger_type == LD_GL ||
gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
gnc_plugin_page_register_set_sort_order_gcm (leader, sort_order);
else // save to kvp
{
if (leader != NULL)
{
if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
xaccAccountSetSortOrder (leader, NULL);
else
xaccAccountSetSortOrder (leader, sort_order);
}
}
return;
leader = gnc_ledger_display_leader (priv->ledger);
// save to gcm file
gnc_plugin_page_register_set_sort_order_gcm (leader, sort_order);
}
static gboolean
@ -2320,27 +2291,17 @@ static gboolean
gnc_plugin_page_register_get_sort_reversed (GncPluginPage* plugin_page)
{
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
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);
ld = priv->ledger;
ledger_type = gnc_ledger_display_type (ld);
leader = gnc_ledger_display_leader (ld);
// load from gcm file for LD_GL or when feature is set
if (ledger_type == LD_GL ||
gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (leader);
else // load from kvp
{
if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
sort_reversed = xaccAccountGetSortReversed (leader);
}
leader = gnc_ledger_display_leader (priv->ledger);
// load from gcm file
sort_reversed = gnc_plugin_page_register_get_sort_reversed_gcm (leader);
return sort_reversed;
}
@ -2359,6 +2320,8 @@ gnc_plugin_page_register_set_sort_reversed_gcm (Account* leader,
{
if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL))
g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL);
gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
}
else
g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
@ -2372,25 +2335,13 @@ gnc_plugin_page_register_set_sort_reversed (GncPluginPage* plugin_page,
gboolean reverse_order)
{
GncPluginPageRegisterPrivate* priv;
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
Account* leader;
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
ld = priv->ledger;
ledger_type = gnc_ledger_display_type (ld);
leader = gnc_ledger_display_leader (ld);
leader = gnc_ledger_display_leader (priv->ledger);
// save to gcm file for LD_GL or when feature is set
if (ledger_type == LD_GL ||
gnc_features_check_used (gnc_get_current_book(), GNC_FEATURE_REG_SORT_FILTER))
gnc_plugin_page_register_set_sort_reversed_gcm (leader, reverse_order);
else // save to kvp
{
if (leader != NULL)
xaccAccountSetSortReversed (leader, reverse_order);
}
return;
// save to gcm file
gnc_plugin_page_register_set_sort_reversed_gcm (leader, reverse_order);
}
static gchar*
@ -2556,7 +2507,7 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
else
{
// clear the sort when unticking the save option
if ((priv->sd.save_order == FALSE) && (priv->sd.original_save_order == TRUE))
if ((!priv->sd.save_order) && ((priv->sd.original_save_order) || (priv->sd.original_reverse_order)))
{
gnc_plugin_page_register_set_sort_order (plugin_page, DEFAULT_SORT_ORDER);
gnc_plugin_page_register_set_sort_reversed (plugin_page, FALSE);

View File

@ -447,6 +447,82 @@ gnc_split_reg_get_register_state_group (GNCSplitReg *gsr)
}
}
static void
gsr_drop_register_width_state (GNCSplitReg *gsr, GKeyFile* state_file, const gchar *state_section)
{
GNCLedgerDisplayType ledger_type;
GNCLedgerDisplay* ld;
gboolean sort_reversed = FALSE;
gchar* sort_text = NULL;
gchar* filter_text = NULL;
// Look for any old kvp entries and add them to .gcm file
ledger_type = gnc_ledger_display_type (gsr->ledger);
// General ledger should already be using .gcm file
if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
{
Account *leader = gnc_ledger_display_leader (gsr->ledger);
const char* kvp_filter = NULL;
const char* kvp_sort_order = NULL;
gboolean kvp_sort_reversed = FALSE;
kvp_filter = xaccAccountGetFilter (leader);
if (kvp_filter)
{
gchar *temp_filter_text = g_strdup (kvp_filter);
temp_filter_text = g_strdelimit (temp_filter_text, ",",
';'); // make it conform to .gcm file list
g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
temp_filter_text);
g_free (temp_filter_text);
xaccAccountSetFilter (leader, NULL);
}
kvp_sort_order = xaccAccountGetSortOrder (leader);
if (kvp_sort_order)
{
g_key_file_set_string (state_file, state_section,
KEY_PAGE_SORT, kvp_sort_order);
xaccAccountSetSortOrder (leader, NULL);
}
kvp_sort_reversed = xaccAccountGetSortReversed (leader);
if (kvp_sort_reversed)
{
g_key_file_set_boolean (state_file, state_section,
KEY_PAGE_SORT_REV, kvp_sort_reversed);
xaccAccountSetSortReversed (leader, FALSE);
}
}
sort_reversed = g_key_file_get_boolean (state_file, state_section,
KEY_PAGE_SORT_REV, NULL);
sort_text = g_key_file_get_string (state_file, state_section,
KEY_PAGE_SORT, NULL);
filter_text = g_key_file_get_string (state_file, state_section,
KEY_PAGE_FILTER, NULL);
// drop the register state widths
gnc_state_drop_sections_for (state_section);
if (filter_text)
g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
filter_text);
if (sort_text)
g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_text);
if (sort_reversed)
g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
sort_reversed);
g_free (filter_text);
g_free (sort_text);
}
static
void
gsr_create_table( GNCSplitReg *gsr )
@ -457,9 +533,11 @@ gsr_create_table( GNCSplitReg *gsr )
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;
const gchar *default_state_section;
const gchar *group;
gboolean has_date_width = FALSE;
guid_to_string_buff (guid, guidstr);
@ -470,9 +548,12 @@ gsr_create_table( GNCSplitReg *gsr )
sr = gnc_ledger_display_get_split_register (gsr->ledger);
default_state_section = gnc_split_reg_get_register_state_group (gsr);
// see if register group has the date_width key, old format pre 4.0
has_date_width = g_key_file_has_key (state_file, register_state_section, "date_width", NULL);
// if this is from a page recreate and no register state use those settings,
// register state is dropped at the end of function.
if (gsr->page_state_name && !g_key_file_has_group (gnc_state_get_current (), register_state_section))
// register state width information is dropped at the end of function.
if (gsr->page_state_name && !has_date_width)
group = gsr->page_state_name;
else
{
@ -505,12 +586,13 @@ gsr_create_table( GNCSplitReg *gsr )
G_CALLBACK(gsr_emit_show_popup_menu), gsr);
// if no default state and register has state, copy it.
if (g_key_file_has_group (gnc_state_get_current (), register_state_section))
if (has_date_width) // we have old register state section
{
if (!gnc_split_reg_register_has_user_state (gsr))
gnc_table_save_state (sr->table, default_state_section);
// drop the register state
gnc_state_drop_sections_for (register_state_section);
// drop the register width state information
gsr_drop_register_width_state (gsr, state_file, register_state_section);
}
g_free (register_state_section);
LEAVE(" ");

View File

@ -37,6 +37,9 @@
#define IS_GNC_SPLIT_REG(obj) G_TYPE_CHECK_INSTANCE_TYPE( obj, gnc_split_reg_get_type() )
#define STATE_SECTION_REG_PREFIX "Register"
#define KEY_PAGE_SORT "register_order"
#define KEY_PAGE_SORT_REV "register_reversed"
#define KEY_PAGE_FILTER "register_filter"
typedef struct _GNCSplitReg GNCSplitReg;
typedef struct _GNCSplitRegClass GNCSplitRegClass;