Skip to content

Commit c8e7f0a

Browse files
[gnc-plugin-page-register.cpp] add Desc substring filter
1 parent 01bffa4 commit c8e7f0a

File tree

2 files changed

+208
-0
lines changed

2 files changed

+208
-0
lines changed

gnucash/gnome/gnc-plugin-page-register.cpp

+137
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ extern "C"
156156
/* Callbacks for the "Filter By" dialog */
157157
void gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton* button,
158158
GncPluginPageRegister* page);
159+
void gnc_plugin_page_register_filter_desc_changed_cb (GtkEntry *entry,
160+
GncPluginPageRegister* page);
159161
void gnc_plugin_page_register_filter_start_cb (GtkWidget* radio,
160162
GncPluginPageRegister* page);
161163
void gnc_plugin_page_register_filter_end_cb (GtkWidget* radio,
@@ -175,12 +177,14 @@ void gnc_plugin_page_register_filter_days_changed_cb (GtkSpinButton* button,
175177
static time64 gnc_plugin_page_register_filter_dmy2time (char* date_string);
176178
static gchar* gnc_plugin_page_register_filter_time2dmy (time64 raw_time);
177179
static gchar* gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page);
180+
static gchar* gnc_plugin_page_register_get_desc_filter (GncPluginPage* plugin_page);
178181
void gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
179182
const gchar* filter);
180183
static void gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister* page);
181184

182185
static void gnc_ppr_update_status_query (GncPluginPageRegister* page);
183186
static void gnc_ppr_update_date_query (GncPluginPageRegister* page);
187+
static void gnc_ppr_update_text_query (GncPluginPageRegister* page);
184188

185189
/* Command callbacks */
186190
static void gnc_plugin_page_register_cmd_print_check (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
@@ -465,6 +469,7 @@ typedef struct GncPluginPageRegisterPrivate
465469
GtkWidget* end_date_today;
466470
GtkWidget* end_date;
467471
GtkWidget* num_days;
472+
GString* desc_filter;
468473
cleared_match_t original_cleared_match;
469474
cleared_match_t cleared_match;
470475
time64 original_start_time;
@@ -476,6 +481,10 @@ typedef struct GncPluginPageRegisterPrivate
476481
gboolean original_save_filter;
477482
gboolean save_filter;
478483
} fd;
484+
485+
void set_desc_filter (const char *new_str) { g_string_assign (fd.desc_filter, new_str); };
486+
const char *get_desc_filter () const { return fd.desc_filter ? fd.desc_filter->str : nullptr; };
487+
479488
} GncPluginPageRegisterPrivate;
480489

481490
G_DEFINE_TYPE_WITH_PRIVATE (GncPluginPageRegister, gnc_plugin_page_register,
@@ -660,6 +669,7 @@ gnc_plugin_page_register_init (GncPluginPageRegister* plugin_page)
660669
priv->read_only = FALSE;
661670
priv->fd.cleared_match = CLEARED_ALL;
662671
priv->fd.days = 0;
672+
priv->fd.desc_filter = g_string_new ("");
663673
priv->enable_refresh = TRUE;
664674
priv->search_query = NULL;
665675
priv->filter_query = NULL;
@@ -1341,6 +1351,15 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
13411351
filter_changed = filter_changed + 1;
13421352
}
13431353

1354+
auto desc_filter = gnc_plugin_page_register_get_desc_filter (plugin_page);
1355+
if (desc_filter && *desc_filter)
1356+
{
1357+
PINFO ("Loaded Description Filter is %s", desc_filter);
1358+
priv->set_desc_filter (desc_filter);
1359+
++filter_changed;
1360+
}
1361+
g_free (desc_filter);
1362+
13441363
if (filter_changed != 0)
13451364
priv->fd.save_filter = TRUE;
13461365

@@ -1387,6 +1406,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
13871406
/* Update Query with Filter Status and Dates */
13881407
gnc_ppr_update_status_query (page);
13891408
gnc_ppr_update_date_query (page);
1409+
gnc_ppr_update_text_query (page);
13901410

13911411
/* Now do the refresh if this is a new page instead of restore */
13921412
if (create_new_page)
@@ -1492,6 +1512,7 @@ gnc_plugin_page_register_destroy_widget (GncPluginPage* plugin_page)
14921512
if (priv->fd.dialog)
14931513
{
14941514
gtk_widget_destroy (priv->fd.dialog);
1515+
g_string_free (priv->fd.desc_filter, true);
14951516
memset (&priv->fd, 0, sizeof (priv->fd));
14961517
}
14971518

@@ -2027,6 +2048,43 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
20272048
"0", "0", get_filter_default_num_of_days (ledger_type));
20282049
}
20292050

