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