From 77abd7e4be632270c09fda9ffeae809d01ced4e1 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 31 Jan 2012 12:00:00 +0000 Subject: -making progress dialog nice and responsive --- contrib/gnunet_fs_gtk_progress_dialog.glade | 59 ++++++++++++++++++------- src/fs/gnunet-fs-gtk-main_window_file_publish.c | 49 ++++++++++++++------ 2 files changed, 79 insertions(+), 29 deletions(-) diff --git a/contrib/gnunet_fs_gtk_progress_dialog.glade b/contrib/gnunet_fs_gtk_progress_dialog.glade index 6e63b9ee..f05405fa 100644 --- a/contrib/gnunet_fs_gtk_progress_dialog.glade +++ b/contrib/gnunet_fs_gtk_progress_dialog.glade @@ -15,23 +15,42 @@ vertical 2 - + True - True - GNUNET_FS_GTK_progress_dialog_textview_horizontal_adjustment - GNUNET_FS_GTK_progress_dialog_textview_vertical_adjustment - automatic - automatic - in + 0 + none - + True - True - False - word - -10 - GNUNET_FS_GTK_progress_dialog_textbuffer - False + 12 + + + True + True + GNUNET_FS_GTK_progress_dialog_textview_horizontal_adjustment + GNUNET_FS_GTK_progress_dialog_textview_vertical_adjustment + automatic + automatic + + + True + True + False + word + -10 + GNUNET_FS_GTK_progress_dialog_textbuffer + False + + + + + + + + + True + <b>Messages</b> + True @@ -43,6 +62,10 @@ True True + 0.050000002607703209 + Preprocessing... + GNUNET_FS_GTK_progress_bar_adjustment + 5 False @@ -69,6 +92,7 @@ False False + end 1 @@ -82,7 +106,6 @@ - 100 @@ -94,4 +117,10 @@ 1 10 + + 100 + 1 + 10 + 10 + diff --git a/src/fs/gnunet-fs-gtk-main_window_file_publish.c b/src/fs/gnunet-fs-gtk-main_window_file_publish.c index 948078a1..7706da30 100644 --- a/src/fs/gnunet-fs-gtk-main_window_file_publish.c +++ b/src/fs/gnunet-fs-gtk-main_window_file_publish.c @@ -30,6 +30,8 @@ #define MARKER_DIR_FILE_SIZE "-" +#define VERBOSE_PROGRESS GNUNET_NO + struct AddDirClientContext; struct MainPublishingDialogContext @@ -49,7 +51,7 @@ struct MainPublishingDialogContext GtkWidget *cancel_button; GtkTreeView *file_info_treeview; GtkTreeSelection *file_info_selection; - GtkTreeModel *file_info_treemodel; + GtkTreeModel *file_info_treemodel; GtkWindow *master_pubdialog; gulong open_directory_handler_id; @@ -86,6 +88,7 @@ struct AddDirClientContext GtkTextView *progress_dialog_textview; GtkTextBuffer *progress_dialog_textbuffer; GtkTextMark *progress_dialog_textmark; + GtkAdjustment *textview_vertial_adjustment; unsigned int done; unsigned int total; @@ -779,18 +782,13 @@ GNUNET_GTK_master_publish_dialog_delete_button_clicked_cb (GtkWidget * dummy, static void insert_progress_dialog_text (struct AddDirClientContext *adcc, - char *text) + const char *text) { - GtkTextIter iter; - - gtk_text_buffer_get_iter_at_mark (adcc->progress_dialog_textbuffer, - &iter, adcc->progress_dialog_textmark); - gtk_text_buffer_insert (adcc->progress_dialog_textbuffer, - &iter, text, -1); - gtk_text_view_scroll_to_mark (adcc->progress_dialog_textview, - adcc->progress_dialog_textmark, - 0.0, FALSE, 1.0, 1.0); - + gtk_text_buffer_insert_at_cursor (adcc->progress_dialog_textbuffer, + text, -1); + gtk_text_view_place_cursor_onscreen (adcc->progress_dialog_textview); + gtk_adjustment_set_value (adcc->textview_vertial_adjustment, + gtk_adjustment_get_upper (adcc->textview_vertial_adjustment)); } @@ -929,15 +927,21 @@ directory_scan_cb (void *cls, const char *filename, int is_directory, enum GNUNET_FS_DirScannerProgressUpdateReason reason) { + static struct GNUNET_TIME_Absolute last_pulse; struct AddDirClientContext *adcc = cls; char *s; gdouble fraction; - gtk_progress_bar_pulse (adcc->progress_dialog_bar); switch (reason) { case GNUNET_FS_DIRSCANNER_FILE_START: GNUNET_assert (filename != NULL); + if (GNUNET_TIME_absolute_get_duration (last_pulse).rel_value > 100) + { + gtk_progress_bar_pulse (adcc->progress_dialog_bar); + last_pulse = GNUNET_TIME_absolute_get (); + } +#if VERBOSE_PROGRESS if (is_directory) { GNUNET_asprintf (&s, _("Scanning directory `%s'.\n"), filename); @@ -945,13 +949,21 @@ directory_scan_cb (void *cls, GNUNET_free (s); } else - adcc->total++; + adcc->total++; +#else + if (! is_directory) + adcc->total++; +#endif break; case GNUNET_FS_DIRSCANNER_FILE_IGNORED: GNUNET_assert (filename != NULL); GNUNET_asprintf (&s, _("Failed to scan `%s' (access error). Skipping.\n"), filename); +#if ! VERBOSE_PROGRESS + gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (adcc->progress_dialog_builder, + "GNUNET_FS_GTK_progress_dialog_scrolled_window"))); +#endif insert_progress_dialog_text (adcc, s); GNUNET_free (s); break; @@ -968,9 +980,11 @@ directory_scan_cb (void *cls, fraction); break; case GNUNET_FS_DIRSCANNER_EXTRACT_FINISHED: +#if VERBOSE_PROGRESS GNUNET_asprintf (&s, _("Processed file `%s'.\n"), filename); insert_progress_dialog_text (adcc, s); GNUNET_free (s); +#endif adcc->done++; GNUNET_assert (adcc->done <= adcc->total); fraction = (adcc->total == 0) ? 1.0 : (1.0 * adcc->done) / adcc->total; @@ -1040,6 +1054,9 @@ scan_file_or_directory (struct MainPublishingDialogContext *ctx, adcc->progress_dialog_textview = GTK_TEXT_VIEW ( gtk_builder_get_object (adcc->progress_dialog_builder, "GNUNET_FS_GTK_progress_dialog_textview")); + adcc->textview_vertial_adjustment = GTK_ADJUSTMENT ( + gtk_builder_get_object (adcc->progress_dialog_builder, + "GNUNET_FS_GTK_progress_dialog_textview_vertical_adjustment")); adcc->progress_dialog_textbuffer = GTK_TEXT_BUFFER ( gtk_builder_get_object (adcc->progress_dialog_builder, "GNUNET_FS_GTK_progress_dialog_textbuffer")); @@ -1048,6 +1065,10 @@ scan_file_or_directory (struct MainPublishingDialogContext *ctx, adcc->progress_dialog_textmark = gtk_text_buffer_create_mark ( adcc->progress_dialog_textbuffer, "scroll", &iter, FALSE); +#if VERBOSE_PROGRESS + gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (adcc->progress_dialog_builder, + "GNUNET_FS_GTK_progress_dialog_scrolled_window"))); +#endif gtk_window_set_transient_for (GTK_WINDOW (adcc->progress_dialog), adcc->ctx->master_pubdialog); gtk_window_set_title (GTK_WINDOW (adcc->progress_dialog), filename); -- cgit v1.2.3