2051+
static const char* KEY_FILE_DESC_FILTER = "register_desc_filter";
2052+
2053+
static gchar*
2054+
gnc_plugin_page_register_get_desc_filter (GncPluginPage* plugin_page)
2055+
{
2056+
g_return_val_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page), nullptr);
2057+
2058+
auto priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2059+
auto state_file = gnc_state_get_current();
2060+
auto state_section = gsr_get_register_state_section (priv->gsr);
2061+
GError* error = NULL;
2062+
auto filter = g_key_file_get_string (state_file, state_section,
2063+
KEY_FILE_DESC_FILTER, &error);
2064+
if (error)
2065+
g_clear_error (&error);
2066+
2067+
g_free (state_section);
2068+
2069+
return filter;
2070+
}
2071+
2072+
static void
2073+
gnc_plugin_page_register_set_desc_filter (GncPluginPage* plugin_page, const char *desc_filter)
2074+
{
2075+
auto state_file = gnc_state_get_current();
2076+
auto priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (plugin_page);
2077+
auto state_section = gsr_get_register_state_section (priv->gsr);
2078+
if (desc_filter && *desc_filter)
2079+
g_key_file_set_string (state_file, state_section, KEY_FILE_DESC_FILTER, desc_filter);
2080+
else if (g_key_file_has_key (state_file, state_section, KEY_FILE_DESC_FILTER, nullptr))
2081+
{
2082+
g_key_file_remove_key (state_file, state_section, KEY_FILE_DESC_FILTER, nullptr);
2083+
gnc_plugin_page_register_check_for_empty_group (state_file, state_section);
2084+
}
2085+
g_free (state_section);
2086+
}
2087+
20302088
static void
20312089
gnc_plugin_page_register_set_filter_gcm (GNCSplitReg *gsr, const gchar* filter,
20322090
gchar* default_filter)
@@ -2674,6 +2732,52 @@ gnc_ppr_update_date_query (GncPluginPageRegister* page)
26742732
LEAVE (" ");
26752733
}
26762734

2735+
static void
2736+
gnc_ppr_update_text_query (GncPluginPageRegister* page)
2737+
{
2738+
ENTER (" ");
2739+
2740+
auto priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
2741+
if (!priv || !priv->ledger)
2742+
{
2743+
LEAVE ("no ledger");
2744+
return;
2745+
}
2746+
2747+
// check if this a search register and save query
2748+
gnc_ppr_update_for_search_query (page);
2749+
2750+
auto query = gnc_ledger_display_get_query (priv->ledger);
2751+
if (!query)
2752+
{
2753+
LEAVE ("no query");
2754+
return;
2755+
}
2756+
2757+
if (gnc_ledger_display_get_split_register (priv->ledger)->type != SEARCH_LEDGER)
2758+
{
2759+
auto param_list = qof_query_build_param_list (SPLIT_TRANS, TRANS_DESCRIPTION, NULL);
2760+
qof_query_purge_terms (query, param_list);
2761+
g_slist_free (param_list);
2762+
}
2763+
2764+
auto desc_filter = priv->get_desc_filter ();
2765+
if (desc_filter && *desc_filter)
2766+
xaccQueryAddDescriptionMatch (query, desc_filter, true, false, QOF_COMPARE_CONTAINS,
2767+
QOF_QUERY_AND);
2768+
2769+
// Set filter tooltip for summary bar
2770+
gnc_plugin_page_register_set_filter_tooltip (page);
2771+
2772+
// clear previous filter query and save current
2773+
qof_query_destroy (priv->filter_query);
2774+
priv->filter_query = qof_query_copy (query);
2775+
2776+
if (priv->enable_refresh)
2777+
gnc_ledger_display_refresh (priv->ledger);
2778+
LEAVE (" ");
2779+
}
2780+
26772781

26782782
/* This function converts a time64 value date to a string */
26792783
static gchar*
@@ -2908,6 +3012,24 @@ gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton* button,
29083012
LEAVE (" ");
29093013
}
29103014

3015+
void
3016+
gnc_plugin_page_register_filter_desc_changed_cb (GtkEntry *entry,
3017+
GncPluginPageRegister* page)
3018+
{
3019+
3020+
g_return_if_fail (GTK_IS_ENTRY (entry));
3021+
g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (page));
3022+
3023+
ENTER ("(entry %p, page %p)", entry, page);
3024+
3025+
auto priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page);
3026+
priv->set_desc_filter (gtk_entry_get_text (entry));
3027+
gnc_ppr_update_text_query (page);
3028+
3029+
LEAVE (" ");
3030+
}
3031+
3032+
29113033
void
29123034
gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page)
29133035
{
@@ -2921,8 +3043,10 @@ gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page)
29213043
priv->fd.start_time = 0;
29223044
priv->fd.end_time = 0;
29233045
priv->fd.cleared_match = (cleared_match_t)g_ascii_strtoll (DEFAULT_FILTER, NULL, 16);
3046+
priv->set_desc_filter("");
29243047

