Mercurial > geeqie.yaz
diff src/bar_keywords.c @ 1421:130054d9dd8a
added a dialog for editing keyword tree
author | nadvornik |
---|---|
date | Thu, 12 Mar 2009 21:27:13 +0000 |
parents | 6ce1f7171d48 |
children | 80462be81410 |
line wrap: on
line diff
--- a/src/bar_keywords.c Thu Mar 12 21:06:37 2009 +0000 +++ b/src/bar_keywords.c Thu Mar 12 21:27:13 2009 +0000 @@ -120,6 +120,19 @@ gchar *key; }; +typedef struct _ConfDialogData ConfDialogData; +struct _ConfDialogData +{ + PaneKeywordsData *pkd; + GtkTreePath *click_tpath; + + /* dialog parts */ + GenericDialog *gd; + GtkWidget *edit_widget; + gboolean is_keyword; + + gboolean edit_existing; +}; static GList *bar_list = NULL; @@ -446,6 +459,12 @@ */ } +/* + *------------------------------------------------------------------- + * dnd + *------------------------------------------------------------------- + */ + static GtkTargetEntry bar_pane_keywords_drag_types[] = { { TARGET_APP_KEYWORD_PATH_STRING, GTK_TARGET_SAME_WIDGET, TARGET_APP_KEYWORD_PATH }, @@ -664,8 +683,193 @@ return TRUE; } -static void bar_pane_keywords_conf_dialog_cb(GtkWidget *menu_widget, gpointer data) +/* + *------------------------------------------------------------------- + * edit dialog + *------------------------------------------------------------------- + */ + +static void bar_pane_keywords_edit_destroy_cb(GtkWidget *widget, gpointer data) +{ + ConfDialogData *cdd = data; + gtk_tree_path_free(cdd->click_tpath); + g_free(cdd); +} + + +static void bar_pane_keywords_edit_cancel_cb(GenericDialog *gd, gpointer data) +{ +} + + +static void bar_pane_keywords_edit_ok_cb(GenericDialog *gd, gpointer data) +{ + ConfDialogData *cdd = data; + PaneKeywordsData *pkd = cdd->pkd; + GtkTreeModel *model; + + GtkTreeModel *keyword_tree; + GtkTreeIter kw_iter; + + gboolean have_dest = FALSE; + + GList *keywords; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); + keyword_tree = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model)); + + if (cdd->click_tpath) + { + GtkTreeIter iter; + if (gtk_tree_model_get_iter(model, &iter, cdd->click_tpath)) + { + gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), &kw_iter, &iter); + have_dest = TRUE; + } + } + + if (cdd->edit_existing && !have_dest) return; + + keywords = keyword_list_pull(cdd->edit_widget); + + if (cdd->edit_existing) + { + if (keywords && keywords->data) /* there should be one keyword */ + { + keyword_set(GTK_TREE_STORE(keyword_tree), &kw_iter, keywords->data, cdd->is_keyword); + } + } + else + { + GList *work = keywords; + + while (work) + { + GtkTreeIter add; + if (have_dest) + { + gtk_tree_store_insert_after(GTK_TREE_STORE(keyword_tree), &add, NULL, &kw_iter); + } + else + { + gtk_tree_store_append(GTK_TREE_STORE(keyword_tree), &add, NULL); + have_dest = TRUE; + } + kw_iter = add; + keyword_set(GTK_TREE_STORE(keyword_tree), &kw_iter, work->data, cdd->is_keyword); + work = work->next; + } + } + string_list_free(keywords); +} + +static void bar_pane_keywords_conf_set_helper(GtkWidget *widget, gpointer data) +{ + ConfDialogData *cdd = data; + cdd->is_keyword = FALSE; +} + +static void bar_pane_keywords_conf_set_kw(GtkWidget *widget, gpointer data) { + ConfDialogData *cdd = data; + cdd->is_keyword = TRUE; +} + + + +static void bar_pane_keywords_edit_dialog(PaneKeywordsData *pkd, gboolean edit_existing) +{ + ConfDialogData *cdd; + GenericDialog *gd; + GtkWidget *table; + GtkWidget *group; + GtkWidget *button; + + gchar *name = NULL; + gboolean is_keyword = TRUE; + + + if (edit_existing && pkd->click_tpath) + { + GtkTreeModel *model; + GtkTreeIter iter; + model = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview)); + + if (gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) + { + gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, &name, + FILTER_KEYWORD_COLUMN_IS_KEYWORD, &is_keyword, -1); + } + else + { + return; + } + } + + if (edit_existing && !name) return; + + + cdd = g_new0(ConfDialogData, 1); + cdd->pkd =pkd; + cdd->click_tpath = pkd->click_tpath; + pkd->click_tpath = NULL; + cdd->is_keyword = is_keyword; + cdd->edit_existing = edit_existing; + + cdd->gd = gd = generic_dialog_new(name ? _("Edit keyword") : _("Add keywords"), "keyword_edit", + pkd->widget, TRUE, + bar_pane_keywords_edit_cancel_cb, cdd); + g_signal_connect(G_OBJECT(gd->dialog), "destroy", + G_CALLBACK(bar_pane_keywords_edit_destroy_cb), cdd); + + + generic_dialog_add_message(gd, NULL, name ? _("Configure keyword") : _("Add keyword"), NULL); + + generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, + bar_pane_keywords_edit_ok_cb, TRUE); + + table = pref_table_new(gd->vbox, 3, 1, FALSE, TRUE); + pref_table_label(table, 0, 0, _("Keyword:"), 1.0); + cdd->edit_widget = gtk_entry_new(); + gtk_widget_set_size_request(cdd->edit_widget, 300, -1); + if (name) gtk_entry_set_text(GTK_ENTRY(cdd->edit_widget), name); + gtk_table_attach_defaults(GTK_TABLE(table), cdd->edit_widget, 1, 2, 0, 1); + /* here could eventually be a text view instead of entry */ + generic_dialog_attach_default(gd, cdd->edit_widget); + gtk_widget_show(cdd->edit_widget); + + group = pref_group_new(gd->vbox, FALSE, _("Keyword type:"), GTK_ORIENTATION_VERTICAL); + + button = pref_radiobutton_new(group, NULL, _("Active keyword"), + (cdd->is_keyword), + G_CALLBACK(bar_pane_keywords_conf_set_kw), cdd); + button = pref_radiobutton_new(group, button, _("Helper"), + (!cdd->is_keyword), + G_CALLBACK(bar_pane_keywords_conf_set_helper), cdd); + g_free(name); + + gtk_widget_show(gd->dialog); +} + + + + +/* + *------------------------------------------------------------------- + * popup menu + *------------------------------------------------------------------- + */ + +static void bar_pane_keywords_edit_dialog_cb(GtkWidget *menu_widget, gpointer data) +{ + PaneKeywordsData *pkd = data; + bar_pane_keywords_edit_dialog(pkd, TRUE); +} + +static void bar_pane_keywords_add_dialog_cb(GtkWidget *menu_widget, gpointer data) +{ + PaneKeywordsData *pkd = data; + bar_pane_keywords_edit_dialog(pkd, FALSE); } static void bar_pane_keywords_delete_cb(GtkWidget *menu_widget, gpointer data) @@ -710,9 +914,9 @@ gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, &name, -1); - gchar *conf = g_strdup_printf(_("Configure \"%s\""), name); + gchar *conf = g_strdup_printf(_("Edit \"%s\""), name); gchar *del = g_strdup_printf(_("Delete \"%s\""), name); - menu_item_add_stock(menu, conf, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_conf_dialog_cb), pkd); + menu_item_add_stock(menu, conf, GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_edit_dialog_cb), pkd); menu_item_add_stock(menu, del, GTK_STOCK_DELETE, G_CALLBACK(bar_pane_keywords_delete_cb), pkd); menu_item_add_divider(menu); g_free(conf); @@ -720,8 +924,7 @@ g_free(name); } /* for the pane */ -// menu_item_add_stock(menu, _("Add entry"), GTK_STOCK_ADD, G_CALLBACK(bar_pane_keywords_conf_dialog_cb), pkd); -// menu_item_add_check(menu, _("Show hidden entries"), pkd->show_all, G_CALLBACK(bar_pane_keywords_toggle_show_all_cb), pkd); + menu_item_add_stock(menu, _("Add keyword"), GTK_STOCK_EDIT, G_CALLBACK(bar_pane_keywords_add_dialog_cb), pkd); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME); } @@ -738,6 +941,11 @@ return FALSE; } +/* + *------------------------------------------------------------------- + * init + *------------------------------------------------------------------- + */ void bar_pane_keywords_close(GtkWidget *bar) {