gnucash stable: Multiple changes pushed

Robert Fewell bobit at code.gnucash.org
Sun Apr 19 05:13:19 EDT 2026


Updated	 via  https://github.com/Gnucash/gnucash/commit/1bed1f1e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/efd3edca (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1a25310c (commit)
	 via  https://github.com/Gnucash/gnucash/commit/cdd75f42 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/a56fdf04 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1e1bbfd2 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/42d476ea (commit)
	 via  https://github.com/Gnucash/gnucash/commit/ea36ecc8 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1cca75cb (commit)
	 via  https://github.com/Gnucash/gnucash/commit/d51b2882 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/4855345e (commit)
	 via  https://github.com/Gnucash/gnucash/commit/bad32f35 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/94bc521b (commit)
	 via  https://github.com/Gnucash/gnucash/commit/a6ced0bb (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1ac61411 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/5d538f23 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1fc2b550 (commit)
	 via  https://github.com/Gnucash/gnucash/commit/1d913a8e (commit)
	from  https://github.com/Gnucash/gnucash/commit/8281853b (commit)



commit 1bed1f1e600a496bfed59f4420a918db2e9913d5
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Apr 15 09:43:27 2026 +0100

    Use a blocking function to reduce duplication
    
    When setting GtkToggleButtons there is a need to block the associated
    callback so instead of wrapping individual uses add a function to do it.

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index 9ca39aacc0..aedc53ec3f 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -718,6 +718,21 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
     LEAVE(" ");
 }
 
+static void
+set_checkbutton_with_blocking (GtkWidget *widget,
+                               GFunc function,
+                               RegisterFilterDialog *rfd,
+                               gboolean active)
+{
+    PINFO("Block GtkToggleButton %p for setting active %s",
+           widget, active ? "TRUE" : "FALSE");
+    g_signal_handlers_block_by_func (widget,
+                                     (gpointer)function, rfd);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), active);
+    g_signal_handlers_unblock_by_func (widget,
+                                       (gpointer)function, rfd);
+}
+
 /** This function is called whenever the "select all" status button is
  *  clicked.  It updates all of the checkbox widgets, then updates the
  *  query on the register.
@@ -740,13 +755,9 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
     /* Turn on all the check menu items */
     for (const auto& action : status_actions)
     {
-        g_signal_handlers_block_by_func (action.widget,
-                                         (gpointer)gnc_ppr_filter_status_one_cb,
-                                         rfd);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), TRUE);
-        g_signal_handlers_unblock_by_func (action.widget,
-                                           (gpointer)gnc_ppr_filter_status_one_cb,
-                                           rfd);
+        set_checkbutton_with_blocking (action.widget,
+                                       (GFunc)gnc_ppr_filter_status_one_cb,
+                                       rfd, TRUE);
     }
 
     /* Set the requested status */
@@ -777,13 +788,9 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
     /* Turn off all the check menu items */
     for (const auto& action : status_actions)
     {
-        g_signal_handlers_block_by_func (action.widget,
-                                         (gpointer)gnc_ppr_filter_status_one_cb,
-                                         rfd);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), FALSE);
-        g_signal_handlers_unblock_by_func (action.widget,
-                                           (gpointer)gnc_ppr_filter_status_one_cb,
-                                           rfd);
+        set_checkbutton_with_blocking (action.widget,
+                                       (GFunc)gnc_ppr_filter_status_one_cb,
+                                       rfd, FALSE);
     }
 
     /* Set the requested status */

commit efd3edca9528df5e0cb35e12bf59a5e98e7a1fbd
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 14:17:05 2026 +0100

    Change load and save of the filter
    
    Use separate functions to break up and create filter string

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index 36100329b5..9ca39aacc0 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -191,6 +191,20 @@ gnc_ppr_filter_dmy2time (std::string date_string)
     return gnc_mktime (&when);
 }
 
+static std::vector<std::string>
+split_filter_by_delimiter (std::string str, char delimiter)
+{
+    std::istringstream ss;
+    std::vector<std::string> res;
+    std::string token;
+    ss.str (str);
+    while (std::getline (ss, token, delimiter))
+    {
+        res.push_back (token);
+    }
+    return res;
+}
+
 static void
 gnc_ppr_check_for_empty_group (GKeyFile *state_file,
                                const gchar *state_section)
@@ -205,11 +219,8 @@ gnc_ppr_check_for_empty_group (GKeyFile *state_file,
 }
 
 static std::string
-gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
+gnc_ppr_filter_load_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
 {
-    if (!gsr)
-        return _("unknown");
-
     // get the filter from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
     auto state_section = gsr_get_register_state_section (gsr);
@@ -234,11 +245,74 @@ gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
 }
 
 static void
-gnc_ppr_filter_set_filter (GNCSplitReg *gsr, std::string filter)
+set_filterdata_to_defaults (FilterData *fd)
+{
+    fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER, nullptr, 16);
+    fd->start_time = 0;
+    fd->end_time = 0;
+    fd->days = 0;
+    fd->save_filter = false;
+}
+
+static void
+gnc_ppr_filter_load_filter_parts (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type, FilterData *fd)
 {
+    set_filterdata_to_defaults (fd);
+    fd->dialog = nullptr;
+
     if (!gsr)
         return;
 
+    std::string filter_str = gnc_ppr_filter_load_filter (gsr, ledger_type);
+
+    PINFO("Loaded Filter String is %s", filter_str.c_str());
+
+    std::vector<std::string> split_filter = split_filter_by_delimiter (filter_str, ';');
+    int split_filter_size = split_filter.size();
+
+    if (split_filter_size > 0 && (split_filter[0].compare (DEFAULT_FILTER)) != 0)
+    {
+        PINFO("Loaded Filter Status is %s", split_filter[0].c_str());
+
+        fd->cleared_match = (cleared_match_t)std::stol (split_filter[0], nullptr, 16);
+        fd->save_filter = true;
+    }
+
+    if (split_filter_size > 1 && (split_filter[1].compare (std::string ("0"))) != 0)
+    {
+        PINFO("Loaded Filter Start Date is %s", split_filter[1].c_str());
+
+        fd->start_time = gnc_ppr_filter_dmy2time (split_filter[1]);
+        fd->start_time = gnc_time64_get_day_start (fd->start_time);
+        fd->save_filter = true;
+    }
+
+    if (split_filter_size > 2 && (split_filter[2].compare (std::string ("0"))) != 0)
+    {
+        PINFO("Loaded Filter End Date is %s", split_filter[2].c_str());
+
+        fd->end_time = gnc_ppr_filter_dmy2time (split_filter[2]);
+        fd->end_time = gnc_time64_get_day_end (fd->end_time);
+        fd->save_filter = true;
+    }
+
+    // set the default for the number of days
+    fd->days = (int)std::stol (get_filter_default_num_of_days (ledger_type), nullptr, 10);
+
+    if (split_filter_size > 3 &&
+        (split_filter[3].compare (get_filter_default_num_of_days (ledger_type)) != 0))
+    {
+        PINFO("Loaded Filter Days is %s", split_filter[3].c_str());
+
+        fd->days = (int)std::stol (split_filter[3], nullptr, 10);
+        fd->save_filter = true;
+    }
+}
+
+static void
+gnc_ppr_filter_save_filter (GNCSplitReg *gsr, std::string filter)
+
+{
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
 
     std::string default_filter_str = DEFAULT_FILTER + ";0;0;" +
@@ -257,13 +331,57 @@ gnc_ppr_filter_set_filter (GNCSplitReg *gsr, std::string filter)
     }
     else
     {
+        PINFO("The filter to save is %s", filter.c_str());
         g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
                                filter.c_str());
-
     }
     g_free (state_section);
 }
 
+static void
+gnc_ppr_filter_save_filter_parts (GNCSplitReg *gsr, FilterData *fd)
+{
+    if (!gsr)
+        return;
+
+    std::string save_filter_str;
+
+    if (fd->save_filter)
+    {
+        static const size_t buffer_size = 10;
+        char buffer [buffer_size];
+
+        // cleared match
+        std::snprintf (buffer, buffer_size, "0x%04x", fd->cleared_match);
+        save_filter_str.append (buffer);
+
+        // start time
+        if (fd->start_time != 0)
+        {
+            save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->start_time));
+        }
+        else
+            save_filter_str.append (";0");
+
+        // end time
+        if (fd->end_time != 0)
+        {
+            save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->end_time));
+        }
+        else
+            save_filter_str.append (";0");
+
+        // number of days
+        if (fd->days > 0)
+        {
+             save_filter_str.append (";" + std::to_string (fd->days));
+        }
+        else
+             save_filter_str.append (";0");
+    }
+    gnc_ppr_filter_save_filter (gsr, save_filter_str);
+}
+
 static void
 gpp_update_match_filter_text (cleared_match_t match, const guint mask,
                               const gchar* filter_name, GList **show, GList **hide)
@@ -274,6 +392,14 @@ gpp_update_match_filter_text (cleared_match_t match, const guint mask,
         *hide = g_list_prepend (*hide, g_strdup (filter_name));
 }
 
+/** This function is used to update the tooltip shown in the register
+ *  which shows a summary of the current filter.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ * 
+ *  @param fd A pointer to the filter data used for filter state.
+ */
 void
 gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
 {
@@ -495,6 +621,12 @@ gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page)
     LEAVE(" ");
 }
 
+/** This function is used to clear the current filter so that a 
+ *  specific split can be shown in the register.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
 void
 gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
 {
@@ -502,104 +634,40 @@ gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
 
     auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
 
-    fd->days = 0;
-    fd->start_time = 0;
-    fd->end_time = 0;
-    fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER, nullptr, 16);
+    set_filterdata_to_defaults (fd);
 
     gnc_ppr_filter_update_date_query (plugin_page);
 }
 
-static std::vector<std::string>
-split_filter_by_delimiter (std::string str, char delimiter)
-{
-    std::istringstream ss;
-    std::vector<std::string> res;
-    std::string token;
-    ss.str (str);
-    while (std::getline (ss, token, delimiter))
-    {
-        res.push_back (token);
-    }
-    return res;
-}
-
+/** This function is called to update the register.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
 void
 gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
 {
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
     auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+
+    if (!gsr)
+        return;
+
+    auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
-    int filter_changed = 0;
 
     /* Set the filter for the split register and status of save filter button */
     fd->save_filter = false;
 
-    std::string filter_str = gnc_ppr_filter_get_filter (gsr, ledger_type);
-
-    std::vector<std::string> split_filter = split_filter_by_delimiter (filter_str, ';');
-    int split_filter_size = split_filter.size();
-
-    PINFO("Loaded Filter Status is %s", split_filter[0].c_str());
-
-    fd->cleared_match = (cleared_match_t)std::stol (split_filter[0], nullptr, 16);
-
-    if (split_filter_size > 0 && (split_filter[0].compare (DEFAULT_FILTER)) != 0)
-        filter_changed++;
-
-    if (split_filter_size > 1 && (split_filter[1].compare (std::string ("0"))) != 0)
-    {
-        PINFO("Loaded Filter Start Date is %s", split_filter[1].c_str());
-
-        fd->start_time = gnc_ppr_filter_dmy2time (split_filter[1]);
-        fd->start_time = gnc_time64_get_day_start (fd->start_time);
-        filter_changed++;
-    }
-
-    if (split_filter_size > 2 && (split_filter[2].compare (std::string ("0"))) != 0)
-    {
-        PINFO("Loaded Filter End Date is %s", split_filter[2].c_str());
-
-        fd->end_time = gnc_ppr_filter_dmy2time (split_filter[2]);
-        fd->end_time = gnc_time64_get_day_end (fd->end_time);
-        filter_changed++;
-    }
-
-    // set the default for the number of days
-    fd->days = (int)std::stol (get_filter_default_num_of_days (ledger_type), nullptr, 10);
-
-    if (split_filter_size > 3 &&
-        (split_filter[3].compare (get_filter_default_num_of_days (ledger_type)) != 0))
-    {
-        PINFO("Loaded Filter Days is %s", split_filter[3].c_str());
-
-        fd->days = (int)std::stol (split_filter[3], nullptr, 10);
-        filter_changed++;
-    }
-
-    if (filter_changed != 0)
-        fd->save_filter = true;
+    gnc_ppr_filter_load_filter_parts (gsr, ledger_type, fd);
 
     if (ledger_type == LD_GL)
     {
         SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger);
-        time64 start_time = 0, end_time = 0;
 
-        if (reg->type == GENERAL_JOURNAL)
-        {
-            start_time = fd->start_time;
-            end_time = fd->end_time;
-        }
-        else // search ledger and the like
-        {
-            fd->days = 0;
-            fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER, nullptr, 16);
-            fd->save_filter = false;
-        }
-        fd->start_time = start_time;
-        fd->end_time = end_time;
+        if (reg->type != GENERAL_JOURNAL) // search ledger and the like
+            set_filterdata_to_defaults (fd);
     }
     /* Update Query with Filter Status and Dates */
     gnc_ppr_filter_update_status_query (plugin_page);
@@ -613,8 +681,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
  *
  *  @param button The toggle button that was changed.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
@@ -657,8 +724,7 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
  *
  *  @param button The button that was clicked.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_status_select_all_cb (GtkButton* button,
@@ -676,11 +742,11 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
     {
         g_signal_handlers_block_by_func (action.widget,
                                          (gpointer)gnc_ppr_filter_status_one_cb,
-                                         rfd->plugin_page);
+                                         rfd);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), TRUE);
         g_signal_handlers_unblock_by_func (action.widget,
                                            (gpointer)gnc_ppr_filter_status_one_cb,
-                                           rfd->plugin_page);
+                                           rfd);
     }
 
     /* Set the requested status */
@@ -695,8 +761,7 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
  *
  *  @param button The button that was clicked.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
@@ -714,11 +779,11 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
     {
         g_signal_handlers_block_by_func (action.widget,
                                          (gpointer)gnc_ppr_filter_status_one_cb,
-                                         rfd->plugin_page);
+                                         rfd);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), FALSE);
         g_signal_handlers_unblock_by_func (action.widget,
                                            (gpointer)gnc_ppr_filter_status_one_cb,
-                                           rfd->plugin_page);
+                                           rfd);
     }
 
     /* Set the requested status */
@@ -735,8 +800,7 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
  *  range" button.  Since it exists, it make sense for the rest of the
  *  callbacks to take advantage of it.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 static void
 get_filter_times (RegisterFilterDialog* rfd)
@@ -782,8 +846,7 @@ get_filter_times (RegisterFilterDialog* rfd)
  *
  *  @param button A pointer to the "select range" radio button.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
@@ -815,12 +878,11 @@ gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
     {
         gtk_widget_set_sensitive (rfd->table, FALSE);
         gtk_widget_set_sensitive (rfd->num_days, FALSE);
-        fd->days = 0;
         fd->start_time = 0;
         fd->end_time = 0;
+        fd->days = 0;
     }
     gnc_ppr_filter_update_date_query (rfd->plugin_page);
-
     LEAVE(" ");
 }
 
@@ -831,8 +893,7 @@ gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
  *
  *  @param button A pointer to the "number of days" spin button.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
@@ -858,8 +919,7 @@ gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
  *  @param unused A pointer to a GncDateEntry widgets, but it could be
  *  any widget.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 static void
 gnc_ppr_filter_gde_changed_cb (GtkWidget* unused,
@@ -892,8 +952,7 @@ gnc_ppr_filter_gde_changed_cb (GtkWidget* unused,
  *  this function, and will be the newly selected button the second
  *  time.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_start_cb (GtkWidget* radio,
@@ -936,8 +995,7 @@ gnc_ppr_filter_start_cb (GtkWidget* radio,
  *  this function, and will be the newly selected button the second
  *  time.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_end_cb (GtkWidget* radio,
@@ -969,8 +1027,7 @@ gnc_ppr_filter_end_cb (GtkWidget* radio,
  *
  *  @param button The toggle button that was changed.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_save_cb (GtkToggleButton* button,
@@ -1000,8 +1057,7 @@ gnc_ppr_filter_save_cb (GtkToggleButton* button,
  *
  *  @param response A numerical value indicating why the dialog box was closed.
  *
- *  @param page A pointer to the GncPluginPageRegister associated with
- *  this dialog box.
+ *  @param rfd A pointer to the filter dialog structure.
  */
 void
 gnc_ppr_filter_response_cb (GtkDialog* dialog,
@@ -1033,50 +1089,12 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
     {
         // clear the filter when unticking the save option
         if (!fd->save_filter && rfd->original_save_filter)
-            gnc_ppr_filter_set_filter (gsr, "");
+            gnc_ppr_filter_save_filter (gsr, "");
 
         rfd->original_save_filter = fd->save_filter;
 
         if (fd->save_filter)
-        {
-            std::string save_filter_str;
-            static const size_t buffer_size = 10;
-            char buffer [buffer_size];
-
-            // cleared match
-            std::snprintf (buffer, buffer_size, "0x%04x", fd->cleared_match);
-            save_filter_str.append (buffer);
-
-            // start time
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->start_date_choose))
-                && fd->start_time != 0)
-            {
-                save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->start_time));
-            }
-            else
-                save_filter_str.append (";0");
-
-            // end time
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->end_date_choose))
-                && fd->end_time != 0)
-            {
-                save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->end_time));
-            }
-            else
-                save_filter_str.append (";0");
-
-            // number of days
-            if (fd->days > 0)
-            {
-                save_filter_str.append (";" + std::to_string (fd->days));
-            }
-            else
-                save_filter_str.append (";0");
-
-            PINFO("The filter to save is %s", save_filter_str.c_str());
-
-            gnc_ppr_filter_set_filter (gsr, save_filter_str);
-        }
+            gnc_ppr_filter_save_filter_parts (gsr, fd);
     }
     rfd->dialog = nullptr;
     fd->dialog = nullptr;
@@ -1085,6 +1103,14 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
     LEAVE(" ");
 }
 
+/** This function is called to create the filter dialog.
+ *
+ *  @param rfd A pointer to the filter dialog structure.
+ * 
+ *  @param fd The filter data structure for remembering state.
+ *
+ *  @param query A pointer to the current register query.
+ */
 static void
 gnc_ppr_filter_dialog_create (RegisterFilterDialog* rfd, FilterData *fd, Query *query)
 {
@@ -1250,6 +1276,17 @@ gnc_ppr_filter_dialog_create (RegisterFilterDialog* rfd, FilterData *fd, Query *
     LEAVE (" ");
 }
 
+/** This function is called for the filter dialog.
+ *
+ *  @param plugin_page  A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ * 
+ *  @param query A pointer to the current register query.
+ * 
+ *  @param fd A pointer to the filter data structure for remembering state.
+ *
+ *  @param show_save_button Set to True to show save button.
+ */
 void
 gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
                    FilterData *fd, bool show_save_button)

commit 1a25310c38fff5fd6a26d42a1b4e094ec184a5f0
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 14:16:28 2026 +0100

    Change location of Filter Dialog action widgets
    
    The register does not need to know about the dialog action widgets so
    create a new structure for the dialog and store them there. Only keep
    the state in the 'FilterData' structure.

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index a38b8af368..36100329b5 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -65,38 +65,60 @@ static std::string DEFAULT_FILTER = "0x001f";
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
+struct RegisterFilterDialog
+{
+    GncPluginPage* plugin_page;
+    GtkWidget*     dialog;
+    GtkWidget*     table;
+    GtkWidget*     start_date_choose;
+    GtkWidget*     start_date_today;
+    GtkWidget*     start_date;
+    GtkWidget*     end_date_choose;
+    GtkWidget*     end_date_today;
+    GtkWidget*     end_date;
+    GtkWidget*     num_days;
+
+    cleared_match_t original_cleared_match;
+    time64          original_start_time;
+    time64          original_end_time;
+    int             original_days;
+    bool            original_save_filter;
+
+    bool            show_save_button;
+};
+
 extern "C"
 {
 // These functions are the dialog callbacks. They're connected to their
 // signals in gnc-plugin-page-register.glade so they mustn't be name-mangled.
 void
 gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
-                                GncPluginPageRegister* page);
+                                RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_start_cb (GtkWidget* radio,
-                         GncPluginPageRegister* page);
+                         RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_end_cb (GtkWidget* radio,
-                       GncPluginPageRegister* page);
+                       RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_response_cb (GtkDialog* dialog,
                             gint response,
-                            GncPluginPageRegister* page);
+                            RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_status_select_all_cb (GtkButton* button,
-                                     GncPluginPageRegister* page);
+                                     RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
-                                    GncPluginPageRegister* page);
+                                    RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
-                              GncPluginPageRegister* page);
+                              RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_save_cb (GtkToggleButton* button,
-                        GncPluginPageRegister* page);
+                        RegisterFilterDialog* rfd);
 void
 gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
-                                GncPluginPageRegister* page);
+                                RegisterFilterDialog* rfd);
 }
 
 struct status_action
@@ -515,9 +537,9 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
     /* Set the filter for the split register and status of save filter button */
     fd->save_filter = false;
 
-    std::string filter_strx = gnc_ppr_filter_get_filter (gsr, ledger_type);
+    std::string filter_str = gnc_ppr_filter_get_filter (gsr, ledger_type);
 
-    std::vector<std::string> split_filter = split_filter_by_delimiter (filter_strx, ';');
+    std::vector<std::string> split_filter = split_filter_by_delimiter (filter_str, ';');
     int split_filter_size = split_filter.size();
 
     PINFO("Loaded Filter Status is %s", split_filter[0].c_str());
@@ -560,8 +582,6 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
     if (filter_changed != 0)
         fd->save_filter = true;
 
-    fd->original_save_filter = fd->save_filter;
-
     if (ledger_type == LD_GL)
     {
         SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger);
@@ -578,11 +598,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
             fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER, nullptr, 16);
             fd->save_filter = false;
         }
-
-        fd->original_days = fd->days;
-        fd->original_start_time = start_time;
         fd->start_time = start_time;
-        fd->original_end_time = end_time;
         fd->end_time = end_time;
     }
     /* Update Query with Filter Status and Dates */
@@ -602,16 +618,16 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
  */
 void
 gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
-                              GncPluginPageRegister* page)
+                              RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
     auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
 
-    ENTER("toggle button %s (%p), plugin_page %p", name, button, page);
+    ENTER("toggle button %s (%p), plugin_page %p", name, button, rfd->plugin_page);
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
     /* Determine what status bit to change */
     int value = CLEARED_NONE;
@@ -630,7 +646,7 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
     else
         fd->cleared_match = (cleared_match_t)(fd->cleared_match & ~value);
 
-    gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+    gnc_ppr_filter_update_status_query (rfd->plugin_page);
 
     LEAVE(" ");
 }
@@ -646,28 +662,30 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
  */
 void
 gnc_ppr_filter_status_select_all_cb (GtkButton* button,
-                                     GncPluginPageRegister* page)
+                                     RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
-    ENTER("(button %p, page %p)", button, page);
+    ENTER("(button %p, page %p)", button, rfd->plugin_page);
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
     /* Turn on all the check menu items */
     for (const auto& action : status_actions)
     {
         g_signal_handlers_block_by_func (action.widget,
-                                         (gpointer)gnc_ppr_filter_status_one_cb, page);
+                                         (gpointer)gnc_ppr_filter_status_one_cb,
+                                         rfd->plugin_page);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), TRUE);
         g_signal_handlers_unblock_by_func (action.widget,
-                                           (gpointer)gnc_ppr_filter_status_one_cb, page);
+                                           (gpointer)gnc_ppr_filter_status_one_cb,
+                                           rfd->plugin_page);
     }
 
     /* Set the requested status */
     fd->cleared_match = CLEARED_ALL;
-    gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+    gnc_ppr_filter_update_status_query (rfd->plugin_page);
     LEAVE(" ");
 }
 
@@ -682,28 +700,30 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
  */
 void
 gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
-                                    GncPluginPageRegister* page)
+                                    RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
-    ENTER("(button %p, page %p)", button, page);
+    ENTER("(button %p, page %p)", button, rfd->plugin_page);
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
     /* Turn off all the check menu items */
     for (const auto& action : status_actions)
     {
         g_signal_handlers_block_by_func (action.widget,
-                                         (gpointer)gnc_ppr_filter_status_one_cb, page);
+                                         (gpointer)gnc_ppr_filter_status_one_cb,
+                                         rfd->plugin_page);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), FALSE);
         g_signal_handlers_unblock_by_func (action.widget,
-                                           (gpointer)gnc_ppr_filter_status_one_cb, page);
+                                           (gpointer)gnc_ppr_filter_status_one_cb,
+                                           rfd->plugin_page);
     }
 
     /* Set the requested status */
     fd->cleared_match = CLEARED_NONE;
-    gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+    gnc_ppr_filter_update_status_query (rfd->plugin_page);
     LEAVE(" ");
 }
 
@@ -719,35 +739,35 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
  *  associated with this filter dialog.
  */
 static void
-get_filter_times (GncPluginPageRegister* page)
+get_filter_times (RegisterFilterDialog* rfd)
 {
     time64 time_val;
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_choose)))
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->start_date_choose)))
     {
-        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(fd->start_date));
+        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(rfd->start_date));
         time_val = gnc_time64_get_day_start (time_val);
         fd->start_time = time_val;
     }
     else
     {
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_today)))
+        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->start_date_today)))
             fd->start_time = gnc_time64_get_today_start();
         else
             fd->start_time = 0;
     }
 
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_choose)))
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->end_date_choose)))
     {
-        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(fd->end_date));
+        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(rfd->end_date));
         time_val = gnc_time64_get_day_end (time_val);
         fd->end_time = time_val;
     }
     else
     {
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_today)))
+        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->end_date_today)))
             fd->end_time = gnc_time64_get_today_end();
         else
             fd->end_time = 0;
@@ -767,39 +787,39 @@ get_filter_times (GncPluginPageRegister* page)
  */
 void
 gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
-                                GncPluginPageRegister* page)
+                                RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_RADIO_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
-    ENTER("(button %p, page %p)", button, page);
+    ENTER("(button %p, page %p)", button, rfd->plugin_page);
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
     auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
     gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
 
     if (active && g_strcmp0 (name, "filter_show_range") == 0)
     {
-        gtk_widget_set_sensitive (fd->table, active);
-        gtk_widget_set_sensitive (fd->num_days, !active);
-        get_filter_times (page);
+        gtk_widget_set_sensitive (rfd->table, active);
+        gtk_widget_set_sensitive (rfd->num_days, !active);
+        get_filter_times (rfd);
     }
     else if (active && g_strcmp0 (name, "filter_show_days") == 0)
     {
-        gtk_widget_set_sensitive (fd->table, !active);
-        gtk_widget_set_sensitive (fd->num_days, active);
-        gtk_spin_button_set_value (GTK_SPIN_BUTTON(fd->num_days), fd->days);
+        gtk_widget_set_sensitive (rfd->table, !active);
+        gtk_widget_set_sensitive (rfd->num_days, active);
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON(rfd->num_days), fd->days);
     }
     else
     {
-        gtk_widget_set_sensitive (fd->table, FALSE);
-        gtk_widget_set_sensitive (fd->num_days, FALSE);
+        gtk_widget_set_sensitive (rfd->table, FALSE);
+        gtk_widget_set_sensitive (rfd->num_days, FALSE);
         fd->days = 0;
         fd->start_time = 0;
         fd->end_time = 0;
     }
-    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+    gnc_ppr_filter_update_date_query (rfd->plugin_page);
 
     LEAVE(" ");
 }
@@ -816,17 +836,17 @@ gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
  */
 void
 gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
-                                GncPluginPageRegister* page)
+                                RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_SPIN_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
-    ENTER("(button %p, page %p)", button, page);
+    ENTER("(button %p, page %p)", button, rfd->plugin_page);
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
     fd->days = gtk_spin_button_get_value (GTK_SPIN_BUTTON(button));
-    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+    gnc_ppr_filter_update_date_query (rfd->plugin_page);
 
     LEAVE(" ");
 }
@@ -843,15 +863,15 @@ gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
  */
 static void
 gnc_ppr_filter_gde_changed_cb (GtkWidget* unused,
-                               GncPluginPageRegister* page)
+                               RegisterFilterDialog* rfd)
 {
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
     ENTER("(widget %s(%p), page %p)",
-           gtk_buildable_get_name (GTK_BUILDABLE(unused)), unused, page);
+           gtk_buildable_get_name (GTK_BUILDABLE(unused)), unused, rfd->plugin_page);
 
-    get_filter_times (page);
-    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+    get_filter_times (rfd);
+    gnc_ppr_filter_update_date_query (rfd->plugin_page);
 
     LEAVE(" ");
 }
@@ -877,26 +897,25 @@ gnc_ppr_filter_gde_changed_cb (GtkWidget* unused,
  */
 void
 gnc_ppr_filter_start_cb (GtkWidget* radio,
-                         GncPluginPageRegister* page)
+                         RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
     ENTER("(radio %s(%p), page %p)",
-           gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, page);
+           gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, rfd->plugin_page);
 
     if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
     {
         LEAVE("1st callback of pair. Defer to 2nd callback.");
         return;
     }
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     auto name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
     gboolean active = !g_strcmp0 (name, "start_date_choose");
-    gtk_widget_set_sensitive (fd->start_date, active);
-    get_filter_times (page);
-    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+    gtk_widget_set_sensitive (rfd->start_date, active);
+    get_filter_times (rfd);
+    gnc_ppr_filter_update_date_query (rfd->plugin_page);
 
     LEAVE(" ");
 }
@@ -922,13 +941,13 @@ gnc_ppr_filter_start_cb (GtkWidget* radio,
  */
 void
 gnc_ppr_filter_end_cb (GtkWidget* radio,
-                       GncPluginPageRegister* page)
+                       RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
     ENTER("(radio %s(%p), page %p)",
-          gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, page);
+          gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, rfd->plugin_page);
 
     if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
     {
@@ -936,12 +955,11 @@ gnc_ppr_filter_end_cb (GtkWidget* radio,
         return;
     }
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
     auto name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
     gboolean active = !g_strcmp0 (name, "end_date_choose");
-    gtk_widget_set_sensitive (fd->end_date, active);
-    get_filter_times (page);
-    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+    gtk_widget_set_sensitive (rfd->end_date, active);
+    get_filter_times (rfd);
+    gnc_ppr_filter_update_date_query (rfd->plugin_page);
 
     LEAVE(" ");
 }
@@ -956,14 +974,14 @@ gnc_ppr_filter_end_cb (GtkWidget* radio,
  */
 void
 gnc_ppr_filter_save_cb (GtkToggleButton* button,
-                        GncPluginPageRegister* page)
+                        RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
-    ENTER("Save toggle button (%p), plugin_page %p", button, page);
+    ENTER("Save toggle button (%p), plugin_page %p", button, rfd->plugin_page);
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
 
     /* Compute the new save filter status */
     if (gtk_toggle_button_get_active (button))
@@ -988,36 +1006,36 @@ gnc_ppr_filter_save_cb (GtkToggleButton* button,
 void
 gnc_ppr_filter_response_cb (GtkDialog* dialog,
                             gint response,
-                            GncPluginPageRegister* page)
+                            RegisterFilterDialog* rfd)
 {
     g_return_if_fail (GTK_IS_DIALOG(dialog));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rfd->plugin_page));
 
     ENTER(" ");
 
-    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
-    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (rfd->plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (rfd->plugin_page);
 
     if (response != GTK_RESPONSE_OK)
     {
         /* Remove the old status match */
-        fd->cleared_match = fd->original_cleared_match;
-        gnc_plugin_register_set_enable_refresh (page, FALSE);
-        gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
-        gnc_plugin_register_set_enable_refresh (page, TRUE);
-        fd->start_time = fd->original_start_time;
-        fd->end_time = fd->original_end_time;
-        fd->days = fd->original_days;
-        fd->save_filter = fd->original_save_filter;
-        gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+        fd->cleared_match = rfd->original_cleared_match;
+        gnc_plugin_register_set_enable_refresh (GNC_PLUGIN_PAGE_REGISTER(rfd->plugin_page), FALSE);
+        gnc_ppr_filter_update_status_query (rfd->plugin_page);
+        gnc_plugin_register_set_enable_refresh (GNC_PLUGIN_PAGE_REGISTER(rfd->plugin_page), TRUE);
+        fd->start_time = rfd->original_start_time;
+        fd->end_time = rfd->original_end_time;
+        fd->days = rfd->original_days;
+        fd->save_filter = rfd->original_save_filter;
+        gnc_ppr_filter_update_date_query (rfd->plugin_page);
     }
     else
     {
         // clear the filter when unticking the save option
-        if (!fd->save_filter && fd->original_save_filter)
+        if (!fd->save_filter && rfd->original_save_filter)
             gnc_ppr_filter_set_filter (gsr, "");
 
-        fd->original_save_filter = fd->save_filter;
+        rfd->original_save_filter = fd->save_filter;
 
         if (fd->save_filter)
         {
@@ -1030,7 +1048,7 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
             save_filter_str.append (buffer);
 
             // start time
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_choose))
+            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->start_date_choose))
                 && fd->start_time != 0)
             {
                 save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->start_time));
@@ -1039,7 +1057,7 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
                 save_filter_str.append (";0");
 
             // end time
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_choose))
+            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(rfd->end_date_choose))
                 && fd->end_time != 0)
             {
                 save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->end_time));
@@ -1060,15 +1078,15 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
             gnc_ppr_filter_set_filter (gsr, save_filter_str);
         }
     }
+    rfd->dialog = nullptr;
     fd->dialog = nullptr;
+    g_free (rfd);
     gtk_widget_destroy (GTK_WIDGET(dialog));
-
     LEAVE(" ");
 }
 
-void
-gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
-                   FilterData *fd, bool show_save_button)
+static void
+gnc_ppr_filter_dialog_create (RegisterFilterDialog* rfd, FilterData *fd, Query *query)
 {
     time64 start_time, end_time, time_val;
 
@@ -1079,13 +1097,16 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
                                "filter_by_dialog");
     auto dialog = GTK_WIDGET(gtk_builder_get_object (builder, "filter_by_dialog"));
-    fd->dialog = dialog;
+    rfd->dialog = dialog;
+    fd->dialog = rfd->dialog;
+
     gtk_window_set_transient_for (GTK_WINDOW(dialog),
-                                  gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
+                                  gnc_window_get_gtk_window (GNC_WINDOW(
+                                      GNC_PLUGIN_PAGE(rfd->plugin_page)->window)));
 
     /* Translators: The %s is the name of the plugin page */
     auto title = g_strdup_printf (_ ("Filter %s by…"),
-                     gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+                     gnc_plugin_page_get_page_name (rfd->plugin_page));
     gtk_window_set_title (GTK_WINDOW(dialog), title);
     g_free (title);
 
@@ -1098,26 +1119,27 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         action.widget = toggle;
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), bool_to_gboolean (value));
     }
-    fd->original_cleared_match = fd->cleared_match;
+    rfd->original_cleared_match = fd->cleared_match;
 
     auto button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_save"));
     if (fd->save_filter)
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
 
+    rfd->original_save_filter = fd->save_filter;
+
     // hide the save button if appropriate
-    gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (show_save_button));
+    gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (rfd->show_save_button));
 
     /* Set up number of days */
-    fd->num_days = GTK_WIDGET(gtk_builder_get_object (builder,
-                                                            "filter_show_num_days"));
+    rfd->num_days = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_num_days"));
     button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_days"));
 
     if (fd->days > 0) // using number of days
     {
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-        gtk_widget_set_sensitive (GTK_WIDGET(fd->num_days), TRUE);
-        gtk_spin_button_set_value (GTK_SPIN_BUTTON(fd->num_days), fd->days);
-        fd->original_days = fd->days;
+        gtk_widget_set_sensitive (GTK_WIDGET(rfd->num_days), TRUE);
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON(rfd->num_days), fd->days);
+        rfd->original_days = fd->days;
 
         /* Set the start_time and end_time to 0 */
         start_time = 0;
@@ -1125,8 +1147,8 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     }
     else
     {
-        gtk_widget_set_sensitive (GTK_WIDGET(fd->num_days), FALSE);
-        fd->original_days = 0;
+        gtk_widget_set_sensitive (GTK_WIDGET(rfd->num_days), FALSE);
+        rfd->original_days = 0;
         fd->days = 0;
 
         /* Get the start and end times */
@@ -1134,21 +1156,21 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     }
 
     /* Set the date info */
-    fd->original_start_time = start_time;
+    rfd->original_start_time = start_time;
     fd->start_time = start_time;
-    fd->original_end_time = end_time;
+    rfd->original_end_time = end_time;
     fd->end_time = end_time;
 
     button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), start_time || end_time);
     auto table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
-    fd->table = table;
+    rfd->table = table;
     gtk_widget_set_sensitive (GTK_WIDGET(table), start_time || end_time);
 
-    fd->start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_choose"));
-    fd->start_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_today"));
-    fd->end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_choose"));
-    fd->end_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_today"));
+    rfd->start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_choose"));
+    rfd->start_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_today"));
+    rfd->end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_choose"));
+    rfd->end_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_today"));
 
     bool sensitive;
     {
@@ -1165,25 +1187,24 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
             if ((start_time >= gnc_time64_get_today_start()) &&
                 (start_time <= gnc_time64_get_today_end()))
             {
-                button = fd->start_date_today;
+                button = rfd->start_date_today;
                 sensitive = false;
             }
             else
             {
-                button = fd->start_date_choose;
+                button = rfd->start_date_choose;
                 sensitive = true;
             }
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-        fd->start_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
+        rfd->start_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
         auto hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
-        gtk_box_pack_start (GTK_BOX(hbox), fd->start_date, TRUE, TRUE, 0);
-        gtk_widget_show (fd->start_date);
-        gtk_widget_set_sensitive (GTK_WIDGET(fd->start_date), bool_to_gboolean (sensitive));
-        gnc_date_edit_set_time (GNC_DATE_EDIT(fd->start_date), time_val);
-        g_signal_connect (G_OBJECT(fd->start_date), "date-changed",
-                          G_CALLBACK(gnc_ppr_filter_gde_changed_cb),
-                          GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+        gtk_box_pack_start (GTK_BOX(hbox), rfd->start_date, TRUE, TRUE, 0);
+        gtk_widget_show (rfd->start_date);
+        gtk_widget_set_sensitive (GTK_WIDGET(rfd->start_date), bool_to_gboolean (sensitive));
+        gnc_date_edit_set_time (GNC_DATE_EDIT(rfd->start_date), time_val);
+        g_signal_connect (G_OBJECT(rfd->start_date), "date-changed",
+                          G_CALLBACK(gnc_ppr_filter_gde_changed_cb), rfd);
     }
 
     {
@@ -1200,33 +1221,49 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
             if ((end_time >= gnc_time64_get_today_start()) &&
                 (end_time <= gnc_time64_get_today_end()))
             {
-                button = fd->end_date_today;
+                button = rfd->end_date_today;
                 sensitive = false;
             }
             else
             {
-                button = fd->end_date_choose;
+                button = rfd->end_date_choose;
                 sensitive = true;
             }
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-        fd->end_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
+        rfd->end_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
         auto hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
-        gtk_box_pack_start (GTK_BOX(hbox), fd->end_date, TRUE, TRUE, 0);
-        gtk_widget_show (fd->end_date);
-        gtk_widget_set_sensitive (GTK_WIDGET(fd->end_date), bool_to_gboolean (sensitive));
-        gnc_date_edit_set_time (GNC_DATE_EDIT(fd->end_date), time_val);
-        g_signal_connect (G_OBJECT(fd->end_date), "date-changed",
-                          G_CALLBACK(gnc_ppr_filter_gde_changed_cb),
-                          GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+        gtk_box_pack_start (GTK_BOX(hbox), rfd->end_date, TRUE, TRUE, 0);
+        gtk_widget_show (rfd->end_date);
+        gtk_widget_set_sensitive (GTK_WIDGET(rfd->end_date), bool_to_gboolean (sensitive));
+        gnc_date_edit_set_time (GNC_DATE_EDIT(rfd->end_date), time_val);
+        g_signal_connect (G_OBJECT(rfd->end_date), "date-changed",
+                          G_CALLBACK(gnc_ppr_filter_gde_changed_cb), rfd);
     }
 
     /* Wire it up */
-    gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
-                                      GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+    gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, rfd);
 
     /* Show it */
     gtk_widget_show (dialog);
     g_object_unref (G_OBJECT(builder));
     LEAVE (" ");
 }
