~mdoyen/homebank/5.2.x

« back to all changes in this revision

Viewing changes to src/ui-payee.c

  • Committer: Maxime Doyen
  • Date: 2019-07-29 20:34:22 UTC
  • Revision ID: homebank@free.fr-20190729203422-hy3g4szjv3dbzmxu
5.2.7 release

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
40
40
 
41
41
 
 
42
static GtkWidget *
 
43
container_get_nth(GtkBox *container, gint nth)
 
44
{
 
45
GList *lchild, *list;
 
46
GtkWidget *child;
 
47
 
 
48
        if(!GTK_IS_CONTAINER(container))
 
49
                return NULL;
 
50
 
 
51
        lchild = list = gtk_container_get_children (GTK_CONTAINER(container));
 
52
        child = g_list_nth_data (list, nth);
 
53
        g_list_free(lchild);
 
54
        
 
55
        return child;
 
56
}
 
57
 
 
58
 
 
59
GtkWidget *
 
60
ui_pay_entry_popover_get_entry(GtkBox *box)
 
61
{
 
62
        return container_get_nth(box, 0);
 
63
}
 
64
 
 
65
 
 
66
Payee
 
67
*ui_pay_entry_popover_get(GtkBox *box)
 
68
{
 
69
GtkWidget *entry;
 
70
gchar *name;
 
71
Payee *item = NULL;
 
72
 
 
73
        DB( g_print ("ui_pay_entry_popover_get()\n") );
 
74
 
 
75
        entry = container_get_nth(box, 0);
 
76
        if( entry != NULL && GTK_IS_ENTRY(entry) )
 
77
        {
 
78
                name = (gchar *)gtk_entry_get_text(GTK_ENTRY (entry));
 
79
                item = da_pay_get_by_name(name);
 
80
        }
 
81
        return item;
 
82
}
 
83
 
 
84
 
 
85
guint32
 
86
ui_pay_entry_popover_get_key_add_new(GtkBox *box)
 
87
{
 
88
Payee *item = ui_pay_entry_popover_get(box);
 
89
GtkWidget *entry;
 
90
GtkTreeModel *store;
 
91
        
 
92
        if( item == NULL )
 
93
        {
 
94
                /* automatic add */
 
95
                //todo: check prefs + ask the user here 1st time
 
96
                entry = container_get_nth(box, 0);
 
97
                if( entry != NULL && GTK_IS_ENTRY(entry) )
 
98
                {
 
99
                        item = da_pay_malloc();
 
100
                        item->name = g_strdup(gtk_entry_get_text(GTK_ENTRY (entry)));
 
101
                        da_pay_append(item);
 
102
 
 
103
                        store = gtk_entry_completion_get_model(gtk_entry_get_completion(GTK_ENTRY(entry)));
 
104
                        if( store )
 
105
                                gtk_list_store_insert_with_values(GTK_LIST_STORE(store), NULL, -1,
 
106
                                        0, item->name, -1);
 
107
                }
 
108
        }
 
109
        return item->key;
 
110
}
 
111
 
 
112
 
 
113
guint32
 
114
ui_pay_entry_popover_get_key(GtkBox *box)
 
115
{
 
116
Payee *item = ui_pay_entry_popover_get(box);
 
117
 
 
118
        return ((item != NULL) ? item->key : 0);
 
119
}
 
120
 
 
121
 
 
122
void
 
123
ui_pay_entry_popover_set_active(GtkBox *box, guint32 key)
 
124
{
 
125
GtkWidget *entry;
 
126
 
 
127
        DB( g_print ("ui_pay_comboboxentry_set_active()\n") );
 
128
 
 
129
        entry = container_get_nth(box, 0);
 
130
        if( entry != NULL && GTK_IS_ENTRY(entry) )
 
131
        {
 
132
        Payee *item = da_pay_get(key);
 
133
 
 
134
                ui_gtk_entry_set_text(GTK_WIDGET(entry), item != NULL ? item->name : "");
 
135
        }
 
136
}
 
137
 
 
138
 
 
139
static void 
 
140
ui_pay_entry_popover_cb_row_activated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
 
