@@ -156,6 +156,8 @@ extern "C"
156
156
/* Callbacks for the "Filter By" dialog */
157
157
void gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton* button,
158
158
GncPluginPageRegister* page);
159
+ void gnc_plugin_page_register_filter_desc_changed_cb (GtkEntry *entry,
160
+ GncPluginPageRegister* page);
159
161
void gnc_plugin_page_register_filter_start_cb (GtkWidget* radio,
160
162
GncPluginPageRegister* page);
161
163
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,
175
177
static time64 gnc_plugin_page_register_filter_dmy2time (char * date_string);
176
178
static gchar* gnc_plugin_page_register_filter_time2dmy (time64 raw_time);
177
179
static gchar* gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page);
180
+ static gchar* gnc_plugin_page_register_get_desc_filter (GncPluginPage* plugin_page);
178
181
void gnc_plugin_page_register_set_filter (GncPluginPage* plugin_page,
179
182
const gchar* filter);
180
183
static void gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister* page);
181
184
182
185
static void gnc_ppr_update_status_query (GncPluginPageRegister* page);
183
186
static void gnc_ppr_update_date_query (GncPluginPageRegister* page);
187
+ static void gnc_ppr_update_text_query (GncPluginPageRegister* page);
184
188
185
189
/* Command callbacks */
186
190
static void gnc_plugin_page_register_cmd_print_check (GSimpleAction *simple, GVariant *paramter, gpointer user_data);
@@ -465,6 +469,7 @@ typedef struct GncPluginPageRegisterPrivate
465
469
GtkWidget* end_date_today;
466
470
GtkWidget* end_date;
467
471
GtkWidget* num_days;
472
+ GString* desc_filter;
468
473
cleared_match_t original_cleared_match;
469
474
cleared_match_t cleared_match;
470
475
time64 original_start_time;
@@ -476,6 +481,10 @@ typedef struct GncPluginPageRegisterPrivate
476
481
gboolean original_save_filter;
477
482
gboolean save_filter;
478
483
} 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
+
479
488
} GncPluginPageRegisterPrivate;
480
489
481
490
G_DEFINE_TYPE_WITH_PRIVATE (GncPluginPageRegister, gnc_plugin_page_register,
@@ -660,6 +669,7 @@ gnc_plugin_page_register_init (GncPluginPageRegister* plugin_page)
660
669
priv->read_only = FALSE ;
661
670
priv->fd .cleared_match = CLEARED_ALL;
662
671
priv->fd .days = 0 ;
672
+ priv->fd .desc_filter = g_string_new (" " );
663
673
priv->enable_refresh = TRUE ;
664
674
priv->search_query = NULL ;
665
675
priv->filter_query = NULL ;
@@ -1341,6 +1351,15 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
1341
1351
filter_changed = filter_changed + 1 ;
1342
1352
}
1343
1353
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
+
1344
1363
if (filter_changed != 0 )
1345
1364
priv->fd .save_filter = TRUE ;
1346
1365
@@ -1387,6 +1406,7 @@ gnc_plugin_page_register_create_widget (GncPluginPage* plugin_page)
1387
1406
/* Update Query with Filter Status and Dates */
1388
1407
gnc_ppr_update_status_query (page);
1389
1408
gnc_ppr_update_date_query (page);
1409
+ gnc_ppr_update_text_query (page);
1390
1410
1391
1411
/* Now do the refresh if this is a new page instead of restore */
1392
1412
if (create_new_page)
@@ -1492,6 +1512,7 @@ gnc_plugin_page_register_destroy_widget (GncPluginPage* plugin_page)
1492
1512
if (priv->fd .dialog )
1493
1513
{
1494
1514
gtk_widget_destroy (priv->fd .dialog );
1515
+ g_string_free (priv->fd .desc_filter , true );
1495
1516
memset (&priv->fd , 0 , sizeof (priv->fd ));
1496
1517
}
1497
1518
@@ -2027,6 +2048,43 @@ gnc_plugin_page_register_get_filter (GncPluginPage* plugin_page)
2027
2048
" 0" , " 0" , get_filter_default_num_of_days (ledger_type));
2028
2049
}
2029
2050
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
+
2030
2088
static void
2031
2089
gnc_plugin_page_register_set_filter_gcm (GNCSplitReg *gsr, const gchar* filter,
2032
2090
gchar* default_filter)
@@ -2674,6 +2732,52 @@ gnc_ppr_update_date_query (GncPluginPageRegister* page)
2674
2732
LEAVE (" " );
2675
2733
}
2676
2734
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
+
2677
2781
2678
2782
/* This function converts a time64 value date to a string */
2679
2783
static gchar*
@@ -2908,6 +3012,24 @@ gnc_plugin_page_register_filter_select_range_cb (GtkRadioButton* button,
2908
3012
LEAVE (" " );
2909
3013
}
2910
3014
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
+
2911
3033
void
2912
3034
gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page)
2913
3035
{
@@ -2921,8 +3043,10 @@ gnc_plugin_page_register_clear_current_filter (GncPluginPage* plugin_page)
2921
3043
priv->fd .start_time = 0 ;
2922
3044
priv->fd .end_time = 0 ;
2923
3045
priv->fd .cleared_match = (cleared_match_t )g_ascii_strtoll (DEFAULT_FILTER, NULL , 16 );
3046
+ priv->set_desc_filter (" " );
2924
3047
2925
3048
gnc_ppr_update_date_query (GNC_PLUGIN_PAGE_REGISTER (plugin_page));
3049
+ gnc_ppr_update_text_query (GNC_PLUGIN_PAGE_REGISTER (plugin_page));
2926
3050
}
2927
3051
2928
3052
/* * 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,
3140
3264
priv->fd .days = priv->fd .original_days ;
3141
3265
priv->fd .save_filter = priv->fd .original_save_filter ;
3142
3266
gnc_ppr_update_date_query (page);
3267
+ gnc_ppr_update_text_query (page);
3143
3268
}
3144
3269
else
3145
3270
{
@@ -3183,6 +3308,8 @@ gnc_plugin_page_register_filter_response_cb (GtkDialog* dialog,
3183
3308
gnc_plugin_page_register_set_filter (plugin_page, filter);
3184
3309
g_free (filter);
3185
3310
g_list_free_full (flist, g_free);
3311
+
3312
+ gnc_plugin_page_register_set_desc_filter (plugin_page, priv->get_desc_filter ());
3186
3313
}
3187
3314
}
3188
3315
priv->fd .dialog = NULL ;
@@ -3275,6 +3402,14 @@ gnc_plugin_page_register_set_filter_tooltip (GncPluginPageRegister* page)
3275
3402
g_list_free_full (hide, g_free);
3276
3403
}
3277
3404
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
+
3278
3413
t_list = g_list_reverse (t_list);
3279
3414
3280
3415
if (t_list)
@@ -4170,6 +4305,8 @@ gnc_plugin_page_register_cmd_view_filter_by (GSimpleAction *simple,
4170
4305
" end_date_choose" ));
4171
4306
priv->fd .end_date_today = GTK_WIDGET (gtk_builder_get_object (builder,
4172
4307
" end_date_today" ));
4308
+ gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, " desc_filter_entry" )),
4309
+ priv->get_desc_filter ());
4173
4310
4174
4311
{
4175
4312
/* Start date info */
0 commit comments