+
+void
+gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
+                   FilterData *fd, bool show_save_button)
+{
+    RegisterFilterDialog *rfd;
+
+    ENTER(" ");
+
+    rfd = g_new0 (RegisterFilterDialog, 1);
+
+    rfd->plugin_page = plugin_page;
+    rfd->show_save_button = show_save_button;
+
+    gnc_ppr_filter_dialog_create (rfd, fd, query);
+
+    LEAVE(" ");
+}
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.hpp b/gnucash/gnome/gnc-plugin-page-register-filter.hpp
index 7f8f20604a..d90620a45f 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.hpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.hpp
@@ -40,25 +40,12 @@
 
 struct FilterData
 {
-    GtkWidget* dialog;
-    GtkWidget* table;
-    GtkWidget* start_date_choose;
-    GtkWidget* start_date_today;
-    GtkWidget* start_date;
-    GtkWidget* end_date_choose;
-    GtkWidget* end_date_today;
-    GtkWidget* end_date;
-    GtkWidget* num_days;
-    cleared_match_t original_cleared_match;
+    GtkWidget*      dialog;
     cleared_match_t cleared_match;
-    time64 original_start_time;
-    time64 original_end_time;
-    time64 start_time;
-    time64 end_time;
-    int days;
-    int original_days;
-    bool original_save_filter;
-    bool save_filter;
+    time64          start_time;
+    time64          end_time;
+    int             days;
+    bool            save_filter;
 };
 
 void gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, struct FilterData *fd);

commit cdd75f421aaf8c53de0eb7e30e73f352674145b3
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 14:15:44 2026 +0100

    Change location of Sort Dialog action widgets
    
    The register does not need to know about the dialog action widgets so
    create a new structure for the dialog and store them there. Only keep
    the state in the 'SortData' structure.

diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.cpp b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
index 256d13ecee..39443aa9e2 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
@@ -55,6 +55,21 @@ static QofLogModule log_module = GNC_MOD_GUI;
 
 static std::string DEFAULT_SORT_ORDER = "BY_STANDARD";
 
+struct RegisterSortDialog
+{
+    GncPluginPage* plugin_page;
+    SplitRegister* reg;
+    GtkWidget*     dialog;
+    GtkWidget*     num_radio;
+    GtkWidget*     act_radio;
+
+    SortType       original_sort_type;
+    bool           original_reverse_order;
+    bool           original_save_order;
+
+    bool           show_save_button;
+};
+
 extern "C"
 {
 // These functions are the dialog callbacks. They're connected to their
@@ -62,19 +77,19 @@ extern "C"
 void
 gnc_ppr_sort_response_cb (GtkDialog* dialog,
                           gint response,
-                          GncPluginPageRegister *page);
+                          RegisterSortDialog *rsd);
 
 void
 gnc_ppr_sort_button_cb (GtkToggleButton* button,
-                        GncPluginPageRegister *page);
+                        RegisterSortDialog *rsd);
 
 void
 gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
-                            GncPluginPageRegister *page);
+                            RegisterSortDialog *rsd);
 
 void
 gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
-                               GncPluginPageRegister *page);
+                               RegisterSortDialog *rsd);
 }
 
 static inline bool
@@ -196,6 +211,11 @@ gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, bool reverse_order)
     g_free (state_section);
 }
 
+/** This function is called to update the register.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this sort order dialog.
+ */
 void
 gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
 {
@@ -216,19 +236,17 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
     if (sd->reverse_order)
         sd->save_order = true;
 
-    sd->original_reverse_order = sd->reverse_order;
-
     // Set the sort order for the split register and status of save order button
-    std::string sort_order = gnc_ppr_sort_get_order (gsr);
+    std::string sort_type = gnc_ppr_sort_get_order (gsr);
 
-    PINFO("Loaded Sort order is %s", sort_order.c_str());
+    PINFO("Loaded Sort type is %s", sort_type.c_str());
 
-    gnc_split_reg_sort (gsr, SortTypefromString (sort_order.c_str()), no_force, no_refresh);
+    SortType type = SortTypefromString (sort_type.c_str());
 
-    if (sort_order.compare (DEFAULT_SORT_ORDER) != 0)
-        sd->save_order = true;
+    gnc_split_reg_sort (gsr, type, no_force, no_refresh);
 
-    sd->original_save_order = sd->save_order;
+    if (sort_type.compare (DEFAULT_SORT_ORDER) != 0)
+        sd->save_order = true;
 
     if (ledger_type == LD_GL)
     {
@@ -250,32 +268,29 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
  *
  *  @param new_val A pointer to the boolean for the new value of the book option.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this sort order dialog.
+ *  @param user_data A pointer to the sort dialog structure.
  */
 static void
 gnc_ppr_sort_book_option_changed (gpointer new_val,
                                   gpointer user_data)
 {
-    GncPluginPageRegister *page = GNC_PLUGIN_PAGE_REGISTER(user_data);
+    RegisterSortDialog *rsd = (RegisterSortDialog*)user_data;
     gboolean* new_data = (gboolean*)new_val;
 
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
-
-    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
 
     if (*new_data)
     {
-        gtk_button_set_label (GTK_BUTTON(sd->num_radio), _("Transaction Number"));
-        gtk_button_set_label (GTK_BUTTON(sd->act_radio), _("Number/Action"));
+        gtk_button_set_label (GTK_BUTTON(rsd->num_radio), _("Transaction Number"));
+        gtk_button_set_label (GTK_BUTTON(rsd->act_radio), _("Number/Action"));
     }
     else
     {
-        gtk_button_set_label (GTK_BUTTON(sd->num_radio), _("Number"));
-        gtk_button_set_label (GTK_BUTTON(sd->act_radio), _("Action"));
+        gtk_button_set_label (GTK_BUTTON(rsd->num_radio), _("Number"));
+        gtk_button_set_label (GTK_BUTTON(rsd->act_radio), _("Action"));
     }
 
-    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (rsd->plugin_page);
 
     gnc_split_reg_sort (gsr, (SortType)gsr->sort_type, force, refresh);
 }
@@ -288,56 +303,60 @@ gnc_ppr_sort_book_option_changed (gpointer new_val,
  *
  *  @param response A numerical value indicating why the dialog box was closed.
  *
- *  @param page A pointer to the GncPluginPageRegister associated with
- *  this dialog box.
+ *  @param rsd A pointer to the sort dialog structure.
  */
 void
 gnc_ppr_sort_response_cb (GtkDialog* dialog,
                           gint response,
-                          GncPluginPageRegister *page)
+                          RegisterSortDialog *rsd)
 {
     g_return_if_fail (GTK_IS_DIALOG(dialog));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
 
     ENTER(" ");
 
-    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
-    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (rsd->plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (rsd->plugin_page);
 
     if (response != GTK_RESPONSE_OK)
     {
-        /* Restore the original sort order */
-        gnc_split_reg_set_sort_reversed (gsr, sd->original_reverse_order, no_refresh);
-        sd->reverse_order = sd->original_reverse_order;
-        gnc_split_reg_sort (gsr, sd->original_sort_type, no_force, refresh);
-        sd->save_order = sd->original_save_order;
+        // Restore the original sort order
+        gnc_split_reg_set_sort_reversed (gsr, rsd->original_reverse_order, no_refresh);
+        sd->reverse_order = rsd->original_reverse_order;
+        // use force as sort_type may still be the same if only reverse_order changed
+        gnc_split_reg_sort (gsr, rsd->original_sort_type, force, refresh);
+        sd->sort_type = rsd->original_sort_type;
+        sd->save_order = rsd->original_save_order;
     }
     else
     {
         // clear the sort when unticking the save option
-        if ((!sd->save_order) && ((sd->original_save_order) ||
-                                  (sd->original_reverse_order)))
+        if ((!sd->save_order) && ((rsd->original_sort_type) ||
+                                  (rsd->original_reverse_order)))
         {
             gnc_ppr_sort_set_order (gsr, DEFAULT_SORT_ORDER);
             gnc_ppr_sort_set_reversed (gsr, false);
         }
-        sd->original_save_order = sd->save_order;
+        rsd->original_sort_type = sd->sort_type;
+        rsd->original_reverse_order = sd->reverse_order;
 
         if (sd->save_order)
         {
             SortType type = gnc_split_reg_get_sort_type (gsr);
-            std::string sort_order = (SortTypeasString (type));
+            std::string sort_type = (SortTypeasString (type));
 
-            gnc_ppr_sort_set_order (gsr, sort_order);
+            gnc_ppr_sort_set_order (gsr, sort_type);
             gnc_ppr_sort_set_reversed (gsr, sd->reverse_order);
         }
     }
     gnc_book_option_remove_cb (OPTION_NAME_NUM_FIELD_SOURCE,
                                gnc_ppr_sort_book_option_changed,
-                               page);
+                               (gpointer)rsd);
+    rsd->dialog = nullptr;
+    rsd->num_radio = nullptr;
+    rsd->act_radio = nullptr;
     sd->dialog = nullptr;
-    sd->num_radio = nullptr;
-    sd->act_radio = nullptr;
+    g_free (rsd);
     gtk_widget_destroy (GTK_WIDGET(dialog));
     LEAVE (" ");
 }
@@ -347,19 +366,18 @@ gnc_ppr_sort_response_cb (GtkDialog* dialog,
  *
  *  @param button The button that was toggled.
  *
- *  @param page A pointer to the GncPluginPageRegister associated with
- *  this dialog box.
+ *  @param rsd A pointer to the sort dialog structure.
  */
 void
 gnc_ppr_sort_button_cb (GtkToggleButton* button,
-                        GncPluginPageRegister *page)
+                        RegisterSortDialog *rsd)
 {
     g_return_if_fail (GTK_IS_TOGGLE_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
 
     auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
 
-    ENTER("button %s(%p), page %p", name, button, page);
+    ENTER("button %s(%p), page %p", name, button, rsd->plugin_page);
 
     if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
     {
@@ -367,7 +385,7 @@ gnc_ppr_sort_button_cb (GtkToggleButton* button,
         return;
     }
 
-    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (rsd->plugin_page);
 
     SortType type = SortTypefromString (name);
     gnc_split_reg_sort (gsr, type, no_force, refresh);
@@ -379,20 +397,19 @@ gnc_ppr_sort_button_cb (GtkToggleButton* button,
  *
  *  @param button The toggle button that was changed.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this sort order dialog.
+ *  @param rsd A pointer to the sort dialog structure.
  */
 void
 gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
-                            GncPluginPageRegister *page)
+                            RegisterSortDialog *rsd)
 {
     g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
 
-    ENTER("Save toggle button (%p), page %p", button, page);
+    ENTER("Save toggle button (%p), page %p", button, rsd->plugin_page);
 
     /* Compute the new save sort order */
-    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (rsd->plugin_page);
 
     if (gtk_toggle_button_get_active (button))
         sd->save_order = true;
@@ -406,45 +423,52 @@ gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
  *
  *  @param button The toggle button that was changed.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this sort order dialog.
+ *  @param rsd A pointer to the sort dialog structure.
  */
 void
 gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
-                               GncPluginPageRegister *page)
+                               RegisterSortDialog *rsd)
 {
     g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
 
-    ENTER("Reverse toggle button (%p), page %p", button, page);
+    ENTER("Reverse toggle button (%p), page %p", button, rsd->plugin_page);
 
     /* Compute the new save sort order */
-    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
-    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (rsd->plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (rsd->plugin_page);
 
     sd->reverse_order = gtk_toggle_button_get_active (button);
     gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, refresh);
     LEAVE (" ");
 }
 
-void
-gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
-                     SortData *sd, bool show_save_button)
+/** This function is called to create the sort dialog.
+ *
+ *  @param rsd A pointer to the sort dialog structure.
+ * 
+ *  @param sd The sort data structure for remembering state.
+ */
+static void
+gnc_ppr_sort_dialog_create (RegisterSortDialog *rsd, SortData *sd)
 {
     /* Create the dialog */
     auto builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade", "sort_by_dialog");
     auto dialog = GTK_WIDGET(gtk_builder_get_object (builder, "sort_by_dialog"));
-    sd->dialog = dialog;
+    rsd->dialog = dialog;
+    sd->dialog = rsd->dialog;
+
     gtk_window_set_transient_for (GTK_WINDOW(dialog),
-                                  gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
+                                  gnc_window_get_gtk_window (GNC_WINDOW(
+                                      GNC_PLUGIN_PAGE(rsd->plugin_page)->window)));
     /* Translators: The %s is the name of the plugin page */
-    auto title = g_strdup_printf (_ ("Sort %s by…"),
-                           gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+    auto title = g_strdup_printf (_("Sort %s by…"),
+                           gnc_plugin_page_get_page_name (rsd->plugin_page));
     gtk_window_set_title (GTK_WINDOW(dialog), title);
     g_free (title);
 
-    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (rsd->plugin_page);
 
     /* Set the button for the current sort order */
     SortType sort = gnc_split_reg_get_sort_type (gsr);
@@ -452,36 +476,38 @@ gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
     auto button = GTK_WIDGET(gtk_builder_get_object (builder, name));
     DEBUG("current sort %d, button %s(%p)", sort, name, button);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-    sd->original_sort_type = sort;
+    rsd->original_sort_type = sort;
 
     button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_save"));
     if (sd->save_order)
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
 
+    rsd->original_save_order = sd->save_order;
+
     // hide the save button if appropriate
-    gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (show_save_button));
+    gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (rsd->show_save_button));
 
     /* Set the button for the current reverse_order order */
     button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_reverse"));
     if (sd->reverse_order)
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-    sd->original_reverse_order = sd->reverse_order;
+    rsd->original_reverse_order = sd->reverse_order;
 
-    sd->num_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_NUM"));
-    sd->act_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_ACTION"));
+    rsd->num_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_NUM"));
+    rsd->act_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_ACTION"));
     /* Adjust labels related to Num/Action radio buttons based on book option */
-    if (reg && !reg->use_tran_num_for_num_field)
+    if (rsd->reg && !rsd->reg->use_tran_num_for_num_field)
     {
-        gtk_button_set_label (GTK_BUTTON(sd->num_radio), _ ("Transaction Number"));
-        gtk_button_set_label (GTK_BUTTON(sd->act_radio), _ ("Number/Action"));
+        gtk_button_set_label (GTK_BUTTON(rsd->num_radio), _ ("Transaction Number"));
+        gtk_button_set_label (GTK_BUTTON(rsd->act_radio), _ ("Number/Action"));
     }
     gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
                                  (GncBOCb)gnc_ppr_sort_book_option_changed,
-                                 GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+                                 (gpointer)rsd);
 
     /* Wire it up */
     gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
-                                      GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+                                      rsd);
 
     /* Show it */
     gtk_widget_show (dialog);
@@ -489,3 +515,32 @@ gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
     LEAVE (" ");
 }
 
+/** This function is called for the sort dialog.
+ *
+ *  @param plugin_page  A pointer to the GncPluginPageRegister that is
+ *  associated with this sort dialog.
+ * 
+ *  @param reg A pointer to the SplitRegister of the current register.
+ * 
+ *  @param fd A pointer to the sort data structure for remembering state.
+ *
+ *  @param show_save_button Set to True to show save button.
+ */
+void
+gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
+                     SortData *sd, bool show_save_button)
+{
+    RegisterSortDialog *rsd;
+
+    ENTER(" ");
+
+    rsd = g_new0 (RegisterSortDialog, 1);
+
+    rsd->plugin_page = plugin_page;
+    rsd->reg = reg;
+    rsd->show_save_button = show_save_button;
+
+    gnc_ppr_sort_dialog_create (rsd, sd);
+
+    LEAVE(" ");
+}
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.hpp b/gnucash/gnome/gnc-plugin-page-register-sort.hpp
index 09c7390762..96da645523 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.hpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.hpp
@@ -40,14 +40,10 @@
 
 struct SortData
 {
-    GtkWidget* dialog;
-    GtkWidget* num_radio;
-    GtkWidget* act_radio;
-    SortType   original_sort_type;
-    bool       original_save_order;
-    bool       save_order;
-    bool       reverse_order;
-    bool       original_reverse_order;
+    GtkWidget*    dialog;
+    SortType      sort_type;
+    bool          reverse_order;
+    bool          save_order;
 };
 
 void gnc_ppr_sort_update_register (GncPluginPage* plugin_page);

commit a56fdf0427b64d9efe286219890b08c3f274b341
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 14:01:44 2026 +0100

    Use a c++ array for status_actions

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index bef1914527..a38b8af368 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -49,6 +49,7 @@
 #include "Query.h"
 
 #include <algorithm>
+#include <array>
 #include <cstdio>
 #include <iostream>
 #include <sstream>
@@ -100,20 +101,19 @@ gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
 
 struct status_action
 {
-    const char* action_name;
+    std::string action_name;
     int value;
     GtkWidget* widget;
 };
 
-static struct status_action status_actions[] =
-{
+static std::array<status_action, 5> status_actions {{
     { "filter_status_reconciled",   CLEARED_RECONCILED, nullptr },
     { "filter_status_cleared",      CLEARED_CLEARED, nullptr },
     { "filter_status_voided",       CLEARED_VOIDED, nullptr },
     { "filter_status_frozen",       CLEARED_FROZEN, nullptr },
-    { "filter_status_unreconciled", CLEARED_NO, nullptr },
-    { nullptr, 0, nullptr },
-};
+    { "filter_status_unreconciled", CLEARED_NO, nullptr }
+}};
+
 #ifdef skip
 static inline bool
 gboolean_to_bool (gboolean value)
@@ -615,11 +615,11 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
 
     /* Determine what status bit to change */
     int value = CLEARED_NONE;
-    for (int i = 0; status_actions[i].action_name; i++)
+    for (const auto& action : status_actions)
     {
-        if (g_strcmp0 (name, status_actions[i].action_name) == 0)
+        if (action.action_name.compare (name) == 0)
         {
-            value = status_actions[i].value;
+            value = action.value;
             break;
         }
     }
@@ -656,13 +656,12 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
     auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Turn on all the check menu items */
-    for (int i = 0; status_actions[i].action_name; i++)
+    for (const auto& action : status_actions)
     {
-        auto widget = status_actions[i].widget;
-        g_signal_handlers_block_by_func (widget,
+        g_signal_handlers_block_by_func (action.widget,
                                          (gpointer)gnc_ppr_filter_status_one_cb, page);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), TRUE);
-        g_signal_handlers_unblock_by_func (widget,
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), TRUE);
+        g_signal_handlers_unblock_by_func (action.widget,
                                            (gpointer)gnc_ppr_filter_status_one_cb, page);
     }
 
@@ -693,13 +692,12 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
     auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Turn off all the check menu items */
-    for (int i = 0; status_actions[i].action_name; i++)
+    for (const auto& action : status_actions)
     {
-        auto widget = status_actions[i].widget;
-        g_signal_handlers_block_by_func (widget,
+        g_signal_handlers_block_by_func (action.widget,
                                          (gpointer)gnc_ppr_filter_status_one_cb, page);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), FALSE);
-        g_signal_handlers_unblock_by_func (widget,
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(action.widget), FALSE);
+        g_signal_handlers_unblock_by_func (action.widget,
                                            (gpointer)gnc_ppr_filter_status_one_cb, page);
     }
 
@@ -1092,12 +1090,12 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     g_free (title);
 
     /* Set the check buttons for the current status */
-    for (int i = 0; status_actions[i].action_name; i++)
+    for (auto& action : status_actions)
     {
         auto toggle = GTK_WIDGET(gtk_builder_get_object (builder,
-                                                     status_actions[i].action_name));
-        bool value = fd->cleared_match & status_actions[i].value;
-        status_actions[i].widget = toggle;
+                                                         action.action_name.c_str()));
+        bool value = fd->cleared_match & action.value;
+        action.widget = toggle;
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), bool_to_gboolean (value));
     }
     fd->original_cleared_match = fd->cleared_match;

commit 1e1bbfd2f45b0b27454e58481e4f76994c59f3ce
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 14:01:01 2026 +0100

    Filter and Sort string changes

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index 63573d5380..bef1914527 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -48,11 +48,18 @@
 #include "qof.h"
 #include "Query.h"
 
+#include <algorithm>
+#include <cstdio>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
 #include "gnc-plugin-page-register.h"
 #include "gnc-plugin-page-register-filter.hpp"
 
-#define DEFAULT_FILTER_NUM_DAYS_GL  "30"
-#define DEFAULT_FILTER "0x001f"
+static std::string DEFAULT_FILTER_NUM_DAYS_GL = "30";
+static std::string DEFAULT_FILTER = "0x001f";
 
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
@@ -120,7 +127,7 @@ bool_to_gboolean (bool value)
     return value ? TRUE : FALSE;
 }
 
-static const gchar*
+static std::string
 get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
 {
     if (ledger_type == LD_GL)
@@ -130,31 +137,31 @@ get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
 }
 
 /* This function converts a time64 value date to a string */
-static gchar*
+static std::string
 gnc_ppr_filter_time2dmy (time64 raw_time)
 {
     struct tm* timeinfo;
-    gchar date_string[11];
+    char date_string[11];
 
     timeinfo = gnc_localtime (&raw_time);
     strftime (date_string, 11, "%d-%m-%Y", timeinfo);
     PINFO("Date to string is %s", date_string);
     gnc_tm_free (timeinfo);
 
-    return g_strdup (date_string);
+    return (date_string);
 }
 
 /* This function converts a string date to a time64 value */
 static time64
-gnc_ppr_filter_dmy2time (char* date_string)
+gnc_ppr_filter_dmy2time (std::string date_string)
 {
     struct tm when;
 
-    PINFO("Date from string is %s", date_string);
+    PINFO("Date from string is %s", date_string.c_str());
     memset (&when, 0, sizeof (when));
 
-    sscanf (date_string, "%d-%d-%d", &when.tm_mday,
-            &when.tm_mon, &when.tm_year);
+    std::sscanf (date_string.c_str(), "%d-%d-%d", &when.tm_mday,
+                 &when.tm_mon, &when.tm_year);
 
     when.tm_mon -= 1;
     when.tm_year -= 1900;
@@ -175,11 +182,11 @@ gnc_ppr_check_for_empty_group (GKeyFile *state_file,
     g_strfreev (keys);
 }
 
-static gchar*
+static std::string
 gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
 {
     if (!gsr)
-        return g_strdup (_("unknown"));
+        return _("unknown");
 
     // get the filter from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
@@ -188,37 +195,38 @@ gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
 
     auto filter = g_key_file_get_string (state_file, state_section,
                                          KEY_PAGE_FILTER, &error);
+    std::string filter_str;
 
     if (error)
         g_clear_error (&error);
     else
-        g_strdelimit (filter, ";", ',');
+        filter_str = std::string (filter);
 
+    g_free (filter);
     g_free (state_section);
 
-    if (filter)
-        return filter;
+    if (!filter_str.empty())
+        return filter_str;
 
-    return g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER,
-                            "0", "0", get_filter_default_num_of_days (ledger_type));
+    return DEFAULT_FILTER + ";0;0;" + get_filter_default_num_of_days (ledger_type);
 }
 
 static void
-gnc_ppr_filter_set_filter (GNCSplitReg *gsr, const gchar* filter)
+gnc_ppr_filter_set_filter (GNCSplitReg *gsr, std::string filter)
 {
     if (!gsr)
         return;
 
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
 
-    auto default_filter = g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0",
-                                           get_filter_default_num_of_days (ledger_type));
+    std::string default_filter_str = DEFAULT_FILTER + ";0;0;" +
+                                     get_filter_default_num_of_days (ledger_type);
 
     // save the filter to the .gcm file also
     GKeyFile* state_file = gnc_state_get_current();
     auto state_section = gsr_get_register_state_section (gsr);
 
-    if (!filter || (g_strcmp0 (filter, default_filter) == 0))
+    if (filter.empty() || (filter.compare (default_filter_str) == 0))
     {
         if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, nullptr))
             g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, nullptr);
@@ -227,16 +235,11 @@ gnc_ppr_filter_set_filter (GNCSplitReg *gsr, const gchar* filter)
     }
     else
     {
-        auto filter_text = g_strdup (filter);
-        g_strdelimit (filter_text, ",", ';'); // make it conform to .gcm file list
         g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
-                               filter_text);
-        g_free (filter_text);
+                               filter.c_str());
+
     }
     g_free (state_section);
-    g_free (default_filter);
-
-    return;
 }
 
 static void
@@ -480,11 +483,25 @@ gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
     fd->days = 0;
     fd->start_time = 0;
     fd->end_time = 0;
-    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, nullptr, 16);
+    fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER, nullptr, 16);
 
     gnc_ppr_filter_update_date_query (plugin_page);
 }
- 
+
+static std::vector<std::string>
+split_filter_by_delimiter (std::string str, char delimiter)
+{
+    std::istringstream ss;
+    std::vector<std::string> res;
+    std::string token;
+    ss.str (str);
+    while (std::getline (ss, token, delimiter))
+    {
+        res.push_back (token);
+    }
+    return res;
+}
+
 void
 gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
 {
@@ -498,45 +515,45 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
     /* Set the filter for the split register and status of save filter button */
     fd->save_filter = false;
 
-    gchar* filter_str = gnc_ppr_filter_get_filter (gsr, ledger_type);
-    gchar** filter = g_strsplit (filter_str, ",", -1);
-    guint filtersize = g_strv_length (filter);
-    g_free (filter_str);
+    std::string filter_strx = gnc_ppr_filter_get_filter (gsr, ledger_type);
 
-    PINFO("Loaded Filter Status is %s", filter[0]);
+    std::vector<std::string> split_filter = split_filter_by_delimiter (filter_strx, ';');
+    int split_filter_size = split_filter.size();
 
-    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], nullptr, 16);
+    PINFO("Loaded Filter Status is %s", split_filter[0].c_str());
 
-    if (filtersize > 0 && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
+    fd->cleared_match = (cleared_match_t)std::stol (split_filter[0], nullptr, 16);
+
+    if (split_filter_size > 0 && (split_filter[0].compare (DEFAULT_FILTER)) != 0)
         filter_changed++;
 
-    if (filtersize > 1 && (g_strcmp0 (filter[1], "0") != 0))
+    if (split_filter_size > 1 && (split_filter[1].compare (std::string ("0"))) != 0)
     {
-        PINFO("Loaded Filter Start Date is %s", filter[1]);
+        PINFO("Loaded Filter Start Date is %s", split_filter[1].c_str());
 
-        fd->start_time = gnc_ppr_filter_dmy2time (filter[1]);
+        fd->start_time = gnc_ppr_filter_dmy2time (split_filter[1]);
         fd->start_time = gnc_time64_get_day_start (fd->start_time);
         filter_changed++;
     }
 
-    if (filtersize > 2 && (g_strcmp0 (filter[2], "0") != 0))
+    if (split_filter_size > 2 && (split_filter[2].compare (std::string ("0"))) != 0)
     {
-        PINFO("Loaded Filter End Date is %s", filter[2]);
+        PINFO("Loaded Filter End Date is %s", split_filter[2].c_str());
 
-        fd->end_time = gnc_ppr_filter_dmy2time (filter[2]);
+        fd->end_time = gnc_ppr_filter_dmy2time (split_filter[2]);
         fd->end_time = gnc_time64_get_day_end (fd->end_time);
         filter_changed++;
     }
 
     // set the default for the number of days
-    fd->days = (gint)g_ascii_strtoll (get_filter_default_num_of_days (ledger_type), nullptr, 10);
+    fd->days = (int)std::stol (get_filter_default_num_of_days (ledger_type), nullptr, 10);
 
-    if (filtersize > 3 &&
-        (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0))
+    if (split_filter_size > 3 &&
+        (split_filter[3].compare (get_filter_default_num_of_days (ledger_type)) != 0))
     {
-        PINFO("Loaded Filter Days is %s", filter[3]);
+        PINFO("Loaded Filter Days is %s", split_filter[3].c_str());
 
-        fd->days = (gint)g_ascii_strtoll (filter[3], nullptr, 10);
+        fd->days = (int)std::stol (split_filter[3], nullptr, 10);
         filter_changed++;
     }
 
@@ -544,7 +561,6 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
         fd->save_filter = true;
 
     fd->original_save_filter = fd->save_filter;
-    g_strfreev (filter);
 
     if (ledger_type == LD_GL)
     {
@@ -559,7 +575,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
         else // search ledger and the like
         {
             fd->days = 0;
-            fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, nullptr, 16);
+            fd->cleared_match = (cleared_match_t)std::stol (DEFAULT_FILTER, nullptr, 16);
             fd->save_filter = false;
         }
 
@@ -1001,49 +1017,49 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
     {
         // clear the filter when unticking the save option
         if (!fd->save_filter && fd->original_save_filter)
-            gnc_ppr_filter_set_filter (gsr, nullptr);
+            gnc_ppr_filter_set_filter (gsr, "");
 
         fd->original_save_filter = fd->save_filter;
 
         if (fd->save_filter)
         {
-            gchar *filter;
-            GList *flist = nullptr;
+            std::string save_filter_str;
+            static const size_t buffer_size = 10;
+            char buffer [buffer_size];
 
             // cleared match
-            flist = g_list_prepend
-                (flist, g_strdup_printf ("0x%04x", fd->cleared_match));
+            std::snprintf (buffer, buffer_size, "0x%04x", fd->cleared_match);
+            save_filter_str.append (buffer);
 
             // start time
             if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_choose))
                 && fd->start_time != 0)
             {
-                flist = g_list_prepend (flist, gnc_ppr_filter_time2dmy (fd->start_time));
+                save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->start_time));
             }
             else
-                flist = g_list_prepend (flist, g_strdup ("0"));
+                save_filter_str.append (";0");
 
             // end time
             if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_choose))
                 && fd->end_time != 0)
             {
-                flist = g_list_prepend (flist, gnc_ppr_filter_time2dmy (fd->end_time));
+                save_filter_str.append (";" + gnc_ppr_filter_time2dmy (fd->end_time));
             }
             else
-                flist = g_list_prepend (flist, g_strdup ("0"));
+                save_filter_str.append (";0");
 
             // number of days
             if (fd->days > 0)
-                flist = g_list_prepend (flist, g_strdup_printf ("%d", fd->days));
+            {
+                save_filter_str.append (";" + std::to_string (fd->days));
+            }
             else
-                flist = g_list_prepend (flist, g_strdup ("0"));
-
-            flist = g_list_reverse (flist);
-            filter = gnc_g_list_stringjoin (flist, ",");
-            PINFO("The filter to save is %s", filter);
-            gnc_ppr_filter_set_filter (gsr, filter);
-            g_free (filter);
-            g_list_free_full (flist, g_free);
+                save_filter_str.append (";0");
+
+            PINFO("The filter to save is %s", save_filter_str.c_str());
+
+            gnc_ppr_filter_set_filter (gsr, save_filter_str);
         }
     }
     fd->dialog = nullptr;
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.cpp b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
index 8a4dfc61a8..256d13ecee 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
@@ -47,10 +47,13 @@
 #include "qofbookslots.h"
 #include "qof.h"
 
+#include <algorithm>
+#include <string>
+
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
-#define DEFAULT_SORT_ORDER "BY_STANDARD"
+static std::string DEFAULT_SORT_ORDER = "BY_STANDARD";
 
 extern "C"
 {
@@ -99,7 +102,7 @@ gnc_ppr_check_for_empty_group (GKeyFile *state_file,
     g_strfreev (keys);
 }
 
-static gchar*
+static std::string
 gnc_ppr_sort_get_order (GNCSplitReg *gsr)
  {
     if (!gsr)
@@ -109,25 +112,25 @@ gnc_ppr_sort_get_order (GNCSplitReg *gsr)
     GKeyFile* state_file = gnc_state_get_current();
     auto state_section = gsr_get_register_state_section (gsr);
     GError* error = nullptr;
-    gchar* sort_order = nullptr;
 
     auto sort_text = g_key_file_get_string (state_file, state_section,
                                             KEY_PAGE_SORT, &error);
+    std::string sort_order;
 
     if (error)
         g_clear_error (&error);
     else
     {
-        sort_order = g_strdup (sort_text);
+        sort_order = (sort_text);
         g_free (sort_text);
     }
     g_free (state_section);
 
-    return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
+    return !sort_order.empty() ? sort_order : (DEFAULT_SORT_ORDER);
 }
 
 static void
-gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
+gnc_ppr_sort_set_order (GNCSplitReg *gsr, std::string sort_order)
 {
     if (!gsr)
         return;
@@ -136,7 +139,7 @@ gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
     GKeyFile* state_file = gnc_state_get_current();
     auto state_section = gsr_get_register_state_section (gsr);
 
-    if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
+    if (sort_order.compare (DEFAULT_SORT_ORDER) == 0)
     {
         if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, nullptr))
             g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, nullptr);
@@ -144,7 +147,7 @@ gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
         gnc_ppr_check_for_empty_group (state_file, state_section);
     }
     else
-        g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
+        g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order.c_str());
 
     g_free (state_section);
 }
@@ -216,17 +219,16 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
     sd->original_reverse_order = sd->reverse_order;
 
     // Set the sort order for the split register and status of save order button
-    auto order = gnc_ppr_sort_get_order (gsr);
+    std::string sort_order = gnc_ppr_sort_get_order (gsr);
 
-    PINFO("Loaded Sort order is %s", order);
+    PINFO("Loaded Sort order is %s", sort_order.c_str());
 
-    gnc_split_reg_sort (gsr, SortTypefromString (order), no_force, no_refresh);
+    gnc_split_reg_sort (gsr, SortTypefromString (sort_order.c_str()), no_force, no_refresh);
 
-    if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
+    if (sort_order.compare (DEFAULT_SORT_ORDER) != 0)
         sd->save_order = true;
 
     sd->original_save_order = sd->save_order;
-    g_free (order);
 
     if (ledger_type == LD_GL)
     {
@@ -234,7 +236,7 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
 
         if (reg->type != GENERAL_JOURNAL) // search ledger and the like
         {
-            gnc_split_reg_sort (gsr, SortTypefromString (DEFAULT_SORT_ORDER), no_force, no_refresh);
+            gnc_split_reg_sort (gsr, SortTypefromString (DEFAULT_SORT_ORDER.c_str()), no_force, no_refresh);
             sd->reverse_order = false;
             sd->save_order = false;
         }
@@ -324,9 +326,9 @@ gnc_ppr_sort_response_cb (GtkDialog* dialog,
         if (sd->save_order)
         {
             SortType type = gnc_split_reg_get_sort_type (gsr);
-            auto order = SortTypeasString (type);
+            std::string sort_order = (SortTypeasString (type));
 
-            gnc_ppr_sort_set_order (gsr, order);
+            gnc_ppr_sort_set_order (gsr, sort_order);
             gnc_ppr_sort_set_reversed (gsr, sd->reverse_order);
         }
     }

commit 42d476eae241ba6f4161468957575562f869ea2e
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 14:00:16 2026 +0100

    Use bool instead of gboolean

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index d115a0c88c..63573d5380 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -107,6 +107,18 @@ static struct status_action status_actions[] =
     { "filter_status_unreconciled", CLEARED_NO, nullptr },
     { nullptr, 0, nullptr },
 };
+#ifdef skip
+static inline bool
+gboolean_to_bool (gboolean value)
+{
+    return value ? true : false;
+}
+#endif
+static inline gboolean
+bool_to_gboolean (bool value)
+{
+    return value ? TRUE : FALSE;
+}
 
 static const gchar*
 get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
@@ -484,7 +496,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
     int filter_changed = 0;
 
     /* Set the filter for the split register and status of save filter button */
-    fd->save_filter = FALSE;
+    fd->save_filter = false;
 
     gchar* filter_str = gnc_ppr_filter_get_filter (gsr, ledger_type);
     gchar** filter = g_strsplit (filter_str, ",", -1);
@@ -529,7 +541,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
     }
 
     if (filter_changed != 0)
-        fd->save_filter = TRUE;
+        fd->save_filter = true;
 
     fd->original_save_filter = fd->save_filter;
     g_strfreev (filter);
@@ -548,7 +560,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
         {
             fd->days = 0;
             fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, nullptr, 16);
-            fd->save_filter = FALSE;
+            fd->save_filter = false;
         }
 
         fd->original_days = fd->days;
@@ -941,9 +953,9 @@ gnc_ppr_filter_save_cb (GtkToggleButton* button,
 
     /* Compute the new save filter status */
     if (gtk_toggle_button_get_active (button))
-        fd->save_filter = TRUE;
+        fd->save_filter = true;
     else
-        fd->save_filter = FALSE;
+        fd->save_filter = false;
 
     LEAVE(" ");
 }
@@ -1042,10 +1054,9 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
 
 void
 gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
-                   FilterData *fd, gboolean show_save_button)
+                   FilterData *fd, bool show_save_button)
 {
     time64 start_time, end_time, time_val;
-    gboolean sensitive, value;
 
     /* Create the dialog */
     auto builder = gtk_builder_new();
@@ -1069,9 +1080,9 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     {
         auto toggle = GTK_WIDGET(gtk_builder_get_object (builder,
                                                      status_actions[i].action_name));
-        value = fd->cleared_match & status_actions[i].value;
+        bool value = fd->cleared_match & status_actions[i].value;
         status_actions[i].widget = toggle;
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), value);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), bool_to_gboolean (value));
     }
     fd->original_cleared_match = fd->cleared_match;
 
@@ -1080,7 +1091,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
 
     // hide the save button if appropriate
