comparison src/utilops.c @ 1560:dd0a89cdb021

differentiate between "Cancel" and "Discard changes"
author nadvornik
date Thu, 23 Apr 2009 20:48:03 +0000
parents 597ed9e9979c
children d986a7727442
comparison
equal deleted inserted replaced
1559:597ed9e9979c 1560:dd0a89cdb021
250 typedef enum { 250 typedef enum {
251 UTILITY_PHASE_START = 0, 251 UTILITY_PHASE_START = 0,
252 UTILITY_PHASE_ENTERING, 252 UTILITY_PHASE_ENTERING,
253 UTILITY_PHASE_CHECKED, 253 UTILITY_PHASE_CHECKED,
254 UTILITY_PHASE_DONE, 254 UTILITY_PHASE_DONE,
255 UTILITY_PHASE_CANCEL 255 UTILITY_PHASE_CANCEL,
256 UTILITY_PHASE_DISCARD
256 } UtilityPhase; 257 } UtilityPhase;
257 258
258 enum { 259 enum {
259 UTILITY_RENAME = 0, 260 UTILITY_RENAME = 0,
260 UTILITY_RENAME_AUTO, 261 UTILITY_RENAME_AUTO,
317 gchar *external_command; 318 gchar *external_command;
318 gpointer resume_data; 319 gpointer resume_data;
319 320
320 FileUtilDoneFunc done_func; 321 FileUtilDoneFunc done_func;
321 void (*details_func)(FileData *fd, GtkWidget *parent); 322 void (*details_func)(FileData *fd, GtkWidget *parent);
323 gboolean (*finalize_func)(FileData *fd);
324 gboolean (*discard_func)(FileData *fd);
322 gpointer done_data; 325 gpointer done_data;
323 }; 326 };
324 327
325 enum { 328 enum {
326 UTILITY_COLUMN_FD = 0, 329 UTILITY_COLUMN_FD = 0,
558 file_data_apply_ci(fd); 561 file_data_apply_ci(fd);
559 } 562 }
560 563
561 ud->flist = g_list_remove(ud->flist, fd); 564 ud->flist = g_list_remove(ud->flist, fd);
562 565
563 /* FIXME: put it here for now */ 566 if (ud->finalize_func)
564 if (ud->type == UTILITY_TYPE_WRITE_METADATA) 567 {
565 { 568 ud->finalize_func(fd);
566 metadata_write_queue_remove(fd);
567 } 569 }
568 570
569 if (ud->with_sidecars) 571 if (ud->with_sidecars)
570 file_data_sc_free_ci(fd); 572 file_data_sc_free_ci(fd);
571 else 573 else
989 991
990 ud->phase = UTILITY_PHASE_CANCEL; 992 ud->phase = UTILITY_PHASE_CANCEL;
991 file_util_dialog_run(ud); 993 file_util_dialog_run(ud);
992 } 994 }
993 995
996 static void file_util_discard_cb(GenericDialog *gd, gpointer data)
997 {
998 UtilityData *ud = data;
999
1000 generic_dialog_close(gd);
1001
1002 ud->gd = NULL;
1003
1004 ud->phase = UTILITY_PHASE_DISCARD;
1005 file_util_dialog_run(ud);
1006 }
1007
994 static void file_util_ok_cb(GenericDialog *gd, gpointer data) 1008 static void file_util_ok_cb(GenericDialog *gd, gpointer data)
995 { 1009 {
996 UtilityData *ud = data; 1010 UtilityData *ud = data;
997 1011
998 generic_dialog_close(gd); 1012 generic_dialog_close(gd);
1317 stock_id = GTK_STOCK_OK; 1331 stock_id = GTK_STOCK_OK;
1318 } 1332 }
1319 1333
1320 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm", 1334 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm",
1321 ud->parent, FALSE, file_util_cancel_cb, ud); 1335 ud->parent, FALSE, file_util_cancel_cb, ud);
1336 if (ud->discard_func) generic_dialog_add_button(ud->gd, GTK_STOCK_REVERT_TO_SAVED, _("Discard changes"), file_util_discard_cb, FALSE);
1322 if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE); 1337 if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE);
1323 1338
1324 generic_dialog_add_button(ud->gd, stock_id, NULL, file_util_ok_cb, TRUE); 1339 generic_dialog_add_button(ud->gd, stock_id, NULL, file_util_ok_cb, TRUE);
1325 1340
1326 if (ud->dir_fd) 1341 if (ud->dir_fd)
1429 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm", 1444 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm",
1430 ud->parent, FALSE, file_util_cancel_cb, ud); 1445 ud->parent, FALSE, file_util_cancel_cb, ud);
1431 1446
1432 box = generic_dialog_add_message(ud->gd, NULL, ud->messages.question, NULL); 1447 box = generic_dialog_add_message(ud->gd, NULL, ud->messages.question, NULL);
1433 1448
1449 if (ud->discard_func) generic_dialog_add_button(ud->gd, GTK_STOCK_REVERT_TO_SAVED, _("Discard changes"), file_util_discard_cb, FALSE);
1434 if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE); 1450 if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE);
1435 1451
1436 generic_dialog_add_button(ud->gd, GTK_STOCK_OK, ud->messages.title, file_util_ok_cb, TRUE); 1452 generic_dialog_add_button(ud->gd, GTK_STOCK_OK, ud->messages.title, file_util_ok_cb, TRUE);
1437 1453
1438 box = pref_group_new(box, TRUE, ud->messages.desc_flist, GTK_ORIENTATION_HORIZONTAL); 1454 box = pref_group_new(box, TRUE, ud->messages.desc_flist, GTK_ORIENTATION_HORIZONTAL);
1546 // gtk_combo_box_set_active(GTK_COMBO_BOX(ud->combo_type), 0); /* callback will take care of the rest */ 1562 // gtk_combo_box_set_active(GTK_COMBO_BOX(ud->combo_type), 0); /* callback will take care of the rest */
1547 1563
1548 file_util_dialog_list_select(ud->listview, 0); 1564 file_util_dialog_list_select(ud->listview, 0);
1549 } 1565 }
1550 1566
1567 static void file_util_finalize_all(UtilityData *ud)
1568 {
1569 GList *work = ud->flist;
1570
1571 if (ud->phase == UTILITY_PHASE_CANCEL) return;
1572 if (ud->phase == UTILITY_PHASE_DONE && !ud->finalize_func) return;
1573 if (ud->phase == UTILITY_PHASE_DISCARD && !ud->discard_func) return;
1574
1575 while (work)
1576 {
1577 FileData *fd = work->data;
1578 work = work->next;
1579 if (ud->phase == UTILITY_PHASE_DONE) ud->finalize_func(fd);
1580 else if (ud->phase == UTILITY_PHASE_DISCARD) ud->discard_func(fd);
1581 }
1582 }
1551 1583
1552 void file_util_dialog_run(UtilityData *ud) 1584 void file_util_dialog_run(UtilityData *ud)
1553 { 1585 {
1554 switch (ud->phase) 1586 switch (ud->phase)
1555 { 1587 {
1588 case UTILITY_PHASE_CHECKED: 1620 case UTILITY_PHASE_CHECKED:
1589 file_util_perform_ci(ud); 1621 file_util_perform_ci(ud);
1590 break; 1622 break;
1591 case UTILITY_PHASE_CANCEL: 1623 case UTILITY_PHASE_CANCEL:
1592 case UTILITY_PHASE_DONE: 1624 case UTILITY_PHASE_DONE:
1593 1625 case UTILITY_PHASE_DISCARD:
1594 /* FIXME: put it here for now */ 1626
1595 if (ud->type == UTILITY_TYPE_WRITE_METADATA) 1627 file_util_finalize_all(ud);
1596 {
1597 metadata_write_queue_remove_list(ud->flist);
1598 }
1599 1628
1600 if (ud->done_func) 1629 if (ud->done_func)
1601 ud->done_func((ud->phase == UTILITY_PHASE_DONE), ud->dest_path, ud->done_data); 1630 ud->done_func((ud->phase == UTILITY_PHASE_DONE), ud->dest_path, ud->done_data);
1602 1631
1603 if (ud->with_sidecars) 1632 if (ud->with_sidecars)
1774 1803
1775 ud->done_func = done_func; 1804 ud->done_func = done_func;
1776 ud->done_data = done_data; 1805 ud->done_data = done_data;
1777 1806
1778 ud->details_func = file_util_write_metadata_details_dialog; 1807 ud->details_func = file_util_write_metadata_details_dialog;
1808 ud->finalize_func = metadata_write_queue_remove;
1809 ud->discard_func = metadata_write_queue_remove;
1779 1810
1780 ud->messages.title = _("Write metadata"); 1811 ud->messages.title = _("Write metadata");
1781 ud->messages.question = _("Write metadata?"); 1812 ud->messages.question = _("Write metadata?");
1782 ud->messages.desc_flist = _("This will write the changed metadata into the following files"); 1813 ud->messages.desc_flist = _("This will write the changed metadata into the following files");
1783 ud->messages.desc_source_fd = ""; 1814 ud->messages.desc_source_fd = "";