gnucash maint: Bug 770136 - 'Reverse Order' in 'View'->'Sort by' is not saved
Geert Janssens
gjanssens at code.gnucash.org
Wed Aug 24 05:54:09 EDT 2016
Updated via https://github.com/Gnucash/gnucash/commit/bd34059d (commit)
from https://github.com/Gnucash/gnucash/commit/59c5f8e0 (commit)
commit bd34059d2922c0258121ab899c7f3b4e23ab4c1a
Author: Geert Janssens <janssens-geert at telenet.be>
Date: Wed Aug 24 11:53:44 2016 +0200
Bug 770136 - 'Reverse Order' in 'View'->'Sort by' is not saved
diff --git a/src/engine/Account.c b/src/engine/Account.c
index c0f120b..922ce0f 100644
--- a/src/engine/Account.c
+++ b/src/engine/Account.c
@@ -84,6 +84,7 @@ enum
PROP_PLACEHOLDER,
PROP_FILTER,
PROP_SORT_ORDER,
+ PROP_SORT_REVERSED,
};
#define GET_PRIVATE(o) \
@@ -377,6 +378,9 @@ gnc_account_get_property (GObject *object,
case PROP_SORT_ORDER:
g_value_set_string(value, xaccAccountGetSortOrder(account));
break;
+ case PROP_SORT_REVERSED:
+ g_value_set_boolean(value, xaccAccountGetSortReversed(account));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -476,6 +480,9 @@ gnc_account_set_property (GObject *object,
case PROP_SORT_ORDER:
xaccAccountSetSortOrder(account, g_value_get_string(value));
break;
+ case PROP_SORT_REVERSED:
+ xaccAccountSetSortReversed(account, g_value_get_boolean(value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -833,6 +840,15 @@ gnc_account_class_init (AccountClass *klass)
"the sort order to be recalled.",
NULL,
G_PARAM_READWRITE));
+
+ g_object_class_install_property
+ (gobject_class,
+ PROP_SORT_REVERSED,
+ g_param_spec_boolean ("sort-reversed",
+ "Account Sort Reversed",
+ "Parameter to store whether the sort order is reversed or not.",
+ FALSE,
+ G_PARAM_READWRITE));
}
static void
@@ -2193,6 +2209,18 @@ xaccAccountSetSortOrder (Account *acc, const char *str)
xaccAccountCommitEdit(acc);
}
+void
+xaccAccountSetSortReversed (Account *acc, gboolean sortreversed)
+{
+ g_return_if_fail(GNC_IS_ACCOUNT(acc));
+
+ xaccAccountBeginEdit (acc);
+ kvp_frame_set_string (acc->inst.kvp_data, "sort-reversed",
+ sortreversed ? "true" : NULL);
+ mark_account (acc);
+ xaccAccountCommitEdit (acc);
+}
+
static void
qofAccountSetParent (Account *acc, QofInstance *parent)
{
@@ -2964,6 +2992,17 @@ xaccAccountGetSortOrder (const Account *acc)
return acc ? kvp_frame_get_string(acc->inst.kvp_data, "sort-order") : NULL;
}
+gboolean
+xaccAccountGetSortReversed (const Account *acc)
+{
+ const char *str;
+
+ g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
+
+ str = kvp_frame_get_string(acc->inst.kvp_data, "sort-reversed");
+ return (str && !strcmp(str, "true"));
+}
+
const char *
xaccAccountGetNotes (const Account *acc)
{
@@ -4824,6 +4863,11 @@ gboolean xaccAccountRegister (void)
(QofSetterFunc) xaccAccountSetSortOrder
},
{
+ ACCOUNT_SORT_REVERSED_, QOF_TYPE_BOOLEAN,
+ (QofAccessFunc) xaccAccountGetSortReversed,
+ (QofSetterFunc) xaccAccountSetSortReversed
+ },
+ {
ACCOUNT_NOTES_, QOF_TYPE_STRING,
(QofAccessFunc) xaccAccountGetNotes,
(QofSetterFunc) xaccAccountSetNotes
diff --git a/src/engine/Account.h b/src/engine/Account.h
index ae1f0a8..742e4f1 100644
--- a/src/engine/Account.h
+++ b/src/engine/Account.h
@@ -293,6 +293,8 @@ void xaccAccountSetColor (Account *account, const char *color);
void xaccAccountSetFilter (Account *account, const char *filter);
/** Set the account's Sort Order */
void xaccAccountSetSortOrder (Account *account, const char *sortorder);
+/** Set the account's Sort Order direction */
+void xaccAccountSetSortReversed (Account *account, gboolean sortreversed);
/** Set the account's notes */
void xaccAccountSetNotes (Account *account, const char *notes);
/** Set the last num field of an Account */
@@ -384,6 +386,8 @@ const char * xaccAccountGetColor (const Account *account);
const char * xaccAccountGetFilter (const Account *account);
/** Get the account's Sort Order */
const char * xaccAccountGetSortOrder (const Account *account);
+/** Get the account's Sort Order direction */
+gboolean xaccAccountGetSortReversed (const Account *account);
/** Get the account's notes */
const char * xaccAccountGetNotes (const Account *account);
/** Get the last num field of an Account */
@@ -1400,6 +1404,7 @@ const char * dxaccAccountGetQuoteTZ (const Account *account);
#define ACCOUNT_COLOR_ "color"
#define ACCOUNT_FILTER_ "filter"
#define ACCOUNT_SORT_ORDER_ "sort-order"
+#define ACCOUNT_SORT_REVERSED_ "sort-reversed"
#define ACCOUNT_NOTES_ "notes"
#define ACCOUNT_BALANCE_ "balance"
#define ACCOUNT_CLEARED_ "cleared"
diff --git a/src/gnome/gnc-plugin-page-register.c b/src/gnome/gnc-plugin-page-register.c
index 950b526..88b03a5 100644
--- a/src/gnome/gnc-plugin-page-register.c
+++ b/src/gnome/gnc-plugin-page-register.c
@@ -115,6 +115,8 @@ void gnc_plugin_page_register_sort_order_reverse_cb(GtkToggleButton *button, Gnc
static gchar *gnc_plugin_page_register_get_sort_order (GncPluginPage *plugin_page);
void gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar *sort_order);
+static gboolean gnc_plugin_page_register_get_sort_reversed (GncPluginPage *plugin_page);
+void gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean reverse_order);
/* Callbacks for the "Filter By" dialog */
void gnc_plugin_page_register_filter_select_range_cb(GtkRadioButton *button, GncPluginPageRegister *page);
@@ -540,6 +542,7 @@ typedef struct GncPluginPageRegisterPrivate
gboolean original_save_order;
gboolean save_order;
gboolean reverse_order;
+ gboolean original_reverse_order;
} sd;
struct
@@ -1100,7 +1103,6 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
{
/* Set the sort order for the split register and status of save order button */
priv->sd.save_order = FALSE;
- priv->sd.reverse_order = FALSE;
order = gnc_plugin_page_register_get_sort_order(plugin_page);
PINFO("Loaded Sort order is %s", order);
@@ -1113,6 +1115,13 @@ gnc_plugin_page_register_create_widget (GncPluginPage *plugin_page)
priv->sd.original_save_order = priv->sd.save_order;
g_free(order);
+ priv->sd.reverse_order = gnc_plugin_page_register_get_sort_reversed(plugin_page);
+ gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.reverse_order);
+ if (priv->sd.reverse_order)
+ priv->sd.save_order = TRUE;
+
+ priv->sd.original_reverse_order = priv->sd.reverse_order;
+
/* Set the filter for the split register and status of save filter button */
priv->fd.save_filter = FALSE;
@@ -1740,6 +1749,45 @@ gnc_plugin_page_register_set_sort_order (GncPluginPage *plugin_page, const gchar
return;
}
+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);
+
+ if ((ledger_type == LD_SINGLE) || (ledger_type == LD_SUBACCOUNT))
+ sort_reversed = xaccAccountGetSortReversed (leader);
+
+ return sort_reversed;
+}
+
+void
+gnc_plugin_page_register_set_sort_reversed (GncPluginPage *plugin_page, gboolean reverse_order)
+{
+ GncPluginPageRegisterPrivate *priv;
+ GNCLedgerDisplay *ld;
+ Account *leader;
+
+ priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(plugin_page);
+ ld = priv->ledger;
+ leader = gnc_ledger_display_leader (ld);
+
+ if (leader != NULL)
+ xaccAccountSetSortReversed (leader, reverse_order);
+
+ return;
+}
+
static gchar *
gnc_plugin_page_register_get_long_name (GncPluginPage *plugin_page)
{
@@ -1872,6 +1920,8 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog *dialog,
if (response != GTK_RESPONSE_OK)
{
/* Restore the original sort order */
+ gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.original_reverse_order);
+ priv->sd.reverse_order = priv->sd.original_reverse_order;
gnc_split_reg_set_sort_type(priv->gsr, priv->sd.original_sort_type);
priv->sd.save_order = priv->sd.original_save_order;
}
@@ -1884,6 +1934,7 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog *dialog,
type = gnc_split_reg_get_sort_type(priv->gsr);
order = SortTypeasString(type);
gnc_plugin_page_register_set_sort_order (plugin_page, order);
+ gnc_plugin_page_register_set_sort_reversed (plugin_page, priv->sd.reverse_order);
}
}
gnc_book_option_remove_cb(OPTION_NAME_NUM_FIELD_SOURCE,
@@ -1977,16 +2028,8 @@ gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton *button,
/* Compute the new save sort order */
priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
- if (gtk_toggle_button_get_active(button))
- {
- gnc_split_reg_set_sort_reversed(priv->gsr, FALSE);
- priv->sd.reverse_order = TRUE;
- }
- else
- {
- gnc_split_reg_set_sort_reversed(priv->gsr, TRUE);
- priv->sd.reverse_order = FALSE;
- }
+ priv->sd.reverse_order = gtk_toggle_button_get_active(button);
+ gnc_split_reg_set_sort_reversed(priv->gsr, priv->sd.reverse_order);
LEAVE(" ");
}
@@ -3101,6 +3144,7 @@ gnc_plugin_page_register_cmd_view_sort_by (GtkAction *action,
button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_reverse"));
if(priv->sd.reverse_order == TRUE)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ priv->sd.original_reverse_order = priv->sd.reverse_order;
priv->sd.num_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_NUM"));
priv->sd.act_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_ACTION"));
diff --git a/src/gnome/gnc-split-reg.c b/src/gnome/gnc-split-reg.c
index f6219b8..a336213 100644
--- a/src/gnome/gnc-split-reg.c
+++ b/src/gnome/gnc-split-reg.c
@@ -1895,8 +1895,13 @@ gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
void
gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev)
{
+ /* Note: sort_reversed is the boolean opposite of sort_increasing
+ * so when rev == true, we're sorting decreasing
+ * In other words, qof_query_set_sort_increasing should
+ * always use the inverse of rev.
+ */
Query *query = gnc_ledger_display_get_query( gsr->ledger );
- qof_query_set_sort_increasing (query, rev, rev, rev);
+ qof_query_set_sort_increasing (query, !rev, !rev, !rev);
gnc_ledger_display_refresh( gsr->ledger );
}
Summary of changes:
src/engine/Account.c | 44 ++++++++++++++++++++++++
src/engine/Account.h | 5 +++
src/gnome/gnc-plugin-page-register.c | 66 ++++++++++++++++++++++++++++++------
src/gnome/gnc-split-reg.c | 7 +++-
4 files changed, 110 insertions(+), 12 deletions(-)
More information about the gnucash-changes
mailing list