-    gtk_widget_set_visible (GTK_WIDGET(button), show_save_button);
+    gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (show_save_button));
 
     /* Set up number of days */
     fd->num_days = GTK_WIDGET(gtk_builder_get_object (builder,
@@ -1125,13 +1136,14 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     fd->end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_choose"));
     fd->end_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_today"));
 
+    bool sensitive;
     {
         /* Start date info */
         if (start_time == 0)
         {
             button = GTK_WIDGET(gtk_builder_get_object(builder, "start_date_earliest"));
             time_val = xaccQueryGetEarliestDateFound (query);
-            sensitive = FALSE;
+            sensitive = false;
         }
         else
         {
@@ -1140,12 +1152,12 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
                 (start_time <= gnc_time64_get_today_end()))
             {
                 button = fd->start_date_today;
-                sensitive = FALSE;
+                sensitive = false;
             }
             else
             {
                 button = fd->start_date_choose;
-                sensitive = TRUE;
+                sensitive = true;
             }
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
@@ -1153,7 +1165,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         auto hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
         gtk_box_pack_start (GTK_BOX(hbox), fd->start_date, TRUE, TRUE, 0);
         gtk_widget_show (fd->start_date);
-        gtk_widget_set_sensitive (GTK_WIDGET(fd->start_date), sensitive);
+        gtk_widget_set_sensitive (GTK_WIDGET(fd->start_date), bool_to_gboolean (sensitive));
         gnc_date_edit_set_time (GNC_DATE_EDIT(fd->start_date), time_val);
         g_signal_connect (G_OBJECT(fd->start_date), "date-changed",
                           G_CALLBACK(gnc_ppr_filter_gde_changed_cb),
@@ -1166,7 +1178,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         {
             button = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_latest"));
             time_val = xaccQueryGetLatestDateFound (query);
-            sensitive = FALSE;
+            sensitive = false;
         }
         else
         {
@@ -1175,12 +1187,12 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
                 (end_time <= gnc_time64_get_today_end()))
             {
                 button = fd->end_date_today;
-                sensitive = FALSE;
+                sensitive = false;
             }
             else
             {
                 button = fd->end_date_choose;
-                sensitive = TRUE;
+                sensitive = true;
             }
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
@@ -1188,7 +1200,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         auto hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
         gtk_box_pack_start (GTK_BOX(hbox), fd->end_date, TRUE, TRUE, 0);
         gtk_widget_show (fd->end_date);
-        gtk_widget_set_sensitive (GTK_WIDGET(fd->end_date), sensitive);
+        gtk_widget_set_sensitive (GTK_WIDGET(fd->end_date), bool_to_gboolean (sensitive));
         gnc_date_edit_set_time (GNC_DATE_EDIT(fd->end_date), time_val);
         g_signal_connect (G_OBJECT(fd->end_date), "date-changed",
                           G_CALLBACK(gnc_ppr_filter_gde_changed_cb),
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.hpp b/gnucash/gnome/gnc-plugin-page-register-filter.hpp
index 428187ef41..7f8f20604a 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.hpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.hpp
@@ -36,6 +36,7 @@
 #include <gtk/gtk.h>
 #include "gnc-split-reg.h"
 #include "gnc-plugin-page.h"
+#include <stdbool.h>
 
 struct FilterData
 {
@@ -56,8 +57,8 @@ struct FilterData
     time64 end_time;
     int days;
     int original_days;
-    gboolean original_save_filter;
-    gboolean save_filter;
+    bool original_save_filter;
+    bool save_filter;
 };
 
 void gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, struct FilterData *fd);
@@ -67,6 +68,6 @@ void gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page);
 void gnc_ppr_filter_update_register (GncPluginPage* plugin_page);
 
 void gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
-                        struct FilterData *fd, gboolean show_save_button);
+                        struct FilterData *fd, bool show_save_button);
 
 #endif /* __GNC_PLUGIN_PAGE_REGISTER_FILTER_HPP */
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.cpp b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
index 1d79765b52..8a4dfc61a8 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
@@ -74,6 +74,18 @@ gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
                                GncPluginPageRegister *page);
 }
 
+static inline bool
+gboolean_to_bool (gboolean value)
+{
+    return value ? true : false;
+}
+
+static inline gboolean
+bool_to_gboolean (bool value)
+{
+    return value ? TRUE : FALSE;
+}
+
 static void
 gnc_ppr_check_for_empty_group (GKeyFile *state_file,
                                const gchar *state_section)
@@ -137,11 +149,11 @@ gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
     g_free (state_section);
 }
 
-static gboolean
+static bool
 gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
 {
     if (!gsr)
-        return FALSE;
+        return false;
 
     // get the sort_reversed from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
@@ -154,11 +166,11 @@ gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
         g_clear_error (&error);
 
     g_free (state_section);
-    return sort_reversed;
+    return gboolean_to_bool (sort_reversed);
 }
 
 static void
-gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
+gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, bool reverse_order)
 {
     if (!gsr)
         return;
@@ -176,7 +188,7 @@ gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
     }
     else
         g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
-                                reverse_order);
+                                bool_to_gboolean (reverse_order));
 
     g_free (state_section);
 }
@@ -190,7 +202,7 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
     auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
 
-    sd->save_order = FALSE;
+    sd->save_order = false;
 
     // Set the sort direction for the split register and status of save order button
     sd->reverse_order = gnc_ppr_sort_get_reversed (gsr);
@@ -199,7 +211,7 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
 
     gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, no_refresh);
     if (sd->reverse_order)
-        sd->save_order = TRUE;
+        sd->save_order = true;
 
     sd->original_reverse_order = sd->reverse_order;
 
@@ -211,7 +223,7 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
     gnc_split_reg_sort (gsr, SortTypefromString (order), no_force, no_refresh);
 
     if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
-        sd->save_order = TRUE;
+        sd->save_order = true;
 
     sd->original_save_order = sd->save_order;
     g_free (order);
@@ -223,8 +235,8 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
         if (reg->type != GENERAL_JOURNAL) // search ledger and the like
         {
             gnc_split_reg_sort (gsr, SortTypefromString (DEFAULT_SORT_ORDER), no_force, no_refresh);
-            sd->reverse_order = FALSE;
-            sd->save_order = FALSE;
+            sd->reverse_order = false;
+            sd->save_order = false;
         }
     }
 }
@@ -305,7 +317,7 @@ gnc_ppr_sort_response_cb (GtkDialog* dialog,
                                   (sd->original_reverse_order)))
         {
             gnc_ppr_sort_set_order (gsr, DEFAULT_SORT_ORDER);
-            gnc_ppr_sort_set_reversed (gsr, FALSE);
+            gnc_ppr_sort_set_reversed (gsr, false);
         }
         sd->original_save_order = sd->save_order;
 
@@ -381,9 +393,9 @@ gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
     auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
 
     if (gtk_toggle_button_get_active (button))
-        sd->save_order = TRUE;
+        sd->save_order = true;
     else
-        sd->save_order = FALSE;
+        sd->save_order = false;
     LEAVE (" ");
 }
 
@@ -415,7 +427,7 @@ gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
 
 void
 gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
-                     SortData *sd, gboolean show_save_button)
+                     SortData *sd, bool show_save_button)
 {
     /* Create the dialog */
     auto builder = gtk_builder_new();
@@ -445,7 +457,7 @@ gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
 
     // hide the save button if appropriate
-    gtk_widget_set_visible (GTK_WIDGET(button), show_save_button);
+    gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (show_save_button));
 
     /* Set the button for the current reverse_order order */
     button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_reverse"));
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.hpp b/gnucash/gnome/gnc-plugin-page-register-sort.hpp
index 1a0ed921ff..09c7390762 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.hpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.hpp
@@ -36,6 +36,7 @@
 #include <gtk/gtk.h>
 #include "gnc-split-reg.h"
 #include "gnc-plugin-page.h"
+#include <stdbool.h>
 
 struct SortData
 {
@@ -43,15 +44,15 @@ struct SortData
     GtkWidget* num_radio;
     GtkWidget* act_radio;
     SortType   original_sort_type;
-    gboolean   original_save_order;
-    gboolean   save_order;
-    gboolean   reverse_order;
-    gboolean   original_reverse_order;
+    bool       original_save_order;
+    bool       save_order;
+    bool       reverse_order;
+    bool       original_reverse_order;
 };
 
 void gnc_ppr_sort_update_register (GncPluginPage* plugin_page);
 
 void gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
-                          struct SortData *sd, gboolean show_save_button);
+                          struct SortData *sd, bool show_save_button);
 
 #endif /* __GNC_PLUGIN_PAGE_REGISTER_SORT_HPP */
diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index be628844ad..89b52dcc49 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -2603,7 +2603,7 @@ gnc_plugin_page_register_cmd_reverse_transaction (GSimpleAction *simple,
     LEAVE (" ");
 }
 
-static gboolean
+static bool
 gnc_plugin_page_register_show_fs_save (GncPluginPageRegister* page)
 {
     GncPluginPageRegisterPrivate* priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
@@ -2611,20 +2611,20 @@ gnc_plugin_page_register_show_fs_save (GncPluginPageRegister* page)
     SplitRegister* reg = gnc_ledger_display_get_split_register (priv->ledger);
 
     if (ledger_type == LD_SINGLE || ledger_type == LD_SUBACCOUNT)
-        return TRUE;
+        return true;
     else
     {
         switch (reg->type)
         {
         case GENERAL_JOURNAL:
-            return TRUE;
+            return true;
             break;
 
         case INCOME_LEDGER:
         case PORTFOLIO_LEDGER:
         case SEARCH_LEDGER:
         default:
-            return FALSE;
+            return false;
             break;
         }
     }
@@ -2650,7 +2650,7 @@ gnc_plugin_page_register_cmd_view_sort_by (GSimpleAction *simple,
     }
 
     SplitRegister* reg = gnc_ledger_display_get_split_register (priv->ledger);
-    gboolean show_save_button = gnc_plugin_page_register_show_fs_save (page);
+    bool show_save_button = gnc_plugin_page_register_show_fs_save (page);
 
     gnc_ppr_sort_dialog (GNC_PLUGIN_PAGE(page), reg,
                          &priv->sd, show_save_button);
@@ -2676,7 +2676,7 @@ gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
     }
 
     Query* query = gnc_ledger_display_get_query (priv->ledger);
-    gboolean show_save_button = gnc_plugin_page_register_show_fs_save (page);
+    bool show_save_button = gnc_plugin_page_register_show_fs_save (page);
 
     gnc_ppr_filter_by (GNC_PLUGIN_PAGE(page), query,
                        &priv->fd, show_save_button);

commit ea36ecc86d4afee985409f97cf0b835c804deed1
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 13:55:33 2026 +0100

    Change to use auto instead of an explicit type

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index e31b40f5bf..d115a0c88c 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -171,11 +171,11 @@ gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
 
     // get the filter from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section = gsr_get_register_state_section (gsr);
+    auto state_section = gsr_get_register_state_section (gsr);
     GError* error = nullptr;
 
-    gchar* filter = g_key_file_get_string (state_file, state_section,
-                                           KEY_PAGE_FILTER, &error);
+    auto filter = g_key_file_get_string (state_file, state_section,
+                                         KEY_PAGE_FILTER, &error);
 
     if (error)
         g_clear_error (&error);
@@ -199,12 +199,12 @@ gnc_ppr_filter_set_filter (GNCSplitReg *gsr, const gchar* filter)
 
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
 
-    gchar* default_filter = g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0",
-                                             get_filter_default_num_of_days (ledger_type));
+    auto default_filter = g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0",
+                                           get_filter_default_num_of_days (ledger_type));
 
     // save the filter to the .gcm file also
     GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section = gsr_get_register_state_section (gsr);
+    auto state_section = gsr_get_register_state_section (gsr);
 
     if (!filter || (g_strcmp0 (filter, default_filter) == 0))
     {
@@ -215,7 +215,7 @@ gnc_ppr_filter_set_filter (GNCSplitReg *gsr, const gchar* filter)
     }
     else
     {
-        gchar* filter_text = g_strdup (filter);
+        auto filter_text = g_strdup (filter);
         g_strdelimit (filter_text, ",", ';'); // make it conform to .gcm file list
         g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
                                filter_text);
@@ -244,12 +244,12 @@ gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
 
     ENTER(" ");
 
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
 
     // filtered start time
     if (fd->start_time != 0)
     {
-        gchar* sdate = qof_print_date (fd->start_time);
+        auto sdate = qof_print_date (fd->start_time);
         t_list = g_list_prepend
             (t_list, g_strdup_printf ("%s %s", _("Start Date:"), sdate));
         g_free (sdate);
@@ -265,7 +265,7 @@ gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
     // filtered end time
     if (fd->end_time != 0)
     {
-        gchar* edate = qof_print_date (fd->end_time);
+        auto edate = qof_print_date (fd->end_time);
         t_list = g_list_prepend
             (t_list, g_strdup_printf ("%s %s", _("End Date:"), edate));
         g_free (edate);
@@ -293,7 +293,7 @@ gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
 
         if (show)
         {
-            char *str = gnc_list_formatter (show);
+            auto str = gnc_list_formatter (show);
             t_list = g_list_prepend
                 (t_list, g_strdup_printf ("%s %s", _("Show:"), str));
             g_free (str);
@@ -301,7 +301,7 @@ gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
 
         if (hide)
         {
-            char *str = gnc_list_formatter (hide);
+            auto str = gnc_list_formatter (hide);
             t_list = g_list_prepend
                 (t_list, g_strdup_printf ("%s %s", _("Hide:"), str));
             g_free (str);
@@ -345,7 +345,7 @@ gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page)
 {
     ENTER(" ");
 
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
     if (!gsr->ledger)
     {
         LEAVE("no ledger");
@@ -355,15 +355,15 @@ gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page)
     // check if this a search register and save query
     gnc_plugin_page_register_update_for_search_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    Query *query = gnc_plugin_page_register_get_query (plugin_page);
+    auto query = gnc_plugin_page_register_get_query (plugin_page);
     if (!query)
     {
         LEAVE("no query found");
         return;
     }
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
-    SplitRegister* reg = gnc_ledger_display_get_split_register (gsr->ledger);
+    auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    auto reg = gnc_ledger_display_get_split_register (gsr->ledger);
 
     /* Remove the old status match */
     if (reg->type != SEARCH_LEDGER)
@@ -401,7 +401,7 @@ gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page)
 {
     ENTER(" ");
 
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
     if (!gsr->ledger)
     {
         LEAVE("no ledger");
@@ -411,15 +411,15 @@ gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page)
     // check if this a search register and save query
     gnc_plugin_page_register_update_for_search_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    Query *query = gnc_plugin_page_register_get_query (plugin_page);
+    auto query = gnc_plugin_page_register_get_query (plugin_page);
     if (!query)
     {
         LEAVE("no query found");
         return;
     }
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
-    SplitRegister* reg = gnc_ledger_display_get_split_register (gsr->ledger);
+    auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    auto reg = gnc_ledger_display_get_split_register (gsr->ledger);
 
     /* Delete any existing old date spec. */
     if (reg->type != SEARCH_LEDGER)
@@ -463,7 +463,7 @@ gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
 {
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
 
     fd->days = 0;
     fd->start_time = 0;
@@ -478,8 +478,8 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
 {
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
     int filter_changed = 0;
 
@@ -579,11 +579,11 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
     g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
-    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(button));
+    auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
 
     ENTER("toggle button %s (%p), plugin_page %p", name, button, page);
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Determine what status bit to change */
     int value = CLEARED_NONE;
@@ -620,19 +620,17 @@ void
 gnc_ppr_filter_status_select_all_cb (GtkButton* button,
                                      GncPluginPageRegister* page)
 {
-    GtkWidget* widget;
-
     g_return_if_fail (GTK_IS_BUTTON(button));
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
     ENTER("(button %p, page %p)", button, page);
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Turn on all the check menu items */
     for (int i = 0; status_actions[i].action_name; i++)
     {
-        widget = status_actions[i].widget;
+        auto widget = status_actions[i].widget;
         g_signal_handlers_block_by_func (widget,
                                          (gpointer)gnc_ppr_filter_status_one_cb, page);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), TRUE);
@@ -659,19 +657,17 @@ void
 gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
                                     GncPluginPageRegister* page)
 {
-    GtkWidget* widget;
-
     g_return_if_fail (GTK_IS_BUTTON(button));
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
     ENTER("(button %p, page %p)", button, page);
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Turn off all the check menu items */
     for (int i = 0; status_actions[i].action_name; i++)
     {
-        widget = status_actions[i].widget;
+        auto widget = status_actions[i].widget;
         g_signal_handlers_block_by_func (widget,
                                          (gpointer)gnc_ppr_filter_status_one_cb, page);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), FALSE);
@@ -701,7 +697,7 @@ get_filter_times (GncPluginPageRegister* page)
 {
     time64 time_val;
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_choose)))
     {
@@ -752,9 +748,9 @@ gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
 
     ENTER("(button %p, page %p)", button, page);
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
-    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(button));
+    auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
     gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
 
     if (active && g_strcmp0 (name, "filter_show_range") == 0)
@@ -801,7 +797,7 @@ gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
 
     ENTER("(button %p, page %p)", button, page);
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     fd->days = gtk_spin_button_get_value (GTK_SPIN_BUTTON(button));
     gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
@@ -868,9 +864,9 @@ gnc_ppr_filter_start_cb (GtkWidget* radio,
         LEAVE("1st callback of pair. Defer to 2nd callback.");
         return;
     }
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
-    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
+    auto name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
     gboolean active = !g_strcmp0 (name, "start_date_choose");
     gtk_widget_set_sensitive (fd->start_date, active);
     get_filter_times (page);
@@ -914,8 +910,8 @@ gnc_ppr_filter_end_cb (GtkWidget* radio,
         return;
     }
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
-    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
     gboolean active = !g_strcmp0 (name, "end_date_choose");
     gtk_widget_set_sensitive (fd->end_date, active);
     get_filter_times (page);
@@ -941,7 +937,7 @@ gnc_ppr_filter_save_cb (GtkToggleButton* button,
 
     ENTER("Save toggle button (%p), plugin_page %p", button, page);
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Compute the new save filter status */
     if (gtk_toggle_button_get_active (button))
@@ -973,8 +969,8 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
 
     ENTER(" ");
 
-    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
 
     if (response != GTK_RESPONSE_OK)
     {
@@ -1048,32 +1044,30 @@ void
 gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
                    FilterData *fd, gboolean show_save_button)
 {
-    GtkWidget* dialog, *toggle, *button, *table, *hbox;
     time64 start_time, end_time, time_val;
-    GtkBuilder* builder;
     gboolean sensitive, value;
 
     /* Create the dialog */
-    builder = gtk_builder_new();
+    auto builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
                                "days_adjustment");
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
                                "filter_by_dialog");
-    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "filter_by_dialog"));
+    auto dialog = GTK_WIDGET(gtk_builder_get_object (builder, "filter_by_dialog"));
     fd->dialog = dialog;
     gtk_window_set_transient_for (GTK_WINDOW(dialog),
                                   gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
 
     /* Translators: The %s is the name of the plugin page */
-    gchar* title = g_strdup_printf (_ ("Filter %s by…"),
-                       gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+    auto title = g_strdup_printf (_ ("Filter %s by…"),
+                     gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
     gtk_window_set_title (GTK_WINDOW(dialog), title);
     g_free (title);
 
     /* Set the check buttons for the current status */
     for (int i = 0; status_actions[i].action_name; i++)
     {
-        toggle = GTK_WIDGET(gtk_builder_get_object (builder,
+        auto toggle = GTK_WIDGET(gtk_builder_get_object (builder,
                                                      status_actions[i].action_name));
         value = fd->cleared_match & status_actions[i].value;
         status_actions[i].widget = toggle;
@@ -1081,7 +1075,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     }
     fd->original_cleared_match = fd->cleared_match;
 
-    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_save"));
+    auto button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_save"));
     if (fd->save_filter)
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
 
@@ -1122,7 +1116,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
 
     button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), start_time || end_time);
-    table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
+    auto table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
     fd->table = table;
     gtk_widget_set_sensitive (GTK_WIDGET(table), start_time || end_time);
 
@@ -1156,7 +1150,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
         fd->start_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
-        hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
+        auto hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
         gtk_box_pack_start (GTK_BOX(hbox), fd->start_date, TRUE, TRUE, 0);
         gtk_widget_show (fd->start_date);
         gtk_widget_set_sensitive (GTK_WIDGET(fd->start_date), sensitive);
@@ -1191,7 +1185,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
         fd->end_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
-        hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
+        auto hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
         gtk_box_pack_start (GTK_BOX(hbox), fd->end_date, TRUE, TRUE, 0);
         gtk_widget_show (fd->end_date);
         gtk_widget_set_sensitive (GTK_WIDGET(fd->end_date), sensitive);
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.cpp b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
index df9616ae3a..1d79765b52 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
@@ -95,12 +95,12 @@ gnc_ppr_sort_get_order (GNCSplitReg *gsr)
 
     // get the sort_order from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section = gsr_get_register_state_section (gsr);
+    auto state_section = gsr_get_register_state_section (gsr);
     GError* error = nullptr;
     gchar* sort_order = nullptr;
 
-    gchar* sort_text = g_key_file_get_string (state_file, state_section,
-                                              KEY_PAGE_SORT, &error);
+    auto sort_text = g_key_file_get_string (state_file, state_section,
+                                            KEY_PAGE_SORT, &error);
 
     if (error)
         g_clear_error (&error);
@@ -122,7 +122,7 @@ gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
 
     // save sort_order to the .gcm file also
     GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section = gsr_get_register_state_section (gsr);
+    auto state_section = gsr_get_register_state_section (gsr);
 
     if (!sort_order || (g_strcmp0 (sort_order, DEFAULT_SORT_ORDER) == 0))
     {
@@ -145,7 +145,7 @@ gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
 
     // get the sort_reversed from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section = gsr_get_register_state_section (gsr);
+    auto state_section = gsr_get_register_state_section (gsr);
     GError* error = nullptr;
     gboolean sort_reversed = g_key_file_get_boolean (state_file, state_section,
                                                      KEY_PAGE_SORT_REV, &error);
@@ -165,7 +165,7 @@ gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
 
     // save reverse_order to the .gcm file also
     GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section = gsr_get_register_state_section (gsr);
+    auto state_section = gsr_get_register_state_section (gsr);
 
     if (!reverse_order)
     {
@@ -186,8 +186,8 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
 {
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    SortData *sd = gnc_plugin_page_register_get_sort_data (plugin_page);
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto sd = gnc_plugin_page_register_get_sort_data (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
 
     sd->save_order = FALSE;
@@ -204,7 +204,7 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
     sd->original_reverse_order = sd->reverse_order;
 
     // Set the sort order for the split register and status of save order button
-    gchar* order = gnc_ppr_sort_get_order (gsr);
+    auto order = gnc_ppr_sort_get_order (gsr);
 
     PINFO("Loaded Sort order is %s", order);
 
@@ -218,7 +218,7 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
 
     if (ledger_type == LD_GL)
     {
-        SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger);
+        auto reg = gnc_ledger_display_get_split_register (gsr->ledger);
 
         if (reg->type != GENERAL_JOURNAL) // search ledger and the like
         {
@@ -248,7 +248,7 @@ gnc_ppr_sort_book_option_changed (gpointer new_val,
 
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
-    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
 
     if (*new_data)
     {
@@ -261,7 +261,7 @@ gnc_ppr_sort_book_option_changed (gpointer new_val,
         gtk_button_set_label (GTK_BUTTON(sd->act_radio), _("Action"));
     }
 
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
 
     gnc_split_reg_sort (gsr, (SortType)gsr->sort_type, force, refresh);
 }
@@ -287,8 +287,8 @@ gnc_ppr_sort_response_cb (GtkDialog* dialog,
 
     ENTER(" ");
 
-    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
 
     if (response != GTK_RESPONSE_OK)
     {
@@ -312,7 +312,7 @@ gnc_ppr_sort_response_cb (GtkDialog* dialog,
         if (sd->save_order)
         {
             SortType type = gnc_split_reg_get_sort_type (gsr);
-            const gchar* order = SortTypeasString (type);
+            auto order = SortTypeasString (type);
 
             gnc_ppr_sort_set_order (gsr, order);
             gnc_ppr_sort_set_reversed (gsr, sd->reverse_order);
@@ -343,7 +343,7 @@ gnc_ppr_sort_button_cb (GtkToggleButton* button,
     g_return_if_fail (GTK_IS_TOGGLE_BUTTON(button));
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
-    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(button));
+    auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
 
     ENTER("button %s(%p), page %p", name, button, page);
 
@@ -353,7 +353,7 @@ gnc_ppr_sort_button_cb (GtkToggleButton* button,
         return;
     }
 
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
 
     SortType type = SortTypefromString (name);
     gnc_split_reg_sort (gsr, type, no_force, refresh);
@@ -378,7 +378,7 @@ gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
     ENTER("Save toggle button (%p), page %p", button, page);
 
     /* Compute the new save sort order */
-    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
 
     if (gtk_toggle_button_get_active (button))
         sd->save_order = TRUE;
@@ -405,8 +405,8 @@ gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
     ENTER("Reverse toggle button (%p), page %p", button, page);
 
     /* Compute the new save sort order */
-    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+    auto sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    auto gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
 
     sd->reverse_order = gtk_toggle_button_get_active (button);
     gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, refresh);
@@ -417,28 +417,25 @@ void
 gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
                      SortData *sd, gboolean show_save_button)
 {
-    GtkWidget* dialog, *button;
-    GtkBuilder* builder;
-
     /* Create the dialog */
-    builder = gtk_builder_new();
+    auto builder = gtk_builder_new();
     gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade", "sort_by_dialog");
-    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "sort_by_dialog"));
+    auto dialog = GTK_WIDGET(gtk_builder_get_object (builder, "sort_by_dialog"));
     sd->dialog = dialog;
     gtk_window_set_transient_for (GTK_WINDOW(dialog),
                                   gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
     /* Translators: The %s is the name of the plugin page */
-    gchar* title = g_strdup_printf (_ ("Sort %s by…"),
-                             gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+    auto title = g_strdup_printf (_ ("Sort %s by…"),
+                           gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
     gtk_window_set_title (GTK_WINDOW(dialog), title);
     g_free (title);
 
-    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    auto gsr = gnc_plugin_page_register_get_gsr (plugin_page);
 
     /* Set the button for the current sort order */
     SortType sort = gnc_split_reg_get_sort_type (gsr);
-    const gchar* name = SortTypeasString (sort);
-    button = GTK_WIDGET(gtk_builder_get_object (builder, name));
+    auto name = SortTypeasString (sort);
+    auto button = GTK_WIDGET(gtk_builder_get_object (builder, name));
     DEBUG("current sort %d, button %s(%p)", sort, name, button);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
     sd->original_sort_type = sort;

commit 1cca75cbdd21da7bb51016da43fdc9f28a84335e
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 13:52:48 2026 +0100

    Change NULL's to nullptr

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.cpp b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
index be56535724..e31b40f5bf 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -100,12 +100,12 @@ struct status_action
 
 static struct status_action status_actions[] =
 {
-    { "filter_status_reconciled",   CLEARED_RECONCILED, NULL },
-    { "filter_status_cleared",      CLEARED_CLEARED, NULL },
-    { "filter_status_voided",       CLEARED_VOIDED, NULL },
-    { "filter_status_frozen",       CLEARED_FROZEN, NULL },
-    { "filter_status_unreconciled", CLEARED_NO, NULL },
-    { NULL, 0, NULL },
+    { "filter_status_reconciled",   CLEARED_RECONCILED, nullptr },
+    { "filter_status_cleared",      CLEARED_CLEARED, nullptr },
+    { "filter_status_voided",       CLEARED_VOIDED, nullptr },
+    { "filter_status_frozen",       CLEARED_FROZEN, nullptr },
+    { "filter_status_unreconciled", CLEARED_NO, nullptr },
+    { nullptr, 0, nullptr },
 };
 
 static const gchar*
@@ -155,7 +155,7 @@ gnc_ppr_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);
+    gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys, nullptr);
 
     if (num_keys == 0)
         gnc_state_drop_sections_for (state_section);
@@ -172,7 +172,7 @@ gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
     // get the filter from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section = gsr_get_register_state_section (gsr);
-    GError* error = NULL;
+    GError* error = nullptr;
 
     gchar* filter = g_key_file_get_string (state_file, state_section,
                                            KEY_PAGE_FILTER, &error);
@@ -208,8 +208,8 @@ gnc_ppr_filter_set_filter (GNCSplitReg *gsr, const gchar* filter)
 
     if (!filter || (g_strcmp0 (filter, default_filter) == 0))
     {
-        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);
+        if (g_key_file_has_key (state_file, state_section, KEY_PAGE_FILTER, nullptr))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, nullptr);
 
         gnc_ppr_check_for_empty_group (state_file, state_section);
     }
@@ -240,7 +240,7 @@ gpp_update_match_filter_text (cleared_match_t match, const guint mask,
 void
 gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
 {
-    GList *t_list = NULL;
+    GList *t_list = nullptr;
 
     ENTER(" ");
 
@@ -274,8 +274,8 @@ gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
     // filtered match items
     if (fd->cleared_match != CLEARED_ALL)
     {
-        GList *show = NULL;
-        GList *hide = NULL;
+        GList *show = nullptr;
+        GList *hide = nullptr;
 
         gpp_update_match_filter_text (fd->cleared_match, 0x01, _("Unreconciled"),
                                       &show, &hide);
@@ -368,7 +368,7 @@ gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page)
     /* Remove the old status match */
     if (reg->type != SEARCH_LEDGER)
     {
-        GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
+        GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE, nullptr);
         qof_query_purge_terms (query, param_list);
         g_slist_free (param_list);
     }
@@ -425,7 +425,7 @@ gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page)
     if (reg->type != SEARCH_LEDGER)
     {
         GSList *param_list = qof_query_build_param_list (SPLIT_TRANS,
-                                                         TRANS_DATE_POSTED, NULL);
+                                                         TRANS_DATE_POSTED, nullptr);
         qof_query_purge_terms (query, param_list);
         g_slist_free (param_list);
     }
@@ -468,7 +468,7 @@ gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
     fd->days = 0;
     fd->start_time = 0;
     fd->end_time = 0;
-    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
+    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, nullptr, 16);
 
     gnc_ppr_filter_update_date_query (plugin_page);
 }
@@ -493,7 +493,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
 
     PINFO("Loaded Filter Status is %s", filter[0]);
 
-    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], NULL, 16);
+    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], nullptr, 16);
 
     if (filtersize > 0 && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
         filter_changed++;
@@ -517,14 +517,14 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
     }
 
     // set the default for the number of days
-    fd->days = (gint)g_ascii_strtoll (get_filter_default_num_of_days (ledger_type), NULL, 10);
+    fd->days = (gint)g_ascii_strtoll (get_filter_default_num_of_days (ledger_type), nullptr, 10);
 
     if (filtersize > 3 &&
         (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0))
     {
         PINFO("Loaded Filter Days is %s", filter[3]);
 
-        fd->days = (gint)g_ascii_strtoll (filter[3], NULL, 10);
+        fd->days = (gint)g_ascii_strtoll (filter[3], nullptr, 10);
         filter_changed++;
     }
 
@@ -547,7 +547,7 @@ gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
         else // search ledger and the like
         {
             fd->days = 0;
-            fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
+            fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, nullptr, 16);
             fd->save_filter = FALSE;
         }
 
@@ -993,14 +993,14 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
     {
         // clear the filter when unticking the save option
         if (!fd->save_filter && fd->original_save_filter)
-            gnc_ppr_filter_set_filter (gsr, NULL);
+            gnc_ppr_filter_set_filter (gsr, nullptr);
 
         fd->original_save_filter = fd->save_filter;
 
         if (fd->save_filter)
         {
             gchar *filter;
-            GList *flist = NULL;
+            GList *flist = nullptr;
 
             // cleared match
             flist = g_list_prepend
@@ -1038,7 +1038,7 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
             g_list_free_full (flist, g_free);
         }
     }
-    fd->dialog = NULL;
+    fd->dialog = nullptr;
     gtk_widget_destroy (GTK_WIDGET(dialog));
 
     LEAVE(" ");
@@ -1155,7 +1155,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
             }
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-        fd->start_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
+        fd->start_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
         hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
         gtk_box_pack_start (GTK_BOX(hbox), fd->start_date, TRUE, TRUE, 0);
         gtk_widget_show (fd->start_date);
@@ -1190,7 +1190,7 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
             }
         }
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
-        fd->end_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
+        fd->end_date = gnc_date_edit_new (gnc_time (nullptr), FALSE, FALSE);
         hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
         gtk_box_pack_start (GTK_BOX(hbox), fd->end_date, TRUE, TRUE, 0);
         gtk_widget_show (fd->end_date);
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.cpp b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
index 7434f85c4a..df9616ae3a 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
@@ -79,7 +79,7 @@ gnc_ppr_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);
+    gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys, nullptr);
 
     if (num_keys == 0)
         gnc_state_drop_sections_for (state_section);
@@ -96,8 +96,8 @@ gnc_ppr_sort_get_order (GNCSplitReg *gsr)
     // get the sort_order from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section = gsr_get_register_state_section (gsr);
-    GError* error = NULL;
-    gchar* sort_order = NULL;
+    GError* error = nullptr;
+    gchar* sort_order = nullptr;
 
     gchar* sort_text = g_key_file_get_string (state_file, state_section,
                                               KEY_PAGE_SORT, &error);
@@ -126,8 +126,8 @@ gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
 
     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))
-            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, NULL);
+        if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT, nullptr))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, nullptr);
 
         gnc_ppr_check_for_empty_group (state_file, state_section);
     }
@@ -146,7 +146,7 @@ gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
     // get the sort_reversed from the .gcm file
     GKeyFile* state_file = gnc_state_get_current();
     gchar* state_section = gsr_get_register_state_section (gsr);
-    GError* error = NULL;
+    GError* error = nullptr;
     gboolean sort_reversed = g_key_file_get_boolean (state_file, state_section,
                                                      KEY_PAGE_SORT_REV, &error);
 
@@ -169,8 +169,8 @@ gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
 
     if (!reverse_order)
     {
-        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);
+        if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV, nullptr))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV, nullptr);
 
         gnc_ppr_check_for_empty_group (state_file, state_section);
     }
@@ -321,9 +321,9 @@ gnc_ppr_sort_response_cb (GtkDialog* dialog,
     gnc_book_option_remove_cb (OPTION_NAME_NUM_FIELD_SOURCE,
                                gnc_ppr_sort_book_option_changed,
                                page);
-    sd->dialog = NULL;
-    sd->num_radio = NULL;
-    sd->act_radio = NULL;
+    sd->dialog = nullptr;
+    sd->num_radio = nullptr;
+    sd->act_radio = nullptr;
     gtk_widget_destroy (GTK_WIDGET(dialog));
     LEAVE (" ");
 }

commit d51b2882bf304d75d19d35de076775cee1e21720
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 13:47:55 2026 +0100

    Change sort and filter files to .cpp and .hpp

