UTILITY_PHASE_ENTERING,
UTILITY_PHASE_CHECKED,
UTILITY_PHASE_DONE,
- UTILITY_PHASE_CANCEL
+ UTILITY_PHASE_CANCEL,
+ UTILITY_PHASE_DISCARD
} UtilityPhase;
enum {
FileUtilDoneFunc done_func;
void (*details_func)(FileData *fd, GtkWidget *parent);
+ gboolean (*finalize_func)(FileData *fd);
+ gboolean (*discard_func)(FileData *fd);
gpointer done_data;
};
ud->flist = g_list_remove(ud->flist, fd);
- /* FIXME: put it here for now */
- if (ud->type == UTILITY_TYPE_WRITE_METADATA)
+ if (ud->finalize_func)
{
- metadata_write_queue_remove(fd);
+ ud->finalize_func(fd);
}
if (ud->with_sidecars)
file_util_dialog_run(ud);
}
+static void file_util_discard_cb(GenericDialog *gd, gpointer data)
+{
+ UtilityData *ud = data;
+
+ generic_dialog_close(gd);
+
+ ud->gd = NULL;
+
+ ud->phase = UTILITY_PHASE_DISCARD;
+ file_util_dialog_run(ud);
+}
+
static void file_util_ok_cb(GenericDialog *gd, gpointer data)
{
UtilityData *ud = data;
ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm",
ud->parent, FALSE, file_util_cancel_cb, ud);
+ if (ud->discard_func) generic_dialog_add_button(ud->gd, GTK_STOCK_REVERT_TO_SAVED, _("Discard changes"), file_util_discard_cb, FALSE);
if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE);
generic_dialog_add_button(ud->gd, stock_id, NULL, file_util_ok_cb, TRUE);
box = generic_dialog_add_message(ud->gd, NULL, ud->messages.question, NULL);
+ if (ud->discard_func) generic_dialog_add_button(ud->gd, GTK_STOCK_REVERT_TO_SAVED, _("Discard changes"), file_util_discard_cb, FALSE);
if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE);
generic_dialog_add_button(ud->gd, GTK_STOCK_OK, ud->messages.title, file_util_ok_cb, TRUE);
file_util_dialog_list_select(ud->listview, 0);
}
+static void file_util_finalize_all(UtilityData *ud)
+{
+ GList *work = ud->flist;
+
+ if (ud->phase == UTILITY_PHASE_CANCEL) return;
+ if (ud->phase == UTILITY_PHASE_DONE && !ud->finalize_func) return;
+ if (ud->phase == UTILITY_PHASE_DISCARD && !ud->discard_func) return;
+
+ while (work)
+ {
+ FileData *fd = work->data;
+ work = work->next;
+ if (ud->phase == UTILITY_PHASE_DONE) ud->finalize_func(fd);
+ else if (ud->phase == UTILITY_PHASE_DISCARD) ud->discard_func(fd);
+ }
+}
void file_util_dialog_run(UtilityData *ud)
{
break;
case UTILITY_PHASE_CANCEL:
case UTILITY_PHASE_DONE:
+ case UTILITY_PHASE_DISCARD:
- /* FIXME: put it here for now */
- if (ud->type == UTILITY_TYPE_WRITE_METADATA)
- {
- metadata_write_queue_remove_list(ud->flist);
- }
+ file_util_finalize_all(ud);
if (ud->done_func)
ud->done_func((ud->phase == UTILITY_PHASE_DONE), ud->dest_path, ud->done_data);
ud->done_data = done_data;
ud->details_func = file_util_write_metadata_details_dialog;
+ ud->finalize_func = metadata_write_queue_remove;
+ ud->discard_func = metadata_write_queue_remove;
ud->messages.title = _("Write metadata");
ud->messages.question = _("Write metadata?");