? src/tracker-gui/.tracker-gui.c.swp ? src/tracker-gui/Makefile.in ? src/tracker-gui/tracker.gladep Index: src/tracker-gui/tracker-gui.c =================================================================== RCS file: /cvs/gnome/tracker/src/tracker-gui/tracker-gui.c,v retrieving revision 1.2 diff -u -p -r1.2 tracker-gui.c --- src/tracker-gui/tracker-gui.c 13 Sep 2006 22:55:05 -0000 1.2 +++ src/tracker-gui/tracker-gui.c 14 Sep 2006 01:50:29 -0000 @@ -18,55 +18,70 @@ * Boston, MA 02111-1307, USA. */ -#include "sexy-icon-entry.h" +#include #include #include #include +#include "sexy-icon-entry.h" #include "../libtracker/tracker.h" +#define MAX_SEARCH_RESULTS 20 + +static void +fill_services_combo_box (GtkComboBox *); + +static void +on_search (GtkWidget *, gpointer); + +static void +on_search_results (gchar **, GError *, gpointer); + static void -fill_service_combobox_cb (gpointer, gpointer, gpointer); +on_search_results_changed (GtkIconView *, gpointer); -static gchar *service_icons[12][2] = { - { "Applications", "application-x-executable" }, - { "Conversations", "face-smile-big" }, - { "Contacts", "x-office-address-book" }, - { "Development Files", "applications-development" }, - { "Documents", "x-office-document" }, - { "Emails", "email" }, - { "Files", "system-file-manager" }, - { "Images", "image-x-generic" }, - { "Music", "audio-x-generic" }, - { "Text Files", "text-x-generic" }, - { "Videos", "video-x-generic" }, - { NULL, NULL } +typedef struct { + gchar *service; + gchar *icon_name; + ServiceType service_type; +} service_info_t; + +static service_info_t services[13] = { + { "Files", "system-file-manager", SERVICE_FILES }, + { "Folders", "folder", SERVICE_FOLDERS }, + { "Applications", "application-x-executable", SERVICE_APPLICATIONS }, + { "Conversations", "face-smile-big", SERVICE_CONVERSATIONS }, + { "Contacts", "x-office-address-book", SERVICE_CONTACTS }, + { "Development Files", "applications-development", SERVICE_DEVELOPMENT_FILES }, + { "Documents", "x-office-document", SERVICE_DOCUMENTS }, + { "Emails", "email", SERVICE_EMAILS }, + { "Images", "image-x-generic", SERVICE_IMAGES }, + { "Music", "audio-x-generic", SERVICE_MUSIC }, + { "Text Files", "text-x-generic", SERVICE_TEXT_FILES }, + { "Videos", "video-x-generic", SERVICE_VIDEOS }, + { NULL, NULL, -1 } }; int main (int argc, char *argv[]) { - GladeXML *glade; - GtkWidget *main_window; - GtkWidget *details_text_view; - GtkWidget *search_entry; - GtkTextBuffer *details_text_buffer; - GtkComboBox *service_combo; - GtkListStore *service_store; - GtkCellRenderer *cell; - GError *error; - - TrackerClient *client; - GHashTable *services; - + GladeXML *glade; + GtkWidget *main_window; + GtkWidget *details_text_view; + GtkWidget *search_entry; + GtkWidget *search_button; + GtkWidget *iview; + GtkListStore *results_store; + GtkTextBuffer *details_text_buffer; + GtkComboBox *service_combo; gtk_init (&argc, &argv); - client = tracker_connect (FALSE); +#if 0 if (!client) { g_print ("Could not initialise Tracker - exiting...\n"); return 1; } - +#endif /*Glade stuff*/ @@ -84,6 +99,8 @@ int main (int argc, char *argv[]) main_window = glade_xml_get_widget (glade, "main_window"); search_entry = glade_xml_get_widget (glade, "search_entry"); + search_button = glade_xml_get_widget (glade, "search_button"); + iview = glade_xml_get_widget (glade, "iconview_results"); details_text_view = glade_xml_get_widget (glade,"details_text_view"); details_text_buffer = gtk_text_buffer_new (NULL); @@ -92,26 +109,20 @@ int main (int argc, char *argv[]) sexy_icon_entry_add_clear_button (SEXY_ICON_ENTRY (search_entry)); service_combo = GTK_COMBO_BOX (glade_xml_get_widget (glade, "combobox_services")); - service_store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING); - - gtk_combo_box_set_model (service_combo, GTK_TREE_MODEL (service_store)); - - cell = gtk_cell_renderer_pixbuf_new (); - gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT (service_combo), cell, FALSE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (service_combo), cell, "pixbuf", 0); - - cell = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (service_combo), cell, TRUE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (service_combo), cell, "text", 1); - - error = NULL; - services = tracker_get_services (client, TRUE, &error); - printf("%d services\n", g_hash_table_size (services)); - g_hash_table_foreach (services, fill_service_combobox_cb, service_combo); + fill_services_combo_box (service_combo); + results_store = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING); + gtk_icon_view_set_column_spacing (iview, 48); + gtk_icon_view_set_model (iview, results_store); + gtk_icon_view_set_pixbuf_column (iview, 0); + gtk_icon_view_set_text_column (iview, 1); + g_object_set_data (G_OBJECT (iview), "prev_signal", -1); + g_object_set_data (G_OBJECT (iview), "next_signal", -1); /*Signals*/ g_signal_connect (G_OBJECT (main_window), "destroy", G_CALLBACK (gtk_main_quit), NULL); + g_signal_connect (G_OBJECT (search_button), "clicked", G_CALLBACK (on_search), glade); + g_signal_connect (G_OBJECT (iview), "selection-changed", G_CALLBACK (on_search_results_changed), glade); /*Test*/ gtk_text_buffer_set_text(details_text_buffer, "Hello world!", -1); @@ -123,38 +134,195 @@ int main (int argc, char *argv[]) return 0; } -void fill_service_combobox_cb (gpointer key, gpointer value, gpointer user_data) +void fill_services_combo_box (GtkComboBox *combo) { - GtkComboBox *combo; - GtkListStore *store; - GdkPixbuf *pixbuf = NULL; - GtkTreeIter iter; - GtkIconTheme *theme; - guint i; - GError *error = NULL; + GtkListStore *store; + GtkCellRenderer *cell; + GdkPixbuf *pixbuf; + GtkTreeIter iter; + GtkIconTheme *theme; + GError *error = NULL; + service_info_t *service; theme = gtk_icon_theme_get_default (); - if (strcmp (key, "Other Files") == 0) { - return; - } + store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING); + gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store)); + + cell = gtk_cell_renderer_pixbuf_new (); + gtk_cell_layout_pack_start ( GTK_CELL_LAYOUT (combo), cell, FALSE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), cell, "pixbuf", 0); + + cell = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), cell, "text", 1); + + for (service = services; service->service; ++service) { + pixbuf = gtk_icon_theme_load_icon (theme, service->icon_name, + GTK_ICON_SIZE_MENU, + GTK_ICON_LOOKUP_USE_BUILTIN, + &error); + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, pixbuf, 1, service->service, -1); + } + gtk_combo_box_set_active (combo, 0); +} + +void +start_search (GladeXML *glade, gint offset) +{ + GtkWidget *search_entry; + GtkWidget *service_combo; + GtkWidget *iview; + const gchar *query; + TrackerClient *client; + gint service_idx; + + client = tracker_connect (FALSE); + + search_entry = glade_xml_get_widget (glade, "search_entry"); + service_combo = glade_xml_get_widget (glade, "combobox_services"); + iview = glade_xml_get_widget (glade, "iconview_results"); + assert (iview); + /* gtk_icon_view_unselect_all (iview); */ + service_idx = gtk_combo_box_get_active (GTK_COMBO_BOX (service_combo)); + query = gtk_entry_get_text (GTK_ENTRY(search_entry)); + g_object_set_data (G_OBJECT (iview), "offset", offset); + tracker_search_text_async (client, -1, services[service_idx].service_type, + query, offset, MAX_SEARCH_RESULTS + offset + 1, FALSE, on_search_results, + glade); + + printf("%s\n", query); +} + +void +on_search (GtkWidget *button, gpointer user_data) +{ + GladeXML *glade; + glade = GLADE_XML (user_data); + start_search (glade, 0); +} + +void +on_search_previous (GtkWidget *button, gpointer user_data) +{ + GladeXML *glade; + GtkWidget *iview; + gint offset; + + glade = GLADE_XML (user_data); + iview = glade_xml_get_widget (glade, "iconview_results"); + offset = (gint) g_object_get_data (G_OBJECT (iview), "offset"); + + start_search (glade, offset - MAX_SEARCH_RESULTS); +} + +void +on_search_next (GtkWidget *button, gpointer user_data) +{ + GladeXML *glade; + GtkWidget *iview; + gint offset; + + glade = GLADE_XML (user_data); + iview = glade_xml_get_widget (glade, "iconview_results"); + offset = (gint) g_object_get_data (G_OBJECT (iview), "offset"); + + start_search (glade, offset + MAX_SEARCH_RESULTS); +} - for(i = 0; i < 11; i++) { - if (strcmp (key, service_icons[i][0]) == 0) { - pixbuf = gtk_icon_theme_load_icon (theme, service_icons[i][1], - GTK_ICON_SIZE_MENU, - GTK_ICON_LOOKUP_USE_BUILTIN, - &error); - break; - } - } - - combo = GTK_COMBO_BOX (user_data); - store = gtk_combo_box_get_model (combo); - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, pixbuf, 1, key, -1); +void +on_search_results (gchar **results, GError *error, gpointer user_data) +{ + GladeXML *glade; + GtkWidget *iview; + GtkWidget *button; + GdkPixbuf *pixbuf; + GtkIconTheme *theme; + GtkListStore *store; + GtkTreeIter iter; + + gchar **p; + gint offset; + gint idx; + gulong signal_id; + + glade = GLADE_XML (user_data); + iview = glade_xml_get_widget (glade, "iconview_results"); + offset = (gint) g_object_get_data (G_OBJECT (iview), "offset"); + + store = gtk_icon_view_get_model (iview); + + theme = gtk_icon_theme_get_default (); + pixbuf = gtk_icon_theme_load_icon (theme, "image-loading", + 32 /*GTK_ICON_SIZE_MENU*/, + GTK_ICON_LOOKUP_USE_BUILTIN, + &error); + printf("offset=%d\n",offset); + idx = 0; + gtk_list_store_clear (store); + for (p = results; *p && idx < MAX_SEARCH_RESULTS; ++p,++idx) { + gchar *basename = g_path_get_basename (*p); + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, pixbuf, 1, basename, 2, *p, -1); + g_free (basename); + g_print ("%d: %s\n", offset+idx, *p); - if (strcmp (key, "Files") == 0) { - gtk_combo_box_set_active_iter (combo, &iter); } + + button = glade_xml_get_widget (glade, "button_previous"); + signal_id = (gulong) g_object_get_data (G_OBJECT (iview), "prev_signal"); + if (signal_id != -1) + g_signal_handler_disconnect (G_OBJECT (button), signal_id); + if (offset > 0) { + /* initialize the previous results button */ + gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE); + signal_id = g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (on_search_previous), user_data); + g_object_set_data (G_OBJECT (iview), "prev_signal", signal_id); + } + else { + gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); + g_object_set_data (G_OBJECT (iview), "prev_signal", -1); + } + + button = glade_xml_get_widget (glade, "button_next"); + signal_id = (gulong) g_object_get_data (G_OBJECT (iview), "next_signal"); + if (signal_id != -1) + g_signal_handler_disconnect (G_OBJECT (button), signal_id); + if (idx == MAX_SEARCH_RESULTS && *p) { + /* initialize the next results button */ + gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE); + signal_id = g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (on_search_next), user_data); + g_object_set_data (G_OBJECT (iview), "next_signal", signal_id); + } + else { + gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE); + g_object_set_data (G_OBJECT (iview), "next_signal", -1); + } + +} + +void +on_search_results_changed (GtkIconView *iview, gpointer user_data) +{ + GladeXML *glade; + GtkListStore *store; + gchar *fullpath; + GList *selected; + GtkTreeIter iter; + GValue value = { 0, }; + GtkTreePath *path; + + glade = GLADE_XML (user_data); + + store = gtk_icon_view_get_model (iview); + selected = gtk_icon_view_get_selected_items (iview); + if (selected == NULL) + return; + path = selected->data; + gtk_tree_model_get_iter (store, &iter, path); + gtk_tree_model_get_value (store, &iter, 2, &value); + fullpath = g_value_get_string (&value); + printf("\"%s\" selected\n",fullpath); } + Index: src/tracker-gui/tracker.glade =================================================================== RCS file: /cvs/gnome/tracker/src/tracker-gui/tracker.glade,v retrieving revision 1.2 diff -u -p -r1.2 tracker.glade --- src/tracker-gui/tracker.glade 13 Sep 2006 22:55:05 -0000 1.2 +++ src/tracker-gui/tracker.glade 14 Sep 2006 01:50:30 -0000 @@ -172,415 +172,174 @@ - + True - True - False - GTK_POS_TOP - False - False + True + GTK_POLICY_NEVER + GTK_POLICY_ALWAYS + GTK_SHADOW_ETCHED_OUT + GTK_CORNER_TOP_LEFT - + + True + True + GTK_SELECTION_SINGLE + GTK_ORIENTATION_VERTICAL + False + + + + + 3 + True + True + + + + + + True + False + 6 + + + True - False - 0 + True + GTK_RELIEF_NORMAL + True - + True - False - 0 + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 - + True - 131 Hits : showing hits 1..20 - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 8 - True - True - - - - - - True - False - True - GTK_RELIEF_NORMAL - True + False + 2 - + True + gtk-go-forward + 4 0.5 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-go-back - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - + 0 + 0 + + 0 + False + False + - - - 0 - False - False - - - - - - True - True - GTK_RELIEF_NORMAL - True - + True + Next + True + False + GTK_JUSTIFY_LEFT + False + False 0.5 0.5 - 0 - 0 - 0 - 0 - 0 - 0 - - - - True - False - 2 - - - - True - gtk-go-forward - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - - - - - True - Next - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + 0 + False + False + - - 0 - False - False - - - 3 - False - False - - - - - - True - True - GTK_POLICY_NEVER - GTK_POLICY_AUTOMATIC - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - - - - True - True - False - False - False - True - False - False - False - - - - - 0 - True - True - - False - False + 0 + False + False + GTK_PACK_END - - True - All Files (131) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - - - - + True - Documents (33) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - + True + GTK_RELIEF_NORMAL + True - - - - - - - True - Images (56) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - - - - - True - Music (12) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - - - - - True - Videos (1) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - - - - - - - - - True - Text Files (21) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - tab - - + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 - - - + + + True + False + 2 - - - True - Development Files (4) - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + + + True + gtk-go-back + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + - tab + 0 + False + False + GTK_PACK_END - 3 - True - True + 6 + False + False