diff --git a/gnucash/gnome/CMakeLists.txt b/gnucash/gnome/CMakeLists.txt
index c2807ca262..2e0ff04247 100644
--- a/gnucash/gnome/CMakeLists.txt
+++ b/gnucash/gnome/CMakeLists.txt
@@ -47,8 +47,8 @@ set (gnc_gnome_noinst_HEADERS
   gnc-plugin-page-invoice.h
   gnc-plugin-page-owner-tree.h
   gnc-plugin-page-register.h
-  gnc-plugin-page-register-filter.h
-  gnc-plugin-page-register-sort.h
+  gnc-plugin-page-register-filter.hpp
+  gnc-plugin-page-register-sort.hpp
   gnc-plugin-page-report.h
   gnc-plugin-page-sx-list.h
   gnc-split-reg.h
@@ -116,8 +116,8 @@ set (gnc_gnome_SOURCES
   gnc-plugin-page-invoice.cpp
   gnc-plugin-page-owner-tree.cpp
   gnc-plugin-page-register.cpp
-  gnc-plugin-page-register-filter.c
-  gnc-plugin-page-register-sort.c
+  gnc-plugin-page-register-filter.cpp
+  gnc-plugin-page-register-sort.cpp
   gnc-plugin-page-report.cpp
   gnc-plugin-page-sx-list.cpp
   gnc-split-reg.c
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.c b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
similarity index 98%
rename from gnucash/gnome/gnc-plugin-page-register-filter.c
rename to gnucash/gnome/gnc-plugin-page-register-filter.cpp
index 5fa216273d..be56535724 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.c
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.cpp
@@ -1,5 +1,5 @@
 /**********************************************************************
- * gnc-plugin-page-register-filter.c -- register page filter          *
+ * gnc-plugin-page-register-filter.cpp -- register page filter        *
  *                                                                    *
  * Copyright (C) 2026, Robert Fewell                                  *
  *                                                                    *
@@ -25,7 +25,7 @@
     @{ */
 /** @addtogroup RegisterPlugin Register Page Filter
     @{ */
-/** @file gnc-plugin-page-register-filter.c
+/** @file gnc-plugin-page-register-filter.cpp
     @brief  Functions providing a register page filter for the GnuCash UI
     @author Copyright (C) 2026 Bob Fewell
 */
@@ -49,15 +49,18 @@
 #include "Query.h"
 
 #include "gnc-plugin-page-register.h"
-#include "gnc-plugin-page-register-filter.h"
+#include "gnc-plugin-page-register-filter.hpp"
 
 #define DEFAULT_FILTER_NUM_DAYS_GL  "30"
-#define CLEARED_VALUE "cleared_value"
 #define DEFAULT_FILTER "0x001f"
 
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
+extern "C"
+{
+// These functions are the dialog callbacks. They're connected to their
+// signals in gnc-plugin-page-register.glade so they mustn't be name-mangled.
 void
 gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
                                 GncPluginPageRegister* page);
@@ -86,6 +89,7 @@ gnc_ppr_filter_save_cb (GtkToggleButton* button,
 void
 gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
                                 GncPluginPageRegister* page);
+}
 
 struct status_action
 {
@@ -580,11 +584,10 @@ gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
     ENTER("toggle button %s (%p), plugin_page %p", name, button, page);
 
     FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
-    gint i, value;
 
     /* Determine what status bit to change */
-    value = CLEARED_NONE;
-    for (i = 0; status_actions[i].action_name; i++)
+    int value = CLEARED_NONE;
+    for (int i = 0; status_actions[i].action_name; i++)
     {
         if (g_strcmp0 (name, status_actions[i].action_name) == 0)
         {
@@ -618,7 +621,6 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
                                      GncPluginPageRegister* page)
 {
     GtkWidget* widget;
-    gint i;
 
     g_return_if_fail (GTK_IS_BUTTON(button));
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
@@ -628,7 +630,7 @@ gnc_ppr_filter_status_select_all_cb (GtkButton* button,
     FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Turn on all the check menu items */
-    for (i = 0; status_actions[i].action_name; i++)
+    for (int i = 0; status_actions[i].action_name; i++)
     {
         widget = status_actions[i].widget;
         g_signal_handlers_block_by_func (widget,
@@ -658,7 +660,6 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
                                     GncPluginPageRegister* page)
 {
     GtkWidget* widget;
-    gint i;
 
     g_return_if_fail (GTK_IS_BUTTON(button));
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
@@ -668,7 +669,7 @@ gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
     FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
 
     /* Turn off all the check menu items */
-    for (i = 0; status_actions[i].action_name; i++)
+    for (int i = 0; status_actions[i].action_name; i++)
     {
         widget = status_actions[i].widget;
         g_signal_handlers_block_by_func (widget,
@@ -986,7 +987,7 @@ gnc_ppr_filter_response_cb (GtkDialog* dialog,
         fd->end_time = fd->original_end_time;
         fd->days = fd->original_days;
         fd->save_filter = fd->original_save_filter;
-        gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));;
+        gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
     }
     else
     {
@@ -1051,8 +1052,6 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
     time64 start_time, end_time, time_val;
     GtkBuilder* builder;
     gboolean sensitive, value;
-    gchar* title;
-    int i;
 
     /* Create the dialog */
     builder = gtk_builder_new();
@@ -1066,13 +1065,13 @@ gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
                                   gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
 
     /* Translators: The %s is the name of the plugin page */
-    title = g_strdup_printf (_ ("Filter %s by…"),
-                             gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+    gchar* title = g_strdup_printf (_ ("Filter %s by…"),
+                       gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
     gtk_window_set_title (GTK_WINDOW(dialog), title);
     g_free (title);
 
     /* Set the check buttons for the current status */
-    for (i = 0; status_actions[i].action_name; i++)
+    for (int i = 0; status_actions[i].action_name; i++)
     {
         toggle = GTK_WIDGET(gtk_builder_get_object (builder,
                                                      status_actions[i].action_name));
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.h b/gnucash/gnome/gnc-plugin-page-register-filter.hpp
similarity index 82%
rename from gnucash/gnome/gnc-plugin-page-register-filter.h
rename to gnucash/gnome/gnc-plugin-page-register-filter.hpp
index 3c31873233..428187ef41 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.h
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.hpp
@@ -1,5 +1,5 @@
 /**********************************************************************
- * gnc-plugin-page-register-filter.h -- register page filter          *
+ * gnc-plugin-page-register-filter.hpp -- register page filter        *
  *                                                                    *
  * Copyright (C) 2026 Bob Fewell                                      *
  *                                                                    *
@@ -25,24 +25,19 @@
     @{ */
 /** @addtogroup RegisterPlugin Register Page Filter
     @{ */
-/** @file gnc-plugin-page-register-filter.h
+/** @file gnc-plugin-page-register-filter.hpp
     @brief  Functions providing a register page filter for the GnuCash UI
     @author Copyright (C) 2026 Bob Fewell
 */
 
-#ifndef __GNC_PLUGIN_PAGE_REGISTER_FILTER_H
-#define __GNC_PLUGIN_PAGE_REGISTER_FILTER_H
+#ifndef __GNC_PLUGIN_PAGE_REGISTER_FILTER_HPP
+#define __GNC_PLUGIN_PAGE_REGISTER_FILTER_HPP
 
 #include <gtk/gtk.h>
 #include "gnc-split-reg.h"
 #include "gnc-plugin-page.h"
 
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-typedef struct filter_data
+struct FilterData
 {
     GtkWidget* dialog;
     GtkWidget* table;
@@ -59,23 +54,19 @@ typedef struct filter_data
     time64 original_end_time;
     time64 start_time;
     time64 end_time;
-    gint days;
-    gint original_days;
+    int days;
+    int original_days;
     gboolean original_save_filter;
     gboolean save_filter;
-}FilterData;
+};
 
-void gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd);
+void gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, struct FilterData *fd);
 
 void gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page);
 
 void gnc_ppr_filter_update_register (GncPluginPage* plugin_page);
 
 void gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
-                        FilterData *fd, gboolean show_save_button);
-
-#ifdef __cplusplus
-}
-#endif
+                        struct FilterData *fd, gboolean show_save_button);
 
-#endif /* __GNC_PLUGIN_PAGE_REGISTER_FILTER_H */
+#endif /* __GNC_PLUGIN_PAGE_REGISTER_FILTER_HPP */
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.c b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
similarity index 96%
rename from gnucash/gnome/gnc-plugin-page-register-sort.c
rename to gnucash/gnome/gnc-plugin-page-register-sort.cpp
index 5bb3a4ae46..7434f85c4a 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.c
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.cpp
@@ -36,7 +36,7 @@
 #include <glib/gi18n.h>
 
 #include "gnc-plugin-page-register.h"
-#include "gnc-plugin-page-register-sort.h"
+#include "gnc-plugin-page-register-sort.hpp"
 #include "dialog-utils.h"
 #include "gnc-state.h"
 #include "gnc-prefs.h"
@@ -52,6 +52,10 @@ static QofLogModule log_module = GNC_MOD_GUI;
 
 #define DEFAULT_SORT_ORDER "BY_STANDARD"
 
+extern "C"
+{
+// These functions are the dialog callbacks. They're connected to their
+// signals in gnc-plugin-page-register.glade so they mustn't be name-mangled.
 void
 gnc_ppr_sort_response_cb (GtkDialog* dialog,
                           gint response,
@@ -68,6 +72,7 @@ gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
 void
 gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
                                GncPluginPageRegister *page);
+}
 
 static void
 gnc_ppr_check_for_empty_group (GKeyFile *state_file,
@@ -185,19 +190,20 @@ gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
     GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
     GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
 
+    sd->save_order = FALSE;
+
     // Set the sort direction for the split register and status of save order button
     sd->reverse_order = gnc_ppr_sort_get_reversed (gsr);
 
     PINFO("Loaded Sort reversed order is %s", sd->reverse_order ? "true" : "false");
 
-    gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, FALSE);
+    gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, no_refresh);
     if (sd->reverse_order)
         sd->save_order = TRUE;
 
     sd->original_reverse_order = sd->reverse_order;
 
     // Set the sort order for the split register and status of save order button
-    sd->save_order = FALSE;
     gchar* order = gnc_ppr_sort_get_order (gsr);
 
     PINFO("Loaded Sort order is %s", order);
@@ -257,7 +263,7 @@ gnc_ppr_sort_book_option_changed (gpointer new_val,
 
     GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
 
-    gnc_split_reg_sort (gsr, gsr->sort_type, force, refresh);
+    gnc_split_reg_sort (gsr, (SortType)gsr->sort_type, force, refresh);
 }
 
 /** This function is called when the "Sort By…" dialog is closed.
@@ -413,9 +419,6 @@ gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
 {
     GtkWidget* dialog, *button;
     GtkBuilder* builder;
-    SortType sort;
-    const gchar* name;
-    gchar* title;
 
     /* Create the dialog */
     builder = gtk_builder_new();
@@ -425,7 +428,7 @@ gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
     gtk_window_set_transient_for (GTK_WINDOW(dialog),
                                   gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
     /* Translators: The %s is the name of the plugin page */
-    title = g_strdup_printf (_ ("Sort %s by…"),
+    gchar* title = g_strdup_printf (_ ("Sort %s by…"),
                              gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
     gtk_window_set_title (GTK_WINDOW(dialog), title);
     g_free (title);
@@ -433,8 +436,8 @@ gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
     GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
 
     /* Set the button for the current sort order */
-    sort = gnc_split_reg_get_sort_type (gsr);
-    name = SortTypeasString (sort);
+    SortType sort = gnc_split_reg_get_sort_type (gsr);
+    const gchar* name = SortTypeasString (sort);
     button = GTK_WIDGET(gtk_builder_get_object (builder, name));
     DEBUG("current sort %d, button %s(%p)", sort, name, button);
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.h b/gnucash/gnome/gnc-plugin-page-register-sort.hpp
similarity index 84%
rename from gnucash/gnome/gnc-plugin-page-register-sort.h
rename to gnucash/gnome/gnc-plugin-page-register-sort.hpp
index 42b84e493c..1a0ed921ff 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.h
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.hpp
@@ -1,5 +1,5 @@
 /**********************************************************************
- * gnc-plugin-page-register-sort.h -- register page sort              *
+ * gnc-plugin-page-register-sort.hpp -- register page sort            *
  *                                                                    *
  * Copyright (C) 2026 Bob Fewell                                      *
  *                                                                    *
@@ -25,24 +25,19 @@
     @{ */
 /** @addtogroup RegisterPlugin Register Page Sort
     @{ */
-/** @file gnc-plugin-page-register-filter.h
+/** @file gnc-plugin-page-register-filter.hpp
     @brief  Functions providing a register page sort for the GnuCash UI
     @author Copyright (C) 2026 Bob Fewell
 */
 
-#ifndef __GNC_PLUGIN_PAGE_REGISTER_SORT_H
-#define __GNC_PLUGIN_PAGE_REGISTER_SORT_H
+#ifndef __GNC_PLUGIN_PAGE_REGISTER_SORT_HPP
+#define __GNC_PLUGIN_PAGE_REGISTER_SORT_HPP
 
 #include <gtk/gtk.h>
 #include "gnc-split-reg.h"
 #include "gnc-plugin-page.h"
 
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-typedef struct sort_data
+struct SortData
 {
     GtkWidget* dialog;
     GtkWidget* num_radio;
@@ -52,15 +47,11 @@ typedef struct sort_data
     gboolean   save_order;
     gboolean   reverse_order;
     gboolean   original_reverse_order;
-} SortData;
+};
 
 void gnc_ppr_sort_update_register (GncPluginPage* plugin_page);
 
 void gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
-                          SortData *sd, gboolean show_save_button);
-
-#ifdef __cplusplus
-}
-#endif
+                          struct SortData *sd, gboolean show_save_button);
 
-#endif /* __GNC_PLUGIN_PAGE_REGISTER_SORT_H */
+#endif /* __GNC_PLUGIN_PAGE_REGISTER_SORT_HPP */
diff --git a/gnucash/gnome/gnc-plugin-page-register.h b/gnucash/gnome/gnc-plugin-page-register.h
index 8bfc7736c1..5505a639d9 100644
--- a/gnucash/gnome/gnc-plugin-page-register.h
+++ b/gnucash/gnome/gnc-plugin-page-register.h
@@ -42,8 +42,8 @@
 #include "gnc-plugin-page.h"
 #include "gnc-split-reg.h"
 #include "Query.h"
-#include "gnc-plugin-page-register-filter.h"
-#include "gnc-plugin-page-register-sort.h"
+#include "gnc-plugin-page-register-filter.hpp"
+#include "gnc-plugin-page-register-sort.hpp"
 
 
 #ifdef __cplusplus
@@ -140,13 +140,13 @@ GNCSplitReg * gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page);
  *
  *  @param plugin_page A "register" page.
  */
-FilterData * gnc_plugin_page_register_get_filter_data (GncPluginPage *plugin_page);
+struct FilterData * gnc_plugin_page_register_get_filter_data (GncPluginPage *plugin_page);
 
 /** Get the SortData data structure associated with this register page.
  *
  *  @param plugin_page A "register" page.
  */
-SortData * gnc_plugin_page_register_get_sort_data (GncPluginPage *plugin_page);
+struct SortData * gnc_plugin_page_register_get_sort_data (GncPluginPage *plugin_page);
 
 /** Get the Query associated with this "register" plugin page.
  *
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 271d62b96c..2fc80422f9 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -100,8 +100,8 @@ gnucash/gnome/gnc-plugin-page-budget.cpp
 gnucash/gnome/gnc-plugin-page-invoice.cpp
 gnucash/gnome/gnc-plugin-page-owner-tree.cpp
 gnucash/gnome/gnc-plugin-page-register.cpp
-gnucash/gnome/gnc-plugin-page-register-filter.c
-gnucash/gnome/gnc-plugin-page-register-sort.c
+gnucash/gnome/gnc-plugin-page-register-filter.cpp
+gnucash/gnome/gnc-plugin-page-register-sort.cpp
 gnucash/gnome/gnc-plugin-page-report.cpp
 gnucash/gnome/gnc-plugin-page-sx-list.cpp
 gnucash/gnome/gnc-plugin-register.c

commit 4855345e6c7ecceedc221eaca53999869644ef89
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Tue Apr 14 13:46:40 2026 +0100

    Factor out updating the register from sort/filter

diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.c b/gnucash/gnome/gnc-plugin-page-register-filter.c
index fc3cff3107..5fa216273d 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.c
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.c
@@ -51,29 +51,41 @@
 #include "gnc-plugin-page-register.h"
 #include "gnc-plugin-page-register-filter.h"
 
+#define DEFAULT_FILTER_NUM_DAYS_GL  "30"
+#define CLEARED_VALUE "cleared_value"
+#define DEFAULT_FILTER "0x001f"
+
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
-
-void gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
-                                     GncPluginPageRegister* page);
-void gnc_ppr_filter_start_cb (GtkWidget* radio,
-                              GncPluginPageRegister* page);
-void gnc_ppr_filter_end_cb (GtkWidget* radio,
+void
+gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
+                                GncPluginPageRegister* page);
+void
+gnc_ppr_filter_start_cb (GtkWidget* radio,
+                         GncPluginPageRegister* page);
+void
+gnc_ppr_filter_end_cb (GtkWidget* radio,
+                       GncPluginPageRegister* page);
+void
+gnc_ppr_filter_response_cb (GtkDialog* dialog,
+                            gint response,
                             GncPluginPageRegister* page);
-void gnc_ppr_filter_response_cb (GtkDialog* dialog,
-                                 gint response,
-                                 GncPluginPageRegister* page);
-void gnc_ppr_filter_status_select_all_cb (GtkButton* button,
-                                          GncPluginPageRegister* page);
-void gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
-                                         GncPluginPageRegister* page);
-void gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
-                                   GncPluginPageRegister* page);
-void gnc_ppr_filter_save_cb (GtkToggleButton* button,
-                             GncPluginPageRegister* page);
-void gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
+void
+gnc_ppr_filter_status_select_all_cb (GtkButton* button,
                                      GncPluginPageRegister* page);
+void
+gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
+                                    GncPluginPageRegister* page);
+void
+gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
+                              GncPluginPageRegister* page);
+void
+gnc_ppr_filter_save_cb (GtkToggleButton* button,
+                        GncPluginPageRegister* page);
+void
+gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
+                                GncPluginPageRegister* page);
 
 struct status_action
 {
@@ -102,7 +114,7 @@ get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
 }
 
 /* This function converts a time64 value date to a string */
-gchar*
+static gchar*
 gnc_ppr_filter_time2dmy (time64 raw_time)
 {
     struct tm* timeinfo;
@@ -117,7 +129,7 @@ gnc_ppr_filter_time2dmy (time64 raw_time)
 }
 
 /* This function converts a string date to a time64 value */
-time64
+static time64
 gnc_ppr_filter_dmy2time (char* date_string)
 {
     struct tm when;
@@ -147,7 +159,7 @@ gnc_ppr_check_for_empty_group (GKeyFile *state_file,
     g_strfreev (keys);
 }
 
-gchar*
+static gchar*
 gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
 {
     if (!gsr)
@@ -324,7 +336,7 @@ gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
  *  @param plugin_page A pointer to the GncPluginPageRegister that is
  *  associated with this filter dialog.
  */
-void
+static void
 gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page)
 {
     ENTER(" ");
@@ -380,7 +392,7 @@ gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page)
  *  @param plugin_page A pointer to the GncPluginPageRegister that is
  *  associated with this filter dialog.
  */
-void
+static void
 gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page)
 {
     ENTER(" ");
@@ -456,6 +468,95 @@ gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
 
     gnc_ppr_filter_update_date_query (plugin_page);
 }
+ 
+void
+gnc_ppr_filter_update_register (GncPluginPage* plugin_page)
+{
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
+    int filter_changed = 0;
+
+    /* Set the filter for the split register and status of save filter button */
+    fd->save_filter = FALSE;
+
+    gchar* filter_str = gnc_ppr_filter_get_filter (gsr, ledger_type);
+    gchar** filter = g_strsplit (filter_str, ",", -1);
+    guint filtersize = g_strv_length (filter);
+    g_free (filter_str);
+
+    PINFO("Loaded Filter Status is %s", filter[0]);
+
+    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], NULL, 16);
+
+    if (filtersize > 0 && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
+        filter_changed++;
+
+    if (filtersize > 1 && (g_strcmp0 (filter[1], "0") != 0))
+    {
+        PINFO("Loaded Filter Start Date is %s", filter[1]);
+
+        fd->start_time = gnc_ppr_filter_dmy2time (filter[1]);
+        fd->start_time = gnc_time64_get_day_start (fd->start_time);
+        filter_changed++;
+    }
+
+    if (filtersize > 2 && (g_strcmp0 (filter[2], "0") != 0))
+    {
+        PINFO("Loaded Filter End Date is %s", filter[2]);
+
+        fd->end_time = gnc_ppr_filter_dmy2time (filter[2]);
+        fd->end_time = gnc_time64_get_day_end (fd->end_time);
+        filter_changed++;
+    }
+
+    // set the default for the number of days
+    fd->days = (gint)g_ascii_strtoll (get_filter_default_num_of_days (ledger_type), NULL, 10);
+
+    if (filtersize > 3 &&
+        (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0))
+    {
+        PINFO("Loaded Filter Days is %s", filter[3]);
+
+        fd->days = (gint)g_ascii_strtoll (filter[3], NULL, 10);
+        filter_changed++;
+    }
+
+    if (filter_changed != 0)
+        fd->save_filter = TRUE;
+
+    fd->original_save_filter = fd->save_filter;
+    g_strfreev (filter);
+
+    if (ledger_type == LD_GL)
+    {
+        SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger);
+        time64 start_time = 0, end_time = 0;
+
+        if (reg->type == GENERAL_JOURNAL)
+        {
+            start_time = fd->start_time;
+            end_time = fd->end_time;
+        }
+        else // search ledger and the like
+        {
+            fd->days = 0;
+            fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
+            fd->save_filter = FALSE;
+        }
+
+        fd->original_days = fd->days;
+        fd->original_start_time = start_time;
+        fd->start_time = start_time;
+        fd->original_end_time = end_time;
+        fd->end_time = end_time;
+    }
+    /* Update Query with Filter Status and Dates */
+    gnc_ppr_filter_update_status_query (plugin_page);
+    gnc_ppr_filter_update_date_query (plugin_page);
+}
 
 /** This function is called whenever one of the status entries is
  *  checked or unchecked.  It updates the status value maintained for
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.h b/gnucash/gnome/gnc-plugin-page-register-filter.h
index 9a2c10072c..3c31873233 100644
--- a/gnucash/gnome/gnc-plugin-page-register-filter.h
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.h
@@ -65,26 +65,14 @@ typedef struct filter_data
     gboolean save_filter;
 }FilterData;
 
-#define DEFAULT_FILTER_NUM_DAYS_GL  "30"
-#define CLEARED_VALUE "cleared_value"
-#define DEFAULT_FILTER "0x001f"
-
-time64 gnc_ppr_filter_dmy2time (char* date_string);
-gchar* gnc_ppr_filter_time2dmy (time64 raw_time);
-
-gchar* gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type);
-//void gnc_ppr_filter_set_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type, const gchar* filter);
-
-
-void gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page);
-void gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page);
-
 void gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd);
 
 void gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page);
 
-void gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query, FilterData *fd, gboolean show_save_button);
+void gnc_ppr_filter_update_register (GncPluginPage* plugin_page);
 
+void gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
+                        FilterData *fd, gboolean show_save_button);
 
 #ifdef __cplusplus
 }
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.c b/gnucash/gnome/gnc-plugin-page-register-sort.c
index b59e1b4156..5bb3a4ae46 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.c
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.c
@@ -50,6 +50,8 @@
 /* This static indicates the debugging module that this .o belongs to.  */
 static QofLogModule log_module = GNC_MOD_GUI;
 
+#define DEFAULT_SORT_ORDER "BY_STANDARD"
+
 void
 gnc_ppr_sort_response_cb (GtkDialog* dialog,
                           gint response,
@@ -80,7 +82,7 @@ gnc_ppr_check_for_empty_group (GKeyFile *state_file,
     g_strfreev (keys);
 }
 
-gchar*
+static gchar*
 gnc_ppr_sort_get_order (GNCSplitReg *gsr)
  {
     if (!gsr)
@@ -107,7 +109,7 @@ gnc_ppr_sort_get_order (GNCSplitReg *gsr)
     return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
 }
 
-void
+static void
 gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
 {
     if (!gsr)
@@ -130,7 +132,7 @@ gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
     g_free (state_section);
 }
 
-gboolean
+static gboolean
 gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
 {
     if (!gsr)
@@ -150,7 +152,7 @@ gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
     return sort_reversed;
 }
 
-void
+static void
 gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
 {
     if (!gsr)
@@ -174,6 +176,53 @@ gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
     g_free (state_section);
 }
 
+void
+gnc_ppr_sort_update_register (GncPluginPage* plugin_page)
+{
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    SortData *sd = gnc_plugin_page_register_get_sort_data (plugin_page);
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
+
+    // Set the sort direction for the split register and status of save order button
+    sd->reverse_order = gnc_ppr_sort_get_reversed (gsr);
+
+    PINFO("Loaded Sort reversed order is %s", sd->reverse_order ? "true" : "false");
+
+    gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, FALSE);
+    if (sd->reverse_order)
+        sd->save_order = TRUE;
+
+    sd->original_reverse_order = sd->reverse_order;
+
+    // Set the sort order for the split register and status of save order button
+    sd->save_order = FALSE;
+    gchar* order = gnc_ppr_sort_get_order (gsr);
+
+    PINFO("Loaded Sort order is %s", order);
+
+    gnc_split_reg_sort (gsr, SortTypefromString (order), no_force, no_refresh);
+
+    if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
+        sd->save_order = TRUE;
+
+    sd->original_save_order = sd->save_order;
+    g_free (order);
+
+    if (ledger_type == LD_GL)
+    {
+        SplitRegister *reg = gnc_ledger_display_get_split_register (gsr->ledger);
+
+        if (reg->type != GENERAL_JOURNAL) // search ledger and the like
+        {
+            gnc_split_reg_sort (gsr, SortTypefromString (DEFAULT_SORT_ORDER), no_force, no_refresh);
+            sd->reverse_order = FALSE;
+            sd->save_order = FALSE;
+        }
+    }
+}
+
 /** This function is called whenever the number source book options is changed
  *  to adjust the displayed labels. Since the book option change may change the
  *  query sort, the gnc_split_reg_sort function is called with force and refresh
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.h b/gnucash/gnome/gnc-plugin-page-register-sort.h
index 3c09158178..42b84e493c 100644
--- a/gnucash/gnome/gnc-plugin-page-register-sort.h
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.h
@@ -54,13 +54,7 @@ typedef struct sort_data
     gboolean   original_reverse_order;
 } SortData;
 
-#define DEFAULT_SORT_ORDER "BY_STANDARD"
-
-gboolean gnc_ppr_sort_get_reversed (GNCSplitReg *gsr);
-void gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order);
-
-gchar* gnc_ppr_sort_get_order (GNCSplitReg *gsr);
-void gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order);
+void gnc_ppr_sort_update_register (GncPluginPage* plugin_page);
 
 void gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
                           SortData *sd, gboolean show_save_button);
diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index ba74b74771..be628844ad 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -1060,17 +1060,6 @@ gnc_plugin_page_register_ui_initial_state (GncPluginPageRegister* page)
                                        (gpointer)gnc_plugin_page_register_cmd_style_double_line, page);
 }
 
-/* Virtual Functions */
-//FIXME ??
-static const gchar*
-get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
-{
-    if (ledger_type == LD_GL)
-        return DEFAULT_FILTER_NUM_DAYS_GL;
-    else
-        return "0";
-}
-
 /* For setting the focus on a register page, the default gnc_plugin
  * function for 'focus_page' is overridden so that the page focus
  * can be conditionally set. This is to allow for enabling the setting
@@ -1114,19 +1103,36 @@ gnc_plugin_page_register_focus (GncPluginPage* plugin_page,
         gnc_ledger_display_set_focus (priv->ledger, priv->page_focus);
 }
 
+static void
+gnc_ppr_update_filter_and_sort (GncPluginPage* plugin_page)
+{
+    GncPluginPageRegister *page = GNC_PLUGIN_PAGE_REGISTER(plugin_page);
+    GncPluginPageRegisterPrivate *priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+
+    ENTER("page %p", plugin_page);
+
+    priv->enable_refresh = FALSE; // disable refresh
+
+    // Load the saved register sort and filter properties
+    gnc_ppr_sort_update_register (plugin_page);
+    gnc_ppr_filter_update_register (plugin_page);
+
+    priv->enable_refresh = TRUE; // enable refresh
+
+    // Set filter tooltip for summary bar
+    gnc_ppr_filter_set_tooltip (plugin_page, &priv->fd);
+}
+
 static GtkWidget*
 gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
 {
     GncPluginPageRegister* page;
     GncPluginPageRegisterPrivate* priv;
-    GNCLedgerDisplayType ledger_type;
     GncWindow* gnc_window;
     guint numRows;
     GtkWidget* gsr;
     SplitRegister* reg;
     Account* acct;
-    gchar* order;
-    int filter_changed = 0;
 
     ENTER ("page %p", plugin_page);
     page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
@@ -1153,7 +1159,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
                              gnc_window_get_gtk_window (gnc_window),
                              numRows, priv->read_only);
     priv->gsr = (GNCSplitReg *)gsr;
-    g_object_ref(gsr);
+    g_object_ref (gsr);
 
     gtk_widget_show (gsr);
     gtk_box_pack_start (GTK_BOX (priv->widget), gsr, TRUE, TRUE, 0);
@@ -1173,123 +1179,8 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
     gnc_plugin_page_register_ui_initial_state (page);
     gnc_plugin_page_register_ui_update (NULL, page);
 
-    ledger_type = gnc_ledger_display_type (priv->ledger);
-
-    {
-        gchar** filter;
-        gchar* filter_str;
-        guint filtersize = 0;
-        /* Set the sort order for the split register and status of save order button */
-        priv->sd.save_order = FALSE;
-        order = gnc_ppr_sort_get_order (priv->gsr);
-
-        PINFO ("Loaded Sort order is %s", order);
-        gnc_split_reg_sort (priv->gsr, SortTypefromString (order), no_force, no_refresh);
-
-        if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
-            priv->sd.save_order = TRUE;
-
-        priv->sd.original_save_order = priv->sd.save_order;
-        g_free (order);
-
-        priv->sd.reverse_order = gnc_ppr_sort_get_reversed (priv->gsr);
-
-        gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, no_refresh);
-        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;
-
-        filter_str = gnc_ppr_filter_get_filter (priv->gsr, ledger_type);
-        filter = g_strsplit (filter_str, ",", -1);
-        filtersize = g_strv_length (filter);
-        g_free (filter_str);
-
-        PINFO ("Loaded Filter Status is %s", filter[0]);
-
-        priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (filter[0], NULL, 16);
-
-        if (filtersize > 0 && (g_strcmp0 (filter[0], DEFAULT_FILTER) != 0))
-            filter_changed = filter_changed + 1;
-
-        if (filtersize > 1 && (g_strcmp0 (filter[1], "0") != 0))
-        {
-            PINFO ("Loaded Filter Start Date is %s", filter[1]);
-
-            priv->fd.start_time = gnc_ppr_filter_dmy2time (filter[1]);
-            priv->fd.start_time = gnc_time64_get_day_start (priv->fd.start_time);
-            filter_changed = filter_changed + 1;
-        }
-
-        if (filtersize > 2 && (g_strcmp0 (filter[2], "0") != 0))
-        {
-            PINFO ("Loaded Filter End Date is %s", filter[2]);
-
-            priv->fd.end_time = gnc_ppr_filter_dmy2time (filter[2]);
-            priv->fd.end_time = gnc_time64_get_day_end (priv->fd.end_time);
-            filter_changed = filter_changed + 1;
-        }
-
-        // set the default for the number of days
-        priv->fd.days = (gint)g_ascii_strtoll (
-                            get_filter_default_num_of_days (ledger_type), NULL, 10);
-
-        if (filtersize > 3 &&
-            (g_strcmp0 (filter[3], get_filter_default_num_of_days (ledger_type)) != 0))
-        {
-            PINFO ("Loaded Filter Days is %s", filter[3]);
-
-            priv->fd.days = (gint)g_ascii_strtoll (filter[3], NULL, 10);
-            filter_changed = filter_changed + 1;
-        }
-
-        if (filter_changed != 0)
-            priv->fd.save_filter = TRUE;
-
-        priv->fd.original_save_filter = priv->fd.save_filter;
-        g_strfreev (filter);
-    }
-
-    if (ledger_type == LD_GL)
-    {
-        time64 start_time = 0, end_time = 0;
-
-        if (reg->type == GENERAL_JOURNAL)
-        {
-            start_time = priv->fd.start_time;
-            end_time = priv->fd.end_time;
-        }
-        else // search ledger and the like
-        {
-            priv->fd.days = 0;
-            priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
-            gnc_split_reg_sort (priv->gsr, SortTypefromString (DEFAULT_SORT_ORDER), no_force, no_refresh);
-            priv->sd.reverse_order = FALSE;
-            priv->fd.save_filter = FALSE;
-            priv->sd.save_order = FALSE;
-        }
-
-        priv->fd.original_days = priv->fd.days;
-
-        priv->fd.original_start_time = start_time;
-        priv->fd.start_time = start_time;
-        priv->fd.original_end_time = end_time;
-        priv->fd.end_time = end_time;
-    }
-
-    priv->enable_refresh = FALSE; // disable refresh
-
-    /* Update Query with Filter Status and Dates */
-    gnc_ppr_filter_update_status_query (plugin_page);
-    gnc_ppr_filter_update_date_query (plugin_page);
-
-    priv->enable_refresh = TRUE; // enable refresh
-
-    // Set filter tooltip for summary bar
-    gnc_ppr_filter_set_tooltip (plugin_page, &priv->fd);
+    // Now setup the sort and filter settings
+    gnc_ppr_update_filter_and_sort (plugin_page);
 
     plugin_page->summarybar = gsr_create_summary_bar (priv->gsr);
     if (plugin_page->summarybar)
@@ -2015,7 +1906,8 @@ gnc_plugin_page_register_update_for_search_query (GncPluginPageRegister* page)
 }
 
 void
