gnucash stable: Multiple changes pushed

Christopher Lam clam at code.gnucash.org
Tue Nov 4 17:56:21 EST 2025


Updated	 via  https://github.com/Gnucash/gnucash/commit/2dfdb0ba (commit)
	 via  https://github.com/Gnucash/gnucash/commit/42b4ed6a (commit)
	from  https://github.com/Gnucash/gnucash/commit/dde10464 (commit)



commit 2dfdb0bac3b67fde04aa2114db9f0503a70a8b9d
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Nov 3 19:09:48 2025 +0800

    [gnc-file.c] non-dbi file dialog filters .gnucash .xac files

diff --git a/gnucash/gnome-utils/gnc-file.c b/gnucash/gnome-utils/gnc-file.c
index 2dc9bf1526..10094d2376 100644
--- a/gnucash/gnome-utils/gnc-file.c
+++ b/gnucash/gnome-utils/gnc-file.c
@@ -1211,7 +1211,9 @@ gnc_file_open (GtkWindow *parent)
     else
         default_dir = gnc_get_default_directory(GNC_PREFS_GROUP_OPEN_SAVE);
 
-    newfile = gnc_file_dialog (parent, _("Open"), NULL, default_dir, GNC_FILE_DIALOG_OPEN);
+    newfile = gnc_file_dialog (parent, _("Open"),
+                               gnc_file_chooser_get_datafile_filters(),
+                               default_dir, GNC_FILE_DIALOG_OPEN);
     g_free ( last );
     g_free ( default_dir );
 
@@ -1264,9 +1266,9 @@ gnc_file_export (GtkWindow *parent)
     else
         default_dir = gnc_get_default_directory(GNC_PREFS_GROUP_EXPORT);
 
-    filename = gnc_file_dialog (parent,
-                                _("Save"), NULL, default_dir,
-                                GNC_FILE_DIALOG_SAVE);
+    filename = gnc_file_dialog (parent, _("Save"),
+                                gnc_file_chooser_get_datafile_filters(),
+                                default_dir, GNC_FILE_DIALOG_SAVE);
     g_free ( last );
     g_free ( default_dir );
     if (!filename) return;
@@ -1536,9 +1538,9 @@ gnc_file_save_as (GtkWindow *parent)
     else
         default_dir = gnc_get_default_directory(GNC_PREFS_GROUP_OPEN_SAVE);
 
-    filename = gnc_file_dialog (parent,
-                                _("Save"), NULL, default_dir,
-                                GNC_FILE_DIALOG_SAVE);
+    filename = gnc_file_dialog (parent, _("Save"),
+                                gnc_file_chooser_get_datafile_filters(),
+                                default_dir, GNC_FILE_DIALOG_SAVE);
     g_free ( last );
     g_free ( default_dir );
     if (!filename) return;

commit 42b4ed6a1e5c8a7d6470865b3f21437cb0664874
Author: Christopher Lam <christopher.lck at gmail.com>
Date:   Mon Nov 3 19:09:16 2025 +0800

    [gnc-file.c] move datafile filter to gnc-file.c
    
    effectively reverts 6c5f9052602d8e01cbf2 and reinstate in gnc-file.c,
    because the datafile filter is useful for non-dbi file dialog too

diff --git a/gnucash/gnome-utils/dialog-file-access.c b/gnucash/gnome-utils/dialog-file-access.c
index 91c0c50901..1db84d2be1 100644
--- a/gnucash/gnome-utils/dialog-file-access.c
+++ b/gnucash/gnome-utils/dialog-file-access.c
@@ -22,7 +22,6 @@
  * Boston, MA  02110-1301,  USA       gnu at gnu.org                   *
 \********************************************************************/
 
-#include <stdbool.h>
 #include <config.h>
 
 #include <gtk/gtk.h>
@@ -34,7 +33,6 @@
 #include "dialog-utils.h"
 #include "dialog-file-access.h"
 #include "gnc-file.h"
