36 #include <glib/gi18n.h> 39 #include "gnc-plugin-page-register-sort.hpp" 40 #include "dialog-utils.h" 46 #include "engine-helpers.h" 47 #include "qofbookslots.h" 54 static QofLogModule log_module = GNC_MOD_GUI;
56 static std::string DEFAULT_SORT_ORDER =
"BY_STANDARD";
66 SortType original_sort_type;
67 bool original_reverse_order;
68 bool original_save_order;
70 bool show_save_button;
96 gboolean_to_bool (gboolean value)
98 return value ? true :
false;
101 static inline gboolean
102 bool_to_gboolean (
bool value)
104 return value ? TRUE : FALSE;
108 gnc_ppr_check_for_empty_group (GKeyFile *state_file,
109 const gchar *state_section)
112 gchar **keys = g_key_file_get_keys (state_file, state_section, &num_keys,
nullptr);
121 gnc_ppr_sort_get_order (GNCSplitReg *gsr)
128 auto state_section = gsr_get_register_state_section (gsr);
129 GError* error =
nullptr;
131 auto sort_text = g_key_file_get_string (state_file, state_section,
132 KEY_PAGE_SORT, &error);
133 std::string sort_order;
136 g_clear_error (&error);
139 sort_order = (sort_text);
142 g_free (state_section);
144 return !sort_order.empty() ? sort_order : (DEFAULT_SORT_ORDER);
148 gnc_ppr_sort_set_order (GNCSplitReg *gsr, std::string sort_order)
155 auto state_section = gsr_get_register_state_section (gsr);
157 if (sort_order.compare (DEFAULT_SORT_ORDER) == 0)
159 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT,
nullptr))
160 g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT,
nullptr);
162 gnc_ppr_check_for_empty_group (state_file, state_section);
165 g_key_file_set_string (state_file, state_section, KEY_PAGE_SORT, sort_order.c_str());
167 g_free (state_section);
171 gnc_ppr_sort_get_reversed (GNCSplitReg *gsr)
178 auto state_section = gsr_get_register_state_section (gsr);
179 GError* error =
nullptr;
180 gboolean sort_reversed = g_key_file_get_boolean (state_file, state_section,
181 KEY_PAGE_SORT_REV, &error);
184 g_clear_error (&error);
186 g_free (state_section);
187 return gboolean_to_bool (sort_reversed);
191 gnc_ppr_sort_set_reversed (GNCSplitReg* gsr,
bool reverse_order)
198 auto state_section = gsr_get_register_state_section (gsr);
202 if (g_key_file_has_key (state_file, state_section, KEY_PAGE_SORT_REV,
nullptr))
203 g_key_file_remove_key (state_file, state_section, KEY_PAGE_SORT_REV,
nullptr);
205 gnc_ppr_check_for_empty_group (state_file, state_section);
208 g_key_file_set_boolean (state_file, state_section, KEY_PAGE_SORT_REV,
209 bool_to_gboolean (reverse_order));
211 g_free (state_section);
222 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(plugin_page));
226 GNCLedgerDisplayType ledger_type = gnc_ledger_display_type (gsr->ledger);
228 sd->save_order =
false;
231 sd->reverse_order = gnc_ppr_sort_get_reversed (gsr);
233 PINFO(
"Loaded Sort reversed order is %s", sd->reverse_order ?
"true" :
"false");
235 gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, no_refresh);
236 if (sd->reverse_order)
237 sd->save_order =
true;
240 std::string sort_type = gnc_ppr_sort_get_order (gsr);
242 PINFO(
"Loaded Sort type is %s", sort_type.c_str());
244 SortType type = SortTypefromString (sort_type.c_str());
246 gnc_split_reg_sort (gsr, type, no_force, no_refresh);
248 if (sort_type.compare (DEFAULT_SORT_ORDER) != 0)
249 sd->save_order =
true;
251 if (ledger_type == LD_GL)
255 if (reg->type != GENERAL_JOURNAL)
257 gnc_split_reg_sort (gsr, SortTypefromString (DEFAULT_SORT_ORDER.c_str()), no_force, no_refresh);
258 sd->reverse_order =
false;
259 sd->save_order =
false;
274 gnc_ppr_sort_book_option_changed (gpointer new_val,
278 gboolean* new_data = (gboolean*)new_val;
280 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
284 gtk_button_set_label (GTK_BUTTON(rsd->num_radio), _(
"Transaction Number"));
285 gtk_button_set_label (GTK_BUTTON(rsd->act_radio), _(
"Number/Action"));
289 gtk_button_set_label (GTK_BUTTON(rsd->num_radio), _(
"Number"));
290 gtk_button_set_label (GTK_BUTTON(rsd->act_radio), _(
"Action"));
295 gnc_split_reg_sort (gsr, (SortType)gsr->sort_type, force, refresh);
313 g_return_if_fail (GTK_IS_DIALOG(dialog));
314 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
321 if (response != GTK_RESPONSE_OK)
324 gnc_split_reg_set_sort_reversed (gsr, rsd->original_reverse_order, no_refresh);
325 sd->reverse_order = rsd->original_reverse_order;
327 gnc_split_reg_sort (gsr, rsd->original_sort_type, force, refresh);
328 sd->sort_type = rsd->original_sort_type;
329 sd->save_order = rsd->original_save_order;
334 if ((!sd->save_order) && ((rsd->original_sort_type) ||
335 (rsd->original_reverse_order)))
337 gnc_ppr_sort_set_order (gsr, DEFAULT_SORT_ORDER);
338 gnc_ppr_sort_set_reversed (gsr,
false);
340 rsd->original_sort_type = sd->sort_type;
341 rsd->original_reverse_order = sd->reverse_order;
345 SortType type = gnc_split_reg_get_sort_type (gsr);
346 std::string sort_type = (SortTypeasString (type));
348 gnc_ppr_sort_set_order (gsr, sort_type);
349 gnc_ppr_sort_set_reversed (gsr, sd->reverse_order);
352 gnc_book_option_remove_cb (OPTION_NAME_NUM_FIELD_SOURCE,
353 gnc_ppr_sort_book_option_changed,
355 rsd->dialog =
nullptr;
356 rsd->num_radio =
nullptr;
357 rsd->act_radio =
nullptr;
358 sd->dialog =
nullptr;
360 gtk_widget_destroy (GTK_WIDGET(dialog));
375 g_return_if_fail (GTK_IS_TOGGLE_BUTTON(button));
376 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
378 auto name = gtk_buildable_get_name (GTK_BUILDABLE(button));
380 ENTER(
"button %s(%p), page %p", name, button, rsd->plugin_page);
382 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
384 LEAVE(
"1st callback of pair. Defer to 2nd callback.");
390 SortType type = SortTypefromString (name);
391 gnc_split_reg_sort (gsr, type, no_force, refresh);
406 g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
407 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
409 ENTER(
"Save toggle button (%p), page %p", button, rsd->plugin_page);
414 if (gtk_toggle_button_get_active (button))
415 sd->save_order =
true;
417 sd->save_order =
false;
432 g_return_if_fail (GTK_IS_CHECK_BUTTON(button));
433 g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER(rsd->plugin_page));
435 ENTER(
"Reverse toggle button (%p), page %p", button, rsd->plugin_page);
441 sd->reverse_order = gtk_toggle_button_get_active (button);
442 gnc_split_reg_set_sort_reversed (gsr, sd->reverse_order, refresh);
456 auto builder = gtk_builder_new();
457 gnc_builder_add_from_file (builder,
"gnc-plugin-page-register.glade",
"sort_by_dialog");
458 auto dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"sort_by_dialog"));
459 rsd->dialog = dialog;
460 sd->dialog = rsd->dialog;
462 gtk_window_set_transient_for (GTK_WINDOW(dialog),
463 gnc_window_get_gtk_window (GNC_WINDOW(
464 GNC_PLUGIN_PAGE(rsd->plugin_page)->window)));
466 auto title = g_strdup_printf (_(
"Sort %s by…"),
468 gtk_window_set_title (GTK_WINDOW(dialog), title);
474 SortType sort = gnc_split_reg_get_sort_type (gsr);
475 auto name = SortTypeasString (sort);
476 auto button = GTK_WIDGET(gtk_builder_get_object (builder, name));
477 DEBUG(
"current sort %d, button %s(%p)", sort, name, button);
478 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
479 rsd->original_sort_type = sort;
481 button = GTK_WIDGET(gtk_builder_get_object (builder,
"sort_save"));
483 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
485 rsd->original_save_order = sd->save_order;
488 gtk_widget_set_visible (GTK_WIDGET(button), bool_to_gboolean (rsd->show_save_button));
491 button = GTK_WIDGET(gtk_builder_get_object (builder,
"sort_reverse"));
492 if (sd->reverse_order)
493 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button), TRUE);
494 rsd->original_reverse_order = sd->reverse_order;
496 rsd->num_radio = GTK_WIDGET(gtk_builder_get_object (builder,
"BY_NUM"));
497 rsd->act_radio = GTK_WIDGET(gtk_builder_get_object (builder,
"BY_ACTION"));
499 if (rsd->reg && !rsd->reg->use_tran_num_for_num_field)
501 gtk_button_set_label (GTK_BUTTON(rsd->num_radio), _ (
"Transaction Number"));
502 gtk_button_set_label (GTK_BUTTON(rsd->act_radio), _ (
"Number/Action"));
504 gnc_book_option_register_cb (OPTION_NAME_NUM_FIELD_SOURCE,
505 (GncBOCb)gnc_ppr_sort_book_option_changed,
509 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
513 gtk_widget_show (dialog);
514 g_object_unref (G_OBJECT(builder));
531 SortData *sd,
bool show_save_button)
539 rsd->plugin_page = plugin_page;
541 rsd->show_save_button = show_save_button;
543 gnc_ppr_sort_dialog_create (rsd, sd);
void gnc_ppr_sort_order_save_cb(GtkToggleButton *button, RegisterSortDialog *rsd)
This function is called whenever the save sort order is checked or unchecked which allows saving of t...
Functions to load, save and get gui state.
void gnc_ppr_sort_response_cb(GtkDialog *dialog, gint response, RegisterSortDialog *rsd)
This function is called when the "Sort By…" dialog is closed.
The instance data structure for a content plugin.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
gint gnc_state_drop_sections_for(const gchar *partial_name)
Drop all sections from the state file whose name contains partial_name.
#define DEBUG(format, args...)
Print a debugging message.
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
Functions that are supported by all types of windows.
#define ENTER(format, args...)
Print a function entry debugging message.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
Functions for adding content to a window.
Functions providing a register page for the GnuCash UI.
void gnc_ppr_sort_order_reverse_cb(GtkToggleButton *button, RegisterSortDialog *rsd)
This function is called whenever the reverse sort order is checked or unchecked which allows reversin...
SortData * gnc_plugin_page_register_get_sort_data(GncPluginPage *plugin_page)
Get the SortData data structure associated with this register page.
Generic api to store and retrieve preferences.
void gnc_ppr_sort_dialog(GncPluginPage *plugin_page, SplitRegister *reg, SortData *sd, bool show_save_button)
This function is called for the sort dialog.
#define LEAVE(format, args...)
Print a function exit debugging message.
void gnc_ppr_sort_button_cb(GtkToggleButton *button, RegisterSortDialog *rsd)
This function is called when a radio button in the "Sort By…" dialog is clicked. ...
SplitRegister * gnc_ledger_display_get_split_register(GNCLedgerDisplay *ld)
return the split register associated with a ledger display
GNCSplitReg * gnc_plugin_page_register_get_gsr(GncPluginPage *plugin_page)
Get the GNCSplitReg data structure associated with this register page.
void gnc_ppr_sort_update_register(GncPluginPage *plugin_page)
This function is called to update the register.