From 95be8f054616beb31d8ae77e947c18e15bc91ed8 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: Sun, 18 Dec 2011 06:56:58 +0400 Subject: [PATCH 2/2] Make download-by-uri dialogue-less --- contrib/gnunet_fs_gtk_main_window.glade | 198 ++++++++++++++++++++++ src/fs/gnunet-fs-gtk-main_window_file_download.c | 182 +++++++++++++------- src/fs/gnunet-fs-gtk.c | 8 +- src/fs/gnunet-fs-gtk.h | 12 ++ 4 files changed, 330 insertions(+), 70 deletions(-) diff --git a/contrib/gnunet_fs_gtk_main_window.glade b/contrib/gnunet_fs_gtk_main_window.glade index a47a445..d8b4d10 100644 --- a/contrib/gnunet_fs_gtk_main_window.glade +++ b/contrib/gnunet_fs_gtk_main_window.glade @@ -677,6 +677,189 @@ + + + + + False + Enter the URI to be downloaded + True + 640 + 240 + True + True + True + False + GNUNET_GTK_main_window + + + True + False + 2 + + + True + False + + + True + False + _URI: + True + True + GNUNET_GTK_open_url_dialog_url_textview + + + False + False + 4 + 0 + + + + + True + False + 0 + in + + + True + False + + + True + True + GDK_KEY_PRESS_MASK | GDK_STRUCTURE_MASK + char + 20 + GNUNET_GTK_open_url_dialog_url_textview_buffer + False + + + + + + + + + + + True + True + 1 + + + + + True + False + _Anonymity: + True + True + GNUNET_GTK_open_url_dialog_anonymity_combobox + + + False + False + 4 + 2 + + + + + True + False + 0 + + + True + False + main_window_search_anonymity_liststore + 1 + + + + 2 + 0 + + + + + + 1 + + + + + + + False + False + 3 + + + + + True + True + 5 + 0 + + + + + True + False + + + _Execute + False + True + False + True + True + execute_stock_image2 + True + + + + False + False + 4 + end + 0 + + + + + gtk-cancel + False + True + True + True + True + + + + False + False + 4 + end + 1 + + + + + False + False + 4 + 1 + + + + + @@ -715,6 +898,21 @@ 10 10 + + True + False + gtk-execute + + + True + False + gtk-execute + + + True + False + gtk-execute + True False diff --git a/src/fs/gnunet-fs-gtk-main_window_file_download.c b/src/fs/gnunet-fs-gtk-main_window_file_download.c index 19f7817..0d1114a 100644 --- a/src/fs/gnunet-fs-gtk-main_window_file_download.c +++ b/src/fs/gnunet-fs-gtk-main_window_file_download.c @@ -25,82 +25,66 @@ #include "gnunet-fs-gtk-common.h" #include "gnunet-fs-gtk-download.h" #include "gnunet-fs-gtk.h" +#include -static GtkBuilder *builder; - +/** + * User selected "Open URI" in main window. + */ void -GNUNET_GTK_open_url_dialog_url_entry_changed_cb (GtkEditable * editable, - gpointer user_data) +GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy, + gpointer user_data) { - struct GNUNET_FS_Uri *uri; - char *perr; - const char *uris; + GtkBuilder *builder; + GtkWidget *dialog; + GtkTextBuffer *tb; + GtkTextIter ti_start, ti_end; - perr = NULL; - uris = - gtk_entry_get_text (GTK_ENTRY - (gtk_builder_get_object - (builder, "GNUNET_GTK_open_url_dialog_url_entry"))); - if (uris != NULL) - uri = GNUNET_FS_uri_parse (uris, &perr); - else - uri = NULL; - gtk_widget_set_sensitive (GTK_WIDGET - (gtk_builder_get_object - (builder, - "GNUNET_GTK_open_url_dialog_execute_button")), - (uri == NULL) ? FALSE : TRUE); - if (uri != NULL) - GNUNET_FS_uri_destroy (uri); - else - GNUNET_free_non_null (perr); -} + builder = GTK_BUILDER (user_data); + dialog = GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_window")); + + tb = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_dialog_url_textview_buffer")); + gtk_text_buffer_get_iter_at_offset (tb, &ti_start, 0); + gtk_text_buffer_get_iter_at_offset (tb, &ti_end, -1); + gtk_text_buffer_delete (tb, &ti_start, &ti_end); + + /* TODO: queue the clipboard, maybe there's valid URI in there? + * If so, get it. */ + + gtk_widget_show (dialog); +} -/** - * User selected "Open URI" in main window. - */ void -GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy, - gpointer data) +GNUNET_GTK_open_url_dialog_execute_button_clicked_cb (GtkButton *button, + gpointer user_data) { - GtkWidget *ad; - const char *uris; - uint32_t anonymity; - struct GNUNET_FS_Uri *uri; + GtkBuilder *builder; + GtkWidget *dialog; + GtkTextBuffer *tb; + GtkTextIter ti_start, ti_end; + guint anonymity_level; char *perr; - struct DownloadContext *dc; + char *uris; + struct GNUNET_FS_Uri *uri; - GNUNET_assert (builder == NULL); - builder = GNUNET_GTK_get_new_builder ("gnunet_fs_gtk_open_url_dialog.glade"); - if (builder == NULL) - { - GNUNET_break (0); - return; - } - ad = GTK_WIDGET (gtk_builder_get_object - (builder, "GNUNET_GTK_open_url_dialog")); - if (GTK_RESPONSE_OK != gtk_dialog_run (GTK_DIALOG (ad))) - { - gtk_widget_destroy (ad); - g_object_unref (G_OBJECT (builder)); - builder = NULL; - fprintf (stderr, "Dialog closed!\n"); + builder = GTK_BUILDER (user_data); + + dialog = GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_window")); + + gtk_widget_hide (dialog); + + tb = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_dialog_url_textview_buffer")); + gtk_text_buffer_get_iter_at_offset (tb, &ti_start, 0); + gtk_text_buffer_get_iter_at_offset (tb, &ti_end, -1); + + uris = gtk_text_buffer_get_text (tb, &ti_start, &ti_end, FALSE); + + if (!GNUNET_GTK_get_selected_anonymity_level (builder, + "main_window_search_anonymity_combobox", &anonymity_level)) return; - } - uris = - gtk_entry_get_text (GTK_ENTRY - (gtk_builder_get_object - (builder, "GNUNET_GTK_open_url_dialog_url_entry"))); - anonymity = - gtk_spin_button_get_value (GTK_SPIN_BUTTON - (gtk_builder_get_object - (builder, - "GNUNET_GTK_open_url_dialog_anonymity_spin_button"))); + uri = GNUNET_FS_uri_parse (uris, &perr); - gtk_widget_destroy (ad); - g_object_unref (G_OBJECT (builder)); - builder = NULL; + g_free (uris); if (uri == NULL) { GNUNET_free (perr); @@ -113,16 +97,17 @@ GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy, fprintf (stderr, "Starting search!\n"); GNUNET_break (NULL != GNUNET_FS_search_start (GNUNET_FS_GTK_get_fs_handle (), uri, - anonymity, + anonymity_level, GNUNET_FS_SEARCH_OPTION_NONE, NULL)); GNUNET_FS_uri_destroy (uri); return; } if (GNUNET_FS_uri_test_chk (uri) || GNUNET_FS_uri_test_loc (uri)) { + struct DownloadContext *dc; dc = GNUNET_malloc (sizeof (struct DownloadContext)); dc->uri = uri; - dc->anonymity = anonymity; + dc->anonymity = anonymity_level; GNUNET_FS_GTK_open_download_as_dialog (dc); return; } @@ -130,4 +115,69 @@ GNUNET_GTK_main_menu_file_download_uri_activate_cb (GtkWidget * dummy, GNUNET_FS_uri_destroy (uri); } +void +GNUNET_GTK_open_url_dialog_cancel_button_clicked_cb (GtkButton *button, + gpointer user_data) +{ + GtkBuilder *builder; + builder = GTK_BUILDER (user_data); + + gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_window"))); + return; +} + +gboolean +GNUNET_GTK_open_url_dialog_url_textview_key_press_event_cb (GtkWidget *widget, + GdkEventKey *event, gpointer user_data) +{ + GtkBuilder *builder; + builder = GTK_BUILDER (user_data); + + if (event->keyval == GDK_KEY_Return) + { + GtkWidget *execute = GTK_WIDGET (gtk_builder_get_object (builder, + "GNUNET_GTK_open_url_dialog_execute_button")); + if (gtk_widget_get_sensitive (execute)) + GNUNET_GTK_open_url_dialog_execute_button_clicked_cb ( + GTK_BUTTON (execute), user_data); + return TRUE; + } + return FALSE; +} + +void +GNUNET_GTK_open_url_dialog_url_textview_buffer_changed_cb ( + GtkTextBuffer *textbuffer, gpointer user_data) +{ + struct GNUNET_FS_Uri *uri; + GtkTextBuffer *tb; + GtkTextIter ti_start, ti_end; + GtkBuilder *builder; + char *perr; + char *uris; + + builder = GTK_BUILDER (user_data); + + perr = NULL; + tb = GTK_TEXT_BUFFER (gtk_builder_get_object (builder, "GNUNET_GTK_open_url_dialog_url_textview_buffer")); + gtk_text_buffer_get_iter_at_offset (tb, &ti_start, 0); + gtk_text_buffer_get_iter_at_offset (tb, &ti_end, -1); + + uris = gtk_text_buffer_get_text (tb, &ti_start, &ti_end, FALSE); + if (uris != NULL) + uri = GNUNET_FS_uri_parse (uris, &perr); + else + uri = NULL; + g_free (uris); + gtk_widget_set_sensitive (GTK_WIDGET + (gtk_builder_get_object + (builder, + "GNUNET_GTK_open_url_dialog_execute_button")), + (uri == NULL) ? FALSE : TRUE); + if (uri != NULL) + GNUNET_FS_uri_destroy (uri); + else + GNUNET_free_non_null (perr); +} + /* end of gnunet-fs-gtk-main_window_file_download.c */ diff --git a/src/fs/gnunet-fs-gtk.c b/src/fs/gnunet-fs-gtk.c index dd4c951..2e0f299 100644 --- a/src/fs/gnunet-fs-gtk.c +++ b/src/fs/gnunet-fs-gtk.c @@ -240,15 +240,14 @@ GNUNET_GTK_get_tree_string (GtkTreeView *treeview, GtkTreePath *treepath, } gboolean -get_selected_anonymity_level (GtkBuilder *builder, guint *p_level) +GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, gchar *combo_name, guint *p_level) { GtkComboBox *combo; GtkTreeIter iter; GtkTreeModel *model; guint level; - combo = GTK_COMBO_BOX(gtk_builder_get_object (builder, - "main_window_search_anonymity_combobox")); + combo = GTK_COMBO_BOX(gtk_builder_get_object (builder, combo_name)); if (!combo) return FALSE; @@ -447,7 +446,8 @@ main_window_search_button_clicked_cb (GtkButton *button, gpointer 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)) + if (!GNUNET_GTK_get_selected_anonymity_level (builder, + "main_window_search_anonymity_combobox", &anonymity_level)) return; mime_combo = GTK_COMBO_BOX (GNUNET_FS_GTK_get_main_window_object diff --git a/src/fs/gnunet-fs-gtk.h b/src/fs/gnunet-fs-gtk.h index 3b3228f..4cd76de 100644 --- a/src/fs/gnunet-fs-gtk.h +++ b/src/fs/gnunet-fs-gtk.h @@ -63,6 +63,18 @@ GObject * GNUNET_FS_GTK_get_main_window_object (const char *name); +/** + * Get the selected anonymity level. + * + * @param builder builder object for the window + * @param combo_name name of the combobox widget to get anonymity from + * @param p_level pointer to a guint to receive the level value + * @return TRUE on success, FALSE on error + */ +gboolean +GNUNET_GTK_get_selected_anonymity_level (GtkBuilder *builder, + gchar *combo_name, guint *p_level); + #endif /* end of gnunet-fs-gtk.h */ -- 1.7.4