-gnc_plugin_register_set_enable_refresh (GncPluginPageRegister* page, gboolean enable_refresh)
+gnc_plugin_register_set_enable_refresh (GncPluginPageRegister* page,
+                                        gboolean enable_refresh)
 {
     GncPluginPageRegisterPrivate* priv;
 

commit bad32f354ccdc654e9ad186fea5a36ea631577d8
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Apr 8 15:02:00 2026 +0100

    Move register filter parts to separate file

diff --git a/gnucash/gnome/CMakeLists.txt b/gnucash/gnome/CMakeLists.txt
index 3cdf734050..c2807ca262 100644
--- a/gnucash/gnome/CMakeLists.txt
+++ b/gnucash/gnome/CMakeLists.txt
@@ -47,6 +47,7 @@ set (gnc_gnome_noinst_HEADERS
   gnc-plugin-page-invoice.h
   gnc-plugin-page-owner-tree.h
   gnc-plugin-page-register.h
+  gnc-plugin-page-register-filter.h
   gnc-plugin-page-register-sort.h
   gnc-plugin-page-report.h
   gnc-plugin-page-sx-list.h
@@ -115,6 +116,7 @@ set (gnc_gnome_SOURCES
   gnc-plugin-page-invoice.cpp
   gnc-plugin-page-owner-tree.cpp
   gnc-plugin-page-register.cpp
+  gnc-plugin-page-register-filter.c
   gnc-plugin-page-register-sort.c
   gnc-plugin-page-report.cpp
   gnc-plugin-page-sx-list.cpp
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.c b/gnucash/gnome/gnc-plugin-page-register-filter.c
new file mode 100644
index 0000000000..fc3cff3107
--- /dev/null
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.c
@@ -0,0 +1,1112 @@
+/**********************************************************************
+ * gnc-plugin-page-register-filter.c -- register page filter          *
+ *                                                                    *
+ * Copyright (C) 2026, Robert Fewell                                  *
+ *                                                                    *
+ * This program is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License as     *
+ * published by the Free Software Foundation; either version 2 of     *
+ * the License, or (at your option) any later version.                *
+ *                                                                    *
+ * This program is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *
+ * GNU General Public License for more details.                       *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this program; if not, contact:                          *
+ *                                                                    *
+ * Free Software Foundation           Voice:  +1-617-542-5942         *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652         *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                     *
+ **********************************************************************/
+
+/** @addtogroup ContentPlugins
+    @{ */
+/** @addtogroup RegisterPlugin Register Page Filter
+    @{ */
+/** @file gnc-plugin-page-register-filter.c
+    @brief  Functions providing a register page filter for the GnuCash UI
+    @author Copyright (C) 2026 Bob Fewell
+*/
+
+#include <config.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+#include "dialog-utils.h"
+#include "gnc-date.h"
+#include "gnc-date-edit.h"
+#include "gnc-glib-utils.h"
+#include "gnc-state.h"
+#include "gnc-prefs.h"
+#include "gnc-ui-util.h"
+#include "gnc-window.h"
+#include "gnc-main-window.h"
+#include "engine-helpers.h"
+#include "qofbookslots.h"
+#include "qof.h"
+#include "Query.h"
+
+#include "gnc-plugin-page-register.h"
+#include "gnc-plugin-page-register-filter.h"
+
+/* This static indicates the debugging module that this .o belongs to.  */
+static QofLogModule log_module = GNC_MOD_GUI;
+
+
+void gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
+                                     GncPluginPageRegister* page);
+void gnc_ppr_filter_start_cb (GtkWidget* radio,
+                              GncPluginPageRegister* page);
+void gnc_ppr_filter_end_cb (GtkWidget* radio,
+                            GncPluginPageRegister* page);
+void gnc_ppr_filter_response_cb (GtkDialog* dialog,
+                                 gint response,
+                                 GncPluginPageRegister* page);
+void gnc_ppr_filter_status_select_all_cb (GtkButton* button,
+                                          GncPluginPageRegister* page);
+void gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
+                                         GncPluginPageRegister* page);
+void gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
+                                   GncPluginPageRegister* page);
+void gnc_ppr_filter_save_cb (GtkToggleButton* button,
+                             GncPluginPageRegister* page);
+void gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
+                                     GncPluginPageRegister* page);
+
+struct status_action
+{
+    const char* action_name;
+    int value;
+    GtkWidget* widget;
+};
+
+static struct status_action status_actions[] =
+{
+    { "filter_status_reconciled",   CLEARED_RECONCILED, NULL },
+    { "filter_status_cleared",      CLEARED_CLEARED, NULL },
+    { "filter_status_voided",       CLEARED_VOIDED, NULL },
+    { "filter_status_frozen",       CLEARED_FROZEN, NULL },
+    { "filter_status_unreconciled", CLEARED_NO, NULL },
+    { NULL, 0, NULL },
+};
+
+static const gchar*
+get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
+{
+    if (ledger_type == LD_GL)
+        return DEFAULT_FILTER_NUM_DAYS_GL;
+    else
+        return "0";
+}
+
+/* This function converts a time64 value date to a string */
+gchar*
+gnc_ppr_filter_time2dmy (time64 raw_time)
+{
+    struct tm* timeinfo;
+    gchar date_string[11];
+
+    timeinfo = gnc_localtime (&raw_time);
+    strftime (date_string, 11, "%d-%m-%Y", timeinfo);
+    PINFO("Date to string is %s", date_string);
+    gnc_tm_free (timeinfo);
+
+    return g_strdup (date_string);
+}
+
+/* This function converts a string date to a time64 value */
+time64
+gnc_ppr_filter_dmy2time (char* date_string)
+{
+    struct tm when;
+
+    PINFO("Date from string is %s", date_string);
+    memset (&when, 0, sizeof (when));
+
+    sscanf (date_string, "%d-%d-%d", &when.tm_mday,
+            &when.tm_mon, &when.tm_year);
+
+    when.tm_mon -= 1;
+    when.tm_year -= 1900;
+
+    return gnc_mktime (&when);
+}
+
+static void
+gnc_ppr_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);
+}
+
+gchar*
+gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type)
+{
+    if (!gsr)
+        return g_strdup (_("unknown"));
+
+    // get the filter from the .gcm file
+    GKeyFile* state_file = gnc_state_get_current();
+    gchar* state_section = gsr_get_register_state_section (gsr);
+    GError* error = NULL;
+
+    gchar* filter = g_key_file_get_string (state_file, state_section,
+                                           KEY_PAGE_FILTER, &error);
+
+    if (error)
+        g_clear_error (&error);
+    else
+        g_strdelimit (filter, ";", ',');
+
+    g_free (state_section);
+
+    if (filter)
+        return filter;
+
+    return g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER,
+                            "0", "0", get_filter_default_num_of_days (ledger_type));
+}
+
+static void
+gnc_ppr_filter_set_filter (GNCSplitReg *gsr, const gchar* filter)
+{
+    if (!gsr)
+        return;
+
+    GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
+
+    gchar* default_filter = g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER, "0", "0",
+                                             get_filter_default_num_of_days (ledger_type));
+
+    // save the filter to the .gcm file also
+    GKeyFile* state_file = gnc_state_get_current();
+    gchar* 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))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_FILTER, NULL);
+
+        gnc_ppr_check_for_empty_group (state_file, state_section);
+    }
+    else
+    {
+        gchar* filter_text = g_strdup (filter);
+        g_strdelimit (filter_text, ",", ';'); // make it conform to .gcm file list
+        g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
+                               filter_text);
+        g_free (filter_text);
+    }
+    g_free (state_section);
+    g_free (default_filter);
+
+    return;
+}
+
+static void
+gpp_update_match_filter_text (cleared_match_t match, const guint mask,
+                              const gchar* filter_name, GList **show, GList **hide)
+{
+    if ((match & mask) == mask)
+        *show = g_list_prepend (*show, g_strdup (filter_name));
+    else
+        *hide = g_list_prepend (*hide, g_strdup (filter_name));
+}
+
+void
+gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd)
+{
+    GList *t_list = NULL;
+
+    ENTER(" ");
+
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+
+    // filtered start time
+    if (fd->start_time != 0)
+    {
+        gchar* sdate = qof_print_date (fd->start_time);
+        t_list = g_list_prepend
+            (t_list, g_strdup_printf ("%s %s", _("Start Date:"), sdate));
+        g_free (sdate);
+    }
+
+    // filtered number of days
+    if (fd->days > 0)
+    {
+        t_list = g_list_prepend
+            (t_list, g_strdup_printf ("%s %d", _("Show previous number of days:"),
+                                      fd->days));
+    }
+    // filtered end time
+    if (fd->end_time != 0)
+    {
+        gchar* edate = qof_print_date (fd->end_time);
+        t_list = g_list_prepend
+            (t_list, g_strdup_printf ("%s %s", _("End Date:"), edate));
+        g_free (edate);
+    }
+
+    // filtered match items
+    if (fd->cleared_match != CLEARED_ALL)
+    {
+        GList *show = NULL;
+        GList *hide = NULL;
+
+        gpp_update_match_filter_text (fd->cleared_match, 0x01, _("Unreconciled"),
+                                      &show, &hide);
+        gpp_update_match_filter_text (fd->cleared_match, 0x02, _("Cleared"),
+                                      &show, &hide);
+        gpp_update_match_filter_text (fd->cleared_match, 0x04, _("Reconciled"),
+                                      &show, &hide);
+        gpp_update_match_filter_text (fd->cleared_match, 0x08, _("Frozen"),
+                                      &show, &hide);
+        gpp_update_match_filter_text (fd->cleared_match, 0x10, _("Voided"),
+                                      &show, &hide);
+
+        show = g_list_reverse (show);
+        hide = g_list_reverse (hide);
+
+        if (show)
+        {
+            char *str = gnc_list_formatter (show);
+            t_list = g_list_prepend
+                (t_list, g_strdup_printf ("%s %s", _("Show:"), str));
+            g_free (str);
+        }
+
+        if (hide)
+        {
+            char *str = gnc_list_formatter (hide);
+            t_list = g_list_prepend
+                (t_list, g_strdup_printf ("%s %s", _("Hide:"), str));
+            g_free (str);
+        }
+
+        g_list_free_full (show, g_free);
+        g_list_free_full (hide, g_free);
+    }
+
+    t_list = g_list_reverse (t_list);
+
+    if (t_list)
+        t_list = g_list_prepend (t_list, g_strdup (_("Filter By:")));
+
+    // free the existing text if present
+    if (gsr->filter_text)
+        g_free (gsr->filter_text);
+
+    // set the tooltip text variable in the gsr
+    gsr->filter_text = gnc_g_list_stringjoin (t_list, "\n");
+
+    g_list_free_full (t_list, g_free);
+
+    LEAVE(" ");
+}
+
+/** This function updates the "cleared match" term of the register
+ *  query.  It unconditionally removes any old "cleared match" query
+ *  term, then adds back a new query term if needed.  There seems to
+ *  be a bug in the current g2 register code such that when the number
+ *  of entries in the register doesn't fill up the window, the blank
+ *  space at the end of the window isn't correctly redrawn.  This
+ *  function works around that problem, but a root cause analysis
+ *  should probably be done.
+ *
+ *  @param plugin_page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page)
+{
+    ENTER(" ");
+
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    if (!gsr->ledger)
+    {
+        LEAVE("no ledger");
+        return;
+    }
+
+    // check if this a search register and save query
+    gnc_plugin_page_register_update_for_search_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    Query *query = gnc_plugin_page_register_get_query (plugin_page);
+    if (!query)
+    {
+        LEAVE("no query found");
+        return;
+    }
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    SplitRegister* reg = gnc_ledger_display_get_split_register (gsr->ledger);
+
+    /* Remove the old status match */
+    if (reg->type != SEARCH_LEDGER)
+    {
+        GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
+        qof_query_purge_terms (query, param_list);
+        g_slist_free (param_list);
+    }
+
+    /* Install the new status match */
+    if (fd->cleared_match != CLEARED_ALL)
+        xaccQueryAddClearedMatch (query, fd->cleared_match, QOF_QUERY_AND);
+
+    // Set filter tooltip for summary bar
+    gnc_ppr_filter_set_tooltip (plugin_page, fd);
+
+    gnc_plugin_page_register_query_update (GNC_PLUGIN_PAGE_REGISTER(plugin_page), query);
+    LEAVE (" ");
+}
+
+/** This function updates the "date posted" term of the register
+ *  query.  It unconditionally removes any old "date posted" query
+ *  term, then adds back a new query term if needed.  There seems to
+ *  be a bug in the current g2 register code such that when the number
+ *  of entries in the register doesn't fill up the window, the blank
+ *  space at the end of the window isn't correctly redrawn.  This
+ *  function works around that problem, but a root cause analysis
+ *  should probably be done.
+ *
+ *  @param plugin_page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page)
+{
+    ENTER(" ");
+
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+    if (!gsr->ledger)
+    {
+        LEAVE("no ledger");
+        return;
+    }
+
+    // check if this a search register and save query
+    gnc_plugin_page_register_update_for_search_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    Query *query = gnc_plugin_page_register_get_query (plugin_page);
+    if (!query)
+    {
+        LEAVE("no query found");
+        return;
+    }
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+    SplitRegister* reg = gnc_ledger_display_get_split_register (gsr->ledger);
+
+    /* Delete any existing old date spec. */
+    if (reg->type != SEARCH_LEDGER)
+    {
+        GSList *param_list = qof_query_build_param_list (SPLIT_TRANS,
+                                                         TRANS_DATE_POSTED, NULL);
+        qof_query_purge_terms (query, param_list);
+        g_slist_free (param_list);
+    }
+
+    if (fd->start_time || fd->end_time)
+    {
+        /* Build a new spec */
+        xaccQueryAddDateMatchTT (query,
+                                 fd->start_time != 0, fd->start_time,
+                                 fd->end_time != 0, fd->end_time,
+                                 QOF_QUERY_AND);
+    }
+
+    if (fd->days > 0)
+    {
+        time64 start;
+        struct tm tm;
+
+        gnc_tm_get_today_start (&tm);
+
+        tm.tm_mday = tm.tm_mday - fd->days;
+        start = gnc_mktime (&tm);
+        xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
+    }
+
+    // Set filter tooltip for summary bar
+    gnc_ppr_filter_set_tooltip (plugin_page, fd);
+
+    gnc_plugin_page_register_query_update (GNC_PLUGIN_PAGE_REGISTER(plugin_page), query);
+    LEAVE(" ");
+}
+
+void
+gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page)
+{
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (plugin_page);
+
+    fd->days = 0;
+    fd->start_time = 0;
+    fd->end_time = 0;
+    fd->cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
+
+    gnc_ppr_filter_update_date_query (plugin_page);
+}
+
+/** This function is called whenever one of the status entries is
+ *  checked or unchecked.  It updates the status value maintained for
+ *  the filter dialog, and calls another function to do the work of
+ *  applying the change to the register itself.
+ *
+ *  @param button The toggle button that was changed.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_status_one_cb (GtkToggleButton* button,
+                              GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(button));
+
+    ENTER("toggle button %s (%p), plugin_page %p", name, button, page);
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    gint i, value;
+
+    /* Determine what status bit to change */
+    value = CLEARED_NONE;
+    for (i = 0; status_actions[i].action_name; i++)
+    {
+        if (g_strcmp0 (name, status_actions[i].action_name) == 0)
+        {
+            value = status_actions[i].value;
+            break;
+        }
+    }
+
+    /* Compute the new match status */
+    if (gtk_toggle_button_get_active (button))
+        fd->cleared_match = (cleared_match_t)(fd->cleared_match | value);
+    else
+        fd->cleared_match = (cleared_match_t)(fd->cleared_match & ~value);
+
+    gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+
+    LEAVE(" ");
+}
+
+/** This function is called whenever the "select all" status button is
+ *  clicked.  It updates all of the checkbox widgets, then updates the
+ *  query on the register.
+ *
+ *  @param button The button that was clicked.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_status_select_all_cb (GtkButton* button,
+                                     GncPluginPageRegister* page)
+{
+    GtkWidget* widget;
+    gint i;
+
+    g_return_if_fail (GTK_IS_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(button %p, page %p)", button, page);
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    /* Turn on all the check menu items */
+    for (i = 0; status_actions[i].action_name; i++)
+    {
+        widget = status_actions[i].widget;
+        g_signal_handlers_block_by_func (widget,
+                                         (gpointer)gnc_ppr_filter_status_one_cb, page);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), TRUE);
+        g_signal_handlers_unblock_by_func (widget,
+                                           (gpointer)gnc_ppr_filter_status_one_cb, page);
+    }
+
+    /* Set the requested status */
+    fd->cleared_match = CLEARED_ALL;
+    gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+    LEAVE(" ");
+}
+
+/** This function is called whenever the "clear all" status button is
+ *  clicked.  It updates all of the checkbox widgets, then updates the
+ *  query on the register.
+ *
+ *  @param button The button that was clicked.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_status_clear_all_cb (GtkButton* button,
+                                    GncPluginPageRegister* page)
+{
+    GtkWidget* widget;
+    gint i;
+
+    g_return_if_fail (GTK_IS_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(button %p, page %p)", button, page);
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    /* Turn off all the check menu items */
+    for (i = 0; status_actions[i].action_name; i++)
+    {
+        widget = status_actions[i].widget;
+        g_signal_handlers_block_by_func (widget,
+                                         (gpointer)gnc_ppr_filter_status_one_cb, page);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(widget), FALSE);
+        g_signal_handlers_unblock_by_func (widget,
+                                           (gpointer)gnc_ppr_filter_status_one_cb, page);
+    }
+
+    /* Set the requested status */
+    fd->cleared_match = CLEARED_NONE;
+    gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+    LEAVE(" ");
+}
+
+/** This function computes the starting and ending times for the
+ *  filter by examining the dialog widgets to see which ones are
+ *  selected, and will pull times out of the data entry boxes if
+ *  necessary.  This function must exist to handle the case where the
+ *  "show all" button was Selected, and the user clicks on the "select
+ *  range" button.  Since it exists, it make sense for the rest of the
+ *  callbacks to take advantage of it.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+static void
+get_filter_times (GncPluginPageRegister* page)
+{
+    time64 time_val;
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_choose)))
+    {
+        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(fd->start_date));
+        time_val = gnc_time64_get_day_start (time_val);
+        fd->start_time = time_val;
+    }
+    else
+    {
+        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_today)))
+            fd->start_time = gnc_time64_get_today_start();
+        else
+            fd->start_time = 0;
+    }
+
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_choose)))
+    {
+        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT(fd->end_date));
+        time_val = gnc_time64_get_day_end (time_val);
+        fd->end_time = time_val;
+    }
+    else
+    {
+        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_today)))
+            fd->end_time = gnc_time64_get_today_end();
+        else
+            fd->end_time = 0;
+    }
+}
+
+/** This function is called when the radio buttons changes state. This
+ *  function is responsible for setting the sensitivity of the widgets
+ *  controlled by each radio button choice and updating the time
+ *  limitation on the register query. This is handled by a helper
+ *  function as potentially all widgets will need to be examined.
+ *
+ *  @param button A pointer to the "select range" radio button.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_select_range_cb (GtkRadioButton* button,
+                                GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_RADIO_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(button %p, page %p)", button, page);
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(button));
+    gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
+
+    if (active && g_strcmp0 (name, "filter_show_range") == 0)
+    {
+        gtk_widget_set_sensitive (fd->table, active);
+        gtk_widget_set_sensitive (fd->num_days, !active);
+        get_filter_times (page);
+    }
+    else if (active && g_strcmp0 (name, "filter_show_days") == 0)
+    {
+        gtk_widget_set_sensitive (fd->table, !active);
+        gtk_widget_set_sensitive (fd->num_days, active);
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON(fd->num_days), fd->days);
+    }
+    else
+    {
+        gtk_widget_set_sensitive (fd->table, FALSE);
+        gtk_widget_set_sensitive (fd->num_days, FALSE);
+        fd->days = 0;
+        fd->start_time = 0;
+        fd->end_time = 0;
+    }
+    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+
+    LEAVE(" ");
+}
+
+/** This function is called when the "number of days" spin button is
+ *  changed which is then saved and updates the time limitation on
+ *  the register query. This is handled by a helper function as
+ *  potentially all widgets will need to be examined.
+ *
+ *  @param button A pointer to the "number of days" spin button.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_days_changed_cb (GtkSpinButton* button,
+                                GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_SPIN_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(button %p, page %p)", button, page);
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    fd->days = gtk_spin_button_get_value (GTK_SPIN_BUTTON(button));
+    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+
+    LEAVE(" ");
+}
+
+/** This function is called when one of the start date entry widgets
+ *  is updated.  It simply calls common routines to determine the
+ *  start/end times and update the register query.
+ *
+ *  @param unused A pointer to a GncDateEntry widgets, but it could be
+ *  any widget.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+static void
+gnc_ppr_filter_gde_changed_cb (GtkWidget* unused,
+                               GncPluginPageRegister* page)
+{
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(widget %s(%p), page %p)",
+           gtk_buildable_get_name (GTK_BUILDABLE(unused)), unused, page);
+
+    get_filter_times (page);
+    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+
+    LEAVE(" ");
+}
+
+/** This function is called when one of the start date radio buttons
+ *  is selected.  It updates the sensitivity of the date entry widget,
+ *  then calls a common routine to determine the start/end times and
+ *  update the register query.
+ *
+ *  *Note: This function is actually called twice for each new radio
+ *  button selection.  The first time call is to uncheck the old
+ *  button, and the second time to check the new button.  This does
+ *  make a kind of sense, as radio buttons are nothing more than
+ *  linked toggle buttons where only one can be active.
+ *
+ *  @param radio The button whose state is changing.  This will be
+ *  the previously selected button the first of the pair of calls to
+ *  this function, and will be the newly selected button the second
+ *  time.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_start_cb (GtkWidget* radio,
+                         GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(radio %s(%p), page %p)",
+           gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, page);
+
+    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
+    {
+        LEAVE("1st callback of pair. Defer to 2nd callback.");
+        return;
+    }
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
+    gboolean active = !g_strcmp0 (name, "start_date_choose");
+    gtk_widget_set_sensitive (fd->start_date, active);
+    get_filter_times (page);
+    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+
+    LEAVE(" ");
+}
+
+/** This function is called when one of the end date radio buttons is
+ *  selected.  It updates the sensitivity of the date entry widget,
+ *  then calls a common routine to determine the start/end times and
+ *  update the register query.
+ *
+ *  *Note: This function is actually called twice for each new radio
+ *  button selection.  The first time call is to uncheck the old
+ *  button, and the second time to check the new button.  This does
+ *  make a kind of sense, as radio buttons are nothing more than
+ *  linked toggle buttons where only one can be active.
+ *
+ *  @param radio The button whose state is changing.  This will be
+ *  the previously selected button the first of the pair of calls to
+ *  this function, and will be the newly selected button the second
+ *  time.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_end_cb (GtkWidget* radio,
+                       GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_RADIO_BUTTON(radio));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("(radio %s(%p), page %p)",
+          gtk_buildable_get_name (GTK_BUILDABLE(radio)), radio, page);
+
+    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(radio)))
+    {
+        LEAVE("1st callback of pair. Defer to 2nd callback.");
+        return;
+    }
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(radio));
+    gboolean active = !g_strcmp0 (name, "end_date_choose");
+    gtk_widget_set_sensitive (fd->end_date, active);
+    get_filter_times (page);
+    gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));
+
+    LEAVE(" ");
+}
+
+/** This function is called whenever the save status is checked
+ *  or unchecked. It will allow saving of the filter if required.
+ *
+ *  @param button The toggle button that was changed.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this filter dialog.
+ */
+void
+gnc_ppr_filter_save_cb (GtkToggleButton* button,
+                        GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("Save toggle button (%p), plugin_page %p", button, page);
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+
+    /* Compute the new save filter status */
+    if (gtk_toggle_button_get_active (button))
+        fd->save_filter = TRUE;
+    else
+        fd->save_filter = FALSE;
+
+    LEAVE(" ");
+}
+
+/** This function is called when the "Filter By…" dialog is closed.
+ *  If the dialog was closed by any method other than clicking the OK
+ *  button, the original sorting order will be restored.
+ *
+ *  @param dialog A pointer to the dialog box.
+ *
+ *  @param response A numerical value indicating why the dialog box was closed.
+ *
+ *  @param page A pointer to the GncPluginPageRegister associated with
+ *  this dialog box.
+ */
+void
+gnc_ppr_filter_response_cb (GtkDialog* dialog,
+                            gint response,
+                            GncPluginPageRegister* page)
+{
+    g_return_if_fail (GTK_IS_DIALOG(dialog));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER(" ");
+
+    FilterData *fd = gnc_plugin_page_register_get_filter_data (GNC_PLUGIN_PAGE(page));
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+
+    if (response != GTK_RESPONSE_OK)
+    {
+        /* Remove the old status match */
+        fd->cleared_match = fd->original_cleared_match;
+        gnc_plugin_register_set_enable_refresh (page, FALSE);
+        gnc_ppr_filter_update_status_query (GNC_PLUGIN_PAGE(page));
+        gnc_plugin_register_set_enable_refresh (page, TRUE);
+        fd->start_time = fd->original_start_time;
+        fd->end_time = fd->original_end_time;
+        fd->days = fd->original_days;
+        fd->save_filter = fd->original_save_filter;
+        gnc_ppr_filter_update_date_query (GNC_PLUGIN_PAGE(page));;
+    }
+    else
+    {
+        // clear the filter when unticking the save option
+        if (!fd->save_filter && fd->original_save_filter)
+            gnc_ppr_filter_set_filter (gsr, NULL);
+
+        fd->original_save_filter = fd->save_filter;
+
+        if (fd->save_filter)
+        {
+            gchar *filter;
+            GList *flist = NULL;
+
+            // cleared match
+            flist = g_list_prepend
+                (flist, g_strdup_printf ("0x%04x", fd->cleared_match));
+
+            // start time
+            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->start_date_choose))
+                && fd->start_time != 0)
+            {
+                flist = g_list_prepend (flist, gnc_ppr_filter_time2dmy (fd->start_time));
+            }
+            else
+                flist = g_list_prepend (flist, g_strdup ("0"));
+
+            // end time
+            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(fd->end_date_choose))
+                && fd->end_time != 0)
+            {
+                flist = g_list_prepend (flist, gnc_ppr_filter_time2dmy (fd->end_time));
+            }
+            else
+                flist = g_list_prepend (flist, g_strdup ("0"));
+
+            // number of days
+            if (fd->days > 0)
+                flist = g_list_prepend (flist, g_strdup_printf ("%d", fd->days));
+            else
+                flist = g_list_prepend (flist, g_strdup ("0"));
+
+            flist = g_list_reverse (flist);
+            filter = gnc_g_list_stringjoin (flist, ",");
+            PINFO("The filter to save is %s", filter);
+            gnc_ppr_filter_set_filter (gsr, filter);
+            g_free (filter);
+            g_list_free_full (flist, g_free);
+        }
+    }
+    fd->dialog = NULL;
+    gtk_widget_destroy (GTK_WIDGET(dialog));
+
+    LEAVE(" ");
+}
+
+void
+gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query,
+                   FilterData *fd, gboolean show_save_button)
+{
+    GtkWidget* dialog, *toggle, *button, *table, *hbox;
+    time64 start_time, end_time, time_val;
+    GtkBuilder* builder;
+    gboolean sensitive, value;
+    gchar* title;
+    int i;
+
+    /* Create the dialog */
+    builder = gtk_builder_new();
+    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
+                               "days_adjustment");
+    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
+                               "filter_by_dialog");
+    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "filter_by_dialog"));
+    fd->dialog = dialog;
+    gtk_window_set_transient_for (GTK_WINDOW(dialog),
+                                  gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
+
+    /* Translators: The %s is the name of the plugin page */
+    title = g_strdup_printf (_ ("Filter %s by…"),
+                             gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+    gtk_window_set_title (GTK_WINDOW(dialog), title);
+    g_free (title);
+
+    /* Set the check buttons for the current status */
+    for (i = 0; status_actions[i].action_name; i++)
+    {
+        toggle = GTK_WIDGET(gtk_builder_get_object (builder,
+                                                     status_actions[i].action_name));
+        value = fd->cleared_match & status_actions[i].value;
+        status_actions[i].widget = toggle;
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle), value);
+    }
+    fd->original_cleared_match = fd->cleared_match;
+
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_save"));
+    if (fd->save_filter)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+
+    // hide the save button if appropriate
+    gtk_widget_set_visible (GTK_WIDGET(button), show_save_button);
+
+    /* Set up number of days */
+    fd->num_days = GTK_WIDGET(gtk_builder_get_object (builder,
+                                                            "filter_show_num_days"));
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_days"));
+
+    if (fd->days > 0) // using number of days
+    {
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+        gtk_widget_set_sensitive (GTK_WIDGET(fd->num_days), TRUE);
+        gtk_spin_button_set_value (GTK_SPIN_BUTTON(fd->num_days), fd->days);
+        fd->original_days = fd->days;
+
+        /* Set the start_time and end_time to 0 */
+        start_time = 0;
+        end_time = 0;
+    }
+    else
+    {
+        gtk_widget_set_sensitive (GTK_WIDGET(fd->num_days), FALSE);
+        fd->original_days = 0;
+        fd->days = 0;
+
+        /* Get the start and end times */
+        xaccQueryGetDateMatchTT (query, &start_time, &end_time);
+    }
+
+    /* Set the date info */
+    fd->original_start_time = start_time;
+    fd->start_time = start_time;
+    fd->original_end_time = end_time;
+    fd->end_time = end_time;
+
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "filter_show_range"));
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), start_time || end_time);
+    table = GTK_WIDGET(gtk_builder_get_object (builder, "select_range_table"));
+    fd->table = table;
+    gtk_widget_set_sensitive (GTK_WIDGET(table), start_time || end_time);
+
+    fd->start_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_choose"));
+    fd->start_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_today"));
+    fd->end_date_choose = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_choose"));
+    fd->end_date_today = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_today"));
+
+    {
+        /* Start date info */
+        if (start_time == 0)
+        {
+            button = GTK_WIDGET(gtk_builder_get_object(builder, "start_date_earliest"));
+            time_val = xaccQueryGetEarliestDateFound (query);
+            sensitive = FALSE;
+        }
+        else
+        {
+            time_val = start_time;
+            if ((start_time >= gnc_time64_get_today_start()) &&
+                (start_time <= gnc_time64_get_today_end()))
+            {
+                button = fd->start_date_today;
+                sensitive = FALSE;
+            }
+            else
+            {
+                button = fd->start_date_choose;
+                sensitive = TRUE;
+            }
+        }
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+        fd->start_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
+        hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
+        gtk_box_pack_start (GTK_BOX(hbox), fd->start_date, TRUE, TRUE, 0);
+        gtk_widget_show (fd->start_date);
+        gtk_widget_set_sensitive (GTK_WIDGET(fd->start_date), sensitive);
+        gnc_date_edit_set_time (GNC_DATE_EDIT(fd->start_date), time_val);
+        g_signal_connect (G_OBJECT(fd->start_date), "date-changed",
+                          G_CALLBACK(gnc_ppr_filter_gde_changed_cb),
+                          GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+    }
+
+    {
+        /* End date info */
+        if (end_time == 0)
+        {
+            button = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_latest"));
+            time_val = xaccQueryGetLatestDateFound (query);
+            sensitive = FALSE;
+        }
+        else
+        {
+            time_val = end_time;
+            if ((end_time >= gnc_time64_get_today_start()) &&
+                (end_time <= gnc_time64_get_today_end()))
+            {
+                button = fd->end_date_today;
+                sensitive = FALSE;
+            }
+            else
+            {
+                button = fd->end_date_choose;
+                sensitive = TRUE;
+            }
+        }
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+        fd->end_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
+        hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
+        gtk_box_pack_start (GTK_BOX(hbox), fd->end_date, TRUE, TRUE, 0);
+        gtk_widget_show (fd->end_date);
+        gtk_widget_set_sensitive (GTK_WIDGET(fd->end_date), sensitive);
+        gnc_date_edit_set_time (GNC_DATE_EDIT(fd->end_date), time_val);
+        g_signal_connect (G_OBJECT(fd->end_date), "date-changed",
+                          G_CALLBACK(gnc_ppr_filter_gde_changed_cb),
+                          GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+    }
+
+    /* Wire it up */
+    gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
+                                      GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    /* Show it */
+    gtk_widget_show (dialog);
+    g_object_unref (G_OBJECT(builder));
+    LEAVE (" ");
+}
diff --git a/gnucash/gnome/gnc-plugin-page-register-filter.h b/gnucash/gnome/gnc-plugin-page-register-filter.h
new file mode 100644
index 0000000000..9a2c10072c
--- /dev/null
+++ b/gnucash/gnome/gnc-plugin-page-register-filter.h
@@ -0,0 +1,93 @@
+/**********************************************************************
+ * gnc-plugin-page-register-filter.h -- register page filter          *
+ *                                                                    *
+ * Copyright (C) 2026 Bob Fewell                                      *
+ *                                                                    *
+ * This program is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License as     *
+ * published by the Free Software Foundation; either version 2 of     *
+ * the License, or (at your option) any later version.                *
+ *                                                                    *
+ * This program is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *
+ * GNU General Public License for more details.                       *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this program; if not, contact:                          *
+ *                                                                    *
+ * Free Software Foundation           Voice:  +1-617-542-5942         *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652         *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                     *
+ **********************************************************************/
+
+/** @addtogroup ContentPlugins
+    @{ */
+/** @addtogroup RegisterPlugin Register Page Filter
+    @{ */
+/** @file gnc-plugin-page-register-filter.h
+    @brief  Functions providing a register page filter for the GnuCash UI
+    @author Copyright (C) 2026 Bob Fewell
+*/
+
+#ifndef __GNC_PLUGIN_PAGE_REGISTER_FILTER_H
+#define __GNC_PLUGIN_PAGE_REGISTER_FILTER_H
+
+#include <gtk/gtk.h>
+#include "gnc-split-reg.h"
+#include "gnc-plugin-page.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef struct filter_data
+{
+    GtkWidget* dialog;
+    GtkWidget* table;
+    GtkWidget* start_date_choose;
+    GtkWidget* start_date_today;
+    GtkWidget* start_date;
+    GtkWidget* end_date_choose;
+    GtkWidget* end_date_today;
+    GtkWidget* end_date;
+    GtkWidget* num_days;
+    cleared_match_t original_cleared_match;
+    cleared_match_t cleared_match;
+    time64 original_start_time;
+    time64 original_end_time;
+    time64 start_time;
+    time64 end_time;
+    gint days;
+    gint original_days;
+    gboolean original_save_filter;
+    gboolean save_filter;
+}FilterData;
+
+#define DEFAULT_FILTER_NUM_DAYS_GL  "30"
+#define CLEARED_VALUE "cleared_value"
+#define DEFAULT_FILTER "0x001f"
+
+time64 gnc_ppr_filter_dmy2time (char* date_string);
+gchar* gnc_ppr_filter_time2dmy (time64 raw_time);
+
+gchar* gnc_ppr_filter_get_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type);
+//void gnc_ppr_filter_set_filter (GNCSplitReg *gsr, GNCLedgerDisplayType ledger_type, const gchar* filter);
+
+
+void gnc_ppr_filter_update_date_query (GncPluginPage* plugin_page);
+void gnc_ppr_filter_update_status_query (GncPluginPage* plugin_page);
+
+void gnc_ppr_filter_set_tooltip (GncPluginPage* plugin_page, FilterData *fd);
+
+void gnc_ppr_filter_clear_current_filter (GncPluginPage* plugin_page);
+
+void gnc_ppr_filter_by (GncPluginPage *plugin_page, Query *query, FilterData *fd, gboolean show_save_button);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GNC_PLUGIN_PAGE_REGISTER_FILTER_H */
diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index 65842dc975..ba74b74771 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -103,7 +103,6 @@ typedef enum : gint
 static QofLogModule log_module = GNC_MOD_GUI;
 
 #define DEFAULT_LINES_AMOUNT         50
-#define DEFAULT_FILTER_NUM_DAYS_GL  "30"
 
 static void gnc_plugin_page_register_finalize (GObject* object);
 
@@ -139,40 +138,6 @@ static void gnc_plugin_page_register_summarybar_position_changed (gpointer prefs
                                                                   gchar* pref,
                                                                   gpointer user_data);
 
-extern "C"
-{
-/* Callbacks for the "Filter By" dialog */
-void gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton* button,
-                                                      GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_start_cb (GtkWidget* radio,
-                                               GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_end_cb (GtkWidget* radio,
-                                             GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
-                                                  gint response,
-                                                  GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_status_select_all_cb (GtkButton* button,
-                                                           GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_status_clear_all_cb (GtkButton* button,
-                                                          GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_status_one_cb (GtkToggleButton* button,
-                                                    GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_save_cb (GtkToggleButton* button,
-                                              GncPluginPageRegister* page);
-void gnc_plugin_page_register_filter_days_changed_cb (GtkSpinButton* button,
-                                                      GncPluginPageRegister* page);
-}
-
-static time64 gnc_plugin_page_register_filter_dmy2time (char* date_string);
-static gchar* gnc_plugin_page_register_filter_time2dmy (time64 raw_time);
-static gchar* gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page);
-void gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
-                                          const gchar* filter);
-static void gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister* page);
-
-static void gnc_ppr_update_status_query (GncPluginPageRegister* page);
-static void gnc_ppr_update_date_query (GncPluginPageRegister* page);
-
 /* Command callbacks */
 static void gnc_plugin_page_register_cmd_print_check (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
 static void gnc_plugin_page_register_cmd_cut (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
@@ -386,26 +351,6 @@ static GncToolBarShortNames toolbar_labels[] =
     { NULL, NULL },
 };
 
-struct status_action
-{
-    const char* action_name;
-    int value;
-    GtkWidget* widget;
-};
-
-static struct status_action status_actions[] =
-{
-    { "filter_status_reconciled",   CLEARED_RECONCILED, NULL },
-    { "filter_status_cleared",      CLEARED_CLEARED, NULL },
-    { "filter_status_voided",       CLEARED_VOIDED, NULL },
-    { "filter_status_frozen",       CLEARED_FROZEN, NULL },
-    { "filter_status_unreconciled", CLEARED_NO, NULL },
-    { NULL, 0, NULL },
-};
-
-#define CLEARED_VALUE "cleared_value"
-#define DEFAULT_FILTER "0x001f"
-
 /************************************************************/
 /*                      Data Structures                     */
 /************************************************************/
@@ -429,29 +374,8 @@ typedef struct GncPluginPageRegisterPrivate
     Query* filter_query;     // saved filter query for comparison
 
     SortData sd;
+    FilterData fd;
 
-    struct
-    {
-        GtkWidget* dialog;
-        GtkWidget* table;
-        GtkWidget* start_date_choose;
-        GtkWidget* start_date_today;
-        GtkWidget* start_date;
-        GtkWidget* end_date_choose;
-        GtkWidget* end_date_today;
-        GtkWidget* end_date;
-        GtkWidget* num_days;
-        cleared_match_t original_cleared_match;
-        cleared_match_t cleared_match;
-        time64 original_start_time;
-        time64 original_end_time;
-        time64 start_time;
-        time64 end_time;
-        gint days;
-        gint original_days;
-        gboolean original_save_filter;
-        gboolean save_filter;
-    } fd;
 } GncPluginPageRegisterPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GncPluginPageRegister, gnc_plugin_page_register,
@@ -1137,7 +1061,7 @@ gnc_plugin_page_register_ui_initial_state (GncPluginPageRegister* page)
 }
 
 /* Virtual Functions */
-
+//FIXME ??
 static const gchar*
 get_filter_default_num_of_days (GNCLedgerDisplayType ledger_type)
 {
@@ -1279,7 +1203,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         /* Set the filter for the split register and status of save filter button */
         priv->fd.save_filter = FALSE;
 
-        filter_str = gnc_plugin_page_register_get_filter (plugin_page);
+        filter_str = gnc_ppr_filter_get_filter (priv->gsr, ledger_type);
         filter = g_strsplit (filter_str, ",", -1);
         filtersize = g_strv_length (filter);
         g_free (filter_str);
@@ -1295,7 +1219,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         {
             PINFO ("Loaded Filter Start Date is %s", filter[1]);
 
-            priv->fd.start_time = gnc_plugin_page_register_filter_dmy2time (filter[1]);
+            priv->fd.start_time = gnc_ppr_filter_dmy2time (filter[1]);
             priv->fd.start_time = gnc_time64_get_day_start (priv->fd.start_time);
             filter_changed = filter_changed + 1;
         }
@@ -1304,7 +1228,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         {
             PINFO ("Loaded Filter End Date is %s", filter[2]);
 
-            priv->fd.end_time = gnc_plugin_page_register_filter_dmy2time (filter[2]);
+            priv->fd.end_time = gnc_ppr_filter_dmy2time (filter[2]);
             priv->fd.end_time = gnc_time64_get_day_end (priv->fd.end_time);
             filter_changed = filter_changed + 1;
         }
@@ -1359,13 +1283,13 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
     priv->enable_refresh = FALSE; // disable refresh
 
     /* Update Query with Filter Status and Dates */
-    gnc_ppr_update_status_query (page);
-    gnc_ppr_update_date_query (page);
+    gnc_ppr_filter_update_status_query (plugin_page);
+    gnc_ppr_filter_update_date_query (plugin_page);
 
     priv->enable_refresh = TRUE; // enable refresh
 
     // Set filter tooltip for summary bar
-    gnc_plugin_page_register_set_filter_tooltip (page);
+    gnc_ppr_filter_set_tooltip (plugin_page, &priv->fd);
 
     plugin_page->summarybar = gsr_create_summary_bar (priv->gsr);
     if (plugin_page->summarybar)
@@ -1942,115 +1866,6 @@ 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 gchar*
-gnc_plugin_page_register_get_filter_gcm (GNCSplitReg *gsr)
-{
-    GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section;
-    GError* error = NULL;
-    char* filter = NULL;
-
-    // get the filter from the .gcm file
-    state_section = gsr_get_register_state_section (gsr);
-    filter = g_key_file_get_string (state_file, state_section,
-                                    KEY_PAGE_FILTER, &error);
-
-    if (error)
-        g_clear_error (&error);
-    else
-        g_strdelimit (filter, ";", ',');
-
-    g_free (state_section);
-    return filter;
-}
-
-static gchar*
-gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    GNCLedgerDisplayType ledger_type;
-    char* filter = NULL;
-
-    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page),
-                          g_strdup (_("unknown")));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
-
-    ledger_type = gnc_ledger_display_type (priv->ledger);
-
-    // load from gcm file
-    filter = gnc_plugin_page_register_get_filter_gcm (priv->gsr);
-
-    if (filter)
-        return filter;
-
-    return g_strdup_printf ("%s,%s,%s,%s", DEFAULT_FILTER,
-                            "0", "0", get_filter_default_num_of_days (ledger_type));
-}
-
-static void
-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;
-
-    // save the filter to the .gcm file also
-    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))
-            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
-    {
-        filter_text = g_strdup (filter);
-        g_strdelimit (filter_text, ",", ';'); // make it conform to .gcm file list
-        g_key_file_set_string (state_file, state_section, KEY_PAGE_FILTER,
-                               filter_text);
-        g_free (filter_text);
-    }
-    g_free (state_section);
-}
-
-void
-gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
-                                     const gchar* filter)
-{
-    GncPluginPageRegisterPrivate* priv;
-    GNCLedgerDisplayType ledger_type;
-    gchar* default_filter;
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
-
-    ledger_type = gnc_ledger_display_type (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 (priv->gsr, filter, default_filter);
-
-    g_free (default_filter);
-    return;
-}
-
 static gchar*
 gnc_plugin_page_register_get_long_name (GncPluginPage* plugin_page)
 {
@@ -2073,923 +1888,150 @@ gnc_plugin_page_register_get_long_name (GncPluginPage* plugin_page)
         return gnc_account_get_full_name (leader);
 
     case LD_SUBACCOUNT:
-    {
-        gchar* account_full_name = gnc_account_get_full_name (leader);
-        gchar* return_string = g_strdup_printf ("%s+", account_full_name);
-        g_free ((gpointer*) account_full_name);
-        return return_string;
-    }
-
-    default:
-        break;
-    }
-
-    return NULL;
-}
-
-static void
-gnc_plugin_page_register_summarybar_position_changed (gpointer prefs,
-                                                      gchar* pref,
-                                                      gpointer user_data)
-{
-    GncPluginPage* plugin_page;
-    GncPluginPageRegister* page;
-    GncPluginPageRegisterPrivate* priv;
-    GtkPositionType position = GTK_POS_BOTTOM;
-
-    g_return_if_fail (user_data != NULL);
-
-    if (!GNC_IS_PLUGIN_PAGE (user_data))
-        return;
-
-    plugin_page = GNC_PLUGIN_PAGE (user_data);
-    page = GNC_PLUGIN_PAGE_REGISTER (user_data);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-
-    if (priv == NULL)
-        return;
-
-    if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL,
-                            GNC_PREF_SUMMARYBAR_POSITION_TOP))
-        position = GTK_POS_TOP;
-
-    gtk_box_reorder_child (GTK_BOX (priv->widget),
-                           plugin_page->summarybar,
-                           (position == GTK_POS_TOP ? 0 : -1));
-}
-
-/** This function is called to get the query associated with this
- *  plugin page.
- *
- *  @param page A pointer to the GncPluginPage.
- */
-Query*
-gnc_plugin_page_register_get_query (GncPluginPage* plugin_page)
-{
-    GncPluginPageRegister* page;
-    GncPluginPageRegisterPrivate* priv;
-
-    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
-
-    page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    return gnc_ledger_display_get_query (priv->ledger);
-}
-
-/************************************************************/
-/*                    "Filter By" Dialog                    */
-/************************************************************/
-
-static void
-gnc_ppr_update_for_search_query (GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    SplitRegister* reg;
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    reg = gnc_ledger_display_get_split_register (priv->ledger);
-
-    if (reg->type == SEARCH_LEDGER)
-    {
-        Query* query_tmp = gnc_ledger_display_get_query (priv->ledger);
-
-        // if filter_query is NULL, then the dialogue find has been run
-        // before coming here. if query_tmp does not equal filter_query
-        // then the dialogue find has been run again before coming here
-        if ((priv->filter_query == NULL) ||
-            (!qof_query_equal (query_tmp, priv->filter_query)))
-        {
-            qof_query_destroy (priv->search_query);
-            priv->search_query = qof_query_copy (query_tmp);
-        }
-        gnc_ledger_display_set_query (priv->ledger, priv->search_query);
-    }
-}
-
-
-/** This function updates the "cleared match" term of the register
- *  query.  It unconditionally removes any old "cleared match" query
- *  term, then adds back a new query term if needed.  There seems to
- *  be a bug in the current g2 register code such that when the number
- *  of entries in the register doesn't fill up the window, the blank
- *  space at the end of the window isn't correctly redrawn.  This
- *  function works around that problem, but a root cause analysis
- *  should probably be done.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-static void
-gnc_ppr_update_status_query (GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    Query* query;
-    SplitRegister* reg;
-
-    ENTER (" ");
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (!priv->ledger)
-    {
-        LEAVE ("no ledger");
-        return;
-    }
-    // check if this a search register and save query
-    gnc_ppr_update_for_search_query (page);
-
-    query = gnc_ledger_display_get_query (priv->ledger);
-    if (!query)
-    {
-        LEAVE ("no query found");
-        return;
-    }
-
-    reg = gnc_ledger_display_get_split_register (priv->ledger);
-
-    /* Remove the old status match */
-    if (reg->type != SEARCH_LEDGER)
-    {
-        GSList *param_list = qof_query_build_param_list (SPLIT_RECONCILE, NULL);
-        qof_query_purge_terms (query, param_list);
-        g_slist_free (param_list);
-    }
-
-    /* Install the new status match */
-    if (priv->fd.cleared_match != CLEARED_ALL)
-        xaccQueryAddClearedMatch (query, priv->fd.cleared_match, QOF_QUERY_AND);
-
-    // Set filter tooltip for summary bar
-    gnc_plugin_page_register_set_filter_tooltip (page);
-
-    // clear previous filter query and save current
-    qof_query_destroy (priv->filter_query);
-    priv->filter_query = qof_query_copy (query);
-
-    if (priv->enable_refresh)
-        gnc_ledger_display_refresh (priv->ledger);
-    LEAVE (" ");
-}
-
-
-/** This function updates the "date posted" term of the register
- *  query.  It unconditionally removes any old "date posted" query
- *  term, then adds back a new query term if needed.  There seems to
- *  be a bug in the current g2 register code such that when the number
- *  of entries in the register doesn't fill up the window, the blank
- *  space at the end of the window isn't correctly redrawn.  This
- *  function works around that problem, but a root cause analysis
- *  should probably be done.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-static void
-gnc_ppr_update_date_query (GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    Query* query;
-    SplitRegister* reg;
-
-    ENTER (" ");
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (!priv->ledger)
-    {
-        LEAVE ("no ledger");
-        return;
-    }
-    // check if this a search register and save query
-    gnc_ppr_update_for_search_query (page);
-
-    query = gnc_ledger_display_get_query (priv->ledger);
-
-    if (!query)
-    {
-        LEAVE ("no query");
-        return;
-    }
-
-    reg = gnc_ledger_display_get_split_register (priv->ledger);
-
-    /* Delete any existing old date spec. */
-    if (reg->type != SEARCH_LEDGER)
-    {
-        GSList *param_list = qof_query_build_param_list (SPLIT_TRANS,
-                                                         TRANS_DATE_POSTED, NULL);
-        qof_query_purge_terms (query, param_list);
-        g_slist_free (param_list);
-    }
-
-    if (priv->fd.start_time || priv->fd.end_time)
-    {
-        /* Build a new spec */
-        xaccQueryAddDateMatchTT (query,
-                                 priv->fd.start_time != 0, priv->fd.start_time,
-                                 priv->fd.end_time != 0,   priv->fd.end_time,
-                                 QOF_QUERY_AND);
-    }
-
-    if (priv->fd.days > 0)
-    {
-        time64 start;
-        struct tm tm;
-
-        gnc_tm_get_today_start (&tm);
-
-        tm.tm_mday = tm.tm_mday - priv->fd.days;
-        start = gnc_mktime (&tm);
-        xaccQueryAddDateMatchTT (query, TRUE, start, FALSE, 0, QOF_QUERY_AND);
-    }
-
-    // Set filter tooltip for summary bar
-    gnc_plugin_page_register_set_filter_tooltip (page);
-
-    // clear previous filter query and save current
-    qof_query_destroy (priv->filter_query);
-    priv->filter_query = qof_query_copy (query);
-
-    if (priv->enable_refresh)
-        gnc_ledger_display_refresh (priv->ledger);
-    LEAVE (" ");
-}
-
-
-/* This function converts a time64 value date to a string */
-static gchar*
-gnc_plugin_page_register_filter_time2dmy (time64 raw_time)
-{
-    struct tm* timeinfo;
-    gchar date_string[11];
-
-    timeinfo = gnc_localtime (&raw_time);
-    strftime (date_string, 11, "%d-%m-%Y", timeinfo);
-    PINFO ("Date string is %s", date_string);
-    gnc_tm_free (timeinfo);
-
-    return g_strdup (date_string);
-}
-
-
-/* This function converts a string date to a time64 value */
-static time64
-gnc_plugin_page_register_filter_dmy2time (char* date_string)
-{
-    struct tm when;
-
-    PINFO ("Date string is %s", date_string);
-    memset (&when, 0, sizeof (when));
-
-    sscanf (date_string, "%d-%d-%d", &when.tm_mday,
-            &when.tm_mon, &when.tm_year);
-
-    when.tm_mon -= 1;
-    when.tm_year -= 1900;
-
-    return gnc_mktime (&when);
-}
-
-
-/** This function is called whenever one of the status entries is
- *  checked or unchecked.  It updates the status value maintained for
- *  the filter dialog, and calls another function to do the work of
- *  applying the change to the register itself.
- *
- *  @param button The toggle button that was changed.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-void
-gnc_plugin_page_register_filter_status_one_cb (GtkToggleButton* button,
-                                               GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    const gchar* name;
-    gint i, value;
-
-    g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    name = gtk_buildable_get_name (GTK_BUILDABLE (button));
-    ENTER ("toggle button %s (%p), plugin_page %p", name, button, page);
-
-    /* Determine what status bit to change */
-    value = CLEARED_NONE;
-    for (i = 0; status_actions[i].action_name; i++)
-    {
-        if (g_strcmp0 (name, status_actions[i].action_name) == 0)
-        {
-            value = status_actions[i].value;
-            break;
-        }
-    }
-
-    /* Compute the new match status */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (gtk_toggle_button_get_active (button))
-        priv->fd.cleared_match = (cleared_match_t)(priv->fd.cleared_match | value);
-    else
-        priv->fd.cleared_match = (cleared_match_t)(priv->fd.cleared_match & ~value);
-    gnc_ppr_update_status_query (page);
-    LEAVE (" ");
-}
-
-
-/** This function is called whenever the "select all" status button is
- *  clicked.  It updates all of the checkbox widgets, then updates the
- *  query on the register.
- *
- *  @param button The button that was clicked.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-void
-gnc_plugin_page_register_filter_status_select_all_cb (GtkButton* button,
-                                                      GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    GtkWidget* widget;
-    gint i;
-
-    g_return_if_fail (GTK_IS_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER ("(button %p, page %p)", button, page);
-
-    /* Turn on all the check menu items */
-    for (i = 0; status_actions[i].action_name; i++)
-    {
-        widget = status_actions[i].widget;
-        g_signal_handlers_block_by_func (widget,
-                                         (gpointer)gnc_plugin_page_register_filter_status_one_cb, page);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
-        g_signal_handlers_unblock_by_func (widget,
-                                           (gpointer)gnc_plugin_page_register_filter_status_one_cb, page);
-    }
-
-    /* Set the requested status */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    priv->fd.cleared_match = CLEARED_ALL;
-    gnc_ppr_update_status_query (page);
-    LEAVE (" ");
-}
-
-
-
-/** This function is called whenever the "clear all" status button is
- *  clicked.  It updates all of the checkbox widgets, then updates the
- *  query on the register.
- *
- *  @param button The button that was clicked.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-void
-gnc_plugin_page_register_filter_status_clear_all_cb (GtkButton* button,
-                                                     GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    GtkWidget* widget;
-    gint i;
-
-    g_return_if_fail (GTK_IS_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER ("(button %p, page %p)", button, page);
-
-    /* Turn off all the check menu items */
-    for (i = 0; status_actions[i].action_name; i++)
-    {
-        widget = status_actions[i].widget;
-        g_signal_handlers_block_by_func (widget,
-                                         (gpointer)gnc_plugin_page_register_filter_status_one_cb, page);
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
-        g_signal_handlers_unblock_by_func (widget,
-                                           (gpointer)gnc_plugin_page_register_filter_status_one_cb, page);
-    }
-
-    /* Set the requested status */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    priv->fd.cleared_match = CLEARED_NONE;
-    gnc_ppr_update_status_query (page);
-    LEAVE (" ");
-}
-
-
-/** This function computes the starting and ending times for the
- *  filter by examining the dialog widgets to see which ones are
- *  selected, and will pull times out of the data entry boxes if
- *  necessary.  This function must exist to handle the case where the
- *  "show all" button was Selected, and the user clicks on the "select
- *  range" button.  Since it exists, it make sense for the rest of the
- *  callbacks to take advantage of it.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-static void
-get_filter_times (GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    time64 time_val;
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
-                                          priv->fd.start_date_choose)))
-    {
-        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->fd.start_date));
-        time_val = gnc_time64_get_day_start (time_val);
-        priv->fd.start_time = time_val;
-    }
-    else
-    {
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
-                                              priv->fd.start_date_today)))
-        {
-            priv->fd.start_time = gnc_time64_get_today_start();
-        }
-        else
-        {
-            priv->fd.start_time = 0;
-        }
-    }
-
-    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
-                                          priv->fd.end_date_choose)))
-    {
-        time_val = gnc_date_edit_get_date (GNC_DATE_EDIT (priv->fd.end_date));
-        time_val = gnc_time64_get_day_end (time_val);
-        priv->fd.end_time = time_val;
-    }
-    else
-    {
-        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
-                                              priv->fd.end_date_today)))
-        {
-            priv->fd.end_time = gnc_time64_get_today_end();
-        }
-        else
-        {
-            priv->fd.end_time = 0;
-        }
-    }
-}
-
-
-/** This function is called when the radio buttons changes state. This
- *  function is responsible for setting the sensitivity of the widgets
- *  controlled by each radio button choice and updating the time
- *  limitation on the register query. This is handled by a helper
- *  function as potentially all widgets will need to be examined.
- *
- *  @param button A pointer to the "select range" radio button.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-void
-gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton* button,
-                                                 GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    gboolean active;
-    const gchar* name;
-
-    g_return_if_fail (GTK_IS_RADIO_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER ("(button %p, page %p)", button, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    name = gtk_buildable_get_name (GTK_BUILDABLE (button));
-    active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
-
-    if (active && g_strcmp0 (name, "filter_show_range") == 0)
-    {
-        gtk_widget_set_sensitive (priv->fd.table, active);
-        gtk_widget_set_sensitive (priv->fd.num_days, !active);
-        get_filter_times (page);
-    }
-    else if (active && g_strcmp0 (name, "filter_show_days") == 0)
-    {
-        gtk_widget_set_sensitive (priv->fd.table, !active);
-        gtk_widget_set_sensitive (priv->fd.num_days, active);
-        gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
-    }
-    else
-    {
-        gtk_widget_set_sensitive (priv->fd.table, FALSE);
-        gtk_widget_set_sensitive (priv->fd.num_days, FALSE);
-        priv->fd.days = 0;
-        priv->fd.start_time = 0;
-        priv->fd.end_time = 0;
-    }
-    gnc_ppr_update_date_query (page);
-    LEAVE (" ");
-}
-
-void
-gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page)
-{
-    GncPluginPageRegisterPrivate* priv;
-
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
+    {
+        gchar* account_full_name = gnc_account_get_full_name (leader);
+        gchar* return_string = g_strdup_printf ("%s+", account_full_name);
+        g_free ((gpointer*) account_full_name);
+        return return_string;
+    }
 
-    priv->fd.days = 0;
-    priv->fd.start_time = 0;
-    priv->fd.end_time = 0;
-    priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
+    default:
+        break;
+    }
 
-    gnc_ppr_update_date_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+    return NULL;
 }
 
-/** This function is called when the "number of days" spin button is
- *  changed which is then saved and updates the time limitation on
- *  the register query. This is handled by a helper function as
- *  potentially all widgets will need to be examined.
- *
- *  @param button A pointer to the "number of days" spin button.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-void
-gnc_plugin_page_register_filter_days_changed_cb (GtkSpinButton* button,
-                                                 GncPluginPageRegister* page)
+static void
+gnc_plugin_page_register_summarybar_position_changed (gpointer prefs,
+                                                      gchar* pref,
+                                                      gpointer user_data)
 {
+    GncPluginPage* plugin_page;
+    GncPluginPageRegister* page;
     GncPluginPageRegisterPrivate* priv;
+    GtkPositionType position = GTK_POS_BOTTOM;
 
-    g_return_if_fail (GTK_IS_SPIN_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    g_return_if_fail (user_data != NULL);
 
-    ENTER ("(button %p, page %p)", button, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
+    if (!GNC_IS_PLUGIN_PAGE (user_data))
+        return;
 
-    priv->fd.days = gtk_spin_button_get_value (GTK_SPIN_BUTTON (button));
-    gnc_ppr_update_date_query (page);
-    LEAVE (" ");
-}
+    plugin_page = GNC_PLUGIN_PAGE (user_data);
+    page = GNC_PLUGIN_PAGE_REGISTER (user_data);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
 
+    if (priv == NULL)
+        return;
 
-/** This function is called when one of the start date entry widgets
- *  is updated.  It simply calls common routines to determine the
- *  start/end times and update the register query.
- *
- *  @param unused A pointer to a GncDateEntry widgets, but it could be
- *  any widget.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-static void
-gnc_plugin_page_register_filter_gde_changed_cb (GtkWidget* unused,
-                                                GncPluginPageRegister* page)
-{
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL,
+                            GNC_PREF_SUMMARYBAR_POSITION_TOP))
+        position = GTK_POS_TOP;
 
-    ENTER ("(widget %s(%p), page %p)",
-           gtk_buildable_get_name (GTK_BUILDABLE (unused)), unused, page);
-    get_filter_times (page);
-    gnc_ppr_update_date_query (page);
-    LEAVE (" ");
+    gtk_box_reorder_child (GTK_BOX (priv->widget),
+                           plugin_page->summarybar,
+                           (position == GTK_POS_TOP ? 0 : -1));
 }
 
-
-/** This function is called when one of the start date radio buttons
- *  is selected.  It updates the sensitivity of the date entry widget,
- *  then calls a common routine to determine the start/end times and
- *  update the register query.
- *
- *  *Note: This function is actually called twice for each new radio
- *  button selection.  The first time call is to uncheck the old
- *  button, and the second time to check the new button.  This does
- *  make a kind of sense, as radio buttons are nothing more than
- *  linked toggle buttons where only one can be active.
- *
- *  @param radio The button whose state is changing.  This will be
- *  the previously selected button the first of the pair of calls to
- *  this function, and will be the newly selected button the second
- *  time.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
-void
-gnc_plugin_page_register_filter_start_cb (GtkWidget* radio,
-                                          GncPluginPageRegister* page)
+static void
+gnc_plugin_page_register_update_page_icon (GncPluginPage* plugin_page)
 {
     GncPluginPageRegisterPrivate* priv;
-    const gchar* name;
-    gboolean active;
+    gboolean read_only;
 
-    g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
 
-    ENTER ("(radio %s(%p), page %p)",
-           gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
-    {
-        LEAVE ("1st callback of pair. Defer to 2nd callback.");
-        return;
-    }
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
 
-    name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
-    active = !g_strcmp0 (name, "start_date_choose");
-    gtk_widget_set_sensitive (priv->fd.start_date, active);
-    get_filter_times (page);
-    gnc_ppr_update_date_query (page);
-    LEAVE (" ");
-}
+    if (qof_book_is_readonly (gnc_get_current_book()) ||
+        gnc_split_reg_get_read_only (priv->gsr))
+        read_only = TRUE;
+    else
+        read_only = FALSE;
 
+    main_window_update_page_set_read_only_icon (GNC_PLUGIN_PAGE(plugin_page),
+                                                read_only);
+}
 
-/** This function is called when one of the end date radio buttons is
- *  selected.  It updates the sensitivity of the date entry widget,
- *  then calls a common routine to determine the start/end times and
- *  update the register query.
- *
- *  *Note: This function is actually called twice for each new radio
- *  button selection.  The first time call is to uncheck the old
- *  button, and the second time to check the new button.  This does
- *  make a kind of sense, as radio buttons are nothing more than
- *  linked toggle buttons where only one can be active.
- *
- *  @param radio The button whose state is changing.  This will be
- *  the previously selected button the first of the pair of calls to
- *  this function, and will be the newly selected button the second
- *  time.
+/** This function is called to get the query associated with this
+ *  plugin page.
  *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
+ *  @param page A pointer to the GncPluginPage.
  */