29253048
gnc_ppr_update_date_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
3049+
gnc_ppr_update_text_query (GNC_PLUGIN_PAGE_REGISTER(plugin_page));
29263050
}
29273051

29283052
/** This function is called when the "number of days" spin button is
@@ -3140,6 +3264,7 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
31403264
priv->fd.days = priv->fd.original_days;
31413265
priv->fd.save_filter = priv->fd.original_save_filter;
31423266
gnc_ppr_update_date_query (page);
3267+
gnc_ppr_update_text_query (page);
31433268
}
31443269
else
31453270
{
@@ -3183,6 +3308,8 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
31833308
gnc_plugin_page_register_set_filter (plugin_page, filter);
31843309
g_free (filter);
31853310
g_list_free_full (flist, g_free);
3311+
3312+
gnc_plugin_page_register_set_desc_filter (plugin_page, priv->get_desc_filter());
31863313
}
31873314
}
31883315
priv->fd.dialog = NULL;
@@ -3275,6 +3402,14 @@ gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister* page)
32753402
g_list_free_full (hide, g_free);
32763403
}
32773404

3405+
// filtered end time
3406+
const char *desc_filter = priv->get_desc_filter ();
3407+
if (desc_filter && *desc_filter)
3408+
{
3409+
t_list = g_list_prepend
3410+
(t_list, g_strdup_printf ("%s %s", _("Desciption Filter:"), desc_filter));
3411+
}
3412+
32783413
t_list = g_list_reverse (t_list);
32793414

32803415
if (t_list)
@@ -4170,6 +4305,8 @@ gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
41704305
"end_date_choose"));
41714306
priv->fd.end_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
41724307
"end_date_today"));
4308+
gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, "desc_filter_entry")),
4309+
priv->get_desc_filter());
41734310

41744311
{
41754312
/* Start date info */

gnucash/gtkbuilder/gnc-plugin-page-register.glade

+71
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,77 @@ If 0, all previous days included</property>
517517
<property name="tab-fill">False</property>
518518
</packing>
519519
</child>
520+
<child>
521+
<object class="GtkBox">
522+
<property name="visible">True</property>
523+
<property name="can-focus">False</property>
524+
<property name="orientation">vertical</property>
525+
<child>
526+
<!-- n-columns=2 n-rows=3 -->
527+
<object class="GtkGrid">
528+
<property name="visible">True</property>
529+
<property name="can-focus">False</property>
530+
<child>
531+
<object class="GtkLabel">
532+
<property name="visible">True</property>
533+
<property name="can-focus">False</property>
534+
<property name="label" translatable="yes">Description</property>
535+
</object>
536+
<packing>
537+
<property name="left-attach">0</property>
538+
<property name="top-attach">0</property>
539+
</packing>
540+
</child>
541+
<child>
542+
<object class="GtkSearchEntry" id="desc_filter_entry">
543+
<property name="visible">True</property>
544+
<property name="can-focus">True</property>
545+
<property name="primary-icon-name">edit-find-symbolic</property>
546+
<property name="primary-icon-activatable">False</property>
547+
<property name="primary-icon-sensitive">False</property>
548+
<signal name="search-changed" handler="gnc_plugin_page_register_filter_desc_changed_cb" swapped="no"/>
549+
</object>
550+
<packing>
551+
<property name="left-attach">1</property>
552+
<property name="top-attach">0</property>
553+
</packing>
554+
</child>
555+
<child>
556+
<placeholder/>
557+
</child>
558+
<child>
559+
<placeholder/>
560+
</child>
561+
<child>
562+
<placeholder/>
563+
</child>
564+
<child>
565+
<placeholder/>
566+
</child>
567+
</object>
568+
<packing>
569+
<property name="expand">False</property>
570+
<property name="fill">True</property>
571+
<property name="position">0</property>
572+
</packing>
573+
</child>
574+
</object>
575+
<packing>
576+
<property name="position">2</property>
577+
</packing>
578+
</child>
579+
<child type="tab">
580+
<object class="GtkLabel" id="vbox105">
581+
<property name="visible">True</property>
582+
<property name="can-focus">False</property>
583+
<property name="label" translatable="yes">Text</property>
584+
<property name="use-underline">True</property>
585+
</object>
586+
<packing>
587+
<property name="position">2</property>
588+
<property name="tab-fill">False</property>
589+
</packing>
590+
</child>
520591
</object>
521592
<packing>
522593
<property name="expand">True</property>

0 commit comments

Comments
 (0)