Revision: 1521
          http://geeqie.svn.sourceforge.net/geeqie/?rev=1521&view=rev
Author:   nadvornik
Date:     2009-03-13 09:03:06 +0000 (Fri, 13 Mar 2009)

Log Message:
-----------
fixed keyword to mark connection

Modified Paths:
--------------
    trunk/src/bar_keywords.c
    trunk/src/filedata.c
    trunk/src/filedata.h
    trunk/src/metadata.c
    trunk/src/metadata.h

Modified: trunk/src/bar_keywords.c
===================================================================
--- trunk/src/bar_keywords.c    2009-03-12 22:44:21 UTC (rev 1520)
+++ trunk/src/bar_keywords.c    2009-03-13 09:03:06 UTC (rev 1521)
@@ -150,26 +150,6 @@
        string_list_free(list);
 }
 
-static gchar *bar_pane_keywords_get_mark_text(const gchar *key)
-{
-       gint i;
-       static gchar buf[10];
-       
-       for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
-               {
-               FileDataGetMarkFunc get_mark_func;
-               FileDataSetMarkFunc set_mark_func;
-               gpointer data;
-               file_data_get_registered_mark_func(i, &get_mark_func, 
&set_mark_func, &data);
-               if (get_mark_func == meta_data_get_keyword_mark && strcmp(data, 
key) == 0) 
-                       {
-                       g_sprintf(buf, " %d ", i + 1);
-                       return buf;
-                       }
-               }
-       return " ... ";
-}
-
 gboolean bar_keyword_tree_expand_if_set(GtkTreeModel *model, GtkTreePath 
*path, GtkTreeIter *iter, gpointer data)
 {
        PaneKeywordsData *pkd = data;
@@ -412,53 +392,7 @@
        file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, 
NOTIFY_PRIORITY_LOW);
 }
 
-static void bar_pane_keywords_mark_edited(GtkCellRendererText *cell, const 
gchar *path, const gchar *text, gpointer data)
-{
-/*     PaneKeywordsData *pkd = data;
-       GtkTreeModel *store;
-       GtkTreeIter iter;
-       GtkTreePath *tpath;
-       gchar *key = NULL;
-       gint i;
-       FileDataGetMarkFunc get_mark_func;
-       FileDataSetMarkFunc set_mark_func;
-       gpointer mark_func_data;
 
-       file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
-
-       store = gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
-
-       tpath = gtk_tree_path_new_from_string(path);
-       gtk_tree_model_get_iter(store, &iter, tpath);
-       gtk_tree_path_free(tpath);
-
-       gtk_tree_model_get(store, &iter, FILTER_KEYWORD_COLUMN_TEXT, &key, -1);
-
-       for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
-               {
-               file_data_get_registered_mark_func(i, &get_mark_func, 
&set_mark_func, &mark_func_data);
-               if (get_mark_func == meta_data_get_keyword_mark && 
strcmp(mark_func_data, key) == 0) 
-                       {
-                       g_free(mark_func_data);
-                       file_data_register_mark_func(i, NULL, NULL, NULL);
-                       }
-               }
-
-       if (sscanf(text, " %d ", &i) &&i >=1 && i <= FILEDATA_MARKS_SIZE)
-               {
-               i--;
-               file_data_get_registered_mark_func(i, &get_mark_func, 
&set_mark_func, &mark_func_data);
-               if (get_mark_func == meta_data_get_keyword_mark && 
mark_func_data) g_free(mark_func_data); 
-               file_data_register_mark_func(i, meta_data_get_keyword_mark, 
meta_data_set_keyword_mark, g_strdup(key));
-               }
-
-       g_free(key);
-
-       file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, 
NOTIFY_PRIORITY_LOW);
-       bar_pane_keywords_update(pkd);
-*/
-}
-
 /*
  *-------------------------------------------------------------------
  * dnd
@@ -872,6 +806,35 @@
        bar_pane_keywords_edit_dialog(pkd, FALSE);
 }
 
+static void bar_pane_keywords_connect_mark_cb(GtkWidget *menu_widget, gpointer 
data)
+{
+       PaneKeywordsData *pkd = data;
+
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+
+       GtkTreeModel *keyword_tree;
+       GtkTreeIter kw_iter;
+
+       gint mark = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu_widget), 
"mark")) - 1;
+
+       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 (!pkd->click_tpath) return;
+        if (!gtk_tree_model_get_iter(model, &iter, pkd->click_tpath)) return;
+
+       
gtk_tree_model_filter_convert_iter_to_child_iter(GTK_TREE_MODEL_FILTER(model), 
&kw_iter, &iter);
+
+       file_data_unregister_notify_func(bar_pane_keywords_notify_cb, pkd);
+
+       meta_data_connect_mark_with_keyword(keyword_tree, &kw_iter, mark);
+
+       file_data_register_notify_func(bar_pane_keywords_notify_cb, pkd, 
NOTIFY_PRIORITY_LOW);
+//     bar_pane_keywords_update(pkd);
+}
+
+
 static void bar_pane_keywords_delete_cb(GtkWidget *menu_widget, gpointer data)
 {
        PaneKeywordsData *pkd = data;
@@ -906,21 +869,51 @@
        if (pkd->click_tpath)
                {
                /* for the entry */
