|
21 | 21 |
|
22 | 22 | #include <config.h> |
23 | 23 |
|
| 24 | +#include <stdbool.h> |
24 | 25 | #include <gtk/gtk.h> |
25 | 26 | #include <glib/gi18n.h> |
26 | 27 | #include <errno.h> |
@@ -63,6 +64,58 @@ static QofLogModule log_module = GNC_MOD_GUI; |
63 | 64 | static GNCShutdownCB shutdown_cb = NULL; |
64 | 65 | static gint save_in_progress = 0; |
65 | 66 |
|
| 67 | +typedef bool (*CharToBool)(const char*); |
| 68 | + |
| 69 | +static bool datafile_filter (const GtkFileFilterInfo* info, CharToBool checker) |
| 70 | +{ |
| 71 | + return info && info->filename && checker (info->filename); |
| 72 | +} |
| 73 | + |
| 74 | +GList* |
| 75 | +gnc_file_chooser_get_datafile_filters () |
| 76 | +{ |
| 77 | + /* Translators: *.gnucash.*.gnucash, *.xac.*.xac are file patterns |
| 78 | + and must not be translated*/ |
| 79 | + const char* datafiles = N_("Datafiles only (*.gnucash, *.xac)"); |
| 80 | + const char* backups = N_("Backups only (*.gnucash.*.gnucash, *.xac.*.xac)"); |
| 81 | + GList* rv = NULL; |
| 82 | + |
| 83 | + GtkFileFilter *filter = gtk_file_filter_new (); |
| 84 | + gtk_file_filter_set_name (filter, _(datafiles)); |
| 85 | + gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, |
| 86 | + (GtkFileFilterFunc)datafile_filter, |
| 87 | + gnc_filename_is_datafile, NULL); |
| 88 | + rv = g_list_prepend (rv, filter); |
| 89 | + |
| 90 | + filter = gtk_file_filter_new (); |
| 91 | + gtk_file_filter_set_name (filter, _(backups)); |
| 92 | + gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, |
| 93 | + (GtkFileFilterFunc)datafile_filter, |
| 94 | + gnc_filename_is_backup, NULL); |
| 95 | + rv = g_list_prepend (rv, filter); |
| 96 | + |
| 97 | + return g_list_reverse (rv); |
| 98 | +} |
| 99 | + |
| 100 | +void |
| 101 | +gnc_file_chooser_add_filters (GtkFileChooser* file_box, GList *filters) |
| 102 | +{ |
| 103 | + g_return_if_fail (GTK_IS_WIDGET (file_box)); |
| 104 | + if (filters == NULL) return; |
| 105 | + |
| 106 | + for (GList* node = filters; node; node = node->next) |
| 107 | + gtk_file_chooser_add_filter (file_box, GTK_FILE_FILTER (node->data)); |
| 108 | + |
| 109 | + GtkFileFilter* all_filter = gtk_file_filter_new(); |
| 110 | + gtk_file_filter_set_name (all_filter, _("All files")); |
| 111 | + gtk_file_filter_add_pattern (all_filter, "*"); |
| 112 | + gtk_file_chooser_add_filter (file_box, all_filter); |
| 113 | + |
| 114 | + /* preselect the first filter */ |
| 115 | + gtk_file_chooser_set_filter (file_box, filters->data); |
| 116 | + g_list_free (filters); |
| 117 | +} |
| 118 | + |
66 | 119 | // gnc_file_dialog_int is used both by gnc_file_dialog and gnc_file_dialog_multi |
67 | 120 | static GSList * |
68 | 121 | gnc_file_dialog_int (GtkWindow *parent, |
@@ -135,29 +188,7 @@ gnc_file_dialog_int (GtkWindow *parent, |
135 | 188 | gtk_window_set_modal(GTK_WINDOW(file_box), TRUE); |
136 | 189 |
|
137 | 190 | if (filters != NULL) |
138 | | - { |
139 | | - GList* filter; |
140 | | - GtkFileFilter* all_filter = gtk_file_filter_new(); |
141 | | - |
142 | | - for (filter = filters; filter; filter = filter->next) |
143 | | - { |
144 | | - g_return_val_if_fail(GTK_IS_FILE_FILTER(filter->data), NULL); |
145 | | - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_box), |
146 | | - GTK_FILE_FILTER (filter->data)); |
147 | | - } |
148 | | - |
149 | | - gtk_file_filter_set_name (all_filter, _("All files")); |
150 | | - gtk_file_filter_add_pattern (all_filter, "*"); |
151 | | - gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_box), all_filter); |
152 | | - |
153 | | - /* Note: You cannot set a file filter and preselect a file name. |
154 | | - * The latter wins, and the filter ends up disabled. Since we are |
155 | | - * only setting the starting directory for the chooser dialog, |
156 | | - * everything works as expected. */ |
157 | | - gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (file_box), |
158 | | - GTK_FILE_FILTER (filters->data)); |
159 | | - g_list_free (filters); |
160 | | - } |
| 191 | + gnc_file_chooser_add_filters (GTK_FILE_CHOOSER (file_box), filters); |
161 | 192 |
|
162 | 193 | response = gtk_dialog_run(GTK_DIALOG(file_box)); |
163 | 194 |
|
|
0 commit comments