-void
-gnc_plugin_page_register_filter_end_cb (GtkWidget* radio,
-                                        GncPluginPageRegister* page)
+Query*
+gnc_plugin_page_register_get_query (GncPluginPage* plugin_page)
 {
+    GncPluginPageRegister* page;
     GncPluginPageRegisterPrivate* priv;
-    const gchar* name;
-    gboolean active;
 
-    g_return_if_fail (GTK_IS_RADIO_BUTTON (radio));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), NULL);
 
-    ENTER ("(radio %s(%p), page %p)",
-           gtk_buildable_get_name (GTK_BUILDABLE (radio)), radio, page);
+    page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio)))
-    {
-        LEAVE ("1st callback of pair. Defer to 2nd callback.");
-        return;
-    }
-
-    name = gtk_buildable_get_name (GTK_BUILDABLE (radio));
-    active = !g_strcmp0 (name, "end_date_choose");
-    gtk_widget_set_sensitive (priv->fd.end_date, active);
-    get_filter_times (page);
-    gnc_ppr_update_date_query (page);
-    LEAVE (" ");
+    return gnc_ledger_display_get_query (priv->ledger);
 }
 
-
-/** This function is called whenever the save status is checked
- *  or unchecked. It will allow saving of the filter if required.
- *
- *  @param button The toggle button that was changed.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this filter dialog.
- */
 void
-gnc_plugin_page_register_filter_save_cb (GtkToggleButton* button,
-                                         GncPluginPageRegister* page)
+gnc_plugin_page_register_query_update (GncPluginPageRegister* page, Query *query)
 {
     GncPluginPageRegisterPrivate* priv;
 
-    g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    ENTER(" ");
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
 
-    ENTER ("Save toggle button (%p), plugin_page %p", button, page);
+    // clear previous filter query and save current
+    qof_query_destroy (priv->filter_query);
+    priv->filter_query = qof_query_copy (query);
 
-    /* Compute the new save filter status */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (gtk_toggle_button_get_active (button))
-        priv->fd.save_filter = TRUE;
-    else
-        priv->fd.save_filter = FALSE;
-    LEAVE (" ");
+    if (priv->enable_refresh)
+        gnc_ledger_display_refresh (priv->ledger);
+    LEAVE(" ");
 }
 
-
-/** This function is called when the "Filter By…" dialog is closed.
- *  If the dialog was closed by any method other than clicking the OK
- *  button, the original sorting order will be restored.
- *
- *  @param dialog A pointer to the dialog box.
- *
- *  @param response A numerical value indicating why the dialog box was closed.
- *
- *  @param page A pointer to the GncPluginPageRegister associated with
- *  this dialog box.
- */
 void
-gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
-                                             gint response,
-                                             GncPluginPageRegister* page)
+gnc_plugin_page_register_update_for_search_query (GncPluginPageRegister* page)
 {
     GncPluginPageRegisterPrivate* priv;
-    GncPluginPage* plugin_page;
-
-    g_return_if_fail (GTK_IS_DIALOG (dialog));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    SplitRegister* reg;
 
-    ENTER (" ");
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    plugin_page = GNC_PLUGIN_PAGE (page);
+    reg = gnc_ledger_display_get_split_register (priv->ledger);
 
-    if (response != GTK_RESPONSE_OK)
-    {
-        /* Remove the old status match */
-        priv->fd.cleared_match = priv->fd.original_cleared_match;
-        priv->enable_refresh = FALSE;
-        gnc_ppr_update_status_query (page);
-        priv->enable_refresh = TRUE;
-        priv->fd.start_time = priv->fd.original_start_time;
-        priv->fd.end_time = priv->fd.original_end_time;
-        priv->fd.days = priv->fd.original_days;
-        priv->fd.save_filter = priv->fd.original_save_filter;
-        gnc_ppr_update_date_query (page);
-    }
-    else
+    if (reg->type == SEARCH_LEDGER)
     {
-        // clear the filter when unticking the save option
-        if ((priv->fd.save_filter == FALSE) && (priv->fd.original_save_filter == TRUE))
-            gnc_plugin_page_register_set_filter (plugin_page, NULL);
-
-        priv->fd.original_save_filter = priv->fd.save_filter;
+        Query* query_tmp = gnc_ledger_display_get_query (priv->ledger);
 
-        if (priv->fd.save_filter)
+        // if filter_query is NULL, then the dialogue find has been run
+        // before coming here. if query_tmp does not equal filter_query
+        // then the dialogue find has been run again before coming here
+        if ((priv->filter_query == NULL) ||
+            (!qof_query_equal (query_tmp, priv->filter_query)))
         {
-            gchar *filter;
-            GList *flist = NULL;
-
-            // cleared match
-            flist = g_list_prepend
-                (flist, g_strdup_printf ("0x%04x", priv->fd.cleared_match));
-
-            // start time
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.start_date_choose)) && priv->fd.start_time != 0)
-                flist = g_list_prepend (flist, gnc_plugin_page_register_filter_time2dmy (priv->fd.start_time));
-            else
-                flist = g_list_prepend (flist, g_strdup ("0"));
-
-            // end time
-            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->fd.end_date_choose))
-                && priv->fd.end_time != 0)
-                flist = g_list_prepend (flist, gnc_plugin_page_register_filter_time2dmy (priv->fd.end_time));
-            else
-                flist = g_list_prepend (flist, g_strdup ("0"));
-
-            // number of days
-            if (priv->fd.days > 0)
-                flist = g_list_prepend (flist, g_strdup_printf ("%d", priv->fd.days));
-            else
-                flist = g_list_prepend (flist, g_strdup ("0"));
-
-            flist = g_list_reverse (flist);
-            filter = gnc_g_list_stringjoin (flist, ",");
-            PINFO ("The filter to save is %s", filter);
-            gnc_plugin_page_register_set_filter (plugin_page, filter);
-            g_free (filter);
-            g_list_free_full (flist, g_free);
+            qof_query_destroy (priv->search_query);
+            priv->search_query = qof_query_copy (query_tmp);
         }
+        gnc_ledger_display_set_query (priv->ledger, priv->search_query);
     }
-    priv->fd.dialog = NULL;
-    gtk_widget_destroy (GTK_WIDGET (dialog));
-    LEAVE (" ");
-}
-
-static void
-gpp_update_match_filter_text (cleared_match_t match, const guint mask,
-                              const gchar* filter_name, GList **show, GList **hide)
-{
-    if ((match & mask) == mask)
-        *show = g_list_prepend (*show, g_strdup (filter_name));
-    else
-        *hide = g_list_prepend (*hide, g_strdup (filter_name));
 }
 
-static void
-gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister* page)
+void
+gnc_plugin_register_set_enable_refresh (GncPluginPageRegister* page, gboolean enable_refresh)
 {
     GncPluginPageRegisterPrivate* priv;
-    GList *t_list = NULL;
-
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER (" ");
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-
-    // filtered start time
-    if (priv->fd.start_time != 0)
-    {
-        gchar* sdate = qof_print_date (priv->fd.start_time);
-        t_list = g_list_prepend
-            (t_list, g_strdup_printf ("%s %s", _("Start Date:"), sdate));
-        g_free (sdate);
-    }
-
-    // filtered number of days
-    if (priv->fd.days > 0)
-        t_list = g_list_prepend
-            (t_list, g_strdup_printf ("%s %d", _("Show previous number of days:"),
-                                      priv->fd.days));
-
-    // filtered end time
-    if (priv->fd.end_time != 0)
-    {
-        gchar* edate = qof_print_date (priv->fd.end_time);
-        t_list = g_list_prepend
-            (t_list, g_strdup_printf ("%s %s", _("End Date:"), edate));
-        g_free (edate);
-    }
 
-    // filtered match items
-    if (priv->fd.cleared_match != CLEARED_ALL)
-    {
-        GList *show = NULL;
-        GList *hide = NULL;
-
-        gpp_update_match_filter_text (priv->fd.cleared_match, 0x01, _ ("Unreconciled"),
-                                      &show, &hide);
-        gpp_update_match_filter_text (priv->fd.cleared_match, 0x02, _ ("Cleared"),
-                                      &show, &hide);
-        gpp_update_match_filter_text (priv->fd.cleared_match, 0x04, _ ("Reconciled"),
-                                      &show, &hide);
-        gpp_update_match_filter_text (priv->fd.cleared_match, 0x08, _ ("Frozen"),
-                                      &show, &hide);
-        gpp_update_match_filter_text (priv->fd.cleared_match, 0x10, _ ("Voided"),
-                                      &show, &hide);
-
-        show = g_list_reverse (show);
-        hide = g_list_reverse (hide);
-
-        if (show)
-        {
-            char *str = gnc_list_formatter (show);
-            t_list = g_list_prepend
-                (t_list, g_strdup_printf ("%s %s", _("Show:"), str));
-            g_free (str);
-        }
-
-        if (hide)
-        {
-            char *str = gnc_list_formatter (hide);
-            t_list = g_list_prepend
-                (t_list, g_strdup_printf ("%s %s", _("Hide:"), str));
-            g_free (str);
-        }
-
-        g_list_free_full (show, g_free);
-        g_list_free_full (hide, g_free);
-    }
-
-    t_list = g_list_reverse (t_list);
-
-    if (t_list)
-        t_list = g_list_prepend (t_list, g_strdup (_("Filter By:")));
-
-    // free the existing text if present
-    if (priv->gsr->filter_text != NULL)
-        g_free (priv->gsr->filter_text);
-
-    // set the tooltip text variable in the gsr
-    priv->gsr->filter_text = gnc_g_list_stringjoin (t_list, "\n");
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
 
-    g_list_free_full (t_list, g_free);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
 
-    LEAVE (" ");
+    priv->enable_refresh = enable_refresh;
 }
 
-
-static void
-gnc_plugin_page_register_update_page_icon (GncPluginPage* plugin_page)
+void
+gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page)
 {
-    GncPluginPageRegisterPrivate* priv;
-    gboolean read_only;
-
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
-
-    if (qof_book_is_readonly (gnc_get_current_book()) ||
-        gnc_split_reg_get_read_only (priv->gsr))
-        read_only = TRUE;
-    else
-        read_only = FALSE;
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
 
-    main_window_update_page_set_read_only_icon (GNC_PLUGIN_PAGE(plugin_page),
-                                                read_only);
+    gnc_ppr_filter_clear_current_filter (plugin_page);
 }
 
 /************************************************************/
@@ -3729,188 +2771,24 @@ gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
 {
     auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
     GncPluginPageRegisterPrivate* priv;
-    GtkWidget* dialog, *toggle, *button, *table, *hbox;
-    time64 start_time, end_time, time_val;
-    GtkBuilder* builder;
-    gboolean sensitive, value;
-    Query* query;
-    gchar* title;
-    int i;
 
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
     ENTER ("(action %p, page %p)", simple, page);
 
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
     if (priv->fd.dialog)
     {
-        gtk_window_present (GTK_WINDOW (priv->fd.dialog));
+        gtk_window_present (GTK_WINDOW(priv->fd.dialog));
         LEAVE ("existing dialog");
         return;
     }
 
-    /* Create the dialog */
-    builder = gtk_builder_new();
-    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
-                               "days_adjustment");
-    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
-                               "filter_by_dialog");
-    dialog = GTK_WIDGET (gtk_builder_get_object (builder, "filter_by_dialog"));
-    priv->fd.dialog = dialog;
-    gtk_window_set_transient_for (GTK_WINDOW (dialog),
-                                  gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
-
-    /* Translators: The %s is the name of the plugin page */
-    title = g_strdup_printf (_ ("Filter %s by…"),
-                             gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE (page)));
-    gtk_window_set_title (GTK_WINDOW (dialog), title);
-    g_free (title);
-
-    /* Set the check buttons for the current status */
-    for (i = 0; status_actions[i].action_name; i++)
-    {
-        toggle = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                     status_actions[i].action_name));
-        value = priv->fd.cleared_match & status_actions[i].value;
-        status_actions[i].widget = toggle;
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), value);
-    }
-    priv->fd.original_cleared_match = priv->fd.cleared_match;
-
-    button = GTK_WIDGET (gtk_builder_get_object (builder, "filter_save"));
-    if (priv->fd.save_filter == TRUE)
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-
-    // hide the save button if appropriate
-    gtk_widget_set_visible (GTK_WIDGET (button),
-                            gnc_plugin_page_register_show_fs_save (page));
-
-    /* Set up number of days */
-    priv->fd.num_days = GTK_WIDGET (gtk_builder_get_object (builder,
-                                                            "filter_show_num_days"));
-    button = GTK_WIDGET (gtk_builder_get_object (builder, "filter_show_days"));
-
-    query = gnc_ledger_display_get_query (priv->ledger);
-
-    if (priv->fd.days > 0) // using number of days
-    {
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), TRUE);
-        gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->fd.num_days), priv->fd.days);
-        priv->fd.original_days = priv->fd.days;
-
-        /* Set the start_time and end_time to 0 */
-        start_time = 0;
-        end_time = 0;
-    }
-    else
-    {
-        gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.num_days), FALSE);
-        priv->fd.original_days = 0;
-        priv->fd.days = 0;
-
-        /* Get the start and end times */
-        xaccQueryGetDateMatchTT (query, &start_time, &end_time);
-    }
-
-    /* Set the date info */
-    priv->fd.original_start_time = start_time;
-    priv->fd.start_time = start_time;
-    priv->fd.original_end_time = end_time;
-    priv->fd.end_time = end_time;
-
-    button = GTK_WIDGET (gtk_builder_get_object (builder, "filter_show_range"));
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), start_time ||
-                                  end_time);
-    table = GTK_WIDGET (gtk_builder_get_object (builder, "select_range_table"));
-    priv->fd.table = table;
-    gtk_widget_set_sensitive (GTK_WIDGET (table), start_time || end_time);
-
-    priv->fd.start_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
-                                             "start_date_choose"));
-    priv->fd.start_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
-                                            "start_date_today"));
-    priv->fd.end_date_choose = GTK_WIDGET (gtk_builder_get_object (builder,
-                                           "end_date_choose"));
-    priv->fd.end_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
-                                          "end_date_today"));
-
-    {
-        /* Start date info */
-        if (start_time == 0)
-        {
-            button = GTK_WIDGET (gtk_builder_get_object (builder, "start_date_earliest"));
-            time_val = xaccQueryGetEarliestDateFound (query);
-            sensitive = FALSE;
-        }
-        else
-        {
-            time_val = start_time;
-            if ((start_time >= gnc_time64_get_today_start()) &&
-                (start_time <= gnc_time64_get_today_end()))
-            {
-                button = priv->fd.start_date_today;
-                sensitive = FALSE;
-            }
-            else
-            {
-                button = priv->fd.start_date_choose;
-                sensitive = TRUE;
-            }
-        }
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        priv->fd.start_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
-        hbox = GTK_WIDGET (gtk_builder_get_object (builder, "start_date_hbox"));
-        gtk_box_pack_start (GTK_BOX (hbox), priv->fd.start_date, TRUE, TRUE, 0);
-        gtk_widget_show (priv->fd.start_date);
-        gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.start_date), sensitive);
-        gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.start_date), time_val);
-        g_signal_connect (G_OBJECT (priv->fd.start_date), "date-changed",
-                          G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
-                          page);
-    }
-
-    {
-        /* End date info */
-        if (end_time == 0)
-        {
-            button = GTK_WIDGET (gtk_builder_get_object (builder, "end_date_latest"));
-            time_val = xaccQueryGetLatestDateFound (query);
-            sensitive = FALSE;
-        }
-        else
-        {
-            time_val = end_time;
-            if ((end_time >= gnc_time64_get_today_start()) &&
-                (end_time <= gnc_time64_get_today_end()))
-            {
-                button = priv->fd.end_date_today;
-                sensitive = FALSE;
-            }
-            else
-            {
-                button = priv->fd.end_date_choose;
-                sensitive = TRUE;
-            }
-        }
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        priv->fd.end_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
-        hbox = GTK_WIDGET (gtk_builder_get_object (builder, "end_date_hbox"));
-        gtk_box_pack_start (GTK_BOX (hbox), priv->fd.end_date, TRUE, TRUE, 0);
-        gtk_widget_show (priv->fd.end_date);
-        gtk_widget_set_sensitive (GTK_WIDGET (priv->fd.end_date), sensitive);
-        gnc_date_edit_set_time (GNC_DATE_EDIT (priv->fd.end_date), time_val);
-        g_signal_connect (G_OBJECT (priv->fd.end_date), "date-changed",
-                          G_CALLBACK (gnc_plugin_page_register_filter_gde_changed_cb),
-                          page);
-    }
+    Query* query = gnc_ledger_display_get_query (priv->ledger);
+    gboolean show_save_button = gnc_plugin_page_register_show_fs_save (page);
 
-    /* Wire it up */
-    gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
-                                      page);
+    gnc_ppr_filter_by (GNC_PLUGIN_PAGE(page), query,
+                       &priv->fd, show_save_button);
 
-    /* Show it */
-    gtk_widget_show (dialog);
-    g_object_unref (G_OBJECT (builder));
     LEAVE (" ");
 }
 
@@ -5006,6 +3884,17 @@ gnc_plugin_page_register_get_gsr (GncPluginPage* plugin_page)
     return priv->gsr;
 }
 