+               GtkWidget *item;
+               GtkWidget *submenu;
+               gchar *text;
+               gchar *mark;
+               gint i;
+               
                GtkTreeModel *model = 
gtk_tree_view_get_model(GTK_TREE_VIEW(pkd->keyword_treeview));
                
                GtkTreeIter iter;
                 gtk_tree_model_get_iter(model, &iter, pkd->click_tpath);
                gchar *name;
                
-               gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, 
&name, -1);
+               gtk_tree_model_get(model, &iter, FILTER_KEYWORD_COLUMN_NAME, 
&name,
+                                                FILTER_KEYWORD_COLUMN_MARK, 
&mark, -1);
                
-               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_edit_dialog_cb), pkd);
-               menu_item_add_stock(menu, del, GTK_STOCK_DELETE, 
G_CALLBACK(bar_pane_keywords_delete_cb), pkd);
+               text = g_strdup_printf(_("Edit \"%s\""), name);
+               menu_item_add_stock(menu, text, GTK_STOCK_EDIT, 
G_CALLBACK(bar_pane_keywords_edit_dialog_cb), pkd);
+               g_free(text);
+               text = g_strdup_printf(_("Delete \"%s\""), name);
+               menu_item_add_stock(menu, text, GTK_STOCK_DELETE, 
G_CALLBACK(bar_pane_keywords_delete_cb), pkd);
+               g_free(text);
+               
+               submenu = gtk_menu_new();
+               for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
+                       {
+                       text = g_strdup_printf(_("Mark %d"), i + 1);
+                       item = menu_item_add(submenu, text, 
G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd);
+                       g_object_set_data(G_OBJECT(item), "mark", 
GINT_TO_POINTER(i + 1));
+                       g_free(text);
+                       }
+
+               text = g_strdup_printf(_("Connect \"%s\" to mark"), name);
+               item = menu_item_add(menu, text, NULL, NULL);
+               gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+               g_free(text);
+               
+               if (mark && mark[0])
+                       {
+                       text = g_strdup_printf(_("Disconnect \"%s\" from mark 
%s"), name, mark);
+                       menu_item_add_stock(menu, text, GTK_STOCK_DELETE, 
G_CALLBACK(bar_pane_keywords_connect_mark_cb), pkd);
+                       g_free(text);
+                       }
+
                menu_item_add_divider(menu);
-               g_free(conf);
-               g_free(del);
+               g_free(mark);
                g_free(name);
                }
        /* for the pane */
@@ -971,27 +964,7 @@
        g_free(pkd);
 }
 
-static GtkTreeModel *create_marks_list(void)
-{
-       GtkListStore *model;
-       GtkTreeIter iter;
-       gint i;
 
-       /* create list store */
-       model = gtk_list_store_new(1, G_TYPE_STRING);
-       for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
-               {
-               gchar str[10];
-               g_sprintf(str, " %d ", i + 1);
-               gtk_list_store_append(model, &iter);
-               gtk_list_store_set(model, &iter, 0, str, -1);
-               }
-       gtk_list_store_append(model, &iter);
-       gtk_list_store_set(model, &iter, 0, " ... ", -1);
-       return GTK_TREE_MODEL(model);
-}
-
-
 GtkWidget *bar_pane_keywords_new(const gchar *title, const gchar *key, 
gboolean expanded)
 {
        PaneKeywordsData *pkd;
@@ -1070,20 +1043,13 @@
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
 
-       renderer = gtk_cell_renderer_combo_new();
-       g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE,
-                                        "model", create_marks_list(),
-                                        "text-column", 0,
-                                        "has-entry", FALSE,
-                                        NULL);
-
+       renderer = gtk_cell_renderer_text_new();
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
+
        gtk_tree_view_column_add_attribute(column, renderer, "text", 
FILTER_KEYWORD_COLUMN_MARK);
-       g_signal_connect(renderer, "edited",
-                         G_CALLBACK (bar_pane_keywords_mark_edited), pkd);
+
        gtk_tree_view_append_column(GTK_TREE_VIEW(pkd->keyword_treeview), 
column);
 