141
{
 
142
GtkTreeSelection *treeselection;
 
143
GtkTreeModel *model;
 
144
GtkTreeIter iter;
 
145
GtkEntry *entry = user_data;
 
146
 
 
147
        if( GTK_IS_ENTRY(entry) )
 
148
        {
 
149
                treeselection = gtk_tree_view_get_selection(tree_view);
 
150
                if( gtk_tree_selection_get_selected(treeselection, &model, &iter) )
 
151
                {
 
152
                gchar *item;
 
153
 
 
154
                        gtk_tree_model_get(model, &iter, 0, &item, -1);
 
155
                        gtk_entry_set_text(GTK_ENTRY(user_data), item);
 
156
                        g_free(item);                   
 
157
                }
 
158
        }
 
159
}
 
160
 
 
161
 
 
162
static void
 
163
ui_pay_entry_popover_populate(GtkListStore *store)
 
164
{
 
165
GHashTableIter hiter;
 
166
gpointer key, value;
 
167
 
 
168
        g_hash_table_iter_init (&hiter, GLOBALS->h_pay);
 
169
        while (g_hash_table_iter_next (&hiter, &key, &value))
 
170
        {
 
171
        Payee *pay = value;
 
172
 
 
173
                gtk_list_store_insert_with_values(GTK_LIST_STORE(store), NULL, -1,
 
174
                        0, pay->name, -1);
 
175
        }
 
176
 
 
177
        gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
 
178
 
 
179
}
 
180
 
 
181
 
 
182
static void
 
183
ui_pay_entry_popover_function (GtkEditable *editable, gpointer user_data)
 
184
{
 
185
 
 
186
        g_print("text changed to %s\n", gtk_entry_get_text(GTK_ENTRY(editable)) );
 
187
        
 
188
 
 
189
 
 
190
}
 
191
 
 
192
 
 
193
static gint
 
194
ui_pay_entry_popover_compare_func (GtkTreeModel *model, GtkTreeIter  *a, GtkTreeIter  *b, gpointer      userdata)
 
195
{
 
196
gint retval = 0;
 
197
gchar *name1, *name2;
 
198
 
 
199
    gtk_tree_model_get(model, a, 0, &name1, -1);
 
200
    gtk_tree_model_get(model, b, 0, &name2, -1);
 
201
 
 
202
        retval = hb_string_utf8_compare(name1, name2);
 
203
 
 
204
    g_free(name2);
 
205
    g_free(name1);
 
206
 
 
207
        return retval;
 
208
  }
 
209
 
 
210
 
 
211
static void 
 
212
ui_pay_entry_popover_destroy( GtkWidget *widget, gpointer user_data )
 
213
{
 
214
 
 
215
    g_print ("[pay entry popover] destroy\n");
 
216
 
 
217
}
 
218
 
 
219
 
 
220
GtkWidget *
 
221
ui_pay_entry_popover_new(GtkWidget *label)
 
222
{
 
223
GtkWidget *mainbox, *box, *entry, *menubutton, *image, *popover, *scrollwin, *treeview;
 
224
GtkListStore *store;
 
225
GtkEntryCompletion *completion;
 
226
 
 
227
    g_print ("[pay entry popover] new\n");
 
228
 
 
229
        mainbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
 
230
        gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(mainbox)), GTK_STYLE_CLASS_LINKED);
 
231
        
 
232
        entry = gtk_entry_new();
 
233
        gtk_box_pack_start(GTK_BOX(mainbox), entry, TRUE, TRUE, 0);
 
234
 
 
235
        menubutton = gtk_menu_button_new ();
 
236
        //data->MB_template = menubutton;
 
237
        image = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
 
238
        gtk_container_add(GTK_CONTAINER(menubutton), image);
 
239
        //gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton), GTK_ARROW_DOWN );
 
240
        //gtk_widget_set_halign (menubutton, GTK_ALIGN_END);
 
241
        gtk_box_pack_start(GTK_BOX(mainbox), menubutton, FALSE, FALSE, 0);
 
242
        
 
243
    completion = gtk_entry_completion_new ();
 
244
 
 
245
        gtk_entry_set_completion (GTK_ENTRY (entry), completion);
 
246
        g_object_unref(completion);
 
247
        
 
248
        store = gtk_list_store_new (1,
 
249
                G_TYPE_STRING
 
250
                );
 
251
 
 
252
        gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), ui_pay_entry_popover_compare_func, NULL, NULL);
 
253
 
 
254
        ui_pay_entry_popover_populate(store);
 
255
 
 
256
        
 
257
    gtk_entry_completion_set_model (completion, GTK_TREE_MODEL(store));
 
258
        g_object_unref(store);
 
259
 
 
260
        gtk_entry_completion_set_text_column (completion, 0);
 
261
 
 
262
        gtk_widget_show_all(mainbox);
 
