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

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