aboutsummaryrefslogtreecommitdiff
path: root/src/export.c
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2012-07-27 06:41:26 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2012-07-27 06:41:26 +0000
commitd04a449d2ffef1e80af681ef1493d98eee88e22b (patch)
tree3588de02638dc329b22fd2633c3a90279592df0b /src/export.c
parentcc0f803be0553bfb6f76941bf4147f813be09948 (diff)
made export/import progress dialog cancellable.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3142 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src/export.c')
-rw-r--r--src/export.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/export.c b/src/export.c
index 4135cb0b..e4500a02 100644
--- a/src/export.c
+++ b/src/export.c
@@ -81,6 +81,8 @@ static gboolean export_finished;
static gboolean export_ack;
static ProgressDialog *progress;
+static gboolean progress_cancel = FALSE;
+
static void export_create (void);
static gint export_do (void);
static gint export_eml (FolderItem *src,
@@ -106,19 +108,18 @@ static gboolean key_pressed (GtkWidget *widget,
GdkEventKey *event,
gpointer data);
+static void export_progress_cancel_cb (GtkWidget *widget,
+ gpointer data);
+
-static void export_mbox_func(Folder *folder, FolderItem *item, gpointer data)
+static gboolean export_mbox_func(Folder *folder, FolderItem *item, guint count, guint total, gpointer data)
{
gchar str[64];
- gint count = GPOINTER_TO_INT(data);
static GTimeVal tv_prev = {0, 0};
GTimeVal tv_cur;
g_get_current_time(&tv_cur);
- if (item->total > 0)
- g_snprintf(str, sizeof(str), "%d / %d", count, item->total);
- else
- g_snprintf(str, sizeof(str), "%d", count);
+ g_snprintf(str, sizeof(str), "%u / %d", count, total);
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress->progressbar), str);
if (tv_prev.tv_sec == 0 ||
@@ -131,6 +132,11 @@ static void export_mbox_func(Folder *folder, FolderItem *item, gpointer data)
ui_update();
tv_prev = tv_cur;
}
+
+ if (progress_cancel)
+ return FALSE;
+ else
+ return TRUE;
}
gint export_mail(FolderItem *default_src)
@@ -215,7 +221,8 @@ static gint export_do(void)
g_free(msg);
gtk_window_set_modal(GTK_WINDOW(progress->window), TRUE);
manage_window_set_transient(GTK_WINDOW(progress->window));
- gtk_widget_hide(progress->cancel_btn);
+ g_signal_connect(G_OBJECT(progress->cancel_btn), "clicked",
+ G_CALLBACK(export_progress_cancel_cb), NULL);
g_signal_connect(G_OBJECT(progress->window), "delete_event",
G_CALLBACK(gtk_true), NULL);
gtk_widget_show(progress->window);
@@ -228,13 +235,15 @@ static gint export_do(void)
mlist = summary_get_selected_msg_list(mainwin->summaryview);
}
+ progress_cancel = FALSE;
+
if (type == EXPORT_MBOX) {
- folder_set_ui_func(src->folder, export_mbox_func, NULL);
+ folder_set_ui_func2(src->folder, export_mbox_func, NULL);
if (mlist)
ok = export_msgs_to_mbox(src, mlist, mbox);
else
ok = export_to_mbox(src, mbox);
- folder_set_ui_func(src->folder, NULL, NULL);
+ folder_set_ui_func2(src->folder, NULL, NULL);
} else if (type == EXPORT_EML || type == EXPORT_MH) {
ok = export_eml(src, mlist, mbox, type);
}
@@ -246,7 +255,7 @@ static gint export_do(void)
g_slist_free(mlist);
g_free(mbox);
- if (ok < 0)
+ if (ok == -1)
alertpanel_error(_("Error occurred on export."));
return ok;
@@ -259,7 +268,8 @@ static gint export_eml(FolderItem *src, GSList *sel_mlist, const gchar *path,
GSList *mlist, *cur;
MsgInfo *msginfo;
gchar *file, *dest;
- gint count = 0;
+ guint count = 0;
+ guint total;
gint ok = 0;
g_return_val_if_fail(src != NULL, -1);
@@ -287,19 +297,23 @@ static gint export_eml(FolderItem *src, GSList *sel_mlist, const gchar *path,
if (!mlist)
return 0;
}
+ total = g_slist_length(mlist);
for (cur = mlist; cur != NULL; cur = cur->next) {
msginfo = (MsgInfo *)cur->data;
count++;
- export_mbox_func(src->folder, src, GINT_TO_POINTER(count));
+ if (export_mbox_func(src->folder, src, count, total, NULL) == FALSE) {
+ ok = -2;
+ break;
+ }
file = folder_item_fetch_msg(src, msginfo->msgnum);
if (!file) {
ok = -1;
break;
}
- dest = g_strdup_printf("%s%c%d%s", path, G_DIR_SEPARATOR,
+ dest = g_strdup_printf("%s%c%u%s", path, G_DIR_SEPARATOR,
count, ext);
if (g_file_test(dest, G_FILE_TEST_EXISTS)) {
g_warning("export_eml(): %s already exists.", dest);
@@ -528,3 +542,8 @@ static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data
export_cancel_cb(NULL, NULL);
return FALSE;
}
+
+static void export_progress_cancel_cb(GtkWidget *widget, gpointer data)
+{
+ progress_cancel = TRUE;
+}