263
 
 
264
 
 
265
        box = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_MEDIUM);
 
266
        scrollwin = gtk_scrolled_window_new(NULL,NULL);
 
267
        gtk_box_pack_start(GTK_BOX(box), scrollwin, TRUE, TRUE, 0);
 
268
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN);
 
269
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
 
270
        //gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrollwin), HB_MINHEIGHT_LIST);
 
271
        treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store));
 
272
        gtk_container_add(GTK_CONTAINER(scrollwin), GTK_WIDGET(treeview));
 
273
        gtk_widget_show_all(box);
 
274
 
 
275
        //gtk_widget_set_can_focus(GTK_WIDGET(treeview), FALSE);
 
276
 
 
277
GtkCellRenderer *renderer;
 
278
  GtkTreeViewColumn *column;
 
279
        
 
280
  renderer = gtk_cell_renderer_text_new ();
 
281
  column = gtk_tree_view_column_new_with_attributes (NULL,
 
282
                                                     renderer,
 
283
                                                     "text",
 
284
                                                     0,
 
285
                                                     NULL);
 
286
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
 
287
 
 
288
 
 
289
        gtk_tree_view_set_hover_selection(GTK_TREE_VIEW(treeview), TRUE);
 
290
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
 
291
        gtk_tree_view_set_activate_on_single_click(GTK_TREE_VIEW(treeview), TRUE);
 
292
 
 
293
        
 
294
        //gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_BROWSE);
 
295
        
 
296
        
 
297
        popover = create_popover (menubutton, box, GTK_POS_BOTTOM);
 
298
        gtk_widget_set_size_request (popover, HB_MINWIDTH_LIST, HB_MINHEIGHT_LIST);
 
299
 
 
300
        gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton), popover);
 
301
 
 
302
        // connect our dispose function
 
303
        g_signal_connect (entry, "destroy", G_CALLBACK (ui_pay_entry_popover_destroy), NULL);
 
304
 
 
305
        g_signal_connect_after (entry  , "changed", G_CALLBACK (ui_pay_entry_popover_function), NULL);
 
306
 
 
307
        g_signal_connect (treeview, "row-activated", G_CALLBACK (ui_pay_entry_popover_cb_row_activated), entry);
 
308
        g_signal_connect_swapped(treeview, "row-activated", G_CALLBACK(gtk_popover_popdown), popover);
 
309
        //g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), "changed", G_CALLBACK (ui_pay_entry_popover_cb_selection), entry);
 
310
        //g_signal_connect_swapped(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), "changed", G_CALLBACK(gtk_popover_popdown), popover);
 
311
 
 
312
        
 
313
        if(label)
 
314
                gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry);
 
315
 
 
316
        //gtk_widget_set_size_request(comboboxentry, HB_MINWIDTH_LIST, -1);
 
317
 
 
318
        return mainbox;
 
319
}
 
320
 
 
321
 
 
322
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
 
323
 
 
324
 
 
325
/**
 
326
 * ui_pay_comboboxentry_add:
 
327
 *
 
328
 * Add a single element (useful for dynamics add)
 
329
 *
 
330
 * Return value: --
 
331
 *
 
332
 */
 
333
static void
 
334
ui_pay_comboboxentry_add(GtkComboBox *entry_box, Payee *pay)
 
335
{
 
336
        if( pay->name != NULL )
 
337
        {
 
338
        GtkTreeModel *model;
 
339
        GtkTreeIter  iter;
 
340
 
 
341
                model = gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box));
 
342
 
 
343
                gtk_list_store_append (GTK_LIST_STORE(model), &iter);
 
344
                gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pay->name, -1);
 
345
        }
 
346
}
 
347
 
 
348
 
 
349
 
42
350
/**
43
351
 * ui_pay_comboboxentry_get_key_add_new:
44
352
 *
135
443
        return FALSE;
136
444
}
137
445
 
138
 
/**
139
 
 * ui_pay_comboboxentry_add:
140
 
 *
141
 
 * Add a single element (useful for dynamics add)
142
 
 *
143
 
 * Return value: --
144
 
 *
145
 
 */
146
 
void
147
 
ui_pay_comboboxentry_add(GtkComboBox *entry_box, Payee *pay)
148
 
{
149
 
        if( pay->name != NULL )
150
 
        {
151
 
        GtkTreeModel *model;
152
 
        GtkTreeIter  iter;
153
 
 
154
 
                model = gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box));
