From 4633e223d98298d0cf1ac88e2747542e72db8c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1=D1?= =?UTF-8?q?=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Mon, 12 Dec 2011 22:36:28 +0400 Subject: [PATCH 1/2] Multiple GUI changes * Rename "Key" column to "Root" * Make namespace selector focusable * Namespace selector now tracks mouse pointer * Namespace is chosen by a single click * Namespace list is populated by namespace descovery callback instead of namespace list callback (adds found namespaces on the fly) * Normalized cell background for search results Now rows look like they have uniform background * Add tooltips with full query text to search tab * Root is added to the query when a search in namespace is made --- contrib/gnunet_fs_gtk_main_window.glade | 90 ++++++++++---------- contrib/gnunet_fs_gtk_search_tab.glade | 5 +- src/fs/gnunet-fs-gtk-event_handler.c | 1 + src/fs/gnunet-fs-gtk.c | 138 +++++++++++++++++++++++++++---- 4 files changed, 172 insertions(+), 62 deletions(-) diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade index ac572bb..5183ba9 100644 --- a/contrib/gnunet_fs_gtk_main_window.glade +++ b/contrib/gnunet_fs_gtk_main_window.glade @@ -676,38 +676,6 @@ - - 100 - 1 - 10 - 10 - - - 100 - 1 - 10 - 10 - - - True - False - gtk-new - - - True - False - gtk-find - - - True - False - gtk-go-down - - - True - False - gtk-index - @@ -722,6 +690,18 @@ + + 100 + 1 + 10 + 10 + + + 100 + 1 + 10 + 10 + 100 1 @@ -744,6 +724,26 @@ False gtk-go-up + + True + False + gtk-new + + + True + False + gtk-find + + + True + False + gtk-go-down + + + True + False + gtk-index + True False @@ -786,6 +786,14 @@ + + vertical + + + + + + @@ -830,21 +838,13 @@ - - vertical - - - - - - - + @@ -853,7 +853,6 @@ False GDK_LEAVE_NOTIFY_MASK | GDK_STRUCTURE_MASK - popup False dropdown-menu True @@ -869,12 +868,15 @@ True True + True main_window_search_namespace_treestore False 0 + True True 3 - + + autosize @@ -890,7 +892,7 @@ autosize - Key + Root diff --git a/contrib/gnunet_fs_gtk_search_tab.glade b/contrib/gnunet_fs_gtk_search_tab.glade index 196a60d..93e5deb 100644 --- a/contrib/gnunet_fs_gtk_search_tab.glade +++ b/contrib/gnunet_fs_gtk_search_tab.glade @@ -89,7 +89,7 @@ - 8 + 8 10 @@ -123,7 +123,7 @@ - 8 + 8 11 @@ -138,6 +138,7 @@ + 8 3 diff --git a/src/fs/gnunet-fs-gtk-event_handler.c b/src/fs/gnunet-fs-gtk-event_handler.c index 7520c48..2a3d754 100644 --- a/src/fs/gnunet-fs-gtk-event_handler.c +++ b/src/fs/gnunet-fs-gtk-event_handler.c @@ -882,6 +882,7 @@ update_search_label (struct SearchTab *tab) GNUNET_asprintf (&name, "%.*s%s", 20, tab->query_txt, strlen (tab->query_txt) > 20 ? "..." : ""); gtk_label_set_text (tab->label, name); + gtk_widget_set_tooltip_text (GTK_WIDGET (tab->label), tab->query_txt); GNUNET_free (name); } diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c index 3223ec7..d5a6cb5 100644 --- a/src/fs/gnunet-fs-gtk.c +++ b/src/fs/gnunet-fs-gtk.c @@ -137,7 +137,9 @@ main_window_search_namespace_dropdown_button_toggled_cb (GtkToggleButton *toggle gboolean active; GtkBuilder *builder = GTK_BUILDER (user_data); GtkWidget *namespace_selector_window; + GtkWidget *namespace_selector_treeview; namespace_selector_window = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_window")); + namespace_selector_treeview = GTK_WIDGET (gtk_builder_get_object (builder, "namespace_selector_treeview")); g_object_get (G_OBJECT (togglebutton), "active", &active, NULL); if (active) { @@ -162,10 +164,14 @@ main_window_search_namespace_dropdown_button_toggled_cb (GtkToggleButton *toggle gtk_window_move (GTK_WINDOW (namespace_selector_window), popup_x, popup_y); - gtk_widget_show (namespace_selector_window); + gtk_widget_show_all (namespace_selector_window); + gtk_widget_grab_focus (namespace_selector_treeview); } else + { gtk_widget_hide (namespace_selector_window); + gtk_widget_grab_focus (GTK_WIDGET (togglebutton)); + } } gboolean @@ -314,18 +320,26 @@ namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget, GtkBuilder *builder; GtkToggleButton *toggle_button; GtkLabel *sel_namespace_label; + GtkTreeModel *model; gchar *value; GtkTreePath *treepath; + GtkTreeRowReference *ref, *old; builder = GTK_BUILDER (user_data); - if (!get_selected_namespace_treepath_iter_model_widget (builder, &treepath, NULL, NULL, NULL)) - return; - toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "main_window_search_namespace_dropdown_button")); if (!toggle_button) return; + if (!get_selected_namespace_treepath_iter_model_widget (builder, &treepath, NULL, &model, NULL)) + return; + ref = gtk_tree_row_reference_new (model, treepath); + old = g_object_get_data (G_OBJECT (toggle_button), "selected-row-reference"); + if (old) + gtk_tree_row_reference_free (old); + g_object_set_data (G_OBJECT (toggle_button), "selected-row-reference", ref); + + sel_namespace_label = GTK_LABEL (gtk_builder_get_object (builder, "main_window_search_selected_namespace_label")); if (!sel_namespace_label) return; @@ -340,6 +354,72 @@ namespace_selector_treeview_cursor_changed_cb (GtkWidget *widget, gtk_toggle_button_set_active (toggle_button, FALSE); } +GtkTreeRowReference * +get_ns_selected_row (GtkTreeView *tree) +{ + GtkTreeSelection *sel; + GList *rows, *row; + GtkTreeModel *model; + GtkTreeRowReference *ref = NULL; + + sel = gtk_tree_view_get_selection (tree); + rows = gtk_tree_selection_get_selected_rows (sel, &model); + for (row = rows; row; row = row->next) + { + ref = gtk_tree_row_reference_new (model, row->data); + if (ref != NULL) + break; + } + g_list_foreach (rows, (GFunc) gtk_tree_path_free, NULL); + g_list_free (rows); + return ref; +} + +gboolean +namespace_selector_treeview_button_press_event_cb (GtkWidget *widget, + GdkEvent *event, gpointer user_data) +{ + GtkTreeRowReference *ref = NULL; + + ref = get_ns_selected_row (GTK_TREE_VIEW (widget)); + if (ref != NULL) + { + gpointer old = g_object_get_data (G_OBJECT (widget), "pushed-rowreference"); + if (old) + gtk_tree_row_reference_free (old); + g_object_set_data (G_OBJECT (widget), "pushed-rowreference", ref); + } + return FALSE; +} + +gboolean +namespace_selector_treeview_button_release_event_cb (GtkWidget *widget, + GdkEvent *event, gpointer user_data) +{ + GtkTreeRowReference *ref = NULL; + gpointer old = g_object_get_data (G_OBJECT (widget), "pushed-rowreference"); + + ref = get_ns_selected_row (GTK_TREE_VIEW (widget)); + if (ref && old) + { + GtkTreePath *path_ref, *path_old; + path_ref = gtk_tree_row_reference_get_path (ref); + path_old = gtk_tree_row_reference_get_path (old); + if (gtk_tree_path_compare (path_ref, path_old) == 0) + namespace_selector_treeview_cursor_changed_cb (widget, user_data); + if (path_ref) + gtk_tree_path_free (path_ref); + if (path_old) + gtk_tree_path_free (path_old); + } + if (ref) + gtk_tree_row_reference_free (ref); + if (old) + gtk_tree_row_reference_free (old); + g_object_set_data (G_OBJECT (widget), "pushed-rowreference", NULL); + return FALSE; +} + void main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data) { @@ -350,17 +430,23 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data) GtkTreeModel *mime_model; GtkEntry *query_entry; guint anonymity_level; + GtkTreeRowReference *ref = NULL; GtkTreeIter iter; + GtkToggleButton *toggle_button; const char *entry_keywords; gchar *keywords; gchar *mime_keyword; GNUNET_HashCode *nsid = NULL; struct GNUNET_FS_Uri *uri; + gchar *root = NULL; char *emsg; builder = GTK_BUILDER (user_data); + toggle_button = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, + "main_window_search_namespace_dropdown_button")); + if (!get_selected_anonymity_level (builder, &anonymity_level)) return; @@ -372,23 +458,30 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer user_data) mime_keyword = NULL; gtk_tree_model_get (mime_model, &iter, 0, &mime_keyword, -1); } + if (mime_keyword == NULL) + mime_keyword = g_strdup (""); - get_selected_namespace_treepath_iter_model_widget (builder, - &namespace_treepath, &iter, &namespace_model, NULL); + ref = g_object_get_data (G_OBJECT (toggle_button), "selected-row-reference"); + if (ref) + { + namespace_model = gtk_tree_row_reference_get_model (ref); + namespace_treepath = gtk_tree_row_reference_get_path (ref); + gtk_tree_model_get_iter (namespace_model, &iter, namespace_treepath); + } query_entry = GTK_ENTRY (gtk_builder_get_object (builder, "main_window_search_entry")); - entry_keywords = gtk_entry_get_text (query_entry); - if (mime_keyword != NULL) - { - keywords = g_strdup_printf ("%s %s", entry_keywords, mime_keyword); - g_free (mime_keyword); - } - else - keywords = g_strdup (entry_keywords); if (namespace_treepath != NULL) - gtk_tree_model_get (namespace_model, &iter, 1, &nsid, -1); + gtk_tree_model_get (namespace_model, &iter, 1, &nsid, 2, &root, -1); + if (root == NULL) + root = g_strdup (""); + + entry_keywords = gtk_entry_get_text (query_entry); + + keywords = g_strdup_printf ("%s %s %s", entry_keywords, mime_keyword, root); + g_free (mime_keyword); + g_free (root); if (nsid != NULL) { uri = GNUNET_FS_uri_sks_create_from_nsid (nsid, keywords); @@ -487,11 +580,25 @@ GNUNET_GTK_main_window_realize_cb (GtkWidget *widget, gpointer user_data) namespace_tree = GTK_TREE_VIEW (GNUNET_FS_GTK_get_main_window_object ("namespace_selector_treeview")); + /* FIXME: find a way to manage pseudonyms. + * Right now the list will be filled with ALL and ANY pseudonyms that we + * find, these are held as files in a special directory. + * I don't see an easy way to ignore certain pseudonyms in that directory, + * and that require for pseudonym management. Also, pseudonyms are presented + * in arbitrary order. We must either sort them (by name?) or let the user + * drag them around to change the order in which they appear in the list. + * All that is not possible with a simple "files in a directory" concept. + */ gtk_tree_store_insert_with_values (namespace_treestore, &iter, NULL, G_MAXINT, 0, "Any", 1, NULL, 2, "", 3, "Do not search in any particular namespace", -1); + /* GNUNET_PSEUDONYM_list_all (GNUNET_FS_GTK_get_configuration (), &add_namespace_to_ts, namespace_treestore); + */ + GNUNET_PSEUDONYM_discovery_callback_register ( + GNUNET_FS_GTK_get_configuration (), + &add_namespace_to_ts, namespace_treestore); /* FIXME: read currently selected namespace from somewhere instead of selecting 0th item */ if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (namespace_treestore), &iter)) @@ -581,7 +688,6 @@ run (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) } - int main (int argc, char *const *argv) { -- 1.7.4