-#include "gnc-filepath-utils.h"
 #include "gnc-plugin-file-history.h"
 #include "gnc-session.h"
 
@@ -251,15 +249,6 @@ get_default_database( void )
     return default_db;
 }
 
-typedef bool (*CharToBool)(const char*);
-
-static bool datafile_filter (const GtkFileFilterInfo* filter_info,
-                             CharToBool filename_checker)
-{
-    return filter_info && filter_info->filename &&
-        filename_checker (filter_info->filename);
-}
-
 static void free_file_access_window (FileAccessWindow *faw)
 {
     g_free (faw->starting_dir);
@@ -357,30 +346,8 @@ gnc_ui_file_access (GtkWindow *parent, int type)
     faw->fileChooser = GTK_FILE_CHOOSER(fileChooser);
     gtk_box_pack_start( GTK_BOX(file_chooser), GTK_WIDGET(fileChooser), TRUE, TRUE, 6 );
 
-    /* set up .gnucash filters for Datafile operations */
-    GtkFileFilter *filter = gtk_file_filter_new ();
-    gtk_file_filter_set_name (filter, _("All files"));
-    gtk_file_filter_add_pattern (filter, "*");
-    gtk_file_chooser_add_filter (faw->fileChooser, filter);
-
-    filter = gtk_file_filter_new ();
-    /* Translators: *.gnucash and *.xac are file patterns and must not
-       be translated*/
-    gtk_file_filter_set_name (filter, _("Datafiles only (*.gnucash, *.xac)"));
-    gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME,
-                                (GtkFileFilterFunc)datafile_filter,
-                                gnc_filename_is_datafile, NULL);
-    gtk_file_chooser_add_filter (faw->fileChooser, filter);
-    gtk_file_chooser_set_filter (faw->fileChooser, filter);
-
-    filter = gtk_file_filter_new ();
-    /* Translators: *.gnucash.*.gnucash, *.xac.*.xac are file
-       patterns and must not be translated*/
-    gtk_file_filter_set_name (filter, _("Backups only (*.gnucash.*.gnucash, *.xac.*.xac)"));
-    gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME,
-                                (GtkFileFilterFunc)datafile_filter,
-                                gnc_filename_is_backup, NULL);
-    gtk_file_chooser_add_filter (faw->fileChooser, filter);
+    gnc_file_chooser_add_filters (faw->fileChooser,
+                                  gnc_file_chooser_get_datafile_filters ());
 
     /* Set the default directory */
     if (type == FILE_ACCESS_OPEN || type == FILE_ACCESS_SAVE_AS)
diff --git a/gnucash/gnome-utils/gnc-file.c b/gnucash/gnome-utils/gnc-file.c
index 0c56662e88..2dc9bf1526 100644
--- a/gnucash/gnome-utils/gnc-file.c
+++ b/gnucash/gnome-utils/gnc-file.c
@@ -21,6 +21,7 @@
 
 #include <config.h>
 
+#include <stdbool.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #include <errno.h>
@@ -63,6 +64,58 @@ static QofLogModule log_module = GNC_MOD_GUI;
 static GNCShutdownCB shutdown_cb = NULL;
 static gint save_in_progress = 0;
 
