|
|
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 |
|