Author: abrander
Date: 2009-12-21 11:10:55 +0100 (Mon, 21 Dec 2009)
New Revision: 2831

Modified:
   trunk/src/rs-actions.c
   trunk/src/rs-library.c
   trunk/src/rs-library.h
Log:
Added (and using) rs_library_tag_entry_new().

Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c      2009-12-21 01:44:30 UTC (rev 2830)
+++ trunk/src/rs-actions.c      2009-12-21 10:10:55 UTC (rev 2831)
@@ -648,36 +648,17 @@
 
 ACTION(tag_photo)
 {
-       RSLibrary *library = rs_library_get_singleton();
        GtkWidget *popup = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        GtkWidget *label = gtk_label_new("Tag:");
-       GtkWidget *input = gtk_entry_new();
        GtkWidget *box = gtk_hbox_new(FALSE, 2);
+       GtkWidget *entry = rs_library_tag_entry_new(rs_library_get_singleton());
 
        gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0);
-       gtk_box_pack_start(GTK_BOX(box), input, FALSE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(box), entry, FALSE, TRUE, 0);
        gtk_container_add(GTK_CONTAINER(popup), box);
        gtk_widget_show_all(popup);
 
-       GList *tags = rs_library_find_tag(library, "");
-       GtkEntryCompletion *completion = gtk_entry_completion_new();
-       GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING);
-       GtkTreeIter iter;
-       
-       gint n;
-       for (n = 0; n < g_list_length(tags); n++)
-       {
-               gtk_list_store_append(store, &iter);
-               gtk_list_store_set(store, &iter, 0, (gchar *) 
g_list_nth_data(tags, n), -1);
-       }
-       gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store));
-       gtk_entry_completion_set_text_column(completion, 0);
-       gtk_entry_set_completion (GTK_ENTRY(input), completion);
-
-       g_list_free(tags);
-
-        g_signal_connect ((gpointer) input, "activate",
-                         G_CALLBACK(tag_photo_input_changed), rs);
+       g_signal_connect(entry, "activate", 
G_CALLBACK(tag_photo_input_changed), rs);
 }
 
 ACTION(previous_photo)

Modified: trunk/src/rs-library.c
===================================================================
--- trunk/src/rs-library.c      2009-12-21 01:44:30 UTC (rev 2830)
+++ trunk/src/rs-library.c      2009-12-21 10:10:55 UTC (rev 2831)
@@ -733,7 +733,7 @@
 
        cb_carrier *carrier = g_new(cb_carrier, 1);
        GtkWidget *box = gtk_vbox_new(FALSE, 0);
-       tag_search_entry = gtk_entry_new();
+       tag_search_entry = rs_library_tag_entry_new(library);
 
        carrier->library = library;
        carrier->store = store;
@@ -745,6 +745,108 @@
        return box;
 }
 
+GtkWidget *
+rs_library_tag_entry_new(RSLibrary *library)
+{
+       g_assert(RS_IS_LIBRARY(library));
+
+       gboolean
+       selected(GtkEntryCompletion *completion, GtkTreeModel *model, 
GtkTreeIter *iter, gpointer user_data)
+       {
+               GtkEntry *entry = 
GTK_ENTRY(gtk_entry_completion_get_entry(completion));
+               gchar *i;
+               gchar *current_text, *new_text;
+               gchar *tag;
+               gchar *target;
+
+               gtk_tree_model_get (model, iter, 0, &tag, -1);
+               current_text = g_strdup(gtk_entry_get_text(entry));
+
+               /* Try to find the last tag entered */
+               target = strrchr(current_text, ' ');
+               if (target)
+                       target++;
+               else
+                       target = current_text;
+
+               /* End the string just as the last tag starts */
+               *target = '\0';
+
+               /* Append selected tag */
+               new_text = g_strconcat(current_text, tag, NULL);
+
+               gtk_entry_set_text(entry, new_text);
+               gtk_editable_set_position(GTK_EDITABLE(entry), -1);
+
+               g_free(current_text);
+               g_free(new_text);
+
+               return TRUE;
+       }
+
+       gboolean
+       match(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter 
*iter, gpointer user_data)
+       {
+               gboolean found = FALSE;
+               GtkTreeModel *model;
+               const gchar *needle;
+               gchar *needle_normalized;
+               gchar *needle_case_normalized;
+               gchar *tag;
+               gchar *tag_normalized;
+               gchar *tag_case_normalized;
+
+               /* Look for last tag if found */
+               needle = strrchr(key, ' ');
+               if (needle)
+                       needle += 1;
+               else
+                       needle = key;
+
+               needle_normalized = g_utf8_normalize(needle, -1, 
G_NORMALIZE_ALL);
+               needle_case_normalized = g_utf8_casefold(needle_normalized, -1);
+
+               model = gtk_entry_completion_get_model (completion);
+               gtk_tree_model_get (model, iter, 0, &tag, -1);
+               tag_normalized = g_utf8_normalize(tag, -1, G_NORMALIZE_ALL);
+               tag_case_normalized = g_utf8_casefold(tag_normalized, -1);
+
+               if (g_str_has_prefix(tag_case_normalized, 
needle_case_normalized))
+                       found = TRUE;
+
+               g_free(tag_normalized);
+
+               return found;
+       }
+
+       GtkWidget *entry = gtk_entry_new();
+       GtkEntryCompletion *completion = gtk_entry_completion_new();
+       GtkListStore *store = gtk_list_store_new(1, G_TYPE_STRING);
+       GList *all_tags = rs_library_find_tag(library, "");
+       GtkTreeIter iter;
+
+       GList *node;
+
+       for (node = g_list_first(all_tags); node != NULL; node = 
g_list_next(node))
+       {
+               gchar *tag = node->data;
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, 0, tag, -1);
+
+               g_free(tag);
+       }
+
+       gtk_entry_completion_set_model(completion, GTK_TREE_MODEL(store));
+       gtk_entry_completion_set_text_column(completion, 0);
+       gtk_entry_completion_set_match_func(completion, match, NULL, NULL);
+       g_signal_connect(completion, "match-selected", G_CALLBACK(selected), 
NULL);
+       gtk_entry_set_completion (GTK_ENTRY(entry), completion);
+
+       g_list_free(all_tags);
+
+       return entry;
+}
+
 gboolean
 rs_library_set_tag_search(gchar *str)
 {

Modified: trunk/src/rs-library.h
===================================================================
--- trunk/src/rs-library.h      2009-12-21 01:44:30 UTC (rev 2830)
+++ trunk/src/rs-library.h      2009-12-21 10:10:55 UTC (rev 2831)
@@ -54,6 +54,7 @@
 GList *rs_library_photo_tags(RSLibrary *library, const gchar *photo, const 
gboolean autotag);
 GList *rs_library_find_tag(RSLibrary *library, const gchar *tag);
 GtkWidget *rs_library_toolbox_new(RSLibrary *library, RSStore *store);
+GtkWidget *rs_library_tag_entry_new(RSLibrary *library);
 gboolean rs_library_set_tag_search(gchar *str);
 
 G_END_DECLS


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to