155
 
 
156
 
                gtk_list_store_append (GTK_LIST_STORE(model), &iter);
157
 
                gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pay->name, -1);
158
 
        }
159
 
}
160
446
 
161
447
static void
162
448
ui_pay_comboboxentry_populate_ghfunc(gpointer key, gpointer value, struct payPopContext *ctx)
173
459
        }
174
460
}
175
461
 
176
 
/**
177
 
 * ui_pay_comboboxentry_populate:
178
 
 *
179
 
 * Populate the list and completion
180
 
 *
181
 
 * Return value: --
182
 
 *
183
 
 */
184
 
void
185
 
ui_pay_comboboxentry_populate(GtkComboBox *entry_box, GHashTable *hash)
186
 
{
187
 
        ui_pay_comboboxentry_populate_except(entry_box, hash, -1);
188
 
}
189
462
 
190
 
void
 
463
//not used except here
 
464
static void
191
465
ui_pay_comboboxentry_populate_except(GtkComboBox *entry_box, GHashTable *hash, guint except_key)
192
466
{
193
467
GtkTreeModel *model;
223
497
        
224
498
}
225
499
 
 
500
/**
 
501
 * ui_pay_comboboxentry_populate:
 
502
 *
 
503
 * Populate the list and completion
 
504
 *
 
505
 * Return value: --
 
506
 *
 
507
 */
 
508
void
 
509
ui_pay_comboboxentry_populate(GtkComboBox *entry_box, GHashTable *hash)
 
510
{
 
511
        ui_pay_comboboxentry_populate_except(entry_box, hash, -1);
 
512
}
 
513
 
226
514
 
227
515
static gint
228
516
ui_pay_comboboxentry_compare_func (GtkTreeModel *model, GtkTreeIter  *a, GtkTreeIter  *b, gpointer      userdata)
317
605
                                            ui_pay_comboboxentry_test,
318
606
                                            NULL, NULL);
319
607
 
320
 
 
321
 
 
322
608
        gtk_entry_set_completion (GTK_ENTRY (gtk_bin_get_child(GTK_BIN (comboboxentry))), completion);
323
609
 
324
610
        g_object_unref(store);
659
945
 
660
946
        // column: name
661
947
        renderer = gtk_cell_renderer_text_new ();
 
948
 
662
949
        g_object_set(renderer, 
663
950
                "ellipsize", PANGO_ELLIPSIZE_END,
664
951
            "ellipsize-set", TRUE,
 
952
                //taken from nemo, not exactly a resize to content, but good compromise
 
953
            "width-chars", 40,
665
954
            NULL);
666
955
 
667
956
        column = gtk_tree_view_column_new();
668
 
        gtk_tree_view_column_set_title(column, _("Name"));
 
957
        gtk_tree_view_column_set_title(column, _("Payee"));
669
958
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
670
959
        gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_name_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL);
671
960
        gtk_tree_view_column_set_alignment (column, 0.5);
 
961
        gtk_tree_view_column_set_resizable(column, TRUE);
672
962
        gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST);
673
963
        gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_NAME);
674
 
        gtk_tree_view_column_set_resizable(column, TRUE);
675
964
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
676
965
 
677
966
        // column: usage
696
985
                g_object_set(renderer, 
697
986
                        "ellipsize", PANGO_ELLIPSIZE_END,
698
987
                        "ellipsize-set", TRUE,
 
988
                        //taken from nemo, not exactly a resize to content, but good compromise
 
989
                        "width-chars", 40,
699
990
                        NULL);
700
991
 
701
992
                column = gtk_tree_view_column_new();
702
 
                gtk_tree_view_column_set_title(column, _("Default category"));
 
993
                gtk_tree_view_column_set_title(column, _("Category"));
703
994
                gtk_tree_view_column_pack_start(column, renderer, TRUE);
704
995
                gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_defcat_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL);
705
996
                gtk_tree_view_column_set_alignment (column, 0.5);
 
997
                gtk_tree_view_column_set_resizable(column, TRUE);
706
998
                gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_DEFCAT);
707
 
                gtk_tree_view_column_set_resizable(column, TRUE);
708
999
                gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
709
1000
        }
710
1001
 
 
1002
 
 
1003
        /* empty */
 
1004
        column = gtk_tree_view_column_new();
 
1005
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
 
1006
 
 
1007
 
711
1008
        gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview), ui_pay_listview_search_equal_func, NULL, NULL);
712
1009
 
713
1010
        // treeview attribute