mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
(overwrite_query_dialog): add "Don't overwrite with zero length file" option.
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
a07cb50069
commit
ac689ea726
@ -232,6 +232,7 @@ typedef struct
|
|||||||
const char *src_filename;
|
const char *src_filename;
|
||||||
const char *tgt_filename;
|
const char *tgt_filename;
|
||||||
replace_action_t replace_result;
|
replace_action_t replace_result;
|
||||||
|
gboolean dont_overwrite_with_zero;
|
||||||
|
|
||||||
struct stat *src_stat, *dst_stat;
|
struct stat *src_stat, *dst_stat;
|
||||||
} file_op_context_ui_t;
|
} file_op_context_ui_t;
|
||||||
@ -420,7 +421,7 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode)
|
|||||||
ui->replace_dlg->current->data)
|
ui->replace_dlg->current->data)
|
||||||
|
|
||||||
/* dialog sizes */
|
/* dialog sizes */
|
||||||
const int dlg_height = 16;
|
const int dlg_height = 17;
|
||||||
int dlg_width = 60;
|
int dlg_width = 60;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
@ -464,19 +465,21 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode)
|
|||||||
/* --------------------------------------------------- */
|
/* --------------------------------------------------- */
|
||||||
/* 13 - label */
|
/* 13 - label */
|
||||||
{ NULL, N_("Overwrite all files?"), 10, 21, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, 0 },
|
{ NULL, N_("Overwrite all files?"), 10, 21, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, 0 },
|
||||||
/* 14 - button */
|
/* 14 - checkbox */
|
||||||
{ NULL, N_("A&ll"), 11, 12, WPOS_KEEP_DEFAULT, REPLACE_ALL },
|
{ NULL, N_("Don't overwrite with &zero length file"), 11, 3, WPOS_KEEP_DEFAULT, 0 },
|
||||||
/* 15 - button */
|
/* 15 - button */
|
||||||
{ NULL, N_("&Older"), 11, 12, WPOS_KEEP_DEFAULT, REPLACE_OLDER },
|
{ NULL, N_("A&ll"), 12, 12, WPOS_KEEP_DEFAULT, REPLACE_ALL },
|
||||||
/* 16 - button */
|
/* 16 - button */
|
||||||
{ NULL, N_("Non&e"), 11, 12, WPOS_KEEP_DEFAULT, REPLACE_NONE },
|
{ NULL, N_("&Older"), 12, 12, WPOS_KEEP_DEFAULT, REPLACE_OLDER },
|
||||||
/* 17 - button */
|
/* 17 - button */
|
||||||
{ NULL, N_("S&maller"), 11, 25, WPOS_KEEP_DEFAULT, REPLACE_SMALLER },
|
{ NULL, N_("Non&e"), 12, 12, WPOS_KEEP_DEFAULT, REPLACE_NONE },
|
||||||
/* 18 - button */
|
/* 18 - button */
|
||||||
{ NULL, N_("&Size differs"), 11, 40, WPOS_KEEP_DEFAULT, REPLACE_SIZE },
|
{ NULL, N_("S&maller"), 12, 25, WPOS_KEEP_DEFAULT, REPLACE_SMALLER },
|
||||||
/* --------------------------------------------------- */
|
|
||||||
/* 19 - button */
|
/* 19 - button */
|
||||||
{ NULL, N_("&Abort"), 13, 27, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, REPLACE_ABORT }
|
{ NULL, N_("&Size differs"), 12, 40, WPOS_KEEP_DEFAULT, REPLACE_SIZE },
|
||||||
|
/* --------------------------------------------------- */
|
||||||
|
/* 20 - button */
|
||||||
|
{ NULL, N_("&Abort"), 14, 27, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, REPLACE_ABORT }
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -556,7 +559,9 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode)
|
|||||||
NEW_BUTTON (12);
|
NEW_BUTTON (12);
|
||||||
|
|
||||||
NEW_LABEL (13, dlg_widgets[13].text);
|
NEW_LABEL (13, dlg_widgets[13].text);
|
||||||
for (i = 14; i <= 19; i++)
|
dlg_widgets[14].widget =
|
||||||
|
WIDGET (check_new (dlg_widgets[14].y, dlg_widgets[14].x, FALSE, dlg_widgets[14].text));
|
||||||
|
for (i = 15; i <= 20; i++)
|
||||||
NEW_BUTTON (i);
|
NEW_BUTTON (i);
|
||||||
|
|
||||||
/* place widgets */
|
/* place widgets */
|
||||||
@ -570,13 +575,14 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode)
|
|||||||
bw1 += gap + WCOLS (12);
|
bw1 += gap + WCOLS (12);
|
||||||
dlg_width = MAX (dlg_width, bw1);
|
dlg_width = MAX (dlg_width, bw1);
|
||||||
|
|
||||||
bw2 = WCOLS (14);
|
bw2 = WCOLS (15);
|
||||||
for (i = 15; i <= 18; i++)
|
for (i = 16; i <= 19; i++)
|
||||||
bw2 += gap + WCOLS (i);
|
bw2 += gap + WCOLS (i);
|
||||||
dlg_width = MAX (dlg_width, bw2);
|
dlg_width = MAX (dlg_width, bw2);
|
||||||
|
|
||||||
dlg_width = MAX (dlg_width, WCOLS (8));
|
dlg_width = MAX (dlg_width, WCOLS (8));
|
||||||
dlg_width = MAX (dlg_width, WCOLS (13));
|
dlg_width = MAX (dlg_width, WCOLS (13));
|
||||||
|
dlg_width = MAX (dlg_width, WCOLS (14));
|
||||||
|
|
||||||
/* truncate file names */
|
/* truncate file names */
|
||||||
w = WCOLS (0) + gap + WCOLS (1);
|
w = WCOLS (0) + gap + WCOLS (1);
|
||||||
@ -621,8 +627,8 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode)
|
|||||||
if (do_reget)
|
if (do_reget)
|
||||||
WX (12) = WX (11) + WCOLS (11) + gap;
|
WX (12) = WX (11) + WCOLS (11) + gap;
|
||||||
|
|
||||||
WX (14) = dlg_width / 2 - bw2 / 2;
|
WX (15) = dlg_width / 2 - bw2 / 2;
|
||||||
for (i = 15; i <= 18; i++)
|
for (i = 16; i <= 19; i++)
|
||||||
WX (i) = WX (i - 1) + WCOLS (i - 1) + gap;
|
WX (i) = WX (i - 1) + WCOLS (i - 1) + gap;
|
||||||
|
|
||||||
/* TODO: write help (ticket #3970) */
|
/* TODO: write help (ticket #3970) */
|
||||||
@ -648,16 +654,20 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode)
|
|||||||
|
|
||||||
/* label & buttons */
|
/* label & buttons */
|
||||||
ADD_LABEL (13); /* Overwrite all files? */
|
ADD_LABEL (13); /* Overwrite all files? */
|
||||||
for (i = 14; i <= 18; i++)
|
add_widget (ui->replace_dlg, dlg_widgets[14].widget);
|
||||||
|
for (i = 15; i <= 19; i++)
|
||||||
ADD_BUTTON (i);
|
ADD_BUTTON (i);
|
||||||
add_widget (ui->replace_dlg, hline_new (W (18)->y - wd->y + 1, -1, -1));
|
add_widget (ui->replace_dlg, hline_new (W (19)->y - wd->y + 1, -1, -1));
|
||||||
|
|
||||||
ADD_BUTTON (19); /* Abort */
|
ADD_BUTTON (20); /* Abort */
|
||||||
|
|
||||||
dlg_select_by_id (ui->replace_dlg, safe_overwrite ? no_id : yes_id);
|
dlg_select_by_id (ui->replace_dlg, safe_overwrite ? no_id : yes_id);
|
||||||
|
|
||||||
result = dlg_run (ui->replace_dlg);
|
result = dlg_run (ui->replace_dlg);
|
||||||
|
|
||||||
|
if (result != B_CANCEL)
|
||||||
|
ui->dont_overwrite_with_zero = CHECK (dlg_widgets[14].widget)->state;
|
||||||
|
|
||||||
dlg_destroy (ui->replace_dlg);
|
dlg_destroy (ui->replace_dlg);
|
||||||
|
|
||||||
return (result == B_CANCEL) ? REPLACE_ABORT : (replace_action_t) result;
|
return (result == B_CANCEL) ? REPLACE_ABORT : (replace_action_t) result;
|
||||||
@ -1177,6 +1187,7 @@ file_progress_real_query_replace (file_op_context_t * ctx, enum OperationMode mo
|
|||||||
const char *dst, struct stat *dst_stat)
|
const char *dst, struct stat *dst_stat)
|
||||||
{
|
{
|
||||||
file_op_context_ui_t *ui;
|
file_op_context_ui_t *ui;
|
||||||
|
FileProgressStatus replace_with_zero;
|
||||||
|
|
||||||
if (ctx == NULL || ctx->ui == NULL)
|
if (ctx == NULL || ctx->ui == NULL)
|
||||||
return FILE_CONT;
|
return FILE_CONT;
|
||||||
@ -1193,12 +1204,15 @@ file_progress_real_query_replace (file_op_context_t * ctx, enum OperationMode mo
|
|||||||
ui->replace_result = overwrite_query_dialog (ctx, mode);
|
ui->replace_result = overwrite_query_dialog (ctx, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
replace_with_zero = (src_stat->st_size == 0
|
||||||
|
&& ui->dont_overwrite_with_zero) ? FILE_SKIP : FILE_CONT;
|
||||||
|
|
||||||
switch (ui->replace_result)
|
switch (ui->replace_result)
|
||||||
{
|
{
|
||||||
case REPLACE_OLDER:
|
case REPLACE_OLDER:
|
||||||
do_refresh ();
|
do_refresh ();
|
||||||
if (src_stat->st_mtime > dst_stat->st_mtime)
|
if (src_stat->st_mtime > dst_stat->st_mtime)
|
||||||
return FILE_CONT;
|
return replace_with_zero;
|
||||||
else
|
else
|
||||||
return FILE_SKIP;
|
return FILE_SKIP;
|
||||||
|
|
||||||
@ -1207,7 +1221,7 @@ file_progress_real_query_replace (file_op_context_t * ctx, enum OperationMode mo
|
|||||||
if (src_stat->st_size == dst_stat->st_size)
|
if (src_stat->st_size == dst_stat->st_size)
|
||||||
return FILE_SKIP;
|
return FILE_SKIP;
|
||||||
else
|
else
|
||||||
return FILE_CONT;
|
return replace_with_zero;
|
||||||
|
|
||||||
case REPLACE_SMALLER:
|
case REPLACE_SMALLER:
|
||||||
do_refresh ();
|
do_refresh ();
|
||||||
@ -1216,6 +1230,10 @@ file_progress_real_query_replace (file_op_context_t * ctx, enum OperationMode mo
|
|||||||
else
|
else
|
||||||
return FILE_SKIP;
|
return FILE_SKIP;
|
||||||
|
|
||||||
|
case REPLACE_ALL:
|
||||||
|
do_refresh ();
|
||||||
|
return replace_with_zero;
|
||||||
|
|
||||||
case REPLACE_REGET:
|
case REPLACE_REGET:
|
||||||
/* Careful: we fall through and set do_append */
|
/* Careful: we fall through and set do_append */
|
||||||
ctx->do_reget = dst_stat->st_size;
|
ctx->do_reget = dst_stat->st_size;
|
||||||
@ -1226,7 +1244,6 @@ file_progress_real_query_replace (file_op_context_t * ctx, enum OperationMode mo
|
|||||||
MC_FALLTHROUGH;
|
MC_FALLTHROUGH;
|
||||||
|
|
||||||
case REPLACE_YES:
|
case REPLACE_YES:
|
||||||
case REPLACE_ALL:
|
|
||||||
do_refresh ();
|
do_refresh ();
|
||||||
return FILE_CONT;
|
return FILE_CONT;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user