/* HomeBank -- Free, easy, personal accounting for everyone.
- * Copyright (C) 1995-2016 Maxime DOYEN
+ * Copyright (C) 1995-2019 Maxime DOYEN
*
* This file is part of HomeBank.
*
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
+
+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:
*
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 )
{
ui_pay_comboboxentry_add(entry_box, item);
}
- g_free(name);
-
return item->key;
}
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;
{
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)
}
}
-/**
- * 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;
}
+/**
+ * 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)
else
g_object_set(cell, "text", name, NULL);
+ //leak
+ g_free(name);
+
}
/**
ui_pay_comboboxentry_test,
NULL, NULL);
-
-
gtk_entry_set_completion (GTK_ENTRY (gtk_bin_get_child(GTK_BIN (comboboxentry))), completion);
g_object_unref(store);
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;
{
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);
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
}
-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);
// 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
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
payee_delete_unused();
- ui_pay_listview_populate (data->LV_pay);
+ ui_pay_listview_populate (data->LV_pay, NULL);
}
}
{
struct ui_pay_manage_dialog_data *data = user_data;
gchar *filename = NULL;
+gchar *error;
//data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(GTK_WIDGET(widget), GTK_TYPE_WINDOW)), "inst_data");
{
DB( g_print(" + filename is %s\n", filename) );
- payee_load_csv(filename);
- //todo: add error message
+ if( !payee_load_csv(filename, &error) )
+ {
+ ui_dialog_msg_infoerror(GTK_WINDOW(data->window), GTK_MESSAGE_ERROR,
+ _("File format error"),
+ _("The CSV file must contains the exact numbers of column,\nseparated by a semi-colon, please see the help for more details.")
+ );
+ }
g_free( filename );
- ui_pay_listview_populate(data->LV_pay);
+ ui_pay_listview_populate(data->LV_pay, NULL);
}
}
name = (gchar *)gtk_entry_get_text(GTK_ENTRY(data->ST_name));
- item = payee_append_if_new(name);
- if( item )
+ item = da_pay_malloc ();
+ item->name = g_strdup(name);
+
+ g_strstrip(item->name);
+
+ if( strlen(item->name) > 0 )
{
- ui_pay_listview_add(GTK_TREE_VIEW(data->LV_pay), item);
- data->change++;
+ 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), "");
}
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);
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));
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)) )
data->change++;
- ui_pay_listview_populate(data->LV_pay);
+ ui_pay_listview_populate(data->LV_pay, NULL);
}
// cleanup and destroy
}
+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);
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);
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);
- //list
+ 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);
+
+ //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);
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);
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)
{
// cleanup and destroy
- gtk_widget_destroy (window);
+ gtk_widget_destroy (dialog);
GLOBALS->changes_count += data.change;
return NULL;
}
-
-