comparison src/utilops.c @ 1557:c10cd5197447

added possibility to show modifiied metadata before write
author nadvornik
date Tue, 21 Apr 2009 21:07:28 +0000
parents fffb62c7ba1e
children 597ed9e9979c
comparison
equal deleted inserted replaced
1556:3840882253fe 1557:c10cd5197447
30 #include "ui_fileops.h" 30 #include "ui_fileops.h"
31 #include "ui_misc.h" 31 #include "ui_misc.h"
32 #include "ui_tabcomp.h" 32 #include "ui_tabcomp.h"
33 #include "editors.h" 33 #include "editors.h"
34 #include "metadata.h" 34 #include "metadata.h"
35 #include "exif.h"
35 36
36 static GdkPixbuf *file_util_get_error_icon(FileData *fd, GtkWidget *widget); 37 static GdkPixbuf *file_util_get_error_icon(FileData *fd, GtkWidget *widget);
37 38
38 /* 39 /*
39 *-------------------------------------------------------------------------- 40 *--------------------------------------------------------------------------
276 UtilityPhase phase; 277 UtilityPhase phase;
277 278
278 FileData *dir_fd; 279 FileData *dir_fd;
279 GList *content_list; 280 GList *content_list;
280 GList *flist; 281 GList *flist;
282
283 FileData *sel_fd;
281 284
282 GtkWidget *parent; 285 GtkWidget *parent;
283 GenericDialog *gd; 286 GenericDialog *gd;
284 FileDialog *fdlg; 287 FileDialog *fdlg;
285 288
313 316
314 gchar *external_command; 317 gchar *external_command;
315 gpointer resume_data; 318 gpointer resume_data;
316 319
317 FileUtilDoneFunc done_func; 320 FileUtilDoneFunc done_func;
321 void (*details_func)(FileData *fd, GtkWidget *parent);
318 gpointer done_data; 322 gpointer done_data;
319 }; 323 };
320 324
321 enum { 325 enum {
322 UTILITY_COLUMN_FD = 0, 326 UTILITY_COLUMN_FD = 0,
1250 !gtk_tree_model_get_iter(store, &iter, tpath)) return TRUE; 1254 !gtk_tree_model_get_iter(store, &iter, tpath)) return TRUE;
1251 1255
1252 gtk_tree_model_get(store, &iter, UTILITY_COLUMN_FD, &fd, -1); 1256 gtk_tree_model_get(store, &iter, UTILITY_COLUMN_FD, &fd, -1);
1253 generic_dialog_image_set(ud->gd, fd); 1257 generic_dialog_image_set(ud->gd, fd);
1254 1258
1259 ud->sel_fd = fd;
1260
1255 if (ud->type == UTILITY_TYPE_RENAME) 1261 if (ud->type == UTILITY_TYPE_RENAME)
1256 { 1262 {
1257 const gchar *name = filename_from_path(fd->change->dest); 1263 const gchar *name = filename_from_path(fd->change->dest);
1258 1264
1259 gtk_widget_grab_focus(ud->rename_entry); 1265 gtk_widget_grab_focus(ud->rename_entry);
1280 1286
1281 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); 1287 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
1282 gtk_widget_set_sensitive(label, FALSE); 1288 gtk_widget_set_sensitive(label, FALSE);
1283 } 1289 }
1284 1290
1291 static void file_util_details_cb(GenericDialog *gd, gpointer data)
1292 {
1293 UtilityData *ud = data;
1294 if (ud->details_func && ud->sel_fd)
1295 {
1296 ud->details_func(ud->sel_fd, ud->gd->dialog);
1297 }
1298 }
1285 1299
1286 static void file_util_dialog_init_simple_list(UtilityData *ud) 1300 static void file_util_dialog_init_simple_list(UtilityData *ud)
1287 { 1301 {
1288 GtkWidget *box; 1302 GtkWidget *box;
1289 GtkTreeSelection *selection; 1303 GtkTreeSelection *selection;
1290 gchar *dir_msg; 1304 gchar *dir_msg;
1291 1305
1292 const gchar *stock_id; 1306 const gchar *stock_id;
1293 1307
1308 /* FIXME: use ud->stock_id */
1294 if (ud->type == UTILITY_TYPE_DELETE || 1309 if (ud->type == UTILITY_TYPE_DELETE ||
1295 ud->type == UTILITY_TYPE_DELETE_LINK || 1310 ud->type == UTILITY_TYPE_DELETE_LINK ||
1296 ud->type == UTILITY_TYPE_DELETE_FOLDER) 1311 ud->type == UTILITY_TYPE_DELETE_FOLDER)
1297 { 1312 {
1298 stock_id = GTK_STOCK_DELETE; 1313 stock_id = GTK_STOCK_DELETE;
1302 stock_id = GTK_STOCK_OK; 1317 stock_id = GTK_STOCK_OK;
1303 } 1318 }
1304 1319
1305 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm", 1320 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm",
1306 ud->parent, FALSE, file_util_cancel_cb, ud); 1321 ud->parent, FALSE, file_util_cancel_cb, ud);
1322 if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE);
1323
1307 generic_dialog_add_button(ud->gd, stock_id, NULL, file_util_ok_cb, TRUE); 1324 generic_dialog_add_button(ud->gd, stock_id, NULL, file_util_ok_cb, TRUE);
1308
1309 1325
1310 if (ud->dir_fd) 1326 if (ud->dir_fd)
1311 { 1327 {
1312 dir_msg = g_strdup_printf("%s\n\n%s\n", ud->messages.desc_source_fd, ud->dir_fd->path); 1328 dir_msg = g_strdup_printf("%s\n\n%s\n", ud->messages.desc_source_fd, ud->dir_fd->path);
1313 } 1329 }
1412 1428
1413 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm", 1429 ud->gd = file_util_gen_dlg(ud->messages.title, "dlg_confirm",
1414 ud->parent, FALSE, file_util_cancel_cb, ud); 1430 ud->parent, FALSE, file_util_cancel_cb, ud);
1415 1431
1416 box = generic_dialog_add_message(ud->gd, NULL, ud->messages.question, NULL); 1432 box = generic_dialog_add_message(ud->gd, NULL, ud->messages.question, NULL);
1433
1434 if (ud->details_func) generic_dialog_add_button(ud->gd, GTK_STOCK_INFO, _("File details"), file_util_details_cb, FALSE);
1435
1417 generic_dialog_add_button(ud->gd, GTK_STOCK_OK, ud->messages.title, file_util_ok_cb, TRUE); 1436 generic_dialog_add_button(ud->gd, GTK_STOCK_OK, ud->messages.title, file_util_ok_cb, TRUE);
1418 1437
1419 box = pref_group_new(box, TRUE, ud->messages.desc_flist, GTK_ORIENTATION_HORIZONTAL); 1438 box = pref_group_new(box, TRUE, ud->messages.desc_flist, GTK_ORIENTATION_HORIZONTAL);
1420 1439
1421 ud->listview = file_util_dialog_add_list(box, ud->flist, FALSE, ud->with_sidecars); 1440 ud->listview = file_util_dialog_add_list(box, ud->flist, FALSE, ud->with_sidecars);
1654 ud->messages.fail = _("File deletion failed"); 1673 ud->messages.fail = _("File deletion failed");
1655 1674
1656 file_util_dialog_run(ud); 1675 file_util_dialog_run(ud);
1657 } 1676 }
1658 1677
1678 static void file_util_write_metadata_details_dialog_ok_cb(GenericDialog *gd, gpointer data)
1679 {
1680 /* no op */
1681 }
1682
1683 static void file_util_write_metadata_details_dialog(FileData *fd, GtkWidget *parent)
1684 {
1685 GenericDialog *gd;
1686 GtkWidget *table;
1687 GList *keys = NULL;
1688 GList *work;
1689 gchar *message = g_strdup_printf(_("This is a list of modified metadata tags that will be written for file '%s'"), fd->name);
1690 gint i;
1691
1692 if (fd && fd->modified_xmp)
1693 {
1694 keys = g_hash_table_get_keys(fd->modified_xmp);
1695 }
1696
1697 g_assert(keys);
1698
1699
1700 gd = file_util_gen_dlg(_("Overview of changed metadata"), "details", parent, TRUE, NULL, NULL);
1701 generic_dialog_add_message(gd, GTK_STOCK_DIALOG_INFO, _("Overview of changed metadata"), message);
1702 generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, file_util_write_metadata_details_dialog_ok_cb, TRUE);
1703
1704 table = pref_table_new(gd->vbox, 2, g_list_length(keys), FALSE, TRUE);
1705
1706 work = keys;
1707 i = 0;
1708 while (work)
1709 {
1710 GtkWidget *label;
1711 const gchar *key = work->data;
1712 gchar *title = exif_get_description_by_key(key);
1713 gchar *title_f = g_strdup_printf("%s:", title);
1714 gchar *value = metadata_read_string(fd, key, METADATA_FORMATTED);
1715 work = work->next;
1716
1717
1718 label = gtk_label_new(title_f);
1719 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0);
1720 pref_label_bold(label, TRUE, FALSE);
1721 gtk_table_attach(GTK_TABLE(table), label,
1722 0, 1, i, i + 1,
1723 GTK_FILL, GTK_FILL,
1724 2, 2);
1725 gtk_widget_show(label);
1726
1727 label = gtk_label_new(value);
1728 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
1729 gtk_table_attach(GTK_TABLE(table), label,
1730 1, 2, i, i + 1,
1731 GTK_FILL, GTK_FILL,
1732 2, 2);
1733 gtk_widget_show(label);
1734
1735 g_free(title);
1736 g_free(title_f);
1737 g_free(value);
1738 i++;
1739 }
1740
1741 gtk_widget_show(gd->dialog);
1742
1743 g_list_free(keys);
1744 g_free(message);
1745 }
1746
1659 static void file_util_write_metadata_full(FileData *source_fd, GList *source_list, GtkWidget *parent, UtilityPhase phase, FileUtilDoneFunc done_func, gpointer done_data) 1747 static void file_util_write_metadata_full(FileData *source_fd, GList *source_list, GtkWidget *parent, UtilityPhase phase, FileUtilDoneFunc done_func, gpointer done_data)
1660 { 1748 {
1661 UtilityData *ud; 1749 UtilityData *ud;
1662 GList *flist = filelist_copy(source_list); 1750 GList *flist = filelist_copy(source_list);
1663 1751
1684 ud->content_list = NULL; 1772 ud->content_list = NULL;
1685 ud->parent = parent; 1773 ud->parent = parent;
1686 1774
1687 ud->done_func = done_func; 1775 ud->done_func = done_func;
1688 ud->done_data = done_data; 1776 ud->done_data = done_data;
1777
1778 ud->details_func = file_util_write_metadata_details_dialog;
1689 1779
1690 ud->messages.title = _("Write metadata"); 1780 ud->messages.title = _("Write metadata");
1691 ud->messages.question = _("Write metadata?"); 1781 ud->messages.question = _("Write metadata?");
1692 ud->messages.desc_flist = _("This will write the changed metadata into the following files"); 1782 ud->messages.desc_flist = _("This will write the changed metadata into the following files");
1693 ud->messages.desc_source_fd = ""; 1783 ud->messages.desc_source_fd = "";