Mercurial > geeqie
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 = ""; |