X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank;a=blobdiff_plain;f=src%2Fui-payee.c;h=8ffb18ce0bff8b15b76373628a09bcbeda76135e;hp=65fe36f974401954265763d21ec5f4b53f93492d;hb=HEAD;hpb=b84403141a4c3a32a594800eb3fcabdc856461f8 diff --git a/src/ui-payee.c b/src/ui-payee.c index 65fe36f..8ffb18c 100644 --- a/src/ui-payee.c +++ b/src/ui-payee.c @@ -1,5 +1,5 @@ /* HomeBank -- Free, easy, personal accounting for everyone. - * Copyright (C) 1995-2017 Maxime DOYEN + * Copyright (C) 1995-2019 Maxime DOYEN * * This file is part of HomeBank. * @@ -38,33 +38,315 @@ extern struct Preferences *PREFS; /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + +static GtkWidget * +container_get_nth(GtkBox *container, gint nth) +{ +GList *lchild, *list; +GtkWidget *child; + + if(!GTK_IS_CONTAINER(container)) + return NULL; + + lchild = list = gtk_container_get_children (GTK_CONTAINER(container)); + child = g_list_nth_data (list, nth); + g_list_free(lchild); + + return child; +} + + +GtkWidget * +ui_pay_entry_popover_get_entry(GtkBox *box) +{ + return container_get_nth(box, 0); +} + + +Payee +*ui_pay_entry_popover_get(GtkBox *box) +{ +GtkWidget *entry; +gchar *name; +Payee *item = NULL; + + DB( g_print ("ui_pay_entry_popover_get()\n") ); + + entry = container_get_nth(box, 0); + if( entry != NULL && GTK_IS_ENTRY(entry) ) + { + name = (gchar *)gtk_entry_get_text(GTK_ENTRY (entry)); + item = da_pay_get_by_name(name); + } + return item; +} + + +guint32 +ui_pay_entry_popover_get_key_add_new(GtkBox *box) +{ +Payee *item = ui_pay_entry_popover_get(box); +GtkWidget *entry; +GtkTreeModel *store; + + if( item == NULL ) + { + /* automatic add */ + //todo: check prefs + ask the user here 1st time + entry = container_get_nth(box, 0); + if( entry != NULL && GTK_IS_ENTRY(entry) ) + { + item = da_pay_malloc(); + item->name = g_strdup(gtk_entry_get_text(GTK_ENTRY (entry))); + da_pay_append(item); + + store = gtk_entry_completion_get_model(gtk_entry_get_completion(GTK_ENTRY(entry))); + if( store ) + gtk_list_store_insert_with_values(GTK_LIST_STORE(store), NULL, -1, + 0, item->name, -1); + } + } + return item->key; +} + + +guint32 +ui_pay_entry_popover_get_key(GtkBox *box) +{ +Payee *item = ui_pay_entry_popover_get(box); + + return ((item != NULL) ? item->key : 0); +} + + +void +ui_pay_entry_popover_set_active(GtkBox *box, guint32 key) +{ +GtkWidget *entry; + + DB( g_print ("ui_pay_comboboxentry_set_active()\n") ); + + entry = container_get_nth(box, 0); + if( entry != NULL && GTK_IS_ENTRY(entry) ) + { + Payee *item = da_pay_get(key); + + ui_gtk_entry_set_text(GTK_WIDGET(entry), item != NULL ? item->name : ""); + } +} + + +static void +ui_pay_entry_popover_cb_row_activated(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) +{ +GtkTreeSelection *treeselection; +GtkTreeModel *model; +GtkTreeIter iter; +GtkEntry *entry = user_data; + + if( GTK_IS_ENTRY(entry) ) + { + treeselection = gtk_tree_view_get_selection(tree_view); + if( gtk_tree_selection_get_selected(treeselection, &model, &iter) ) + { + gchar *item; + + gtk_tree_model_get(model, &iter, 0, &item, -1); + gtk_entry_set_text(GTK_ENTRY(user_data), item); + g_free(item); + } + } +} + + +static void +ui_pay_entry_popover_populate(GtkListStore *store) +{ +GHashTableIter hiter; +gpointer key, value; + + g_hash_table_iter_init (&hiter, GLOBALS->h_pay); + while (g_hash_table_iter_next (&hiter, &key, &value)) + { + Payee *pay = value; + + gtk_list_store_insert_with_values(GTK_LIST_STORE(store), NULL, -1, + 0, pay->name, -1); + } + + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); + +} + + +static void +ui_pay_entry_popover_function (GtkEditable *editable, gpointer user_data) +{ + + g_print("text changed to %s\n", gtk_entry_get_text(GTK_ENTRY(editable)) ); + + + +} + + +static gint +ui_pay_entry_popover_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) +{ +gint retval = 0; +gchar *name1, *name2; + + gtk_tree_model_get(model, a, 0, &name1, -1); + gtk_tree_model_get(model, b, 0, &name2, -1); + + retval = hb_string_utf8_compare(name1, name2); + + g_free(name2); + g_free(name1); + + return retval; + } + + +static void +ui_pay_entry_popover_destroy( GtkWidget *widget, gpointer user_data ) +{ + + g_print ("[pay entry popover] destroy\n"); + +} + + +GtkWidget * +ui_pay_entry_popover_new(GtkWidget *label) +{ +GtkWidget *mainbox, *box, *entry, *menubutton, *image, *popover, *scrollwin, *treeview; +GtkListStore *store; +GtkEntryCompletion *completion; + + g_print ("[pay entry popover] new\n"); + + mainbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET(mainbox)), GTK_STYLE_CLASS_LINKED); + + entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(mainbox), entry, TRUE, TRUE, 0); + + menubutton = gtk_menu_button_new (); + //data->MB_template = menubutton; + image = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(menubutton), image); + //gtk_menu_button_set_direction (GTK_MENU_BUTTON(menubutton), GTK_ARROW_DOWN ); + //gtk_widget_set_halign (menubutton, GTK_ALIGN_END); + gtk_box_pack_start(GTK_BOX(mainbox), menubutton, FALSE, FALSE, 0); + + completion = gtk_entry_completion_new (); + + gtk_entry_set_completion (GTK_ENTRY (entry), completion); + g_object_unref(completion); + + store = gtk_list_store_new (1, + G_TYPE_STRING + ); + + gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), ui_pay_entry_popover_compare_func, NULL, NULL); + + ui_pay_entry_popover_populate(store); + + + gtk_entry_completion_set_model (completion, GTK_TREE_MODEL(store)); + g_object_unref(store); + + gtk_entry_completion_set_text_column (completion, 0); + + gtk_widget_show_all(mainbox); + + + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_MEDIUM); + scrollwin = gtk_scrolled_window_new(NULL,NULL); + gtk_box_pack_start(GTK_BOX(box), scrollwin, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + //gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrollwin), HB_MINHEIGHT_LIST); + treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(store)); + gtk_container_add(GTK_CONTAINER(scrollwin), GTK_WIDGET(treeview)); + gtk_widget_show_all(box); + + //gtk_widget_set_can_focus(GTK_WIDGET(treeview), FALSE); + +GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + renderer = gtk_cell_renderer_text_new (); + column = gtk_tree_view_column_new_with_attributes (NULL, + renderer, + "text", + 0, + NULL); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + + + gtk_tree_view_set_hover_selection(GTK_TREE_VIEW(treeview), TRUE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); + gtk_tree_view_set_activate_on_single_click(GTK_TREE_VIEW(treeview), TRUE); + + + //gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), GTK_SELECTION_BROWSE); + + + popover = create_popover (menubutton, box, GTK_POS_BOTTOM); + gtk_widget_set_size_request (popover, HB_MINWIDTH_LIST, HB_MINHEIGHT_LIST); + + gtk_menu_button_set_popover(GTK_MENU_BUTTON(menubutton), popover); + + // connect our dispose function + g_signal_connect (entry, "destroy", G_CALLBACK (ui_pay_entry_popover_destroy), NULL); + + g_signal_connect_after (entry , "changed", G_CALLBACK (ui_pay_entry_popover_function), NULL); + + g_signal_connect (treeview, "row-activated", G_CALLBACK (ui_pay_entry_popover_cb_row_activated), entry); + g_signal_connect_swapped(treeview, "row-activated", G_CALLBACK(gtk_popover_popdown), popover); + //g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), "changed", G_CALLBACK (ui_pay_entry_popover_cb_selection), entry); + //g_signal_connect_swapped(gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)), "changed", G_CALLBACK(gtk_popover_popdown), popover); + + + if(label) + gtk_label_set_mnemonic_widget (GTK_LABEL(label), entry); + + //gtk_widget_set_size_request(comboboxentry, HB_MINWIDTH_LIST, -1); + + return mainbox; +} + + +/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + + /** - * ui_pay_comboboxentry_get_name: + * ui_pay_comboboxentry_add: * - * get the name of the active payee or -1 + * Add a single element (useful for dynamics add) * - * Return value: a new allocated name tobe freed with g_free + * Return value: -- * */ -gchar * -ui_pay_comboboxentry_get_name(GtkComboBox *entry_box) +static void +ui_pay_comboboxentry_add(GtkComboBox *entry_box, Payee *pay) { -gchar *cbname; -gchar *name = NULL; + if( pay->name != NULL ) + { + GtkTreeModel *model; + GtkTreeIter iter; - DB( g_print ("ui_pay_comboboxentry_get_name()\n") ); + model = gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box)); - cbname = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); - if( cbname != NULL) - { - name = g_strdup(cbname); - g_strstrip(name); + gtk_list_store_append (GTK_LIST_STORE(model), &iter); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pay->name, -1); } - - return name; } + /** * ui_pay_comboboxentry_get_key_add_new: * @@ -80,8 +362,7 @@ ui_pay_comboboxentry_get_key_add_new(GtkComboBox *entry_box) gchar *name; Payee *item; - name = ui_pay_comboboxentry_get_name(entry_box); - + name = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); item = da_pay_get_by_name(name); if( item == NULL ) { @@ -93,8 +374,6 @@ Payee *item; ui_pay_comboboxentry_add(entry_box, item); } - g_free(name); - return item->key; } @@ -112,9 +391,8 @@ ui_pay_comboboxentry_get_key(GtkComboBox *entry_box) gchar *name; Payee *item; - name = ui_pay_comboboxentry_get_name(entry_box); + name = (gchar *)gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box)))); item = da_pay_get_by_name(name); - g_free(name); if( item != NULL ) return item->key; @@ -143,41 +421,28 @@ ui_pay_comboboxentry_set_active(GtkComboBox *entry_box, guint32 key) { Payee *item; + DB( g_print ("ui_pay_comboboxentry_set_active()\n") ); + + DB( g_print("- key:%d\n", key) ); + if( key > 0 ) { item = da_pay_get(key); - if( item != NULL) + if( item != NULL ) { + DB( g_print("- set combo to '%s'\n", item->name) ); + gtk_entry_set_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box))), item->name); return TRUE; } } + + DB( g_print("- set combo to ''\n") ); + gtk_entry_set_text(GTK_ENTRY (gtk_bin_get_child(GTK_BIN (entry_box))), ""); return FALSE; } -/** - * ui_pay_comboboxentry_add: - * - * Add a single element (useful for dynamics add) - * - * Return value: -- - * - */ -void -ui_pay_comboboxentry_add(GtkComboBox *entry_box, Payee *pay) -{ - if( pay->name != NULL ) - { - GtkTreeModel *model; - GtkTreeIter iter; - - model = gtk_combo_box_get_model(GTK_COMBO_BOX(entry_box)); - - gtk_list_store_append (GTK_LIST_STORE(model), &iter); - gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, pay->name, -1); - } -} static void ui_pay_comboboxentry_populate_ghfunc(gpointer key, gpointer value, struct payPopContext *ctx) @@ -194,21 +459,9 @@ Payee *pay = value; } } -/** - * ui_pay_comboboxentry_populate: - * - * Populate the list and completion - * - * Return value: -- - * - */ -void -ui_pay_comboboxentry_populate(GtkComboBox *entry_box, GHashTable *hash) -{ - ui_pay_comboboxentry_populate_except(entry_box, hash, -1); -} -void +//not used except here +static void ui_pay_comboboxentry_populate_except(GtkComboBox *entry_box, GHashTable *hash, guint except_key) { GtkTreeModel *model; @@ -244,6 +497,20 @@ struct payPopContext ctx; } +/** + * ui_pay_comboboxentry_populate: + * + * Populate the list and completion + * + * Return value: -- + * + */ +void +ui_pay_comboboxentry_populate(GtkComboBox *entry_box, GHashTable *hash) +{ + ui_pay_comboboxentry_populate_except(entry_box, hash, -1); +} + static gint ui_pay_comboboxentry_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) @@ -281,6 +548,9 @@ gchar *name; else g_object_set(cell, "text", name, NULL); + //leak + g_free(name); + } /** @@ -335,8 +605,6 @@ GtkCellRenderer *renderer; ui_pay_comboboxentry_test, NULL, NULL); - - gtk_entry_set_completion (GTK_ENTRY (gtk_bin_get_child(GTK_BIN (comboboxentry))), completion); g_object_unref(store); @@ -398,17 +666,12 @@ gint retval = 0; case LST_DEFPAY_SORT_DEFCAT: { Category *c1, *c2; - gchar *name1, *name2; c1 = da_cat_get(entry1->kcat); c2 = da_cat_get(entry2->kcat); if( c1 != NULL && c2 != NULL ) { - name1 = da_cat_get_fullname(c1); - name2 = da_cat_get_fullname(c2); - retval = hb_string_utf8_compare(name1, name2); - g_free(name2); - g_free(name1); + retval = hb_string_utf8_compare(c1->fullname, c2->fullname); } } break; @@ -450,16 +713,13 @@ ui_pay_listview_defcat_cell_data_function (GtkTreeViewColumn *col, { Payee *entry; Category *cat; -gchar *fullname; gtk_tree_model_get(model, iter, LST_DEFPAY_DATAS, &entry, -1); cat = da_cat_get(entry->kcat); if( cat != NULL ) { - fullname = da_cat_get_fullname(cat); - g_object_set(renderer, "text", fullname, NULL); - g_free(fullname); + g_object_set(renderer, "text", cat->fullname, NULL); } else g_object_set(renderer, "text", "", NULL); @@ -487,7 +747,7 @@ gchar *string; name = entry->name; #if MYDEBUG - string = g_strdup_printf ("%d > %s [ft=%d]", entry->key, name, entry->filter); + string = g_strdup_printf ("%d > %s [ft=%d]", entry->key, name, entry->flt_select); g_object_set(renderer, "text", string, NULL); g_free(string); #else @@ -555,35 +815,55 @@ GtkTreeIter iter; } -static void ui_pay_listview_populate_ghfunc(gpointer key, gpointer value, GtkTreeModel *model) +struct PayListContext { + GtkTreeModel *model; + gchar *needle; +}; + + +static void ui_pay_listview_populate_ghfunc(gpointer key, gpointer value, struct PayListContext *context) { GtkTreeIter iter; Payee *item = value; - +gboolean hastext = FALSE; +gboolean insert = TRUE; + //DB( g_print(" populate: %p\n", key) ); + if( context->needle != NULL ) + hastext = (strlen(context->needle) >= 2) ? TRUE : FALSE; + + if(hastext) + { + insert = hb_string_utf8_strstr(item->name, context->needle, FALSE); + } + + if( insert == TRUE) + { + gtk_list_store_insert_with_values(GTK_LIST_STORE(context->model), &iter, -1, + LST_DEFPAY_TOGGLE , FALSE, + LST_DEFPAY_DATAS, item, + -1); + } - //gtk_list_store_append (GTK_LIST_STORE(model), &iter); - //gtk_list_store_set (GTK_LIST_STORE(model), &iter, - gtk_list_store_insert_with_values(GTK_LIST_STORE(model), &iter, -1, - LST_DEFPAY_TOGGLE , FALSE, - LST_DEFPAY_DATAS, item, - -1); } -void ui_pay_listview_populate(GtkWidget *view) -{ -GtkTreeModel *model; +void ui_pay_listview_populate(GtkWidget *treeview, gchar *needle) +{ +struct PayListContext context; + DB( g_print("ui_pay_listview_populate \n") ); - model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); - gtk_list_store_clear (GTK_LIST_STORE(model)); + context.model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); + context.needle = needle; + + gtk_list_store_clear (GTK_LIST_STORE(context.model)); //g_object_ref(model); /* Make sure the model stays with us after the tree view unrefs it */ //gtk_tree_view_set_model(GTK_TREE_VIEW(view), NULL); /* Detach model from view */ /* populate */ - g_hash_table_foreach(GLOBALS->h_pay, (GHFunc)ui_pay_listview_populate_ghfunc, model); + g_hash_table_foreach(GLOBALS->h_pay, (GHFunc)ui_pay_listview_populate_ghfunc, &context); //gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); /* Re-attach model to view */ //g_object_unref(model); @@ -665,19 +945,22 @@ GtkTreeViewColumn *column; // column: name renderer = gtk_cell_renderer_text_new (); + g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ellipsize-set", TRUE, + //taken from nemo, not exactly a resize to content, but good compromise + "width-chars", 40, NULL); column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Name")); + gtk_tree_view_column_set_title(column, _("Payee")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_name_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL); gtk_tree_view_column_set_alignment (column, 0.5); + gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_min_width(column, HB_MINWIDTH_LIST); gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_NAME); - gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); // column: usage @@ -702,18 +985,26 @@ GtkTreeViewColumn *column; g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, "ellipsize-set", TRUE, + //taken from nemo, not exactly a resize to content, but good compromise + "width-chars", 40, NULL); column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, _("Default category")); + gtk_tree_view_column_set_title(column, _("Category")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, ui_pay_listview_defcat_cell_data_function, GINT_TO_POINTER(LST_DEFPAY_DATAS), NULL); gtk_tree_view_column_set_alignment (column, 0.5); - gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_DEFCAT); gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_sort_column_id (column, LST_DEFPAY_SORT_DEFCAT); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); } + + /* empty */ + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column); + + gtk_tree_view_set_search_equal_func(GTK_TREE_VIEW(treeview), ui_pay_listview_search_equal_func, NULL, NULL); // treeview attribute @@ -757,7 +1048,7 @@ gboolean result; payee_delete_unused(); - ui_pay_listview_populate (data->LV_pay); + ui_pay_listview_populate (data->LV_pay, NULL); } } @@ -790,7 +1081,7 @@ gchar *error; } g_free( filename ); - ui_pay_listview_populate(data->LV_pay); + ui_pay_listview_populate(data->LV_pay, NULL); } } @@ -834,14 +1125,22 @@ gchar *name; name = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_name)); - if( payee_append_if_new(name, &item) ) + item = da_pay_malloc (); + item->name = g_strdup(name); + + g_strstrip(item->name); + + if( strlen(item->name) > 0 ) { - if( item ) { + if( da_pay_append(item) ) + { ui_pay_listview_add(GTK_TREE_VIEW(data->LV_pay), item); data->change++; } } - + else + da_pay_free (item); + gtk_entry_set_text(GTK_ENTRY(data->ST_name), ""); } @@ -930,7 +1229,9 @@ guint32 key; row++; label = make_label_widget(_("Pa_yment:")); gtk_grid_attach (GTK_GRID (group_grid), label, 0, row, 1, 1); - widget = make_paymode(label); + //5.2.4 we drop internal xfer here as it will disapear + //widget = make_paymode_nointxfer(label); + widget = make_paymode_nointxfer(label); NU_mode = widget; gtk_grid_attach (GTK_GRID (group_grid), widget, 1, row, 1, 1); @@ -1081,7 +1382,7 @@ GtkTreeIter iter; if(result == GTK_RESPONSE_OK) { GtkTreeModel *model; - Payee *payee; + Payee *newpay; guint dstpaykey; model = gtk_tree_view_get_model(GTK_TREE_VIEW(data->LV_pay)); @@ -1091,11 +1392,15 @@ GtkTreeIter iter; payee_move(srcpay->key, dstpaykey); + newpay = da_pay_get(dstpaykey); + + //#1771720: update count + newpay->usage_count += srcpay->usage_count; + srcpay->usage_count = 0; // add the new payee to listview - payee = da_pay_get(dstpaykey); - if(payee) - ui_pay_listview_add(GTK_TREE_VIEW(data->LV_pay), payee); + if(newpay) + ui_pay_listview_add(GTK_TREE_VIEW(data->LV_pay), newpay); // delete the old payee if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton)) ) @@ -1109,7 +1414,7 @@ GtkTreeIter iter; data->change++; - ui_pay_listview_populate(data->LV_pay); + ui_pay_listview_populate(data->LV_pay, NULL); } // cleanup and destroy @@ -1219,39 +1524,58 @@ GtkTreeIter iter; } +static void +ui_pay_manage_search_changed_cb (GtkWidget *widget, gpointer user_data) +{ +struct ui_pay_manage_dialog_data *data = user_data; +gchar *needle; + + DB( g_printf("\n[ui_pay_manage_dialog] search_changed_cb\n") ); + + needle = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_search)); + ui_pay_listview_populate(data->LV_pay, needle); +} + + GtkWidget *ui_pay_manage_dialog (void) { struct ui_pay_manage_dialog_data data; -GtkWidget *window, *content, *mainvbox, *bbox, *treeview, *scrollwin, *table; -GtkWidget *menu, *menuitem, *widget, *image; +GtkWidget *dialog, *content, *mainvbox, *box, *bbox, *treeview, *scrollwin, *table; +GtkWidget *menu, *menuitem, *widget, *image, *searchbar, *addreveal; gint w, h, row; - window = gtk_dialog_new_with_buttons (_("Manage Payees"), + dialog = gtk_dialog_new_with_buttons (_("Manage Payees"), GTK_WINDOW(GLOBALS->mainwindow), - 0, - _("_Close"), - GTK_RESPONSE_ACCEPT, + 0, + _("_Close"), GTK_RESPONSE_ACCEPT, NULL); - data.window = window; + /*dialog = g_object_new (GTK_TYPE_DIALOG, "use-header-bar", TRUE, NULL); + gtk_window_set_title (GTK_WINDOW (dialog), _("Manage Payees")); + gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW(GLOBALS->mainwindow)); + gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); + */ + //gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE); + + data.window = dialog; data.change = 0; - gtk_window_set_icon_name(GTK_WINDOW (window), ICONNAME_HB_PAYEE); + gtk_window_set_icon_name(GTK_WINDOW (dialog), ICONNAME_HB_PAYEE); //set a nice dialog size gtk_window_get_size(GTK_WINDOW(GLOBALS->mainwindow), &w, &h); - gtk_window_set_default_size (GTK_WINDOW(window), -1, h/PHI); + gtk_window_set_default_size (GTK_WINDOW(dialog), -1, h/PHI); - //store our window private data - g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data); - DB( g_print("(ui_pay_manage_dialog) window=%p, inst_data=%p\n", window, &data) ); + //store our dialog private data + g_object_set_data(G_OBJECT(dialog), "inst_data", (gpointer)&data); + DB( g_print("(ui_pay_manage_dialog) dialog=%p, inst_data=%p\n", dialog, &data) ); - g_signal_connect (window, "destroy", - G_CALLBACK (gtk_widget_destroyed), &window); + g_signal_connect (dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), &dialog); - //window contents - content = gtk_dialog_get_content_area(GTK_DIALOG (window)); + //dialog contents + content = gtk_dialog_get_content_area(GTK_DIALOG (dialog)); mainvbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_SMALL); gtk_box_pack_start (GTK_BOX (content), mainvbox, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER(mainvbox), SPACING_MEDIUM); @@ -1263,6 +1587,11 @@ gint w, h, row; gtk_box_pack_start (GTK_BOX (mainvbox), table, TRUE, TRUE, 0); row = 0; + bbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, SPACING_MEDIUM); + gtk_grid_attach (GTK_GRID (table), bbox, 0, row, 2, 1); + //test headerbar + //content = gtk_dialog_get_header_bar(GTK_DIALOG (dialog)); + menu = gtk_menu_new (); gtk_widget_set_halign (menu, GTK_ALIGN_END); @@ -1282,44 +1611,63 @@ gint w, h, row; g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (ui_pay_manage_dialog_delete_unused), &data); gtk_widget_show_all (menu); + widget = gtk_menu_button_new(); image = gtk_image_new_from_icon_name (ICONNAME_HB_BUTTON_MENU, GTK_ICON_SIZE_MENU); - - //gchar *thename; - //gtk_image_get_icon_name(image, &thename, NULL); - //g_print("the name is %s\n", thename); - g_object_set (widget, "image", image, "popup", GTK_MENU(menu), NULL); gtk_widget_set_halign (widget, GTK_ALIGN_END); - gtk_grid_attach (GTK_GRID (table), widget, 1, row, 1, 1); - - row++; - data.ST_name = gtk_entry_new (); - gtk_entry_set_placeholder_text(GTK_ENTRY(data.ST_name), _("new payee") ); - gtk_widget_set_hexpand (data.ST_name, TRUE); - gtk_grid_attach (GTK_GRID (table), data.ST_name, 0, row, 2, 1); - + gtk_box_pack_end(GTK_BOX (bbox), widget, FALSE, FALSE, 0); + //gtk_header_bar_pack_end(GTK_HEADER_BAR (content), widget); + + data.BT_search = gtk_toggle_button_new (); + image = gtk_image_new_from_icon_name (ICONNAME_SYSTEM_SEARCH, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON(data.BT_search), image); + gtk_box_pack_end(GTK_BOX (bbox), data.BT_search, FALSE, FALSE, 0); + //gtk_header_bar_pack_end(GTK_HEADER_BAR (content), data.BT_search); - //list + //search + list row++; + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + gtk_grid_attach (GTK_GRID (table), box, 0, row, 2, 1); + + searchbar = gtk_search_bar_new(); + gtk_container_add(GTK_CONTAINER(box), searchbar); + widget = make_search(); + data.ST_search = widget; + gtk_container_add (GTK_CONTAINER (searchbar), widget); + gtk_search_bar_connect_entry(GTK_SEARCH_BAR(searchbar), GTK_ENTRY(data.ST_search)); + gtk_search_bar_set_show_close_button(GTK_SEARCH_BAR(searchbar), TRUE); + scrollwin = gtk_scrolled_window_new(NULL,NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN); + gtk_container_add(GTK_CONTAINER(box), scrollwin); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrollwin), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrollwin), HB_MINHEIGHT_LIST); + gtk_widget_set_hexpand (scrollwin, TRUE); + gtk_widget_set_vexpand (scrollwin, TRUE); treeview = ui_pay_listview_new(FALSE, TRUE); data.LV_pay = treeview; gtk_container_add(GTK_CONTAINER(scrollwin), treeview); - gtk_widget_set_hexpand (scrollwin, TRUE); - gtk_widget_set_vexpand (scrollwin, TRUE); - gtk_grid_attach (GTK_GRID (table), scrollwin, 0, row, 2, 1); + row++; + addreveal = gtk_revealer_new (); + gtk_grid_attach (GTK_GRID (table), addreveal, 0, row, 2, 1); + data.ST_name = gtk_entry_new (); + gtk_entry_set_placeholder_text(GTK_ENTRY(data.ST_name), _("new payee") ); + gtk_widget_set_hexpand (data.ST_name, TRUE); + gtk_container_add(GTK_CONTAINER(addreveal), data.ST_name); + row++; bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START); gtk_box_set_spacing (GTK_BOX (bbox), SPACING_SMALL); gtk_grid_attach (GTK_GRID (table), bbox, 0, row, 2, 1); + data.BT_add = gtk_toggle_button_new_with_mnemonic(_("_Add")); + gtk_container_add (GTK_CONTAINER (bbox), data.BT_add); + + //todo: useless ? data.BT_edit = gtk_button_new_with_mnemonic(_("_Edit")); gtk_container_add (GTK_CONTAINER (bbox), data.BT_edit); @@ -1329,8 +1677,12 @@ gint w, h, row; data.BT_delete = gtk_button_new_with_mnemonic(_("_Delete")); gtk_container_add (GTK_CONTAINER (bbox), data.BT_delete); - + //connect all our signals + g_object_bind_property (data.BT_add, "active", addreveal, "reveal-child", G_BINDING_BIDIRECTIONAL); + g_object_bind_property (data.BT_search, "active", searchbar, "search-mode-enabled", G_BINDING_BIDIRECTIONAL); + + g_signal_connect (G_OBJECT (data.ST_search), "search-changed", G_CALLBACK (ui_pay_manage_search_changed_cb), &data); g_signal_connect (G_OBJECT (data.ST_name), "activate", G_CALLBACK (ui_pay_manage_dialog_add), NULL); g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_pay)), "changed", G_CALLBACK (ui_pay_manage_dialog_selection), NULL); @@ -1340,15 +1692,15 @@ gint w, h, row; g_signal_connect (G_OBJECT (data.BT_merge), "clicked", G_CALLBACK (ui_pay_manage_dialog_merge), NULL); g_signal_connect (G_OBJECT (data.BT_delete), "clicked", G_CALLBACK (ui_pay_manage_dialog_delete), NULL); - //setup, init and show window + //setup, init and show dialog payee_fill_usage(); - ui_pay_listview_populate(data.LV_pay); + ui_pay_listview_populate(data.LV_pay, NULL); ui_pay_manage_dialog_update(data.LV_pay, NULL); - gtk_widget_show_all (window); + gtk_widget_show_all (dialog); //wait for the user - gint result = gtk_dialog_run (GTK_DIALOG (window)); + gint result = gtk_dialog_run (GTK_DIALOG (dialog)); switch (result) { @@ -1362,12 +1714,10 @@ gint w, h, row; // cleanup and destroy - gtk_widget_destroy (window); + gtk_widget_destroy (dialog); GLOBALS->changes_count += data.change; return NULL; } - -