-
        column = gtk_tree_view_column_new();
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
        renderer = gtk_cell_renderer_toggle_new();

Modified: trunk/src/filedata.c
===================================================================
--- trunk/src/filedata.c        2009-03-12 22:44:21 UTC (rev 1520)
+++ trunk/src/filedata.c        2009-03-13 09:03:06 UTC (rev 1521)
@@ -1090,6 +1090,7 @@
 static FileDataGetMarkFunc file_data_get_mark_func[FILEDATA_MARKS_SIZE];
 static FileDataSetMarkFunc file_data_set_mark_func[FILEDATA_MARKS_SIZE];
 static gpointer file_data_mark_func_data[FILEDATA_MARKS_SIZE];
+static GDestroyNotify file_data_destroy_mark_func[FILEDATA_MARKS_SIZE];
 
 gboolean file_data_get_mark(FileData *fd, gint n)
 {
@@ -1189,20 +1190,23 @@
        file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
 }
 
-gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc 
get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data)
+gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc 
get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data, GDestroyNotify 
notify)
 {
        if (n < 0 || n >= FILEDATA_MARKS_SIZE) return FALSE;
+       
+       if (file_data_destroy_mark_func[n]) 
(file_data_destroy_mark_func[n])(file_data_mark_func_data[n]);
                
        file_data_get_mark_func[n] = get_mark_func;
         file_data_set_mark_func[n] = set_mark_func;
         file_data_mark_func_data[n] = data;
-        
+        file_data_destroy_mark_func[n] = notify;
+
         if (get_mark_func)
-               {
-               /* this effectively changes all known files */
-               g_hash_table_foreach(file_data_pool, 
file_data_notify_mark_func, NULL);
-               }
-        
+               {
+               /* this effectively changes all known files */
+               g_hash_table_foreach(file_data_pool, 
file_data_notify_mark_func, NULL);
+               }
+
         return TRUE;
 }
 

Modified: trunk/src/filedata.h
===================================================================
--- trunk/src/filedata.h        2009-03-12 22:44:21 UTC (rev 1520)
+++ trunk/src/filedata.h        2009-03-13 09:03:06 UTC (rev 1521)
@@ -65,7 +65,7 @@
 
 typedef gboolean (* FileDataGetMarkFunc)(FileData *fd, gint n, gpointer data);
 typedef gboolean (* FileDataSetMarkFunc)(FileData *fd, gint n, gboolean value, 
gpointer data);
-gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc 
get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data);
+gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc 
get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data, GDestroyNotify 
notify);
 void file_data_get_registered_mark_func(gint n, FileDataGetMarkFunc 
*get_mark_func, FileDataSetMarkFunc *set_mark_func, gpointer *data);
 
 

Modified: trunk/src/metadata.c
===================================================================
--- trunk/src/metadata.c        2009-03-12 22:44:21 UTC (rev 1520)
+++ trunk/src/metadata.c        2009-03-13 09:03:06 UTC (rev 1521)
@@ -627,68 +627,93 @@
 
 gboolean meta_data_get_keyword_mark(FileData *fd, gint n, gpointer data)
 {
+       /* FIXME: do not use global keyword_tree */
+       GList *path = data;
        GList *keywords;
        gboolean found = FALSE;
        keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
        if (keywords)
                {
-               GList *work = keywords;
+               GtkTreeIter iter;
+               if (keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, 
path) &&
+                   keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, 
keywords))
+                       found = TRUE;
 
