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"
54static QofLogModule log_module = GNC_MOD_GUI;
56static 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;
96gboolean_to_bool (gboolean value)
98 return value ? true :
false;
101static inline gboolean
102bool_to_gboolean (
bool value)
104 return value ? TRUE : FALSE;
108gnc_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);
121gnc_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);
148gnc_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);
171gnc_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);
191gnc_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;
274gnc_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);
Functions for adding content to a window.
Functions providing a register page for the GnuCash UI.
Generic api to store and retrieve preferences.
Functions to load, save and get gui state.
utility functions for the GnuCash UI
Functions that are supported by all types of windows.
const gchar * gnc_plugin_page_get_page_name(GncPluginPage *page)
Retrieve the name of this page.
gint gnc_state_drop_sections_for(const gchar *partial_name)
Drop all sections from the state file whose name contains partial_name.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
SplitRegister * gnc_ledger_display_get_split_register(GNCLedgerDisplay *ld)
return the split register associated with a ledger display
#define PINFO(format, args...)
Print an informational note.
#define DEBUG(format, args...)
Print a debugging message.
#define LEAVE(format, args...)
Print a function exit debugging message.
#define ENTER(format, args...)
Print a function entry debugging message.
SortData * gnc_plugin_page_register_get_sort_data(GncPluginPage *plugin_page)
Get the SortData data structure associated with this register page.
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...
void gnc_ppr_sort_response_cb(GtkDialog *dialog, gint response, RegisterSortDialog *rsd)
This function is called when the "Sort By…" dialog is closed.
void gnc_ppr_sort_dialog(GncPluginPage *plugin_page, SplitRegister *reg, SortData *sd, bool show_save_button)
This function is called for the sort dialog.
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.
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...
void gnc_ppr_sort_update_register(GncPluginPage *plugin_page)
This function is called to update the register.
GNCSplitReg * gnc_plugin_page_register_get_gsr(GncPluginPage *plugin_page)
Get the GNCSplitReg data structure associated with this register page.
The instance data structure for a content plugin.