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