-               while (work)
-                       {
-                       gchar *kw = work->data;
-                       work = work->next;
-                       
-                       if (strcmp(kw, data) == 0)
-                               {
-                               found = TRUE;
-                               break;
-                               }
-                       }
-               string_list_free(keywords);
                }
        return found;
 }
 
 gboolean meta_data_set_keyword_mark(FileData *fd, gint n, gboolean value, 
gpointer data)
 {
+       GList *path = data;
        GList *keywords = NULL;
-       gboolean found = FALSE;
-       gboolean changed = FALSE;
-       GList *work;
+       GtkTreeIter iter;
+       
+       if (!keyword_tree_get_iter(GTK_TREE_MODEL(keyword_tree), &iter, path)) 
return FALSE;
+
        keywords = metadata_read_list(fd, KEYWORD_KEY, METADATA_PLAIN);
 
-       work = keywords;
+       if (!!keyword_tree_is_set(GTK_TREE_MODEL(keyword_tree), &iter, 
keywords) != !!value)
+               {
+               if (value) 
+                       {
+                       keyword_tree_set(GTK_TREE_MODEL(keyword_tree), &iter, 
&keywords);
+                       }
+               else
+                       {
+                       keyword_tree_reset(GTK_TREE_MODEL(keyword_tree), &iter, 
&keywords);
+                       }
+               metadata_write_list(fd, KEYWORD_KEY, keywords);
+               }
 
-       while (work)
+       string_list_free(keywords);
+       return TRUE;
+}
+
+
+
+void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, 
GtkTreeIter *kw_iter, gint mark)
+{
+
+       FileDataGetMarkFunc get_mark_func;
+       FileDataSetMarkFunc set_mark_func;
+       gpointer mark_func_data;
+
+       gint i;
+
+       for (i = 0; i < FILEDATA_MARKS_SIZE; i++)
                {
-               gchar *kw = work->data;
-               
-               if (strcmp(kw, data) == 0)
+               file_data_get_registered_mark_func(i, &get_mark_func, 
&set_mark_func, &mark_func_data);
+               if (get_mark_func == meta_data_get_keyword_mark) 
                        {
-                       found = TRUE;
-                       if (!value) 
+                       GtkTreeIter old_kw_iter;
+                       GList *old_path = mark_func_data;
+                       
+                       if (keyword_tree_get_iter(keyword_tree, &old_kw_iter, 
old_path) && 
+                           (i == mark || /* release any previous connection of 
given mark */
+                            keyword_compare(keyword_tree, &old_kw_iter, 
kw_iter) == 0)) /* or given keyword */
                                {
-                               changed = TRUE;
-                               keywords = g_list_delete_link(keywords, work);
-                               g_free(kw);
+                               file_data_register_mark_func(i, NULL, NULL, 
NULL, NULL);
+                               
gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), &old_kw_iter, 
KEYWORD_COLUMN_MARK, "", -1);
                                }
-                       break;
                        }
-               work = work->next;
                }
-       if (value && !found) 
+
+
+       if (mark >= 0 && mark < FILEDATA_MARKS_SIZE)
                {
-               changed = TRUE;
-               keywords = g_list_append(keywords, g_strdup(data));
+               GList *path;
+               gchar *mark_str;
+               path = keyword_tree_get_path(keyword_tree, kw_iter);
+               file_data_register_mark_func(mark, meta_data_get_keyword_mark, 
meta_data_set_keyword_mark, path, (GDestroyNotify)string_list_free);
+               
+               mark_str = g_strdup_printf("%d", mark + 1);
+               gtk_tree_store_set(GTK_TREE_STORE(keyword_tree), kw_iter, 
KEYWORD_COLUMN_MARK, mark_str, -1);
+               g_free(mark_str);
                }
-       
-       if (changed) metadata_write_list(fd, KEYWORD_KEY, keywords);
-
-       string_list_free(keywords);
-       return TRUE;
 }
 
+
 /*
  *-------------------------------------------------------------------
  * keyword tree

Modified: trunk/src/metadata.h
===================================================================
--- trunk/src/metadata.h        2009-03-12 22:44:21 UTC (rev 1520)
+++ trunk/src/metadata.h        2009-03-13 09:03:06 UTC (rev 1521)
@@ -51,6 +51,9 @@
 
 extern GtkTreeStore *keyword_tree;
 
+void meta_data_connect_mark_with_keyword(GtkTreeModel *keyword_tree, 
GtkTreeIter *kw_iter, gint mark);
+
+
 gchar *keyword_get_name(GtkTreeModel *keyword_tree, GtkTreeIter *iter);
 gchar *keyword_get_casefold(GtkTreeModel *keyword_tree, GtkTreeIter *iter);
 gboolean keyword_get_is_keyword(GtkTreeModel *keyword_tree, GtkTreeIter *iter);


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

Reply via email to