Blame SOURCES/0034-Make-the-progress-bar-smooth-during-file-transfer.patch

48c875
From 39267703f6953a8e471f2d4f89a4a7f58efe77e1 Mon Sep 17 00:00:00 2001
48c875
From: Victor Toso <me@victortoso.com>
48c875
Date: Thu, 11 May 2017 16:16:56 +0200
48c875
Subject: [PATCH virt-viewer 34/35] Make the progress bar smooth during
48c875
 file-transfer
48c875
To: virt-tools-list@redhat.com
48c875
48c875
When the transfer of a file finishes we stop considering that file's
48c875
size in the progress bar which makes it move back due the new
48c875
'transfer size' and 'transferred bytes' - for all the other files.
48c875
48c875
This patch aims to keep the progress smooth when a file is finished
48c875
using the notify::total-bytes from SpiceFileTransferTask to be aware
48c875
of all file's sizes.
48c875
48c875
Note that as we have only one progress bar for all files being
48c875
transferred, it is expected that it will go back when a new
48c875
file-transfer operation starts (e.g we drag-and-drop new files while
48c875
we are already transferring other files).
48c875
48c875
As requested, this patch also updates the string message to include the
48c875
amount of files that will be transferred in case we have more then one
48c875
file.
48c875
48c875
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1449572
48c875
Signed-off-by: Victor Toso <victortoso@redhat.com>
48c875
---
48c875
 src/virt-viewer-file-transfer-dialog.c | 44 ++++++++++++++++++++++++++++------
48c875
 1 file changed, 37 insertions(+), 7 deletions(-)
48c875
48c875
diff --git a/src/virt-viewer-file-transfer-dialog.c b/src/virt-viewer-file-transfer-dialog.c
48c875
index 07d25a7..dcf99a3 100644
48c875
--- a/src/virt-viewer-file-transfer-dialog.c
48c875
+++ b/src/virt-viewer-file-transfer-dialog.c
48c875
@@ -30,6 +30,9 @@ struct _VirtViewerFileTransferDialogPrivate
48c875
     GSList *failed;
48c875
     guint timer_show_src;
48c875
     guint timer_hide_src;
48c875
+    guint num_files;
48c875
+    guint64 total_transfer_size;
48c875
+    guint64 completed_transfer_size;
48c875
     GtkWidget *transfer_summary;
48c875
     GtkWidget *progressbar;
48c875
 };
48c875
@@ -85,6 +88,9 @@ dialog_response(GtkDialog *dialog,
48c875
             for (slist = self->priv->file_transfers; slist != NULL; slist = g_slist_next(slist)) {
48c875
                 spice_file_transfer_task_cancel(SPICE_FILE_TRANSFER_TASK(slist->data));
48c875
             }
48c875
+            self->priv->num_files = 0;
48c875
+            self->priv->total_transfer_size = 0;
48c875
+            self->priv->completed_transfer_size = 0;
48c875
             break;
48c875
         case GTK_RESPONSE_DELETE_EVENT:
48c875
             /* silently ignore */
48c875
@@ -128,23 +134,29 @@ virt_viewer_file_transfer_dialog_new(GtkWindow *parent)
48c875
 static void update_global_progress(VirtViewerFileTransferDialog *self)
48c875
 {
48c875
     GSList *slist;
48c875
-    guint64 total = 0, transferred = 0;
48c875
+    guint64 transferred = 0;
48c875
     gchar *message = NULL;
48c875
     guint n_files = 0;
48c875
     gdouble fraction = 1.0;
48c875
 
48c875
     for (slist = self->priv->file_transfers; slist != NULL; slist = g_slist_next(slist)) {
48c875
         SpiceFileTransferTask *task = slist->data;
48c875
-        total += spice_file_transfer_task_get_total_bytes(task);
48c875
         transferred += spice_file_transfer_task_get_transferred_bytes(task);
48c875
         n_files++;
48c875
     }
48c875
 
48c875
-    if (n_files > 0)
48c875
-        fraction = (gdouble)transferred / total;
48c875
-    message = g_strdup_printf(ngettext("Transferring %d file...",
48c875
-                                       "Transferring %d files...", n_files),
48c875
-                              n_files);
48c875
+    if (n_files > 0) {
48c875
+        transferred += self->priv->completed_transfer_size;
48c875
+        fraction = (gdouble)transferred / self->priv->total_transfer_size;
48c875
+    }
48c875
+
48c875
+    if (self->priv->num_files == 1) {
48c875
+        message = g_strdup(_("Transferring 1 file..."));
48c875
+    } else {
48c875
+        message = g_strdup_printf(ngettext("Transferring %d file of %d...",
48c875
+                                           "Transferring %d files of %d...", n_files),
48c875
+                                  n_files, self->priv->num_files);
48c875
+    }
48c875
     gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(self->priv->progressbar), fraction);
48c875
     gtk_label_set_text(GTK_LABEL(self->priv->transfer_summary), message);
48c875
     g_free(message);
48c875
@@ -159,6 +171,19 @@ static void task_progress_notify(GObject *object G_GNUC_UNUSED,
48c875
     update_global_progress(self);
48c875
 }
48c875
 
48c875
+static void task_total_bytes_notify(GObject *object,
48c875
+                                    GParamSpec *pspec G_GNUC_UNUSED,
48c875
+                                    gpointer user_data)
48c875
+{
48c875
+    VirtViewerFileTransferDialog *self = VIRT_VIEWER_FILE_TRANSFER_DIALOG(user_data);
48c875
+    SpiceFileTransferTask *task = SPICE_FILE_TRANSFER_TASK(object);
48c875
+
48c875
+    self->priv->total_transfer_size += spice_file_transfer_task_get_total_bytes(task);
48c875
+    self->priv->num_files++;
48c875
+    update_global_progress(self);
48c875
+}
48c875
+
48c875
+
48c875
 static void
48c875
 error_dialog_response(GtkDialog *dialog,
48c875
                       gint response_id G_GNUC_UNUSED,
48c875
@@ -222,11 +247,15 @@ static void task_finished(SpiceFileTransferTask *task,
48c875
     }
48c875
 
48c875
     self->priv->file_transfers = g_slist_remove(self->priv->file_transfers, task);
48c875
+    self->priv->completed_transfer_size += spice_file_transfer_task_get_total_bytes(task);
48c875
     g_object_unref(task);
48c875
     update_global_progress(self);
48c875
 
48c875
     /* if this is the last transfer, close the dialog */
48c875
     if (self->priv->file_transfers == NULL) {
48c875
+        self->priv->num_files = 0;
48c875
+        self->priv->total_transfer_size = 0;
48c875
+        self->priv->completed_transfer_size = 0;
48c875
         /* cancel any pending 'show' operations if all tasks complete before
48c875
          * the dialog can be shown */
48c875
         if (self->priv->timer_show_src) {
48c875
@@ -274,6 +303,7 @@ void virt_viewer_file_transfer_dialog_add_task(VirtViewerFileTransferDialog *sel
48c875
 {
48c875
     self->priv->file_transfers = g_slist_prepend(self->priv->file_transfers, g_object_ref(task));
48c875
     g_signal_connect(task, "notify::progress", G_CALLBACK(task_progress_notify), self);
48c875
+    g_signal_connect(task, "notify::total-bytes", G_CALLBACK(task_total_bytes_notify), self);
48c875
     g_signal_connect(task, "finished", G_CALLBACK(task_finished), self);
48c875
 
48c875
     show_transfer_dialog(self);
48c875
-- 
48c875
2.13.0
48c875