Revision: 1517
http://geeqie.svn.sourceforge.net/geeqie/?rev=1517&view=rev
Author: nadvornik
Date: 2009-03-12 21:27:13 +0000 (Thu, 12 Mar 2009)
Log Message:
-----------
added a dialog for editing keyword tree
Modified Paths:
--------------
trunk/src/bar_keywords.c
Modified: trunk/src/bar_keywords.c
===================================================================
--- trunk/src/bar_keywords.c 2009-03-12 21:06:37 UTC (rev 1516)
+++ trunk/src/bar_keywords.c 2009-03-12 21:27:13 UTC (rev 1517)
@@ -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,7 +459,13 @@
*/
}
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
static GtkTargetEntry bar_pane_keywords_drag_types[] = {
{ TARGET_APP_KEYWORD_PATH_STRING, GTK_TARGET_SAME_WIDGET,
TARGET_APP_KEYWORD_PATH },
{ "text/plain", 0, TARGET_TEXT_PLAIN }
@@ -664,10 +683,195 @@
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)
{
PaneKeywordsData *pkd = 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)
{
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
Geeqie-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geeqie-svn