+FilterData *
+gnc_plugin_page_register_get_filter_data (GncPluginPage *plugin_page)
+{
+    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page), NULL);
+
+    GncPluginPageRegister* page = GNC_PLUGIN_PAGE_REGISTER(plugin_page);
+    GncPluginPageRegisterPrivate* priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+
+    return &priv->fd;
+}
+
 SortData *
 gnc_plugin_page_register_get_sort_data (GncPluginPage *plugin_page)
 {
diff --git a/gnucash/gnome/gnc-plugin-page-register.h b/gnucash/gnome/gnc-plugin-page-register.h
index 2aa2a01195..8bfc7736c1 100644
--- a/gnucash/gnome/gnc-plugin-page-register.h
+++ b/gnucash/gnome/gnc-plugin-page-register.h
@@ -42,6 +42,7 @@
 #include "gnc-plugin-page.h"
 #include "gnc-split-reg.h"
 #include "Query.h"
+#include "gnc-plugin-page-register-filter.h"
 #include "gnc-plugin-page-register-sort.h"
 
 
@@ -135,6 +136,12 @@ void gnc_plugin_page_register_set_options (GncPluginPage *plugin_page,
  */
 GNCSplitReg * gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page);
 
+/** Get the FilterData data structure associated with this register page.
+ *
+ *  @param plugin_page A "register" page.
+ */
+FilterData * gnc_plugin_page_register_get_filter_data (GncPluginPage *plugin_page);
+
 /** Get the SortData data structure associated with this register page.
  *
  *  @param plugin_page A "register" page.
@@ -149,6 +156,29 @@ SortData * gnc_plugin_page_register_get_sort_data (GncPluginPage *plugin_page);
  */
 Query * gnc_plugin_page_register_get_query (GncPluginPage *plugin_page);
 
+/** This checks if the register is a search register and if so
+ *  saves the query.
+ *
+ *  @param plugin_page A pointer to the GncPluginPageRegister.
+ */
+void gnc_plugin_page_register_update_for_search_query (GncPluginPageRegister* page);
+
+/** This updates the query after the filters have been applied.
+ *
+ *  @param plugin_page A pointer to the GncPluginPageRegister.
+ *
+ *  @param query The updated query
+ */
+void gnc_plugin_page_register_query_update (GncPluginPageRegister* page, Query *query);
+
+/** This allows controlling when refreshes happen, used to reduce refreshes when
+ *  different aspects of the register filter change, namely date and status.
+ *
+ *  @param plugin_page A pointer to the GncPluginPageRegister.
+ *
+ *  @param enable_refresh Used to controll wehn refresh is required
+ */
+void gnc_plugin_register_set_enable_refresh (GncPluginPageRegister* page, gboolean enable_refresh);
 
 /** Get the Account associated with this register page.
  *
diff --git a/gnucash/gtkbuilder/gnc-plugin-page-register.glade b/gnucash/gtkbuilder/gnc-plugin-page-register.glade
index 2d3dfd6ab1..72714b4ced 100644
--- a/gnucash/gtkbuilder/gnc-plugin-page-register.glade
+++ b/gnucash/gtkbuilder/gnc-plugin-page-register.glade
@@ -14,7 +14,7 @@
     <property name="resizable">False</property>
     <property name="destroy-with-parent">True</property>
     <property name="type-hint">dialog</property>
-    <signal name="response" handler="gnc_plugin_page_register_filter_response_cb" swapped="no"/>
+    <signal name="response" handler="gnc_ppr_filter_response_cb" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox19">
         <property name="visible">True</property>
@@ -105,7 +105,7 @@
                         <property name="active">True</property>
                         <property name="draw-indicator">True</property>
                         <property name="group">filter_show_all</property>
-                        <signal name="toggled" handler="gnc_plugin_page_register_filter_select_range_cb" swapped="no"/>
+                        <signal name="toggled" handler="gnc_ppr_filter_select_range_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -121,7 +121,7 @@
 If 0, all previous days included</property>
                         <property name="adjustment">days_adjustment</property>
                         <property name="numeric">True</property>
-                        <signal name="value-changed" handler="gnc_plugin_page_register_filter_days_changed_cb" swapped="no"/>
+                        <signal name="value-changed" handler="gnc_ppr_filter_days_changed_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="expand">False</property>
@@ -146,7 +146,7 @@ If 0, all previous days included</property>
                     <property name="use-underline">True</property>
                     <property name="draw-indicator">True</property>
                     <property name="group">filter_show_all</property>
-                    <signal name="toggled" handler="gnc_plugin_page_register_filter_select_range_cb" swapped="no"/>
+                    <signal name="toggled" handler="gnc_ppr_filter_select_range_cb" swapped="no"/>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -183,7 +183,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_start_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_start_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">1</property>
@@ -199,7 +199,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_end_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_end_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">1</property>
@@ -216,7 +216,7 @@ If 0, all previous days included</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
                         <property name="group">end_date_choose</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_end_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_end_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">1</property>
@@ -233,7 +233,7 @@ If 0, all previous days included</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
                         <property name="group">end_date_choose</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_end_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_end_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">1</property>
@@ -272,7 +272,7 @@ If 0, all previous days included</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
                         <property name="group">start_date_earliest</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_start_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_start_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">1</property>
@@ -289,7 +289,7 @@ If 0, all previous days included</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
                         <property name="group">start_date_earliest</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_start_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_start_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">1</property>
@@ -394,7 +394,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="toggled" handler="gnc_plugin_page_register_filter_status_one_cb" swapped="no"/>
+                        <signal name="toggled" handler="gnc_ppr_filter_status_one_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -410,7 +410,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="toggled" handler="gnc_plugin_page_register_filter_status_one_cb" swapped="no"/>
+                        <signal name="toggled" handler="gnc_ppr_filter_status_one_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -426,7 +426,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="toggled" handler="gnc_plugin_page_register_filter_status_one_cb" swapped="no"/>
+                        <signal name="toggled" handler="gnc_ppr_filter_status_one_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -442,7 +442,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="toggled" handler="gnc_plugin_page_register_filter_status_one_cb" swapped="no"/>
+                        <signal name="toggled" handler="gnc_ppr_filter_status_one_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -458,7 +458,7 @@ If 0, all previous days included</property>
                         <property name="halign">start</property>
                         <property name="use-underline">True</property>
                         <property name="draw-indicator">True</property>
-                        <signal name="toggled" handler="gnc_plugin_page_register_filter_status_one_cb" swapped="no"/>
+                        <signal name="toggled" handler="gnc_ppr_filter_status_one_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -473,7 +473,7 @@ If 0, all previous days included</property>
                         <property name="receives-default">True</property>
                         <property name="halign">center</property>
                         <property name="use-underline">True</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_status_select_all_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_status_select_all_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -501,7 +501,7 @@ If 0, all previous days included</property>
                         <property name="receives-default">True</property>
                         <property name="halign">center</property>
                         <property name="use-underline">True</property>
-                        <signal name="clicked" handler="gnc_plugin_page_register_filter_status_clear_all_cb" swapped="no"/>
+                        <signal name="clicked" handler="gnc_ppr_filter_status_clear_all_cb" swapped="no"/>
                       </object>
                       <packing>
                         <property name="left-attach">0</property>
@@ -551,7 +551,7 @@ If 0, all previous days included</property>
                 <property name="receives-default">False</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_filter_save_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_filter_save_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 389fb661fb..271d62b96c 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -100,6 +100,7 @@ gnucash/gnome/gnc-plugin-page-budget.cpp
 gnucash/gnome/gnc-plugin-page-invoice.cpp
 gnucash/gnome/gnc-plugin-page-owner-tree.cpp
 gnucash/gnome/gnc-plugin-page-register.cpp
+gnucash/gnome/gnc-plugin-page-register-filter.c
 gnucash/gnome/gnc-plugin-page-register-sort.c
 gnucash/gnome/gnc-plugin-page-report.cpp
 gnucash/gnome/gnc-plugin-page-sx-list.cpp

commit 94bc521bf12ef96babd84b005e1f510874f032a7
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Apr 8 14:54:12 2026 +0100

    Move register sort parts to separate file

diff --git a/gnucash/gnome/CMakeLists.txt b/gnucash/gnome/CMakeLists.txt
index 115a886bb2..3cdf734050 100644
--- a/gnucash/gnome/CMakeLists.txt
+++ b/gnucash/gnome/CMakeLists.txt
@@ -47,6 +47,7 @@ set (gnc_gnome_noinst_HEADERS
   gnc-plugin-page-invoice.h
   gnc-plugin-page-owner-tree.h
   gnc-plugin-page-register.h
+  gnc-plugin-page-register-sort.h
   gnc-plugin-page-report.h
   gnc-plugin-page-sx-list.h
   gnc-split-reg.h
@@ -114,6 +115,7 @@ set (gnc_gnome_SOURCES
   gnc-plugin-page-invoice.cpp
   gnc-plugin-page-owner-tree.cpp
   gnc-plugin-page-register.cpp
+  gnc-plugin-page-register-sort.c
   gnc-plugin-page-report.cpp
   gnc-plugin-page-sx-list.cpp
   gnc-split-reg.c
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.c b/gnucash/gnome/gnc-plugin-page-register-sort.c
new file mode 100644
index 0000000000..b59e1b4156
--- /dev/null
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.c
@@ -0,0 +1,428 @@
+/**********************************************************************
+ * gnc-plugin-page-register-sort.c -- register page sort              *
+ *                                                                    *
+ * Copyright (C) 2026, Robert Fewell                                  *
+ *                                                                    *
+ * This program is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License as     *
+ * published by the Free Software Foundation; either version 2 of     *
+ * the License, or (at your option) any later version.                *
+ *                                                                    *
+ * This program is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *
+ * GNU General Public License for more details.                       *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this program; if not, contact:                          *
+ *                                                                    *
+ * Free Software Foundation           Voice:  +1-617-542-5942         *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652         *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                     *
+ **********************************************************************/
+
+/** @addtogroup ContentPlugins
+    @{ */
+/** @addtogroup RegisterPlugin Register Page Sort
+    @{ */
+/** @file gnc-plugin-page-register-sort.c
+    @brief  Functions providing a register page sort for the GnuCash UI
+    @author Copyright (C) 2026 Bob Fewell
+*/
+
+#include <config.h>
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include "gnc-plugin-page-register.h"
+#include "gnc-plugin-page-register-sort.h"
+#include "dialog-utils.h"
+#include "gnc-state.h"
+#include "gnc-prefs.h"
+#include "gnc-ui-util.h"
+#include "gnc-window.h"
+#include "gnc-main-window.h"
+#include "engine-helpers.h"
+#include "qofbookslots.h"
+#include "qof.h"
+
+/* This static indicates the debugging module that this .o belongs to.  */
+static QofLogModule log_module = GNC_MOD_GUI;
+
+void
+gnc_ppr_sort_response_cb (GtkDialog* dialog,
+                          gint response,
+                          GncPluginPageRegister *page);
+
+void
+gnc_ppr_sort_button_cb (GtkToggleButton* button,
+                        GncPluginPageRegister *page);
+
+void
+gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
+                            GncPluginPageRegister *page);
+
+void
+gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
+                               GncPluginPageRegister *page);
+
+static void
+gnc_ppr_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);
+}
+
+gchar*
+gnc_ppr_sort_get_order (GNCSplitReg *gsr)
+ {
+    if (!gsr)
+        return _("unknown");
+
+    // get the sort_order from the .gcm file
+    GKeyFile* state_file = gnc_state_get_current();
+    gchar* state_section = gsr_get_register_state_section (gsr);
+    GError* error = NULL;
+    gchar* sort_order = NULL;
+
+    gchar* sort_text = g_key_file_get_string (state_file, state_section,
+                                              KEY_PAGE_SORT, &error);
+
+    if (error)
+        g_clear_error (&error);
+    else
+    {
+        sort_order = g_strdup (sort_text);
+        g_free (sort_text);
+    }
+    g_free (state_section);
+
+    return sort_order ? sort_order : g_strdup (DEFAULT_SORT_ORDER);
+}
+
+void
+gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order)
+{
+    if (!gsr)
+        return;
+
+    // save sort_order to the .gcm file also
+    GKeyFile* state_file = gnc_state_get_current();
+    gchar* 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))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT, NULL);
+
+        gnc_ppr_check_for_empty_group (state_file, state_section);
+    }
+    else
+        g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order);
+
+    g_free (state_section);
+}
+
+gboolean
+gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
+{
+    if (!gsr)
+        return FALSE;
+
+    // get the sort_reversed from the .gcm file
+    GKeyFile* state_file = gnc_state_get_current();
+    gchar* state_section = gsr_get_register_state_section (gsr);
+    GError* error = NULL;
+    gboolean sort_reversed = g_key_file_get_boolean (state_file, state_section,
+                                                     KEY_PAGE_SORT_REV, &error);
+
+    if (error)
+        g_clear_error (&error);
+
+    g_free (state_section);
+    return sort_reversed;
+}
+
+void
+gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order)
+{
+    if (!gsr)
+        return;
+
+    // save reverse_order to the .gcm file also
+    GKeyFile* state_file = gnc_state_get_current();
+    gchar* 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))
+            g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV, NULL);
+
+        gnc_ppr_check_for_empty_group (state_file, state_section);
+    }
+    else
+        g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
+                                reverse_order);
+
+    g_free (state_section);
+}
+
+/** This function is called whenever the number source book options is changed
+ *  to adjust the displayed labels. Since the book option change may change the
+ *  query sort, the gnc_split_reg_sort function is called with force and refresh
+ *  to ensure the page is refreshed.
+ *
+ *  @param new_val A pointer to the boolean for the new value of the book option.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this sort order dialog.
+ */
+static void
+gnc_ppr_sort_book_option_changed (gpointer new_val,
+                                  gpointer user_data)
+{
+    GncPluginPageRegister *page = GNC_PLUGIN_PAGE_REGISTER(user_data);
+    gboolean* new_data = (gboolean*)new_val;
+
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+
+    if (*new_data)
+    {
+        gtk_button_set_label (GTK_BUTTON(sd->num_radio), _("Transaction Number"));
+        gtk_button_set_label (GTK_BUTTON(sd->act_radio), _("Number/Action"));
+    }
+    else
+    {
+        gtk_button_set_label (GTK_BUTTON(sd->num_radio), _("Number"));
+        gtk_button_set_label (GTK_BUTTON(sd->act_radio), _("Action"));
+    }
+
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+
+    gnc_split_reg_sort (gsr, gsr->sort_type, force, refresh);
+}
+
+/** This function is called when the "Sort By…" dialog is closed.
+ *  If the dialog was closed by any method other than clicking the OK
+ *  button, the original sorting order will be restored.
+ *
+ *  @param dialog A pointer to the dialog box.
+ *
+ *  @param response A numerical value indicating why the dialog box was closed.
+ *
+ *  @param page A pointer to the GncPluginPageRegister associated with
+ *  this dialog box.
+ */
+void
+gnc_ppr_sort_response_cb (GtkDialog* dialog,
+                          gint response,
+                          GncPluginPageRegister *page)
+{
+    g_return_if_fail (GTK_IS_DIALOG(dialog));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER(" ");
+
+    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+
+    if (response != GTK_RESPONSE_OK)
+    {
+        /* Restore the original sort order */
+        gnc_split_reg_set_sort_reversed (gsr, sd->original_reverse_order, no_refresh);
+        sd->reverse_order = sd->original_reverse_order;
+        gnc_split_reg_sort (gsr, sd->original_sort_type, no_force, refresh);
+        sd->save_order = sd->original_save_order;
+    }
+    else
+    {
+        // clear the sort when unticking the save option
+        if ((!sd->save_order) && ((sd->original_save_order) ||
+                                  (sd->original_reverse_order)))
+        {
+            gnc_ppr_sort_set_order (gsr, DEFAULT_SORT_ORDER);
+            gnc_ppr_sort_set_reversed (gsr, FALSE);
+        }
+        sd->original_save_order = sd->save_order;
+
+        if (sd->save_order)
+        {
+            SortType type = gnc_split_reg_get_sort_type (gsr);
+            const gchar* order = SortTypeasString (type);
+
+            gnc_ppr_sort_set_order (gsr, order);
+            gnc_ppr_sort_set_reversed (gsr, sd->reverse_order);
+        }
+    }
+    gnc_book_option_remove_cb (OPTION_NAME_NUM_FIELD_SOURCE,
+                               gnc_ppr_sort_book_option_changed,
+                               page);
+    sd->dialog = NULL;
+    sd->num_radio = NULL;
+    sd->act_radio = NULL;
+    gtk_widget_destroy (GTK_WIDGET(dialog));
+    LEAVE (" ");
+}
+
+/** This function is called when a radio button in the "Sort By…"
+ *  dialog is clicked.
+ *
+ *  @param button The button that was toggled.
+ *
+ *  @param page A pointer to the GncPluginPageRegister associated with
+ *  this dialog box.
+ */
+void
+gnc_ppr_sort_button_cb (GtkToggleButton* button,
+                        GncPluginPageRegister *page)
+{
+    g_return_if_fail (GTK_IS_TOGGLE_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    const gchar* name = gtk_buildable_get_name (GTK_BUILDABLE(button));
+
+    ENTER("button %s(%p), page %p", name, button, page);
+
+    if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
+    {
+        LEAVE("1st callback of pair. Defer to 2nd callback.");
+        return;
+    }
+
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+
+    SortType type = SortTypefromString (name);
+    gnc_split_reg_sort (gsr, type, no_force, refresh);
+    LEAVE (" ");
+}
+
+/** This function is called whenever the save sort order is checked
+ *  or unchecked which allows saving of the sort order.
+ *
+ *  @param button The toggle button that was changed.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this sort order dialog.
+ */
+void
+gnc_ppr_sort_order_save_cb (GtkToggleButton* button,
+                            GncPluginPageRegister *page)
+{
+    g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("Save toggle button (%p), page %p", button, page);
+
+    /* Compute the new save sort order */
+    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+
+    if (gtk_toggle_button_get_active (button))
+        sd->save_order = TRUE;
+    else
+        sd->save_order = FALSE;
+    LEAVE (" ");
+}
+
+/** This function is called whenever the reverse sort order is checked
+ *  or unchecked which allows reversing of the sort order.
+ *
+ *  @param button The toggle button that was changed.
+ *
+ *  @param page A pointer to the GncPluginPageRegister that is
+ *  associated with this sort order dialog.
+ */
+void
+gnc_ppr_sort_order_reverse_cb (GtkToggleButton* button,
+                               GncPluginPageRegister *page)
+{
+    g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
+
+    ENTER("Reverse toggle button (%p), page %p", button, page);
+
+    /* Compute the new save sort order */
+    SortData *sd = gnc_plugin_page_register_get_sort_data (GNC_PLUGIN_PAGE(page));
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(page));
+
+    sd->reverse_order = gtk_toggle_button_get_active (button);
+    gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, refresh);
+    LEAVE (" ");
+}
+
+void
+gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
+                     SortData *sd, gboolean show_save_button)
+{
+    GtkWidget* dialog, *button;
+    GtkBuilder* builder;
+    SortType sort;
+    const gchar* name;
+    gchar* title;
+
+    /* Create the dialog */
+    builder = gtk_builder_new();
+    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade", "sort_by_dialog");
+    dialog = GTK_WIDGET(gtk_builder_get_object (builder, "sort_by_dialog"));
+    sd->dialog = dialog;
+    gtk_window_set_transient_for (GTK_WINDOW(dialog),
+                                  gnc_window_get_gtk_window (GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window)));
+    /* Translators: The %s is the name of the plugin page */
+    title = g_strdup_printf (_ ("Sort %s by…"),
+                             gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE(plugin_page)));
+    gtk_window_set_title (GTK_WINDOW(dialog), title);
+    g_free (title);
+
+    GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (plugin_page);
+
+    /* Set the button for the current sort order */
+    sort = gnc_split_reg_get_sort_type (gsr);
+    name = SortTypeasString (sort);
+    button = GTK_WIDGET(gtk_builder_get_object (builder, name));
+    DEBUG("current sort %d, button %s(%p)", sort, name, button);
+    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+    sd->original_sort_type = sort;
+
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_save"));
+    if (sd->save_order)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+
+    // hide the save button if appropriate
+    gtk_widget_set_visible (GTK_WIDGET(button), show_save_button);
+
+    /* Set the button for the current reverse_order order */
+    button = GTK_WIDGET(gtk_builder_get_object (builder, "sort_reverse"));
+    if (sd->reverse_order)
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
+    sd->original_reverse_order = sd->reverse_order;
+
+    sd->num_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_NUM"));
+    sd->act_radio = GTK_WIDGET(gtk_builder_get_object (builder, "BY_ACTION"));
+    /* Adjust labels related to Num/Action radio buttons based on book option */
+    if (reg && !reg->use_tran_num_for_num_field)
+    {
+        gtk_button_set_label (GTK_BUTTON(sd->num_radio), _ ("Transaction Number"));
+        gtk_button_set_label (GTK_BUTTON(sd->act_radio), _ ("Number/Action"));
+    }
+    gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
+                                 (GncBOCb)gnc_ppr_sort_book_option_changed,
+                                 GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    /* Wire it up */
+    gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
+                                      GNC_PLUGIN_PAGE_REGISTER(plugin_page));
+
+    /* Show it */
+    gtk_widget_show (dialog);
+    g_object_unref (G_OBJECT(builder));
+    LEAVE (" ");
+}
+
diff --git a/gnucash/gnome/gnc-plugin-page-register-sort.h b/gnucash/gnome/gnc-plugin-page-register-sort.h
new file mode 100644
index 0000000000..3c09158178
--- /dev/null
+++ b/gnucash/gnome/gnc-plugin-page-register-sort.h
@@ -0,0 +1,72 @@
+/**********************************************************************
+ * gnc-plugin-page-register-sort.h -- register page sort              *
+ *                                                                    *
+ * Copyright (C) 2026 Bob Fewell                                      *
+ *                                                                    *
+ * This program is free software; you can redistribute it and/or      *
+ * modify it under the terms of the GNU General Public License as     *
+ * published by the Free Software Foundation; either version 2 of     *
+ * the License, or (at your option) any later version.                *
+ *                                                                    *
+ * This program is distributed in the hope that it will be useful,    *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of     *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      *
+ * GNU General Public License for more details.                       *
+ *                                                                    *
+ * You should have received a copy of the GNU General Public License  *
+ * along with this program; if not, contact:                          *
+ *                                                                    *
+ * Free Software Foundation           Voice:  +1-617-542-5942         *
+ * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652         *
+ * Boston, MA  02110-1301,  USA       gnu at gnu.org                     *
+ **********************************************************************/
+
+/** @addtogroup ContentPlugins
+    @{ */
+/** @addtogroup RegisterPlugin Register Page Sort
+    @{ */
+/** @file gnc-plugin-page-register-filter.h
+    @brief  Functions providing a register page sort for the GnuCash UI
+    @author Copyright (C) 2026 Bob Fewell
+*/
+
+#ifndef __GNC_PLUGIN_PAGE_REGISTER_SORT_H
+#define __GNC_PLUGIN_PAGE_REGISTER_SORT_H
+
+#include <gtk/gtk.h>
+#include "gnc-split-reg.h"
+#include "gnc-plugin-page.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef struct sort_data
+{
+    GtkWidget* dialog;
+    GtkWidget* num_radio;
+    GtkWidget* act_radio;
+    SortType   original_sort_type;
+    gboolean   original_save_order;
+    gboolean   save_order;
+    gboolean   reverse_order;
+    gboolean   original_reverse_order;
+} SortData;
+
+#define DEFAULT_SORT_ORDER "BY_STANDARD"
+
+gboolean gnc_ppr_sort_get_reversed (GNCSplitReg *gsr);
+void gnc_ppr_sort_set_reversed (GNCSplitReg* gsr, gboolean reverse_order);
+
+gchar* gnc_ppr_sort_get_order (GNCSplitReg *gsr);
+void gnc_ppr_sort_set_order (GNCSplitReg *gsr, const gchar* sort_order);
+
+void gnc_ppr_sort_dialog (GncPluginPage *plugin_page, SplitRegister* reg,
+                          SortData *sd, gboolean show_save_button);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __GNC_PLUGIN_PAGE_REGISTER_SORT_H */
diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index c22f92ce27..65842dc975 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -139,27 +139,6 @@ static void gnc_plugin_page_register_summarybar_position_changed (gpointer prefs
                                                                   gchar* pref,
                                                                   gpointer user_data);
 
-extern "C"
-{
-/* Callbacks for the "Sort By" dialog */
-void gnc_plugin_page_register_sort_button_cb (GtkToggleButton* button,
-                                              GncPluginPageRegister* page);
-void gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
-                                                gint response,
-                                                GncPluginPageRegister* page);
-void gnc_plugin_page_register_sort_order_save_cb (GtkToggleButton* button,
-                                                  GncPluginPageRegister* page);
-void gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton* button,
-                                                     GncPluginPageRegister* page);
-}
-
-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);
-
 extern "C"
 {
 /* Callbacks for the "Filter By" dialog */
@@ -426,7 +405,6 @@ static struct status_action status_actions[] =
 
 #define CLEARED_VALUE "cleared_value"
 #define DEFAULT_FILTER "0x001f"
-#define DEFAULT_SORT_ORDER "BY_STANDARD"
 
 /************************************************************/
 /*                      Data Structures                     */
@@ -450,17 +428,7 @@ typedef struct GncPluginPageRegisterPrivate
     Query* search_query;     // saved search query for comparison
     Query* filter_query;     // saved filter query for comparison
 
-    struct
-    {
-        GtkWidget* dialog;
-        GtkWidget* num_radio;
-        GtkWidget* act_radio;
-        SortType original_sort_type;
-        gboolean original_save_order;
-        gboolean save_order;
-        gboolean reverse_order;
-        gboolean original_reverse_order;
-    } sd;
+    SortData sd;
 
     struct
     {
@@ -1289,7 +1257,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         guint filtersize = 0;
         /* Set the sort order for the split register and status of save order button */
         priv->sd.save_order = FALSE;
-        order = gnc_plugin_page_register_get_sort_order (plugin_page);
+        order = gnc_ppr_sort_get_order (priv->gsr);
 
         PINFO ("Loaded Sort order is %s", order);
         gnc_split_reg_sort (priv->gsr, SortTypefromString (order), no_force, no_refresh);
@@ -1300,8 +1268,7 @@ 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);
+        priv->sd.reverse_order = gnc_ppr_sort_get_reversed (priv->gsr);
 
         gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, no_refresh);
         if (priv->sd.reverse_order)
@@ -2084,152 +2051,6 @@ gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
     return;
 }
 
-static gchar*
-gnc_plugin_page_register_get_sort_order_gcm (GNCSplitReg *gsr)
-{
-    GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section;
-    gchar* sort_text;
-    GError* error = NULL;
-    char* sort_order = NULL;
-
-    // get the sort_order from the .gcm file
-    state_section = gsr_get_register_state_section (gsr);
-    sort_text = g_key_file_get_string (state_file, state_section, KEY_PAGE_SORT,
-                                       &error);
-
-    if (error)
-        g_clear_error (&error);
-    else
-    {
-        sort_order = g_strdup (sort_text);
-        g_free (sort_text);
-    }
-    g_free (state_section);
-    return sort_order;
-}
-
-static gchar*
-gnc_plugin_page_register_get_sort_order (GncPluginPage* plugin_page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    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);
-
-    // load from gcm file
-    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 (GNCSplitReg *gsr,
-                                             const gchar* sort_order)
-{
-    GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section;
-
-    // save sort_order to the .gcm file also
-    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))
-            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);
-
-    g_free (state_section);
-}
-void
-gnc_plugin_page_register_set_sort_order (GncPluginPage* plugin_page,
-                                         const gchar* sort_order)
-{
-    GncPluginPageRegisterPrivate* priv;
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
-
-    // save to gcm file
-    gnc_plugin_page_register_set_sort_order_gcm (priv->gsr, sort_order);
-}
-
-static gboolean
-gnc_plugin_page_register_get_sort_reversed_gcm (GNCSplitReg *gsr)
-{
-    GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section;
-    GError* error = NULL;
-    gboolean sort_reversed = FALSE;
-
-    // get the sort_reversed from the .gcm file
-    state_section = gsr_get_register_state_section (gsr);
-    sort_reversed = g_key_file_get_boolean (state_file, state_section,
-                                            KEY_PAGE_SORT_REV, &error);
-
-    if (error)
-        g_clear_error (&error);
-
-    g_free (state_section);
-    return sort_reversed;
-}
-
-static gboolean
-gnc_plugin_page_register_get_sort_reversed (GncPluginPage* plugin_page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    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);
-
-    // load from gcm file
-    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 (GNCSplitReg *gsr,
-                                                gboolean reverse_order)
-{
-    GKeyFile* state_file = gnc_state_get_current();
-    gchar* state_section;
-
-    // save reverse_order to the .gcm file also
-    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))
-            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,
-                                reverse_order);
-
-    g_free (state_section);
-}
-
-void
-gnc_plugin_page_register_set_sort_reversed (GncPluginPage* plugin_page,
-                                            gboolean reverse_order)
-{
-    GncPluginPageRegisterPrivate* priv;
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
-
-    // save to gcm file
-    gnc_plugin_page_register_set_sort_reversed_gcm (priv->gsr, reverse_order);
-}
-
 static gchar*
 gnc_plugin_page_register_get_long_name (GncPluginPage* plugin_page)
 {
@@ -2315,197 +2136,6 @@ gnc_plugin_page_register_get_query (GncPluginPage* plugin_page)
     return gnc_ledger_display_get_query (priv->ledger);
 }
 
-/************************************************************/
-/*                     "Sort By" Dialog                     */
-/************************************************************/
-
-/** This function is called whenever the number source book options is changed
- *  to adjust the displayed labels. Since the book option change may change the
- *  query sort, the gnc_split_reg_sort function is called with force and
- *  refresh to ensure the page is refreshed.
- *
- *  @param new_val A pointer to the boolean for the new value of the book option.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this sort order dialog.
- */
-static void
-gnc_plugin_page_register_sort_book_option_changed (gpointer new_val,
-                                                   gpointer user_data)
-{
-    GncPluginPageRegisterPrivate* priv;
-    auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
-    gboolean* new_data = (gboolean*)new_val;
-
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    if (*new_data)
-    {
-        gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
-                              _ ("Transaction Number"));
-        gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ ("Number/Action"));
-    }
-    else
-    {
-        gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio), _ ("Number"));
-        gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ ("Action"));
-    }
-    gnc_split_reg_sort (priv->gsr, (SortType)priv->gsr->sort_type, force, refresh);
-}
-
-/** This function is called when the "Sort By…" dialog is closed.
- *  If the dialog was closed by any method other than clicking the OK
- *  button, the original sorting order will be restored.
- *
- *  @param dialog A pointer to the dialog box.
- *
- *  @param response A numerical value indicating why the dialog box was closed.
- *
- *  @param page A pointer to the GncPluginPageRegister associated with
- *  this dialog box.
- */
-void
-gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
-                                           gint response,
-                                           GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    GncPluginPage* plugin_page;
-    SortType type;
-    const gchar* order;
-
-    g_return_if_fail (GTK_IS_DIALOG (dialog));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER (" ");
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    plugin_page = GNC_PLUGIN_PAGE (page);
-
-    if (response != GTK_RESPONSE_OK)
-    {
-        /* Restore the original sort order */
-        gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.original_reverse_order,
-                                         no_refresh);
-        priv->sd.reverse_order = priv->sd.original_reverse_order;
-        gnc_split_reg_sort (priv->gsr, priv->sd.original_sort_type, force, refresh);
-        priv->sd.save_order = priv->sd.original_save_order;
-    }
-    else
-    {
-        // clear the sort when unticking the save option
-        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);
-        }
-        priv->sd.original_save_order = priv->sd.save_order;
-
-        if (priv->sd.save_order)
-        {
-            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,
-                               gnc_plugin_page_register_sort_book_option_changed,
-                               page);
-    priv->sd.dialog = NULL;
-    priv->sd.num_radio = NULL;
-    priv->sd.act_radio = NULL;
-    gtk_widget_destroy (GTK_WIDGET (dialog));
-    LEAVE (" ");
-}
-
-
-/** This function is called when a radio button in the "Sort By…"
- *  dialog is clicked.
- *
- *  @param button The button that was toggled.
- *
- *  @param page A pointer to the GncPluginPageRegister associated with
- *  this dialog box.
- */
-void
-gnc_plugin_page_register_sort_button_cb (GtkToggleButton* button,
-                                         GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-    const gchar* name;
-    SortType type;
-
-    g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-    name = gtk_buildable_get_name (GTK_BUILDABLE (button));
-    ENTER ("button %s(%p), page %p", name, button, page);
-    type = SortTypefromString (name);
-    gnc_split_reg_sort (priv->gsr, type, force, refresh);
-    LEAVE (" ");
-}
-
-
-/** This function is called whenever the save sort order is checked
- *  or unchecked which allows saving of the sort order.
- *
- *  @param button The toggle button that was changed.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this sort order dialog.
- */
-void
-gnc_plugin_page_register_sort_order_save_cb (GtkToggleButton* button,
-                                             GncPluginPageRegister* page)
-{
-    GncPluginPageRegisterPrivate* priv;
-
-    g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER ("Save toggle button (%p), plugin_page %p", button, page);
-
-    /* Compute the new save sort order */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-
-    if (gtk_toggle_button_get_active (button))
-        priv->sd.save_order = TRUE;
-    else
-        priv->sd.save_order = FALSE;
-    LEAVE (" ");
-}
-
-/** This function is called whenever the reverse sort order is checked
- *  or unchecked which allows reversing of the sort order.
- *
- *  @param button The toggle button that was changed.
- *
- *  @param page A pointer to the GncPluginPageRegister that is
- *  associated with this sort order dialog.
- */
-void
-gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton* button,
-                                                GncPluginPageRegister* page)
-
-{
-    GncPluginPageRegisterPrivate* priv;
-
-    g_return_if_fail (GTK_IS_CHECK_BUTTON (button));
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
-
-    ENTER ("Reverse toggle button (%p), plugin_page %p", button, page);
-
-    /* Compute the new save sort order */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-
-    priv->sd.reverse_order = gtk_toggle_button_get_active (button);
-    gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, refresh);
-    LEAVE (" ");
-}
-
 /************************************************************/
 /*                    "Filter By" Dialog                    */
 /************************************************************/
@@ -4073,84 +3703,23 @@ gnc_plugin_page_register_cmd_view_sort_by (GSimpleAction *simple,
 {
     auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
     GncPluginPageRegisterPrivate* priv;
-    SplitRegister* reg;
-    GtkWidget* dialog, *button;
-    GtkBuilder* builder;
-    SortType sort;
-    const gchar* name;
-    gchar* title;
 
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(page));
     ENTER ("(action %p, page %p)", simple, page);
 
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
     if (priv->sd.dialog)
     {
         gtk_window_present (GTK_WINDOW (priv->sd.dialog));
-        LEAVE ("existing dialog");
+        LEAVE("existing dialog");
         return;
     }
 
-    /* Create the dialog */
-
-    builder = gtk_builder_new();
-    gnc_builder_add_from_file (builder, "gnc-plugin-page-register.glade",
-                               "sort_by_dialog");
-    dialog = GTK_WIDGET (gtk_builder_get_object (builder, "sort_by_dialog"));
-    priv->sd.dialog = dialog;
-    gtk_window_set_transient_for (GTK_WINDOW (dialog),
-                                  gnc_window_get_gtk_window (GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window)));
-    /* Translators: The %s is the name of the plugin page */
-    title = g_strdup_printf (_ ("Sort %s by…"),
-                             gnc_plugin_page_get_page_name (GNC_PLUGIN_PAGE (page)));
-    gtk_window_set_title (GTK_WINDOW (dialog), title);
-    g_free (title);
-
-    /* Set the button for the current sort order */
-    sort = gnc_split_reg_get_sort_type (priv->gsr);
-    name = SortTypeasString (sort);
-    button = GTK_WIDGET (gtk_builder_get_object (builder, name));
-    DEBUG ("current sort %d, button %s(%p)", sort, name, button);
-    gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-    priv->sd.original_sort_type = sort;
-
-    button = GTK_WIDGET (gtk_builder_get_object (builder, "sort_save"));
-    if (priv->sd.save_order == TRUE)
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-
-    // hide the save button if appropriate
-    gtk_widget_set_visible (GTK_WIDGET (button),
-                            gnc_plugin_page_register_show_fs_save (page));
-
-    /* Set the button for the current reverse_order order */
-    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"));
-    /* Adjust labels related to Num/Action radio buttons based on book option */
-    reg = gnc_ledger_display_get_split_register (priv->ledger);
-    if (reg && !reg->use_tran_num_for_num_field)
-    {
-        gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio),
-                              _ ("Transaction Number"));
-        gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ ("Number/Action"));
-    }
-    gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
-                                 (GncBOCb)gnc_plugin_page_register_sort_book_option_changed,
-                                 page);
-
-    /* Wire it up */
-    gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
-                                      page);
+    SplitRegister* reg = gnc_ledger_display_get_split_register (priv->ledger);
+    gboolean show_save_button = gnc_plugin_page_register_show_fs_save (page);
 
-    /* Show it */
-    gtk_widget_show (dialog);
-    g_object_unref (G_OBJECT (builder));
-    LEAVE (" ");
+    gnc_ppr_sort_dialog (GNC_PLUGIN_PAGE(page), reg,
+                         &priv->sd, show_save_button);
 }
 
 static void
@@ -5437,6 +5006,17 @@ gnc_plugin_page_register_get_gsr (GncPluginPage* plugin_page)
     return priv->gsr;
 }
 
+SortData *
+gnc_plugin_page_register_get_sort_data (GncPluginPage *plugin_page)
+{
+    g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page), NULL);
+
+    GncPluginPageRegister* page = GNC_PLUGIN_PAGE_REGISTER(plugin_page);
+    GncPluginPageRegisterPrivate* priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE(page);
+
+    return &priv->sd;
+}
+
 static void
 gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
                                  GncPluginPageRegister* page)
diff --git a/gnucash/gnome/gnc-plugin-page-register.h b/gnucash/gnome/gnc-plugin-page-register.h
index 3d4b052ab4..2aa2a01195 100644
--- a/gnucash/gnome/gnc-plugin-page-register.h
+++ b/gnucash/gnome/gnc-plugin-page-register.h
@@ -42,6 +42,8 @@
 #include "gnc-plugin-page.h"
 #include "gnc-split-reg.h"
 #include "Query.h"
+#include "gnc-plugin-page-register-sort.h"
+
 
 #ifdef __cplusplus
 extern "C"
@@ -133,6 +135,11 @@ void gnc_plugin_page_register_set_options (GncPluginPage *plugin_page,
  */
 GNCSplitReg * gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page);
 
+/** Get the SortData data structure associated with this register page.
+ *
+ *  @param plugin_page A "register" page.
+ */
+SortData * gnc_plugin_page_register_get_sort_data (GncPluginPage *plugin_page);
 
 /** Get the Query associated with this "register" plugin page.
  *
diff --git a/gnucash/gtkbuilder/gnc-plugin-page-register.glade b/gnucash/gtkbuilder/gnc-plugin-page-register.glade
index 51111d18ce..2d3dfd6ab1 100644
--- a/gnucash/gtkbuilder/gnc-plugin-page-register.glade
+++ b/gnucash/gtkbuilder/gnc-plugin-page-register.glade
@@ -786,7 +786,7 @@ If 0, all previous days included</property>
     <property name="resizable">False</property>
     <property name="window-position">center-on-parent</property>
     <property name="type-hint">dialog</property>
-    <signal name="response" handler="gnc_plugin_page_register_sort_response_cb" swapped="no"/>
+    <signal name="response" handler="gnc_ppr_sort_response_cb" swapped="no"/>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox17">
         <property name="visible">True</property>
@@ -853,7 +853,7 @@ If 0, all previous days included</property>
                 <property name="halign">start</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -883,7 +883,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -902,7 +902,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -921,7 +921,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -940,7 +940,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -959,7 +959,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -978,7 +978,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -997,7 +997,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -1016,7 +1016,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -1035,7 +1035,7 @@ If 0, all previous days included</property>
                 <property name="use-underline">True</property>
                 <property name="draw-indicator">True</property>
                 <property name="group">BY_STANDARD</property>
-                <signal name="toggled" handler="gnc_plugin_page_register_sort_button_cb" swapped="no"/>
+                <signal name="toggled" handler="gnc_ppr_sort_button_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -1069,7 +1069,7 @@ If 0, all previous days included</property>
                     <property name="halign">start</property>
                     <property name="use-underline">True</property>
                     <property name="draw-indicator">True</property>
-                    <signal name="toggled" handler="gnc_plugin_page_register_sort_order_save_cb" swapped="no"/>
+                    <signal name="toggled" handler="gnc_ppr_sort_order_save_cb" swapped="no"/>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -1089,7 +1089,7 @@ If 0, all previous days included</property>
                     <property name="halign">start</property>
                     <property name="use-underline">True</property>
                     <property name="draw-indicator">True</property>
-                    <signal name="toggled" handler="gnc_plugin_page_register_sort_order_reverse_cb" swapped="no"/>
+                    <signal name="toggled" handler="gnc_ppr_sort_order_reverse_cb" swapped="no"/>
                   </object>
                   <packing>
                     <property name="expand">True</property>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index b5970ac329..389fb661fb 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -100,6 +100,7 @@ gnucash/gnome/gnc-plugin-page-budget.cpp
 gnucash/gnome/gnc-plugin-page-invoice.cpp
 gnucash/gnome/gnc-plugin-page-owner-tree.cpp
 gnucash/gnome/gnc-plugin-page-register.cpp
+gnucash/gnome/gnc-plugin-page-register-sort.c
 gnucash/gnome/gnc-plugin-page-report.cpp
 gnucash/gnome/gnc-plugin-page-sx-list.cpp
 gnucash/gnome/gnc-plugin-register.c

commit a6ced0bbad7d30ec2c8d9faeed0d55aa7d926426
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Apr 8 14:39:00 2026 +0100

    Use the added 'Refresh' enum for gnc_split_reg_set_sort_reversed

diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index 29103be77b..c22f92ce27 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -1302,7 +1302,8 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
 
         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, FALSE);
+
+        gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, no_refresh);
         if (priv->sd.reverse_order)
             priv->sd.save_order = TRUE;
 
@@ -2385,7 +2386,7 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
     {
         /* Restore the original sort order */
         gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.original_reverse_order,
-                                         FALSE);
+                                         no_refresh);
         priv->sd.reverse_order = priv->sd.original_reverse_order;
         gnc_split_reg_sort (priv->gsr, priv->sd.original_sort_type, force, refresh);
         priv->sd.save_order = priv->sd.original_save_order;
@@ -2501,7 +2502,7 @@ gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton* button,
     priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
 
     priv->sd.reverse_order = gtk_toggle_button_get_active (button);
-    gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, TRUE);
+    gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.reverse_order, refresh);
     LEAVE (" ");
 }
 
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index 5400b09f91..09af12b4f3 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -2085,7 +2085,7 @@ gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
 }
 
 void
-gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh)
+gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, Refresh ref)
 {
     /* Note: sort_reversed is the boolean opposite of sort_increasing
      *       so when rev == true, we're sorting decreasing
@@ -2100,7 +2100,7 @@ gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh
     qof_query_set_sort_increasing (query, !rev, !rev, !rev);
     gsr->sort_rev = rev;
 
-    if (refresh)
+    if (ref)
         gnc_ledger_display_refresh( gsr->ledger );
 }
 
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index 82fc3cc840..1aa5142d21 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -216,7 +216,7 @@ void gnc_split_reg_sort (GNCSplitReg *gsr, SortType t, ForceSort fs, Refresh ref
  * Set/get sort order of register
  **/
 void gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr,
-                                     gboolean rev, gboolean refresh);
+                                     gboolean rev, Refresh ref);
 
 /**
  * Gets/sets the style of the GNCSplitReg.

commit 1ac614118321b91281d6d6f03c152f15ce8c4ce2
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Apr 8 14:28:21 2026 +0100

    Do not refresh the register pages when quitting
    
    If the page visible is the last page, as they are closed the focus is
    passed to the previous page and results in that register being
    refreshed before that page is closed. If the visible page was the first
    in the list this does not happen.
    
    Retrieve the status of 'window_quitting' from the main window and
    add it as a condition for setting focus and subsequent page refresh.

diff --git a/gnucash/gnome-utils/gnc-main-window.cpp b/gnucash/gnome-utils/gnc-main-window.cpp
index 3cb0c1647d..84d87a4505 100644
--- a/gnucash/gnome-utils/gnc-main-window.cpp
+++ b/gnucash/gnome-utils/gnc-main-window.cpp
@@ -1399,6 +1399,13 @@ gnc_main_window_quit(GncMainWindow *window)
     return FALSE;
 }
 
+gboolean
+gnc_main_window_is_quitting (GncMainWindow *window)
+{
+    g_return_val_if_fail(GNC_IS_MAIN_WINDOW(window), FALSE);
+    return window->window_quitting;
+}
+
 static gboolean
 gnc_main_window_delete_event (GtkWidget *window,
                               GdkEvent *event,
diff --git a/gnucash/gnome-utils/gnc-main-window.h b/gnucash/gnome-utils/gnc-main-window.h
index aec627c8bb..d7e8aa2d7a 100644
--- a/gnucash/gnome-utils/gnc-main-window.h
+++ b/gnucash/gnome-utils/gnc-main-window.h
@@ -443,6 +443,14 @@ void gnc_main_window_restore_all_windows(const GKeyFile *keyfile);
  */
 gboolean gnc_main_window_is_restoring_pages (GncMainWindow *window);
 
+/** Check if the main window is quitting.
+ *
+ *  @param window The main window.
+ *
+ *  @return TRUE if window is quitting
+ */
+gboolean gnc_main_window_is_quitting (GncMainWindow *window);
+
 /** Save the persistent state of all windows.
  *
  *  @param keyfile The GKeyFile to contain persistent window state.
diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index 446a51ca41..29103be77b 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -1191,6 +1191,7 @@ gnc_plugin_page_register_focus (GncPluginPage* plugin_page,
     GncPluginPageRegister* page;
     GncPluginPageRegisterPrivate* priv;
     GNCSplitReg* gsr;
+    gboolean main_window_is_quitting = FALSE;
 
     g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page));
 
@@ -1199,6 +1200,9 @@ gnc_plugin_page_register_focus (GncPluginPage* plugin_page,
 
     gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE (plugin_page));
 
+    if (GNC_IS_MAIN_WINDOW(plugin_page->window))
+        main_window_is_quitting = gnc_main_window_is_quitting (GNC_MAIN_WINDOW(plugin_page->window));
+
     if (on_current_page)
     {
         priv->page_focus = TRUE;
@@ -1213,7 +1217,9 @@ gnc_plugin_page_register_focus (GncPluginPage* plugin_page,
     // set the sheet focus setting
     gnc_split_reg_set_sheet_focus (gsr, priv->page_focus);
 
-    gnc_ledger_display_set_focus (priv->ledger, priv->page_focus);
+    // No need to do a refresh on application closing
+    if (on_current_page && !main_window_is_quitting)
+        gnc_ledger_display_set_focus (priv->ledger, priv->page_focus);
 }
 
 static GtkWidget*

commit 5d538f23d818997c97c58f1be7389a66c89054f0
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Wed Apr 8 14:27:29 2026 +0100

    Bug 799751 - autocomplete crash
    
    With the General Journal saved to show all and sort by 'Date of Entry',
    when restoring the page it was only showing the default number of days
    which is 30. This was down to the query being updated but the register
    was not refreshed, possibly stemming from the change to defer
    refreshing pages that are not visible.
    
    This change stops any page refresh when page is being created or
    restored till when the page is in focus.

diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index baab2e8b1b..446a51ca41 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -1229,7 +1229,6 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
     Account* acct;
     gchar* order;
     int filter_changed = 0;
-    gboolean create_new_page = FALSE;
 
     ENTER ("page %p", plugin_page);
     page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
@@ -1287,8 +1286,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         order = gnc_plugin_page_register_get_sort_order (plugin_page);
 
         PINFO ("Loaded Sort order is %s", order);
-
-        gnc_split_reg_set_sort_type (priv->gsr, SortTypefromString (order));
+        gnc_split_reg_sort (priv->gsr, SortTypefromString (order), no_force, no_refresh);
 
         if (order && (g_strcmp0 (order, DEFAULT_SORT_ORDER) != 0))
             priv->sd.save_order = TRUE;
@@ -1370,8 +1368,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         {
             priv->fd.days = 0;
             priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
-            gnc_split_reg_set_sort_type (priv->gsr,
-                                         SortTypefromString (DEFAULT_SORT_ORDER));
+            gnc_split_reg_sort (priv->gsr, SortTypefromString (DEFAULT_SORT_ORDER), no_force, no_refresh);
             priv->sd.reverse_order = FALSE;
             priv->fd.save_filter = FALSE;
             priv->sd.save_order = FALSE;
@@ -1385,24 +1382,13 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
         priv->fd.end_time = end_time;
     }
 
-    // if enable_refresh is TRUE, default, come from creating
-    // new page instead of restoring
-    if (priv->enable_refresh == TRUE)
-    {
-        create_new_page = TRUE;
-        priv->enable_refresh = FALSE; // disable refresh
-    }
+    priv->enable_refresh = FALSE; // disable refresh
 
     /* Update Query with Filter Status and Dates */
     gnc_ppr_update_status_query (page);
     gnc_ppr_update_date_query (page);
 
-    /* Now do the refresh if this is a new page instead of restore */
-    if (create_new_page)
-    {
-        priv->enable_refresh = TRUE;
-        gnc_ledger_display_refresh (priv->ledger);
-    }
+    priv->enable_refresh = TRUE; // enable refresh
 
     // Set filter tooltip for summary bar
     gnc_plugin_page_register_set_filter_tooltip (page);
