mirror of
https://github.com/MidnightCommander/mc
synced 2025-02-24 19:24:48 +03:00
Ticket 4409: continue copy after interrupt.
(copy_file_file): add button "Continue copy" to query dialog "Incomplete file was retrieved". (file_ui_op_dlg_callback): callback for copy/move progess dialog. Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
38bd3ece9e
commit
30f9309b8a
@ -121,9 +121,11 @@ struct link
|
||||
/* Status of the destination file */
|
||||
typedef enum
|
||||
{
|
||||
DEST_NONE = 0, /* Not created */
|
||||
DEST_SHORT = 1, /* Created, not fully copied */
|
||||
DEST_FULL = 2 /* Created, fully copied */
|
||||
DEST_NONE = 0, /**< Not created */
|
||||
DEST_SHORT_QUERY, /**< Created, not fully copied, query to do */
|
||||
DEST_SHORT_KEEP, /**< Created, not fully copied, keep it */
|
||||
DEST_SHORT_DELETE, /**< Created, not fully copied, delete it */
|
||||
DEST_FULL /**< Created, fully copied */
|
||||
} dest_status_t;
|
||||
|
||||
/* Status of hard link creation */
|
||||
@ -2508,7 +2510,8 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
|
||||
goto ret;
|
||||
}
|
||||
|
||||
dst_status = DEST_SHORT; /* file opened, but not fully copied */
|
||||
/* file opened, but not fully copied */
|
||||
dst_status = DEST_SHORT_QUERY;
|
||||
|
||||
appending = ctx->do_append;
|
||||
ctx->do_append = FALSE;
|
||||
@ -2696,15 +2699,36 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
|
||||
mc_refresh ();
|
||||
|
||||
return_status = check_progress_buttons (ctx);
|
||||
|
||||
if (return_status != FILE_CONT)
|
||||
{
|
||||
mc_refresh ();
|
||||
goto ret;
|
||||
int query_res;
|
||||
|
||||
query_res =
|
||||
query_dialog (Q_ ("DialogTitle|Copy"),
|
||||
_("Incomplete file was retrieved"), D_ERROR, 3,
|
||||
_("&Delete"), _("&Keep"), _("&Continue copy"));
|
||||
|
||||
switch (query_res)
|
||||
{
|
||||
case 0:
|
||||
/* delete */
|
||||
dst_status = DEST_SHORT_DELETE;
|
||||
goto ret;
|
||||
|
||||
case 1:
|
||||
/* keep */
|
||||
dst_status = DEST_SHORT_KEEP;
|
||||
goto ret;
|
||||
|
||||
default:
|
||||
/* continue copy */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dst_status = DEST_FULL; /* copy successful, don't remove target file */
|
||||
/* copy successful */
|
||||
dst_status = DEST_FULL;
|
||||
}
|
||||
|
||||
ret:
|
||||
@ -2734,13 +2758,15 @@ copy_file_file (file_op_total_context_t * tctx, file_op_context_t * ctx,
|
||||
break;
|
||||
}
|
||||
|
||||
if (dst_status == DEST_SHORT)
|
||||
if (dst_status == DEST_SHORT_QUERY)
|
||||
{
|
||||
/* Query to remove short file */
|
||||
if (query_dialog (Q_ ("DialogTitle|Copy"), _("Incomplete file was retrieved. Keep it?"),
|
||||
if (query_dialog (Q_ ("DialogTitle|Copy"), _("Incomplete file was retrieved"),
|
||||
D_ERROR, 2, _("&Delete"), _("&Keep")) == 0)
|
||||
mc_unlink (dst_vpath);
|
||||
}
|
||||
else if (dst_status == DEST_SHORT_DELETE)
|
||||
mc_unlink (dst_vpath);
|
||||
else if (dst_status == DEST_FULL && !appending)
|
||||
{
|
||||
/* Copy has succeeded */
|
||||
|
@ -380,6 +380,27 @@ file_bps_prepare_for_show (char *buffer, long bps)
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
static cb_ret_t
|
||||
file_ui_op_dlg_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
case MSG_ACTION:
|
||||
/* Do not close the dialog because the query dialog will be shown */
|
||||
if (parm == CK_Cancel)
|
||||
{
|
||||
DIALOG (w)->ret_value = FILE_ABORT; /* for check_progress_buttons() */
|
||||
return MSG_HANDLED;
|
||||
}
|
||||
return MSG_NOT_HANDLED;
|
||||
|
||||
default:
|
||||
return dlg_default_callback (w, sender, msg, parm, data);
|
||||
}
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------------------------- */
|
||||
|
||||
/* The dialog layout:
|
||||
*
|
||||
* +---------------------- File exists -----------------------+
|
||||
@ -828,9 +849,8 @@ file_op_context_create_ui (file_op_context_t * ctx, gboolean with_eta,
|
||||
ui = ctx->ui;
|
||||
ui->replace_result = REPLACE_YES;
|
||||
|
||||
ui->op_dlg =
|
||||
dlg_create (TRUE, 0, 0, dlg_height, dlg_width, WPOS_CENTER, FALSE, dialog_colors, NULL,
|
||||
NULL, NULL, op_names[ctx->operation]);
|
||||
ui->op_dlg = dlg_create (TRUE, 0, 0, dlg_height, dlg_width, WPOS_CENTER, FALSE, dialog_colors,
|
||||
file_ui_op_dlg_callback, NULL, NULL, op_names[ctx->operation]);
|
||||
w = WIDGET (ui->op_dlg);
|
||||
g = GROUP (ui->op_dlg);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user