Skip to content

Commit 64d6829

Browse files
committed
file operations: Implement pause/resume.
ref: #3586, #1786, #1033, #3277, #986.
1 parent a5a4bd8 commit 64d6829

4 files changed

Lines changed: 182 additions & 111 deletions

File tree

libnemo-private/nemo-file-operations.c

Lines changed: 74 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ typedef enum {
8888

8989
typedef struct {
9090
GIOSchedulerJob *io_job;
91-
GTimer *time;
9291
GtkWindow *parent_window;
9392
int monitor_num;
9493
int inhibit_cookie;
@@ -1149,7 +1148,6 @@ init_common (gsize job_size,
11491148
}
11501149
common->progress = nemo_progress_info_new ();
11511150
common->cancellable = nemo_progress_info_get_cancellable (common->progress);
1152-
common->time = g_timer_new ();
11531151
common->inhibit_cookie = -1;
11541152
common->monitor_num = 0;
11551153
if (parent_window) {
@@ -1169,7 +1167,6 @@ finalize_common (CommonJob *common)
11691167
}
11701168

11711169
common->inhibit_cookie = -1;
1172-
g_timer_destroy (common->time);
11731170

11741171
if (common->parent_window) {
11751172
g_object_remove_weak_pointer (G_OBJECT (common->parent_window),
@@ -1355,7 +1352,7 @@ run_simple_dialog_va (CommonJob *job,
13551352
const char *button_title;
13561353
GPtrArray *ptr_array;
13571354

1358-
g_timer_stop (job->time);
1355+
nemo_progress_info_pause (job->progress);
13591356

13601357
data = g_new0 (RunSimpleDialogData, 1);
13611358
data->parent_window = &job->parent_window;
@@ -1373,18 +1370,16 @@ run_simple_dialog_va (CommonJob *job,
13731370
g_ptr_array_add (ptr_array, NULL);
13741371
data->button_titles = (const char **)g_ptr_array_free (ptr_array, FALSE);
13751372

1376-
nemo_progress_info_pause (job->progress);
13771373
g_io_scheduler_job_send_to_mainloop (job->io_job,
13781374
do_run_simple_dialog,
13791375
data,
13801376
NULL);
1381-
nemo_progress_info_resume (job->progress);
13821377
res = data->result;
13831378

13841379
g_free (data->button_titles);
13851380
g_free (data);
13861381

1387-
g_timer_continue (job->time);
1382+
nemo_progress_info_resume (job->progress);
13881383

13891384
g_free (primary_text);
13901385
g_free (secondary_text);
@@ -1709,23 +1704,30 @@ report_delete_progress (CommonJob *job,
17091704
nemo_progress_info_take_status (job->progress,
17101705
f (_("Deleting files")));
17111706

1712-
elapsed = g_timer_elapsed (job->time, NULL);
1707+
elapsed = nemo_progress_info_get_elapsed_time (job->progress);
17131708
if (elapsed < SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE) {
1714-
1715-
nemo_progress_info_set_details (job->progress, files_left_s);
1709+
if (nemo_progress_info_get_is_paused (job->progress)) {
1710+
nemo_progress_info_set_details (job->progress, _("Paused"));
1711+
} else {
1712+
nemo_progress_info_set_details (job->progress, files_left_s);
1713+
}
17161714
} else {
1717-
char *details, *time_left_s;
1718-
transfer_rate = transfer_info->num_files / elapsed;
1719-
remaining_time = files_left / transfer_rate;
1720-
1721-
/* To translators: %T will expand to a time like "2 minutes".
1722-
* The singular/plural form will be used depending on the remaining time (i.e. the %T argument).
1723-
*/
1724-
time_left_s = f (ngettext ("%T left",
1725-
"%T left",
1726-
seconds_count_format_time_units (remaining_time)),
1727-
remaining_time);
1715+
char *details, *time_left_s;
17281716

1717+
if (nemo_progress_info_get_is_paused (job->progress)) {
1718+
time_left_s = g_strdup (_("Paused"));
1719+
} else {
1720+
transfer_rate = transfer_info->num_files / elapsed;
1721+
remaining_time = files_left / transfer_rate;
1722+
1723+
/* To translators: %T will expand to a time like "2 minutes".
1724+
* The singular/plural form will be used depending on the remaining time (i.e. the %T argument).
1725+
*/
1726+
time_left_s = f (ngettext ("%T left",
1727+
"%T left",
1728+
seconds_count_format_time_units (remaining_time)),
1729+
remaining_time);
1730+
}
17291731
details = g_strconcat (files_left_s, "\xE2\x80\x94", time_left_s, NULL);
17301732
nemo_progress_info_take_details (job->progress, details);
17311733

@@ -2004,7 +2006,7 @@ delete_files (CommonJob *job, GList *files, guint *files_skipped)
20042006
return;
20052007
}
20062008

2007-
g_timer_start (job->time);
2009+
nemo_progress_info_start (job->progress);
20082010

20092011
memset (&transfer_info, 0, sizeof (transfer_info));
20102012
report_delete_progress (job, &source_info, &transfer_info);
@@ -2762,7 +2764,7 @@ static void
27622764
report_count_progress (CommonJob *job,
27632765
SourceInfo *source_info)
27642766
{
2765-
char *s;
2767+
char *s, *details;
27662768

27672769
switch (source_info->op) {
27682770

@@ -2799,7 +2801,14 @@ report_count_progress (CommonJob *job,
27992801
break;
28002802
}
28012803

2802-
nemo_progress_info_take_details (job->progress, s);
2804+
if (nemo_progress_info_get_is_paused (job->progress)) {
2805+
details = g_strconcat (s, "\xE2\x80\x94", _("Paused"), NULL);
2806+
g_free (s);
2807+
} else {
2808+
details = s;
2809+
}
2810+
2811+
nemo_progress_info_take_details (job->progress, details);
28032812
nemo_progress_info_pulse_progress (job->progress);
28042813
}
28052814

@@ -3329,7 +3338,7 @@ report_copy_progress (CopyMoveJob *copy_job,
33293338

33303339
total_size = MAX (source_info->num_bytes, transfer_info->num_bytes);
33313340

3332-
elapsed = g_timer_elapsed (job->time, NULL);
3341+
elapsed = nemo_progress_info_get_elapsed_time (job->progress);
33333342
transfer_rate = 0;
33343343
if (elapsed > 0) {
33353344
transfer_rate = transfer_info->num_bytes / elapsed;
@@ -3338,26 +3347,36 @@ report_copy_progress (CopyMoveJob *copy_job,
33383347
if (elapsed < SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE &&
33393348
transfer_rate > 0) {
33403349
char *s;
3341-
/* To translators: %S will expand to a size like "2 bytes" or "3 MB", so something like "4 kb of 4 MB" */
3342-
s = f (_("%S of %S"), transfer_info->num_bytes, total_size);
3343-
nemo_progress_info_take_details (job->progress, s);
3344-
} else {
3345-
char *s;
3346-
remaining_time = (total_size - transfer_info->num_bytes) / transfer_rate;
33473350

3348-
/* To translators: %S will expand to a size like "2 bytes" or "3 MB", %T to a time duration like
3349-
* "2 minutes". So the whole thing will be something like "2 kb of 4 MB -- 2 hours left (4kb/sec)"
3350-
*
3351-
* The singular/plural form will be used depending on the remaining time (i.e. the %T argument).
3352-
*/
3353-
s = f (ngettext ("%S of %S \xE2\x80\x94 %T left (%S/sec)",
3354-
"%S of %S \xE2\x80\x94 %T left (%S/sec)",
3355-
seconds_count_format_time_units (remaining_time)),
3356-
transfer_info->num_bytes, total_size,
3357-
remaining_time,
3358-
(goffset)transfer_rate);
3359-
nemo_progress_info_take_details (job->progress, s);
3360-
}
3351+
if (nemo_progress_info_get_is_paused (job->progress)) {
3352+
s = g_strdup (_("Paused"));
3353+
} else {
3354+
/* To translators: %S will expand to a size like "2 bytes" or "3 MB", so something like "4 kb of 4 MB" */
3355+
s = f (_("%S of %S"), transfer_info->num_bytes, total_size);
3356+
}
3357+
3358+
nemo_progress_info_take_details (job->progress, s);
3359+
} else {
3360+
if (nemo_progress_info_get_is_paused (job->progress)) {
3361+
nemo_progress_info_take_details (job->progress, g_strdup (_("Paused")));
3362+
} else {
3363+
char *s;
3364+
remaining_time = (total_size - transfer_info->num_bytes) / transfer_rate;
3365+
3366+
/* To translators: %S will expand to a size like "2 bytes" or "3 MB", %T to a time duration like
3367+
* "2 minutes". So the whole thing will be something like "2 kb of 4 MB -- 2 hours left (4kb/sec)"
3368+
*
3369+
* The singular/plural form will be used depending on the remaining time (i.e. the %T argument).
3370+
*/
3371+
s = f (ngettext ("%S of %S \xE2\x80\x94 %T left (%S/sec)",
3372+
"%S of %S \xE2\x80\x94 %T left (%S/sec)",
3373+
seconds_count_format_time_units (remaining_time)),
3374+
transfer_info->num_bytes, total_size,
3375+
remaining_time,
3376+
(goffset)transfer_rate);
3377+
nemo_progress_info_take_details (job->progress, s);
3378+
}
3379+
}
33613380

33623381
nemo_progress_info_set_progress (job->progress, transfer_info->num_bytes, total_size);
33633382
}
@@ -4326,7 +4345,7 @@ run_conflict_dialog (CommonJob *job,
43264345
ConflictDialogData *data;
43274346
ConflictResponseData *resp_data;
43284347

4329-
g_timer_stop (job->time);
4348+
nemo_progress_info_pause (job->progress);
43304349

43314350
data = g_new0 (ConflictDialogData, 1);
43324351
data->parent = job->parent_window;
@@ -4338,16 +4357,14 @@ run_conflict_dialog (CommonJob *job,
43384357
resp_data->new_name = NULL;
43394358
data->resp_data = resp_data;
43404359

4341-
nemo_progress_info_pause (job->progress);
43424360
g_io_scheduler_job_send_to_mainloop (job->io_job,
43434361
do_run_conflict_dialog,
43444362
data,
43454363
NULL);
4346-
nemo_progress_info_resume (job->progress);
43474364

43484365
g_free (data);
43494366

4350-
g_timer_continue (job->time);
4367+
nemo_progress_info_resume (job->progress);
43514368

43524369
return resp_data;
43534370
}
@@ -4978,7 +4995,7 @@ copy_job (GIOSchedulerJob *io_job,
49784995
goto aborted;
49794996
}
49804997

4981-
g_timer_start (job->common.time);
4998+
nemo_progress_info_start (common->progress);
49824999

49835000
memset (&transfer_info, 0, sizeof (transfer_info));
49845001
copy_files (job,
@@ -5086,10 +5103,14 @@ report_move_progress (CopyMoveJob *move_job, int total, int left)
50865103
f (_("Preparing to Move to \"%B\""),
50875104
move_job->destination));
50885105

5089-
nemo_progress_info_take_details (job->progress,
5090-
f (ngettext ("Preparing to move %'d file",
5091-
"Preparing to move %'d files",
5092-
left), left));
5106+
if (nemo_progress_info_get_is_paused (job->progress)) {
5107+
nemo_progress_info_set_details (job->progress, _("Paused"));
5108+
} else {
5109+
nemo_progress_info_take_details (job->progress,
5110+
f (ngettext ("Preparing to move %'d file",
5111+
"Preparing to move %'d files",
5112+
left), left));
5113+
}
50935114

50945115
nemo_progress_info_pulse_progress (job->progress);
50955116
}

0 commit comments

Comments
 (0)