+typedef bool (*CharToBool)(const char*);
+
+static bool datafile_filter (const GtkFileFilterInfo* info, CharToBool checker)
+{
+    return info && info->filename && checker (info->filename);
+}
+
+GList*
+gnc_file_chooser_get_datafile_filters ()
+{
+    /* Translators: *.gnucash.*.gnucash, *.xac.*.xac are file patterns
+       and must not be translated*/
+    const char* datafiles = N_("Datafiles only (*.gnucash, *.xac)");
+    const char* backups = N_("Backups only (*.gnucash.*.gnucash, *.xac.*.xac)");
+    GList* rv = NULL;
+
+    GtkFileFilter *filter = gtk_file_filter_new ();
+    gtk_file_filter_set_name (filter, _(datafiles));
+    gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME,
+                                (GtkFileFilterFunc)datafile_filter,
+                                gnc_filename_is_datafile, NULL);
+    rv = g_list_prepend (rv, filter);
+
+    filter = gtk_file_filter_new ();
+    gtk_file_filter_set_name (filter, _(backups));
+    gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME,
+                                (GtkFileFilterFunc)datafile_filter,
+                                gnc_filename_is_backup, NULL);
+    rv = g_list_prepend (rv, filter);
+
+    return g_list_reverse (rv);
+}
+
+void
+gnc_file_chooser_add_filters (GtkFileChooser* file_box, GList *filters)
+{
+    g_return_if_fail (GTK_IS_WIDGET (file_box));
+    if (filters == NULL) return;
+
+    for (GList* node = filters; node; node = node->next)
+        gtk_file_chooser_add_filter (file_box, GTK_FILE_FILTER (node->data));
+
+    GtkFileFilter* all_filter = gtk_file_filter_new();
+    gtk_file_filter_set_name (all_filter, _("All files"));
+    gtk_file_filter_add_pattern (all_filter, "*");
+    gtk_file_chooser_add_filter (file_box, all_filter);
+
+    /* preselect the first filter */
+    gtk_file_chooser_set_filter (file_box, filters->data);
+    g_list_free (filters);
+}
+
 // gnc_file_dialog_int is used both by gnc_file_dialog and gnc_file_dialog_multi
 static GSList *
 gnc_file_dialog_int (GtkWindow *parent,
@@ -135,29 +188,7 @@ gnc_file_dialog_int (GtkWindow *parent,
     gtk_window_set_modal(GTK_WINDOW(file_box), TRUE);
 
     if (filters != NULL)
-    {
-        GList* filter;
-        GtkFileFilter* all_filter = gtk_file_filter_new();
-
-        for (filter = filters; filter; filter = filter->next)
-        {
-            g_return_val_if_fail(GTK_IS_FILE_FILTER(filter->data), NULL);
-            gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_box),
-                                         GTK_FILE_FILTER (filter->data));
-        }
-
-        gtk_file_filter_set_name (all_filter, _("All files"));
-        gtk_file_filter_add_pattern (all_filter, "*");
-        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_box), all_filter);
-
-        /* Note: You cannot set a file filter and preselect a file name.
-         * The latter wins, and the filter ends up disabled.  Since we are
-         * only setting the starting directory for the chooser dialog,
-         * everything works as expected. */
-        gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (file_box),
-                                     GTK_FILE_FILTER (filters->data));
-        g_list_free (filters);
-    }
+        gnc_file_chooser_add_filters (GTK_FILE_CHOOSER (file_box), filters);
 
     response = gtk_dialog_run(GTK_DIALOG(file_box));
 
diff --git a/gnucash/gnome-utils/gnc-file.h b/gnucash/gnome-utils/gnc-file.h
index 3fbaca0392..fc79f2f824 100644
--- a/gnucash/gnome-utils/gnc-file.h
+++ b/gnucash/gnome-utils/gnc-file.h
@@ -140,6 +140,10 @@ void gnc_file_do_export(GtkWindow *parent, const char* filename);
 void gnc_file_do_save_as(GtkWindow *parent, const char* filename);
 void gnc_file_revert (GtkWindow *parent);
 
+GList* gnc_file_chooser_get_datafile_filters (void);
+
+void gnc_file_chooser_add_filters (GtkFileChooser* file_box, GList *filters);
+
 /** Tell the user about errors in the backends
 
 */



Summary of changes:
 gnucash/gnome-utils/dialog-file-access.c | 37 +------------
 gnucash/gnome-utils/gnc-file.c           | 93 +++++++++++++++++++++-----------
 gnucash/gnome-utils/gnc-file.h           |  4 ++
 3 files changed, 69 insertions(+), 65 deletions(-)



More information about the gnucash-changes mailing list