@@ -2328,8 +2314,8 @@ gnc_plugin_page_register_get_query (GncPluginPage* plugin_page)
 
 /** This function is called whenever the number source book options is changed
  *  to adjust the displayed labels. Since the book option change may change the
- *  query sort, the gnc_split_reg_set_sort_type_force function is called to
- *  ensure the page is refreshed.
+ *  query sort, the gnc_split_reg_sort function is called with force and
+ *  refresh to ensure the page is refreshed.
  *
  *  @param new_val A pointer to the boolean for the new value of the book option.
  *
@@ -2358,7 +2344,7 @@ gnc_plugin_page_register_sort_book_option_changed (gpointer new_val,
         gtk_button_set_label (GTK_BUTTON (priv->sd.num_radio), _ ("Number"));
         gtk_button_set_label (GTK_BUTTON (priv->sd.act_radio), _ ("Action"));
     }
-    gnc_split_reg_set_sort_type_force (priv->gsr, (SortType)priv->gsr->sort_type, TRUE);
+    gnc_split_reg_sort (priv->gsr, (SortType)priv->gsr->sort_type, force, refresh);
 }
 
 /** This function is called when the "Sort By…" dialog is closed.
@@ -2393,9 +2379,9 @@ gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
     {
         /* Restore the original sort order */
         gnc_split_reg_set_sort_reversed (priv->gsr, priv->sd.original_reverse_order,
-                                         TRUE);
+                                         FALSE);
         priv->sd.reverse_order = priv->sd.original_reverse_order;
-        gnc_split_reg_set_sort_type (priv->gsr, priv->sd.original_sort_type);
+        gnc_split_reg_sort (priv->gsr, priv->sd.original_sort_type, force, refresh);
         priv->sd.save_order = priv->sd.original_save_order;
     }
     else
@@ -2451,7 +2437,7 @@ gnc_plugin_page_register_sort_button_cb (GtkToggleButton* button,
     name = gtk_buildable_get_name (GTK_BUILDABLE (button));
     ENTER ("button %s(%p), page %p", name, button, page);
     type = SortTypefromString (name);
-    gnc_split_reg_set_sort_type (priv->gsr, type);
+    gnc_split_reg_sort (priv->gsr, type, force, refresh);
     LEAVE (" ");
 }
 
diff --git a/gnucash/gnome/gnc-split-reg.c b/gnucash/gnome/gnc-split-reg.c
index c29b17ce55..5400b09f91 100644
--- a/gnucash/gnome/gnc-split-reg.c
+++ b/gnucash/gnome/gnc-split-reg.c
@@ -1938,15 +1938,15 @@ gnc_split_reg_double_line_cb (GtkWidget *w, gpointer data)
     gnc_ledger_display_refresh( gsr->ledger );
 }
 
-static void
-gnc_split_reg_sort_force( GNCSplitReg *gsr, SortType sort_code, gboolean force )
+void
+gnc_split_reg_sort (GNCSplitReg *gsr, SortType sort_code, ForceSort fs, Refresh ref)
 {
     Query *query = gnc_ledger_display_get_query( gsr->ledger );
     gboolean show_present_divider = FALSE;
     GSList *p1 = NULL, *p2 = NULL, *p3 = NULL, *standard;
     SplitRegister *reg;
 
-    if ((gsr->sort_type == sort_code) && !force)
+    if ((gsr->sort_type == sort_code) && !fs)
         return;
 
     standard = g_slist_prepend( NULL, QUERY_DEFAULT_SORT );
@@ -2010,86 +2010,80 @@ gnc_split_reg_sort_force( GNCSplitReg *gsr, SortType sort_code, gboolean force )
     reg = gnc_ledger_display_get_split_register( gsr->ledger );
     gnc_split_register_show_present_divider( reg, show_present_divider );
     gsr->sort_type = sort_code;
-    gnc_ledger_display_refresh( gsr->ledger );
-}
-
-static void
-gnc_split_reg_sort( GNCSplitReg *gsr, SortType sort_code )
-{
-    gnc_split_reg_sort_force( gsr, sort_code, FALSE );
+    if (ref)
+        gnc_ledger_display_refresh( gsr->ledger );
 }
 
 void
 gnc_split_reg_sort_standard_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_STANDARD);
+    gnc_split_reg_sort(gsr, BY_STANDARD, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_date_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_DATE);
+    gnc_split_reg_sort(gsr, BY_DATE, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_date_entered_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_DATE_ENTERED);
+    gnc_split_reg_sort(gsr, BY_DATE_ENTERED, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_date_reconciled_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_DATE_RECONCILED);
+    gnc_split_reg_sort(gsr, BY_DATE_RECONCILED, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_num_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_NUM);
+    gnc_split_reg_sort(gsr, BY_NUM, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_amount_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_AMOUNT);
+    gnc_split_reg_sort(gsr, BY_AMOUNT, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_memo_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_MEMO);
+    gnc_split_reg_sort(gsr, BY_MEMO, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_desc_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_DESC);
+    gnc_split_reg_sort(gsr, BY_DESC, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_action_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_ACTION);
+    gnc_split_reg_sort(gsr, BY_ACTION, no_force, refresh);
 }
 
 void
 gnc_split_reg_sort_notes_cb(GtkWidget *w, gpointer data)
 {
     GNCSplitReg *gsr = data;
-    gnc_split_reg_sort(gsr, BY_NOTES);
+    gnc_split_reg_sort(gsr, BY_NOTES, no_force, refresh);
 }
 
-
 void
 gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr, gboolean rev, gboolean refresh)
 {
@@ -2556,19 +2550,6 @@ gnc_split_reg_get_sort_type( GNCSplitReg *gsr )
     return gsr->sort_type;
 }
 
-void
-gnc_split_reg_set_sort_type( GNCSplitReg *gsr, SortType t )
-{
-    gnc_split_reg_sort( gsr, t );
-}
-
-void
-gnc_split_reg_set_sort_type_force( GNCSplitReg *gsr, SortType t, gboolean force )
-{
-    gnc_split_reg_sort_force( gsr, t, force );
-}
-
-
 GtkWidget*
 gnc_split_reg_get_summarybar( GNCSplitReg *gsr )
 {
diff --git a/gnucash/gnome/gnc-split-reg.h b/gnucash/gnome/gnc-split-reg.h
index 2e4476acf1..82fc3cc840 100644
--- a/gnucash/gnome/gnc-split-reg.h
+++ b/gnucash/gnome/gnc-split-reg.h
@@ -49,6 +49,9 @@ extern "C"
 typedef struct _GNCSplitReg GNCSplitReg;
 typedef struct _GNCSplitRegClass GNCSplitRegClass;
 
+typedef enum { no_force, force } ForceSort;
+typedef enum { no_refresh, refresh } Refresh;
+
 struct _GNCSplitReg
 {
     /* The "parent" widget. */
@@ -207,8 +210,7 @@ GtkWidget *gsr_create_summary_bar( GNCSplitReg *gsr );
  * query to be redone even if SortType has not changed.
  **/
 SortType gnc_split_reg_get_sort_type( GNCSplitReg *gsr );
-void gnc_split_reg_set_sort_type( GNCSplitReg *gsr, SortType t );
-void gnc_split_reg_set_sort_type_force( GNCSplitReg *gsr, SortType t, gboolean force);
+void gnc_split_reg_sort (GNCSplitReg *gsr, SortType t, ForceSort fs, Refresh ref);
 
 /**
  * Set/get sort order of register
@@ -216,7 +218,6 @@ void gnc_split_reg_set_sort_type_force( GNCSplitReg *gsr, SortType t, gboolean f
 void gnc_split_reg_set_sort_reversed(GNCSplitReg *gsr,
                                      gboolean rev, gboolean refresh);
 
-
 /**
  * Gets/sets the style of the GNCSplitReg.
  **/

commit 1fc2b550d60e0534f93e1516200fa3910a52fc90
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Apr 5 13:32:13 2026 +0100

    Be consistent in naming GncPluginPage and GncPluginPageRegister

diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index 88677b9d8d..baab2e8b1b 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -124,9 +124,9 @@ static void gnc_plugin_page_register_save_page (GncPluginPage* plugin_page,
 static GncPluginPage* gnc_plugin_page_register_recreate_page (GtkWidget* window,
                                                               GKeyFile* file,
                                                               const gchar* group);
-static void gnc_plugin_page_register_update_edit_menu (GncPluginPage* page,
+static void gnc_plugin_page_register_update_edit_menu (GncPluginPage* plugin_page,
                                                        gboolean hide);
-static gboolean gnc_plugin_page_register_finish_pending (GncPluginPage* page);
+static gboolean gnc_plugin_page_register_finish_pending (GncPluginPage* plugin_page);
 
 static gchar* gnc_plugin_page_register_get_tab_name (GncPluginPage*
                                                      plugin_page);
@@ -146,7 +146,7 @@ void gnc_plugin_page_register_sort_button_cb (GtkToggleButton* button,
                                               GncPluginPageRegister* page);
 void gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
                                                 gint response,
-                                                GncPluginPageRegister* plugin_page);
+                                                GncPluginPageRegister* page);
 void gnc_plugin_page_register_sort_order_save_cb (GtkToggleButton* button,
                                                   GncPluginPageRegister* page);
 void gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton* button,
@@ -171,11 +171,11 @@ void gnc_plugin_page_register_filter_end_cb (GtkWidget* radio,
                                              GncPluginPageRegister* page);
 void gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
                                                   gint response,
-                                                  GncPluginPageRegister* plugin_page);
+                                                  GncPluginPageRegister* page);
 void gnc_plugin_page_register_filter_status_select_all_cb (GtkButton* button,
-                                                           GncPluginPageRegister* plugin_page);
+                                                           GncPluginPageRegister* page);
 void gnc_plugin_page_register_filter_status_clear_all_cb (GtkButton* button,
-                                                          GncPluginPageRegister* plugin_page);
+                                                          GncPluginPageRegister* page);
 void gnc_plugin_page_register_filter_status_one_cb (GtkToggleButton* button,
                                                     GncPluginPageRegister* page);
 void gnc_plugin_page_register_filter_save_cb (GtkToggleButton* button,
@@ -242,9 +242,9 @@ static void gnc_plugin_page_register_cmd_linked_transaction_open (GSimpleAction
 static void gnc_plugin_page_register_cmd_jump_linked_invoice (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
 
 static void gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
-                                             GncPluginPageRegister* register_page);
+                                             GncPluginPageRegister* page);
 static void gnc_plugin_page_popup_menu_cb (GNCSplitReg* gsr,
-                                           GncPluginPageRegister* register_page);
+                                           GncPluginPageRegister* page);
 static void gnc_plugin_page_register_refresh_cb (GHashTable* changes,
                                                  gpointer user_data);
 static void gnc_plugin_page_register_close_cb (gpointer user_data);
@@ -499,7 +499,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (GncPluginPageRegister, gnc_plugin_page_register,
 static GncPluginPage*
 gnc_plugin_page_register_new_common (GNCLedgerDisplay* ledger)
 {
-    GncPluginPageRegister* register_page;
+    GncPluginPageRegister* page;
     GncPluginPageRegisterPrivate* priv;
     GncPluginPage* plugin_page;
     GNCSplitReg* gsr;
@@ -524,19 +524,19 @@ gnc_plugin_page_register_new_common (GNCLedgerDisplay* ledger)
         item = gnc_gobject_tracking_get_list (GNC_PLUGIN_PAGE_REGISTER_NAME);
         for (; item; item = g_list_next (item))
         {
-            register_page = (GncPluginPageRegister*)item->data;
-            priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
+            page = (GncPluginPageRegister*)item->data;
+            priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
             if (priv->gsr == gsr)
-                return GNC_PLUGIN_PAGE (register_page);
+                return GNC_PLUGIN_PAGE (page);
         }
     }
 
-    register_page = GNC_PLUGIN_PAGE_REGISTER(g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, nullptr));
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
+    page = GNC_PLUGIN_PAGE_REGISTER(g_object_new (GNC_TYPE_PLUGIN_PAGE_REGISTER, nullptr));
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
     priv->ledger = ledger;
     priv->key = *guid_null();
 
-    plugin_page = GNC_PLUGIN_PAGE (register_page);
+    plugin_page = GNC_PLUGIN_PAGE (page);
     label = gnc_plugin_page_register_get_tab_name (plugin_page);
     gnc_plugin_page_set_page_name (plugin_page, label);
     g_free (label);
@@ -572,7 +572,7 @@ GncPluginPage*
 gnc_plugin_page_register_new (Account* account, gboolean subaccounts)
 {
     GNCLedgerDisplay* ledger;
-    GncPluginPage* page;
+    GncPluginPage* plugin_page;
     GncPluginPageRegisterPrivate* priv;
     gnc_commodity* com0;
     gnc_commodity* com1;
@@ -590,12 +590,12 @@ gnc_plugin_page_register_new (Account* account, gboolean subaccounts)
     else
         ledger = gnc_ledger_display_simple (account);
 
-    page = gnc_plugin_page_register_new_common (ledger);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
+    plugin_page = gnc_plugin_page_register_new_common (ledger);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
     priv->key = *xaccAccountGetGUID (account);
 
-    LEAVE ("%p", page);
-    return page;
+    LEAVE ("%p", plugin_page);
+    return plugin_page;
 }
 
 GncPluginPage*
@@ -637,31 +637,32 @@ gnc_plugin_page_register_class_init (GncPluginPageRegisterClass* klass)
 }
 
 static void
-gnc_plugin_page_register_init (GncPluginPageRegister* plugin_page)
+gnc_plugin_page_register_init (GncPluginPageRegister* page)
 {
     GncPluginPageRegisterPrivate* priv;
-    GncPluginPage* parent;
+    GncPluginPage* plugin_page;
     GSimpleActionGroup *simple_action_group;
     gboolean use_new;
 
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
 
     /* Init parent declared variables */
-    parent = GNC_PLUGIN_PAGE (plugin_page);
+    plugin_page = GNC_PLUGIN_PAGE (page);
     use_new = gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL_REGISTER,
                                   GNC_PREF_USE_NEW);
-    g_object_set (G_OBJECT (plugin_page),
+    g_object_set (G_OBJECT (page),
                   "page-name",      _ ("General Journal"),
                   "ui-description", "gnc-plugin-page-register.ui",
                   "use-new-window", use_new,
                   NULL);
 
     /* Create menu and toolbar information */
-    simple_action_group = gnc_plugin_page_create_action_group (parent, "GncPluginPageRegisterActions");
+    simple_action_group = gnc_plugin_page_create_action_group (plugin_page,
+                                                               "GncPluginPageRegisterActions");
     g_action_map_add_action_entries (G_ACTION_MAP(simple_action_group),
                                      gnc_plugin_page_register_actions,
                                      gnc_plugin_page_register_n_actions,
-                                     plugin_page);
+                                     page);
 
     priv->lines_default     = DEFAULT_LINES_AMOUNT;
     priv->read_only         = FALSE;
@@ -715,24 +716,24 @@ gnc_plugin_page_register_get_current_txn (GncPluginPageRegister* page)
  * the current page, set focus on the sheet.
  */
 static gboolean
-gnc_plugin_page_register_focus_widget (GncPluginPage* register_plugin_page)
+gnc_plugin_page_register_focus_widget (GncPluginPage* plugin_page)
 {
-    if (GNC_IS_PLUGIN_PAGE_REGISTER (register_plugin_page))
+    if (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page))
     {
-        GncWindow* gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(register_plugin_page)->window);
-        GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(register_plugin_page));
+        GncWindow* gnc_window = GNC_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window);
+        GNCSplitReg *gsr = gnc_plugin_page_register_get_gsr (GNC_PLUGIN_PAGE(plugin_page));
 
-        if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(register_plugin_page)->window))
+        if (GNC_IS_MAIN_WINDOW(GNC_PLUGIN_PAGE(plugin_page)->window))
         {
             /* Enable the Transaction menu */
-            GAction *action = gnc_main_window_find_action (GNC_MAIN_WINDOW(register_plugin_page->window), "TransactionAction");
+            GAction *action = gnc_main_window_find_action (GNC_MAIN_WINDOW(plugin_page->window), "TransactionAction");
             g_simple_action_set_enabled (G_SIMPLE_ACTION(action), TRUE);
             /* Disable the Schedule menu */
-            action = gnc_main_window_find_action (GNC_MAIN_WINDOW(register_plugin_page->window), "ScheduledAction");
+            action = gnc_main_window_find_action (GNC_MAIN_WINDOW(plugin_page->window), "ScheduledAction");
             g_simple_action_set_enabled (G_SIMPLE_ACTION(action), FALSE);
 
-            gnc_main_window_update_menu_and_toolbar (GNC_MAIN_WINDOW(register_plugin_page->window),
-                                                     register_plugin_page,
+            gnc_main_window_update_menu_and_toolbar (GNC_MAIN_WINDOW(plugin_page->window),
+                                                     plugin_page,
                                                      gnc_plugin_load_ui_items);
         }
         else
@@ -750,7 +751,7 @@ gnc_plugin_page_register_focus_widget (GncPluginPage* register_plugin_page)
         // setup any short toolbar names
         gnc_plugin_init_short_names (gnc_window_get_toolbar (gnc_window), toolbar_labels);
 
-        gnc_plugin_page_register_ui_update (NULL, GNC_PLUGIN_PAGE_REGISTER(register_plugin_page));
+        gnc_plugin_page_register_ui_update (NULL, GNC_PLUGIN_PAGE_REGISTER(plugin_page));
 
         gnc_split_reg_focus_on_sheet (gsr);
     }
@@ -1634,14 +1635,14 @@ gnc_plugin_page_register_save_page (GncPluginPage* plugin_page,
  *  mode.  It should eventually restore the "filter by" and "sort by
  *  settings.
  *
- *  @param page The register being restored.
+ *  @param plugin_page The register being restored.
  *
  *  @param key_file A pointer to the GKeyFile data structure where the
  *  page information should be read.
  *
  *  @param group_name The group name to use when restoring data. */
 static void
-gnc_plugin_page_register_restore_edit_menu (GncPluginPage* page,
+gnc_plugin_page_register_restore_edit_menu (GncPluginPage* plugin_page,
                                             GKeyFile* key_file,
                                             const gchar* group_name)
 {
@@ -1671,7 +1672,7 @@ gnc_plugin_page_register_restore_edit_menu (GncPluginPage* page,
     if (i <= REG_STYLE_JOURNAL)
     {
         DEBUG ("Setting style: %d", i);
-        action = gnc_plugin_page_get_action (page, "ViewStyleRadioAction");
+        action = gnc_plugin_page_get_action (plugin_page, "ViewStyleRadioAction");
         g_action_activate (G_ACTION(action), g_variant_new_int32 (i));
     }
 
@@ -1679,7 +1680,7 @@ gnc_plugin_page_register_restore_edit_menu (GncPluginPage* page,
     use_double_line = g_key_file_get_boolean (key_file, group_name,
                                               KEY_DOUBLE_LINE, &error);
     DEBUG ("Setting double_line_mode: %d", use_double_line);
-    action = gnc_plugin_page_get_action (page, "ViewStyleDoubleLineAction");
+    action = gnc_plugin_page_get_action (plugin_page, "ViewStyleDoubleLineAction");
 
     state = g_action_get_state (G_ACTION(action));
 
@@ -1707,7 +1708,7 @@ gnc_plugin_page_register_recreate_page (GtkWidget* window,
                                         const gchar* group_name)
 {
     GncPluginPageRegisterPrivate* priv;
-    GncPluginPage* page;
+    GncPluginPage* plugin_page;
     GError* error = NULL;
     gchar* reg_type, *acct_guid;
     GncGUID guid;
@@ -1755,11 +1756,11 @@ gnc_plugin_page_register_recreate_page (GtkWidget* window,
             g_free (reg_type);
             return NULL;
         }
-        page = gnc_plugin_page_register_new (account, include_subs);
+        plugin_page = gnc_plugin_page_register_new (account, include_subs);
     }
     else if (g_ascii_strcasecmp (reg_type, LABEL_GL) == 0)
     {
-        page = gnc_plugin_page_register_new_gl();
+        plugin_page = gnc_plugin_page_register_new_gl();
     }
     else
     {
@@ -1771,22 +1772,22 @@ gnc_plugin_page_register_recreate_page (GtkWidget* window,
 
     /* disable the refresh of the display ledger, this is for
      * sort/filter updates and double line/style changes */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
     priv->enable_refresh = FALSE;
 
     /* Recreate page in given window */
-    gnc_plugin_page_set_use_new_window (page, FALSE);
+    gnc_plugin_page_set_use_new_window (plugin_page, FALSE);
 
     /* Install it now so we can them manipulate the created widget */
-    gnc_main_window_open_page (GNC_MAIN_WINDOW (window), page);
+    gnc_main_window_open_page (GNC_MAIN_WINDOW (window), plugin_page);
 
     /* Now update the page to the last state it was in */
-    gnc_plugin_page_register_restore_edit_menu (page, key_file, group_name);
+    gnc_plugin_page_register_restore_edit_menu (plugin_page, key_file, group_name);
 
     /* enable the refresh */
     priv->enable_refresh = TRUE;
     LEAVE (" ");
-    return page;
+    return plugin_page;
 }
 
 
@@ -1794,28 +1795,28 @@ gnc_plugin_page_register_recreate_page (GtkWidget* window,
  * Based on code from Epiphany (src/ephy-window.c)
  */
 static void
-gnc_plugin_page_register_update_edit_menu (GncPluginPage* page, gboolean hide)
+gnc_plugin_page_register_update_edit_menu (GncPluginPage* plugin_page, gboolean hide)
 {
     GncPluginPageRegisterPrivate* priv;
-    GncPluginPageRegister* reg_page;
+    GncPluginPageRegister* page;
     GAction* action;
     gboolean can_copy = FALSE, can_cut = FALSE, can_paste = FALSE;
     gboolean has_selection;
     gboolean is_readwrite = !qof_book_is_readonly (gnc_get_current_book());
 
-    reg_page = GNC_PLUGIN_PAGE_REGISTER (page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (reg_page);
+    page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
     has_selection = gnucash_register_has_selection (priv->gsr->reg);
 
     can_copy = has_selection;
     can_cut = is_readwrite && has_selection;
     can_paste = is_readwrite;
 
-    action = gnc_plugin_page_get_action (page, "EditCopyAction");
+    action = gnc_plugin_page_get_action (plugin_page, "EditCopyAction");
     g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_copy);
-    action = gnc_plugin_page_get_action (page, "EditCutAction");
+    action = gnc_plugin_page_get_action (plugin_page, "EditCutAction");
     g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_cut);
-    action = gnc_plugin_page_get_action (page, "EditPasteAction");
+    action = gnc_plugin_page_get_action (plugin_page, "EditPasteAction");
     g_simple_action_set_enabled (G_SIMPLE_ACTION(action), can_paste);
 }
 
@@ -1826,13 +1827,13 @@ static const char*
 check_repair_abort_YN = N_("'Check & Repair' is currently running, do you want to abort it?");
 
 static gboolean
-finish_scrub (GncPluginPage* page)
+finish_scrub (GncPluginPage* plugin_page)
 {
     gboolean ret = FALSE;
 
     if (is_scrubbing)
     {
-        ret = gnc_verify_dialog (GTK_WINDOW(gnc_plugin_page_get_window (GNC_PLUGIN_PAGE(page))),
+        ret = gnc_verify_dialog (GTK_WINDOW(gnc_plugin_page_get_window (GNC_PLUGIN_PAGE(plugin_page))),
                                  false, "%s", _(check_repair_abort_YN));
 
         show_abort_verify = FALSE;
@@ -1844,10 +1845,10 @@ finish_scrub (GncPluginPage* page)
 }
 
 static gboolean
-gnc_plugin_page_register_finish_pending (GncPluginPage* page)
+gnc_plugin_page_register_finish_pending (GncPluginPage* plugin_page)
 {
     GncPluginPageRegisterPrivate* priv;
-    GncPluginPageRegister* reg_page;
+    GncPluginPageRegister* page;
     SplitRegister* reg;
     GtkWidget* dialog, *window;
     gchar* name;
@@ -1855,19 +1856,19 @@ gnc_plugin_page_register_finish_pending (GncPluginPage* page)
 
     if (is_scrubbing && show_abort_verify)
     {
-        if (!finish_scrub (page))
+        if (!finish_scrub (plugin_page))
             return FALSE;
     }
 
-    reg_page = GNC_PLUGIN_PAGE_REGISTER (page);
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (reg_page);
+    page = GNC_PLUGIN_PAGE_REGISTER (plugin_page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
     reg = gnc_ledger_display_get_split_register (priv->ledger);
 
     if (!reg || !gnc_split_register_changed (reg))
         return TRUE;
 
-    name = gnc_plugin_page_register_get_tab_name (page);
-    window = gnc_plugin_page_get_window (page);
+    name = gnc_plugin_page_register_get_tab_name (plugin_page);
+    window = gnc_plugin_page_get_window (plugin_page);
     dialog = gtk_message_dialog_new (GTK_WINDOW (window),
                                      GTK_DIALOG_DESTROY_WITH_PARENT,
                                      GTK_MESSAGE_WARNING,
@@ -5027,7 +5028,7 @@ gnc_plugin_page_register_cmd_jump (GSimpleAction *simple,
 {
     auto page = GNC_PLUGIN_PAGE_REGISTER(user_data);
     GncPluginPageRegisterPrivate* priv;
-    GncPluginPage* new_page;
+    GncPluginPage* new_plugin_page;
     GtkWidget* window;
     GNCSplitReg* gsr;
     SplitRegister* reg;
@@ -5148,15 +5149,15 @@ gnc_plugin_page_register_cmd_jump (GSimpleAction *simple,
         }
     }
 
-    new_page = gnc_plugin_page_register_new (account, FALSE);
-    if (new_page == NULL)
+    new_plugin_page = gnc_plugin_page_register_new (account, FALSE);
+    if (new_plugin_page == NULL)
     {
         LEAVE ("couldn't create new page");
         return;
     }
 
-    gnc_main_window_open_page (GNC_MAIN_WINDOW (window), new_page);
-    gsr = gnc_plugin_page_register_get_gsr (new_page);
+    gnc_main_window_open_page (GNC_MAIN_WINDOW (window), new_plugin_page);
+    gsr = gnc_plugin_page_register_get_gsr (new_plugin_page);
 
     SplitRegister *new_page_reg = gnc_ledger_display_get_split_register (gsr->ledger);
     gboolean jump_twice = FALSE;
@@ -5170,7 +5171,7 @@ gnc_plugin_page_register_cmd_jump (GSimpleAction *simple,
 
     /* Test for visibility of split */
     if (gnc_split_reg_clear_filter_for_split (gsr, split))
-        gnc_plugin_page_register_clear_current_filter (GNC_PLUGIN_PAGE(new_page));
+        gnc_plugin_page_register_clear_current_filter (GNC_PLUGIN_PAGE(new_plugin_page));
 
     gnc_split_reg_jump_to_split (gsr, split);
 
@@ -5445,16 +5446,16 @@ gnc_plugin_page_register_get_gsr (GncPluginPage* plugin_page)
 
 static void
 gnc_plugin_page_help_changed_cb (GNCSplitReg* gsr,
-                                 GncPluginPageRegister* register_page)
+                                 GncPluginPageRegister* page)
 {
     GncPluginPageRegisterPrivate* priv;
     SplitRegister* reg;
     GncWindow* window;
     char* help;
 
-    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (register_page));
+    g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
 
-    window = GNC_WINDOW (GNC_PLUGIN_PAGE (register_page)->window);
+    window = GNC_WINDOW (GNC_PLUGIN_PAGE (page)->window);
     if (!window)
     {
         // This routine can be called before the page is added to a
@@ -5464,14 +5465,14 @@ 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
-       (GNC_MAIN_WINDOW(window)) != GNC_PLUGIN_PAGE(register_page)))
+       (GNC_MAIN_WINDOW(window)) != GNC_PLUGIN_PAGE(page)))
        return;
 
     /* Get the text from the ledger */
-    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (register_page);
+    priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
     reg = gnc_ledger_display_get_split_register (priv->ledger);
     help = gnc_table_get_help (reg->table);
-    gnc_window_set_status (window, GNC_PLUGIN_PAGE (register_page), help);
+    gnc_window_set_status (window, GNC_PLUGIN_PAGE (page), help);
     g_free (help);
 }
 
@@ -5610,7 +5611,7 @@ gnc_plugin_page_register_event_handler (QofInstance* entity,
 {
     Transaction* trans;
     QofBook* book;
-    GncPluginPage* visible_page;
+    GncPluginPage* visable_plugin_page;
     GtkWidget* window;
 
     g_return_if_fail (page); /* Required */
@@ -5668,8 +5669,8 @@ gnc_plugin_page_register_event_handler (QofInstance* entity,
 
     if (GNC_IS_MAIN_WINDOW (window))
     {
-        visible_page = gnc_main_window_get_current_page (GNC_MAIN_WINDOW (window));
-        if (visible_page != GNC_PLUGIN_PAGE (page))
+        visable_plugin_page = gnc_main_window_get_current_page (GNC_MAIN_WINDOW (window));
+        if (visable_plugin_page != GNC_PLUGIN_PAGE (page))
         {
             LEAVE ("page not visible");
             return;

commit 1d913a8eea603c4aee379c304eadfebea23a442a
Author: Robert Fewell <14uBobIT at gmail.com>
Date:   Sun Apr 5 13:31:19 2026 +0100

    Minor realignment of register source files

diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp
index 494173e77a..88677b9d8d 100644
--- a/gnucash/gnome/gnc-plugin-page-register.cpp
+++ b/gnucash/gnome/gnc-plugin-page-register.cpp
@@ -109,8 +109,8 @@ static void gnc_plugin_page_register_finalize (GObject* object);
 
 /* static Account *gnc_plugin_page_register_get_current_account (GncPluginPageRegister *page); */
 
-static GtkWidget* gnc_plugin_page_register_create_widget (
-    GncPluginPage* plugin_page);
+static GtkWidget* gnc_plugin_page_register_create_widget (GncPluginPage*
+                                                          plugin_page);
 static void gnc_plugin_page_register_destroy_widget (GncPluginPage*
                                                      plugin_page);
 static void gnc_plugin_page_register_window_changed (GncPluginPage*
@@ -121,8 +121,9 @@ static void gnc_plugin_page_register_focus (GncPluginPage* plugin_page,
                                             gboolean current_page);
 static void gnc_plugin_page_register_save_page (GncPluginPage* plugin_page,
                                                 GKeyFile* file, const gchar* group);
-static GncPluginPage* gnc_plugin_page_register_recreate_page (
-    GtkWidget* window, GKeyFile* file, const gchar* group);
+static GncPluginPage* gnc_plugin_page_register_recreate_page (GtkWidget* window,
+                                                              GKeyFile* file,
+                                                              const gchar* group);
 static void gnc_plugin_page_register_update_edit_menu (GncPluginPage* page,
                                                        gboolean hide);
 static gboolean gnc_plugin_page_register_finish_pending (GncPluginPage* page);
@@ -134,8 +135,9 @@ static gchar* gnc_plugin_page_register_get_tab_color (GncPluginPage*
 static gchar* gnc_plugin_page_register_get_long_name (GncPluginPage*
                                                       plugin_page);
 
-static void gnc_plugin_page_register_summarybar_position_changed (
-    gpointer prefs, gchar* pref, gpointer user_data);
+static void gnc_plugin_page_register_summarybar_position_changed (gpointer prefs,
+                                                                  gchar* pref,
+                                                                  gpointer user_data);
 
 extern "C"
 {
@@ -143,19 +145,18 @@ extern "C"
 void gnc_plugin_page_register_sort_button_cb (GtkToggleButton* button,
                                               GncPluginPageRegister* page);
 void gnc_plugin_page_register_sort_response_cb (GtkDialog* dialog,
-                                                gint response, GncPluginPageRegister* plugin_page);
+                                                gint response,
+                                                GncPluginPageRegister* plugin_page);
 void gnc_plugin_page_register_sort_order_save_cb (GtkToggleButton* button,
                                                   GncPluginPageRegister* page);
 void gnc_plugin_page_register_sort_order_reverse_cb (GtkToggleButton* button,
                                                      GncPluginPageRegister* page);
 }
 
-static gchar* gnc_plugin_page_register_get_sort_order (GncPluginPage*
-                                                       plugin_page);
+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);
+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);
 
@@ -169,7 +170,8 @@ void gnc_plugin_page_register_filter_start_cb (GtkWidget* radio,
 void gnc_plugin_page_register_filter_end_cb (GtkWidget* radio,
                                              GncPluginPageRegister* page);
 void gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
-                                                  gint response, GncPluginPageRegister* plugin_page);
+                                                  gint response,
+                                                  GncPluginPageRegister* plugin_page);
 void gnc_plugin_page_register_filter_status_select_all_cb (GtkButton* button,
                                                            GncPluginPageRegister* plugin_page);
 void gnc_plugin_page_register_filter_status_clear_all_cb (GtkButton* button,
@@ -627,8 +629,7 @@ gnc_plugin_page_register_class_init (GncPluginPageRegisterClass* klass)
     gnc_plugin_class->focus_page      = gnc_plugin_page_register_focus;
     gnc_plugin_class->save_page       = gnc_plugin_page_register_save_page;
     gnc_plugin_class->recreate_page   = gnc_plugin_page_register_recreate_page;
-    gnc_plugin_class->update_edit_menu_actions =
-        gnc_plugin_page_register_update_edit_menu;
+    gnc_plugin_class->update_edit_menu_actions = gnc_plugin_page_register_update_edit_menu;
     gnc_plugin_class->finish_pending  = gnc_plugin_page_register_finish_pending;
     gnc_plugin_class->focus_page_function = gnc_plugin_page_register_focus_widget;
 
@@ -4659,7 +4660,8 @@ gnc_plugin_page_register_cmd_linked_transaction_open (GSimpleAction *simple,
     LEAVE (" ");
 }
 
-static GncInvoice* invoice_from_split (Split* split)
+static GncInvoice*
+invoice_from_split (Split* split)
 {
     GncInvoice* invoice;
     GNCLot* lot;
@@ -4777,7 +4779,7 @@ static bool
 find_after_date (Split *split, time64* find_date)
 {
     auto trans = xaccSplitGetParent (split);
-    return !(xaccSplitGetAccount (split) != nullptr && 
+    return !(xaccSplitGetAccount (split) != nullptr &&
              xaccTransGetDate (trans) >= *find_date &&
              xaccTransCountSplits (trans) != 1);
 }
@@ -5625,7 +5627,7 @@ gnc_plugin_page_register_event_handler (QofInstance* entity,
         if (GNC_IS_MAIN_WINDOW (window))
         {
             GncPluginPageRegisterPrivate *priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
-            
+
             if (!gnc_ledger_display_leader (priv->ledger))
             {
                 LEAVE ("account is NULL");
diff --git a/gnucash/gnome/gnc-plugin-page-register.h b/gnucash/gnome/gnc-plugin-page-register.h
index 4acf67023f..3d4b052ab4 100644
--- a/gnucash/gnome/gnc-plugin-page-register.h
+++ b/gnucash/gnome/gnc-plugin-page-register.h
@@ -90,8 +90,7 @@ GType gnc_plugin_page_register_get_type (void);
  *
  *  @return The newly created plugin page.
  */
-GncPluginPage *
-gnc_plugin_page_register_new (Account *account, gboolean subaccounts);
+GncPluginPage * gnc_plugin_page_register_new (Account *account, gboolean subaccounts);
 
 
 /** Create a new "register" plugin page, given a pointer to an already
@@ -104,16 +103,14 @@ gnc_plugin_page_register_new (Account *account, gboolean subaccounts);
  *
  *  @return The newly created plugin page.
  */
-GncPluginPage *
-gnc_plugin_page_register_new_ledger (GNCLedgerDisplay *ledger);
+GncPluginPage * gnc_plugin_page_register_new_ledger (GNCLedgerDisplay *ledger);
 
 
 /** Create a new "register" plugin page containing a general journal.
  *
  *  @return The newly created plugin page.
  */
-GncPluginPage *
-gnc_plugin_page_register_new_gl (void);
+GncPluginPage * gnc_plugin_page_register_new_gl (void);
 
 
 /** Set various register options on a newly created "register" plugin page.
@@ -125,18 +122,16 @@ gnc_plugin_page_register_new_gl (void);
  *
  *  @param read_only True if the register should be read-only.
  */
-void
-gnc_plugin_page_register_set_options (GncPluginPage *plugin_page,
-                                      gint lines_default,
-                                      gboolean read_only);
+void gnc_plugin_page_register_set_options (GncPluginPage *plugin_page,
+                                           gint lines_default,
+                                           gboolean read_only);
 
 
 /** Get the GNCSplitReg data structure associated with this register page.
  *
  *  @param plugin_page A "register" page.
  */
-GNCSplitReg *
-gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page);
+GNCSplitReg * gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page);
 
 
 /** Get the Query associated with this "register" plugin page.
@@ -145,8 +140,8 @@ gnc_plugin_page_register_get_gsr (GncPluginPage *plugin_page);
  *
  *  @return The query.
  */
-Query *
-gnc_plugin_page_register_get_query (GncPluginPage *plugin_page);
+Query * gnc_plugin_page_register_get_query (GncPluginPage *plugin_page);
+
 
 /** Get the Account associated with this register page.
  *
@@ -155,8 +150,8 @@ gnc_plugin_page_register_get_query (GncPluginPage *plugin_page);
  *  @return The account if the register contains only a single
  *  account, or an account and its sub-accounts.  NULL otherwise.
  */
-Account *
-gnc_plugin_page_register_get_account (GncPluginPageRegister *page);
+Account * gnc_plugin_page_register_get_account (GncPluginPageRegister *page);
+
 
 /** Get the currently selected transaction in this register page.
  *
@@ -165,17 +160,16 @@ gnc_plugin_page_register_get_account (GncPluginPageRegister *page);
  *  @return The currently active transaction or NULL if there currently
  *  is no currently selected.
  */
-Transaction *
-gnc_plugin_page_register_get_current_txn (GncPluginPageRegister *page);
+Transaction * gnc_plugin_page_register_get_current_txn (GncPluginPageRegister *page);
+
 
 /** This function clears the registers current filter.
- *  It is used so jumps to splits from other places can be completed 
+ *  It is used so jumps to splits from other places can be completed
  *  otherwise the jump will be to the last active cell.
  *
  *  @param plugin_page A pointer to the GncPluginPageRegister.
  */
-void
-gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page);
+void gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page);
 
 
 G_END_DECLS



Summary of changes:
 gnucash/gnome-utils/gnc-main-window.cpp            |    7 +
 gnucash/gnome-utils/gnc-main-window.h              |    8 +
 gnucash/gnome/CMakeLists.txt                       |    4 +
 gnucash/gnome/gnc-plugin-page-register-filter.cpp  | 1313 ++++++++++++
 .../gnome/gnc-plugin-page-register-filter.hpp      |   70 +-
 gnucash/gnome/gnc-plugin-page-register-sort.cpp    |  546 +++++
 .../gnc-plugin-page-register-sort.hpp}             |   88 +-
 gnucash/gnome/gnc-plugin-page-register.cpp         | 2163 +++-----------------
 gnucash/gnome/gnc-plugin-page-register.h           |   73 +-
 gnucash/gnome/gnc-split-reg.c                      |   53 +-
 gnucash/gnome/gnc-split-reg.h                      |    9 +-
 gnucash/gtkbuilder/gnc-plugin-page-register.glade  |   62 +-
 po/POTFILES.in                                     |    2 +
 13 files changed, 2323 insertions(+), 2075 deletions(-)
 create mode 100644 gnucash/gnome/gnc-plugin-page-register-filter.cpp
 copy libgnucash/engine/Account.hpp => gnucash/gnome/gnc-plugin-page-register-filter.hpp (53%)
 create mode 100644 gnucash/gnome/gnc-plugin-page-register-sort.cpp
 copy gnucash/{html/gnc-html-factory.cpp => gnome/gnc-plugin-page-register-sort.hpp} (53%)



More information about the gnucash-changes mailing list