[evolution] Enhance progress indicator of folder copy/move
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Enhance progress indicator of folder copy/move
- Date: Mon, 30 Oct 2017 10:26:17 +0000 (UTC)
commit ff3865064a0b228966ec7f5f4a370bae98c4a8fe
Author: Milan Crha <mcrha redhat com>
Date: Mon Oct 30 11:15:00 2017 +0100
Enhance progress indicator of folder copy/move
There had been only shown 'Copying messages (X% complete)' before
this change. After it it shows which folder is currently processing
and how many folders are to be done, like:
'Copying folder “Account : Inbox/subfolder” (2/5) (X% complete)'
This makes better idea about the overall operation progress when
folders with subfolders are copied/moved.
src/mail/em-folder-utils.c | 75 +++++++++++++++++++++++++++++++++++++++++--
1 files changed, 71 insertions(+), 4 deletions(-)
---
diff --git a/src/mail/em-folder-utils.c b/src/mail/em-folder-utils.c
index 9033c46..90ce20d 100644
--- a/src/mail/em-folder-utils.c
+++ b/src/mail/em-folder-utils.c
@@ -75,14 +75,42 @@ struct _EMCopyFolders {
gint delete;
};
+static guint32
+emft_copy_folders_count_n_folders (CamelFolderInfo *fi,
+ gboolean can_subfolders)
+{
+ guint32 n_folders = 0;
+
+ while (fi) {
+ n_folders++;
+
+ if (fi->child && can_subfolders)
+ n_folders += emft_copy_folders_count_n_folders (fi->child, can_subfolders);
+
+ fi = fi->next;
+ }
+
+ return n_folders;
+}
+
+static void
+emft_copy_folders_pass_progress_cb (GCancellable *local_cancellable,
+ gint percent,
+ gpointer user_data)
+{
+ GCancellable *caller_cancellable = user_data;
+
+ camel_operation_progress (caller_cancellable, percent);
+}
+
static gchar *
emft_copy_folders__desc (struct _EMCopyFolders *m,
gint complete)
{
if (m->delete)
- return g_strdup_printf (_("Moving folder %s"), m->frombase);
+ return g_strdup_printf (_("Moving folder “%s”"), m->frombase);
else
- return g_strdup_printf (_("Copying folder %s"), m->frombase);
+ return g_strdup_printf (_("Copying folder “%s”"), m->frombase);
}
static void
@@ -90,7 +118,7 @@ emft_copy_folders__exec (struct _EMCopyFolders *m,
GCancellable *cancellable,
GError **error)
{
- guint32 flags;
+ guint32 flags, n_folders, nth_folder = 1;
GList *pending = NULL, *deleting = NULL, *l;
GString *fromname, *toname;
CamelFolderInfo *fi;
@@ -112,6 +140,7 @@ emft_copy_folders__exec (struct _EMCopyFolders *m,
if (fi == NULL)
return;
+ n_folders = emft_copy_folders_count_n_folders (fi, (!m->delete || !same_store));
pending = g_list_append (pending, fi);
toname = g_string_new ("");
@@ -176,6 +205,9 @@ emft_copy_folders__exec (struct _EMCopyFolders *m,
deleted = 1;
} else {
+ GCancellable *local_cancellable;
+ gulong handler_id_cancelled;
+ gulong handler_id_progress;
gboolean success;
fromfolder = camel_store_get_folder_sync (
@@ -199,13 +231,47 @@ emft_copy_folders__exec (struct _EMCopyFolders *m,
goto exception;
}
+ /* to not propagate status messages from sub-functions into UI */
+ if (cancellable) {
+ local_cancellable = camel_operation_new ();
+ handler_id_cancelled = g_signal_connect_swapped (cancellable,
"cancelled",
+ G_CALLBACK (g_cancellable_cancel), local_cancellable);
+ handler_id_progress = g_signal_connect (local_cancellable,
"progress",
+ G_CALLBACK (emft_copy_folders_pass_progress_cb),
cancellable);
+ } else {
+ local_cancellable = NULL;
+ handler_id_cancelled = 0;
+ handler_id_progress = 0;
+ }
+
+ if (n_folders > 1) {
+ gchar *full_display_name;
+
+ full_display_name = e_mail_folder_to_full_display_name
(fromfolder, NULL);
+ camel_operation_push_message (cancellable,
+ m->delete ? _("Moving folder “%s” (%d/%d)") :
_("Copying folder “%s” (%d/%d)"),
+ full_display_name ? full_display_name :
camel_folder_get_display_name (fromfolder),
+ nth_folder, n_folders);
+ g_free (full_display_name);
+ }
+
uids = camel_folder_get_uids (fromfolder);
success = camel_folder_transfer_messages_to_sync (
fromfolder, uids, tofolder,
m->delete, NULL,
- cancellable, error);
+ local_cancellable, error);
camel_folder_free_uids (fromfolder, uids);
+ if (n_folders > 1)
+ camel_operation_pop_message (cancellable);
+
+ if (cancellable) {
+ g_signal_handler_disconnect (cancellable,
handler_id_cancelled);
+ g_signal_handler_disconnect (local_cancellable,
handler_id_progress);
+ }
+
+ g_clear_object (&local_cancellable);
+
if (m->delete && success) {
camel_folder_synchronize_sync (
fromfolder, TRUE,
@@ -235,6 +301,7 @@ emft_copy_folders__exec (struct _EMCopyFolders *m,
toname->str, cancellable, NULL);
info = info->next;
+ nth_folder++;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]