# HG changeset patch # User nadvornik # Date 1234690613 0 # Node ID 48e064b37ba6a52c81050531f4e9502ce778401d # Parent 4a3ae0e6f1ebeff3fb09af3dea5603feaef81976 separated "normal" and advanced exif, "Normal" exif is now in the generic bar, advanced exif is in separate window. diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/Makefile.am --- a/src/Makefile.am Sat Feb 14 20:26:30 2009 +0000 +++ b/src/Makefile.am Sun Feb 15 09:36:53 2009 +0000 @@ -76,6 +76,8 @@ $(module_SLIK) \ ClayRGB1998.icc \ ClayRGB1998_icc.h \ + advanced_exif.c \ + advanced_exif.h \ bar.c \ bar.h \ bar_comment.c \ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/advanced_exif.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/advanced_exif.c Sun Feb 15 09:36:53 2009 +0000 @@ -0,0 +1,321 @@ +/* + * Geeqie + * (C) 2004 John Ellis + * Copyright (C) 2008 - 2009 The Geeqie Team + * + * Author: John Ellis + * + * This software is released under the GNU General Public License (GNU GPL). + * Please read the included file COPYING for more information. + * This software comes with no warranty of any kind, use at your own risk! + */ + + +#include "main.h" +#include "advanced_exif.h" + +#include "exif.h" +#include "metadata.h" +#include "filedata.h" +#include "history_list.h" +#include "misc.h" +#include "ui_misc.h" +#include "window.h" + +/* FIXME: not needed when bar_exif.c is improved */ +#include "bar_exif.h" + +#include + +#define ADVANCED_EXIF_DATA_COLUMN_WIDTH 200 + +/* + *------------------------------------------------------------------- + * EXIF window + *------------------------------------------------------------------- + */ + +typedef struct _ExifWin ExifWin; +struct _ExifWin +{ + GtkWidget *window; + GtkWidget *vbox; + GtkWidget *scrolled; + GtkWidget *listview; + + FileData *fd; +}; + +enum { + EXIF_ADVCOL_ENABLED = 0, + EXIF_ADVCOL_TAG, + EXIF_ADVCOL_NAME, + EXIF_ADVCOL_VALUE, + EXIF_ADVCOL_FORMAT, + EXIF_ADVCOL_ELEMENTS, + EXIF_ADVCOL_DESCRIPTION, + EXIF_ADVCOL_COUNT +}; + +static gint advanced_exif_row_enabled(const gchar *name) +{ + GList *list; + + if (!name) return FALSE; + + list = history_list_get_by_key("exif_extras"); + while (list) + { + if (strcmp(name, (gchar *)(list->data)) == 0) return TRUE; + list = list->next; + } + + return FALSE; +} + +static void advanced_exif_update(ExifWin *ew) +{ + ExifData *exif; + + GtkListStore *store; + GtkTreeIter iter; + ExifData *exif_original; + ExifItem *item; + + exif = exif_read_fd(ew->fd); + + gtk_widget_set_sensitive(ew->scrolled, !!exif); + + if (!exif) return; + + exif_original = exif_get_original(exif); + + store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ew->listview))); + gtk_list_store_clear(store); + + item = exif_get_first_item(exif_original); + while (item) + { + gchar *tag; + gchar *tag_name; + gchar *text; + gchar *utf8_text; + const gchar *format; + gchar *elements; + gchar *description; + + tag = g_strdup_printf("0x%04x", exif_item_get_tag_id(item)); + tag_name = exif_item_get_tag_name(item); + format = exif_item_get_format_name(item, TRUE); + text = exif_item_get_data_as_text(item); + utf8_text = utf8_validate_or_convert(text); + g_free(text); + elements = g_strdup_printf("%d", exif_item_get_elements(item)); + description = exif_item_get_description(item); + if (!description || *description == '\0') + { + g_free(description); + description = g_strdup(tag_name); + } + + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, + EXIF_ADVCOL_ENABLED, advanced_exif_row_enabled(tag_name), + EXIF_ADVCOL_TAG, tag, + EXIF_ADVCOL_NAME, tag_name, + EXIF_ADVCOL_VALUE, utf8_text, + EXIF_ADVCOL_FORMAT, format, + EXIF_ADVCOL_ELEMENTS, elements, + EXIF_ADVCOL_DESCRIPTION, description, -1); + g_free(tag); + g_free(utf8_text); + g_free(elements); + g_free(description); + g_free(tag_name); + item = exif_get_next_item(exif_original); + } + exif_free_fd(ew->fd, exif); + +} + +static void advanced_exif_clear(ExifWin *ew) +{ + GtkListStore *store; + + store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ew->listview))); + gtk_list_store_clear(store); +} + +void advanced_exif_set_fd(GtkWidget *window, FileData *fd) +{ + ExifWin *ew; + + ew = g_object_get_data(G_OBJECT(window), "advanced_exif_data"); + if (!ew) return; + + /* store this, advanced view toggle needs to reload data */ + file_data_unref(ew->fd); + ew->fd = file_data_ref(fd); + + advanced_exif_clear(ew); + advanced_exif_update(ew); +} + +static void advanced_exif_row_toggled_cb(GtkCellRendererToggle *toggle, const gchar *path, gpointer data) +{ + GtkWidget *listview = data; + GtkTreeModel *store; + GtkTreeIter iter; + GtkTreePath *tpath; + gchar *name = NULL; + gboolean active; + + store = gtk_tree_view_get_model(GTK_TREE_VIEW(listview)); + + tpath = gtk_tree_path_new_from_string(path); + gtk_tree_model_get_iter(store, &iter, tpath); + gtk_tree_path_free(tpath); + + gtk_tree_model_get(store, &iter, EXIF_ADVCOL_ENABLED, &active, + EXIF_ADVCOL_NAME, &name, -1); + active = (!active); + + if (active && + g_list_length(history_list_get_by_key("exif_extras")) >= EXIF_BAR_CUSTOM_COUNT) + { + active = FALSE; + } + + gtk_list_store_set(GTK_LIST_STORE(store), &iter, EXIF_ADVCOL_ENABLED, active, -1); + + if (active) + { + history_list_add_to_key("exif_extras", name, EXIF_BAR_CUSTOM_COUNT); + } + else + { + history_list_item_change("exif_extras", name, NULL); + } + + g_free(name); +} + +static void advanced_exif_add_column_check(GtkWidget *listview, const gchar *title, gint n) +{ + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, title); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + + renderer = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_add_attribute(column, renderer, "active", n); + gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); + + g_signal_connect(G_OBJECT(renderer), "toggled", + G_CALLBACK(advanced_exif_row_toggled_cb), listview); +} + +static void advanced_exif_add_column(GtkWidget *listview, const gchar *title, gint n, gint sizable) +{ + GtkTreeViewColumn *column; + GtkCellRenderer *renderer; + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, title); + + if (sizable) + { + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width(column, ADVANCED_EXIF_DATA_COLUMN_WIDTH); + gtk_tree_view_column_set_resizable(column, TRUE); + } + else + { + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + } + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, TRUE); + gtk_tree_view_column_add_attribute(column, renderer, "text", n); + gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); +} + +void advanced_exif_close(GtkWidget *window) +{ + ExifWin *ew; + + ew = g_object_get_data(G_OBJECT(window), "advanced_exif_data"); + if (!ew) return; + + gtk_widget_destroy(ew->vbox); +} + +static void advanced_exif_destroy(GtkWidget *widget, gpointer data) +{ + ExifWin *ew = data; + file_data_unref(ew->fd); + g_free(ew); +} + +GtkWidget *advanced_exif_new(void) +{ + ExifWin *ew; + GtkListStore *store; + GdkGeometry geometry; + + ew = g_new0(ExifWin, 1); + + + ew->window = window_new(GTK_WINDOW_TOPLEVEL, "view", NULL, NULL, _("Metadata")); + + geometry.min_width = 900; + geometry.min_height = 600; + gtk_window_set_geometry_hints(GTK_WINDOW(ew->window), NULL, &geometry, GDK_HINT_MIN_SIZE); + + gtk_window_set_resizable(GTK_WINDOW(ew->window), TRUE); + + g_object_set_data(G_OBJECT(ew->window), "advanced_exif_data", ew); + g_signal_connect_after(G_OBJECT(ew->window), "destroy", + G_CALLBACK(advanced_exif_destroy), ew); + + ew->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); + gtk_container_add(GTK_CONTAINER(ew->window), ew->vbox); + gtk_widget_show(ew->vbox); + + + store = gtk_list_store_new(7, G_TYPE_BOOLEAN, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + ew->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + g_object_unref(store); + + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(ew->listview), TRUE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(ew->listview), TRUE); + + gtk_tree_view_set_search_column(GTK_TREE_VIEW(ew->listview), EXIF_ADVCOL_NAME); + + advanced_exif_add_column_check(ew->listview, "", EXIF_ADVCOL_ENABLED); + + advanced_exif_add_column(ew->listview, _("Description"), EXIF_ADVCOL_DESCRIPTION, FALSE); + advanced_exif_add_column(ew->listview, _("Value"), EXIF_ADVCOL_VALUE, TRUE); + advanced_exif_add_column(ew->listview, _("Name"), EXIF_ADVCOL_NAME, FALSE); + advanced_exif_add_column(ew->listview, _("Tag"), EXIF_ADVCOL_TAG, FALSE); + advanced_exif_add_column(ew->listview, _("Format"), EXIF_ADVCOL_FORMAT, FALSE); + advanced_exif_add_column(ew->listview, _("Elements"), EXIF_ADVCOL_ELEMENTS, FALSE); + + ew->scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ew->scrolled), GTK_SHADOW_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ew->scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(ew->vbox), ew->scrolled, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(ew->scrolled), ew->listview); + gtk_widget_show(ew->listview); + gtk_widget_show(ew->scrolled); + + gtk_widget_show(ew->window); + return ew->window; +} +/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/advanced_exif.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/advanced_exif.h Sun Feb 15 09:36:53 2009 +0000 @@ -0,0 +1,24 @@ +/* + * Geeqie + * (C) 2004 John Ellis + * Copyright (C) 2008 - 2009 The Geeqie Team + * + * Author: John Ellis + * + * This software is released under the GNU General Public License (GNU GPL). + * Please read the included file COPYING for more information. + * This software comes with no warranty of any kind, use at your own risk! + */ + + +#ifndef ADVANCED_EXIF_H +#define ADVANCED_EXIF_H + + +GtkWidget *advanced_exif_new(void); +void advanced_exif_close(GtkWidget *bar); + +void advanced_exif_set_fd(GtkWidget *bar, FileData *fd); + +#endif +/* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/bar.c --- a/src/bar.c Sat Feb 14 20:26:30 2009 +0000 +++ b/src/bar.c Sun Feb 15 09:36:53 2009 +0000 @@ -25,6 +25,7 @@ #include "ui_menu.h" #include "bar_comment.h" #include "bar_keywords.h" +#include "bar_exif.h" #define BAR_SIZE_INCREMENT 48 #define BAR_ARROW_SIZE 7 @@ -321,7 +322,7 @@ scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(bd->widget), scrolled, TRUE, TRUE, 0); gtk_widget_show(scrolled); @@ -343,6 +344,9 @@ widget = bar_pane_comment_new(_("Comment"), "Xmp.dc.description", 150); bar_add(bd->widget, widget); + widget = bar_pane_exif_new(_("Exif")); + bar_add(bd->widget, widget); + return bd->widget; } diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/bar_exif.c --- a/src/bar_exif.c Sat Feb 14 20:26:30 2009 +0000 +++ b/src/bar_exif.c Sun Feb 15 09:36:53 2009 +0000 @@ -20,16 +20,11 @@ #include "history_list.h" #include "misc.h" #include "ui_misc.h" +#include "bar.h" + #include -#define EXIF_BAR_SIZE_INCREMENT 48 -#define EXIF_BAR_ARROW_SIZE 7 - -#define EXIF_BAR_CUSTOM_COUNT 20 - -#define BAR_EXIF_DATA_COLUMN_WIDTH 250 - ExifUI ExifUIList[]={ { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Camera")}, { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("DateTime")}, @@ -121,18 +116,17 @@ /* *------------------------------------------------------------------- - * EXIF bar + * EXIF widget *------------------------------------------------------------------- */ -typedef struct _ExifBar ExifBar; -struct _ExifBar +typedef struct _PaneExifData PaneExifData; +struct _PaneExifData { + PaneData pane; GtkWidget *vbox; GtkWidget *scrolled; GtkWidget *table; - GtkWidget *advanced_scrolled; - GtkWidget *listview; GtkWidget **keys; GtkWidget **labels; @@ -146,288 +140,150 @@ gint allow_search; }; -enum { - EXIF_ADVCOL_ENABLED = 0, - EXIF_ADVCOL_TAG, - EXIF_ADVCOL_NAME, - EXIF_ADVCOL_VALUE, - EXIF_ADVCOL_FORMAT, - EXIF_ADVCOL_ELEMENTS, - EXIF_ADVCOL_DESCRIPTION, - EXIF_ADVCOL_COUNT -}; - -static void bar_exif_sensitive(ExifBar *eb, gint enable) +static void bar_pane_exif_sensitive(PaneExifData *ped, gint enable) { - gtk_widget_set_sensitive(eb->table, enable); - if (eb->advanced_scrolled) gtk_widget_set_sensitive(eb->advanced_scrolled, enable); + gtk_widget_set_sensitive(ped->table, enable); } -static gint bar_exif_row_enabled(const gchar *name) -{ - GList *list; - - if (!name) return FALSE; - - list = history_list_get_by_key("exif_extras"); - while (list) - { - if (strcmp(name, (gchar *)(list->data)) == 0) return TRUE; - list = list->next; - } - - return FALSE; -} - -static void bar_exif_update(ExifBar *eb) +static void bar_pane_exif_update(PaneExifData *ped) { ExifData *exif; gint i; + GList *list; /* do we have any exif at all ? */ - exif = exif_read_fd(eb->fd); + exif = exif_read_fd(ped->fd); if (!exif) { - bar_exif_sensitive(eb, FALSE); + bar_pane_exif_sensitive(ped, FALSE); return; } else { /* we will use high level functions so we can release it for now. it will stay in the cache */ - exif_free_fd(eb->fd, exif); + exif_free_fd(ped->fd, exif); exif = NULL; } - bar_exif_sensitive(eb, TRUE); - - if (GTK_WIDGET_VISIBLE(eb->scrolled)) - { - GList *list; - for (i = 0; ExifUIList[i].key; i++) - { - gchar *text; + bar_pane_exif_sensitive(ped, TRUE); - if (ExifUIList[i].current == EXIF_UI_OFF) - { - gtk_widget_hide(eb->labels[i]); - gtk_widget_hide(eb->keys[i]); - continue; - } - text = metadata_read_string(eb->fd, ExifUIList[i].key, METADATA_FORMATTED); - if (ExifUIList[i].current == EXIF_UI_IFSET - && (!text || !*text)) - { - gtk_widget_hide(eb->labels[i]); - gtk_widget_hide(eb->keys[i]); - g_free(text); - continue; - } - gtk_widget_show(eb->labels[i]); - gtk_widget_show(eb->keys[i]); - gtk_label_set_text(GTK_LABEL(eb->labels[i]), text); - g_free(text); - } + for (i = 0; ExifUIList[i].key; i++) + { + gchar *text; - list = g_list_last(history_list_get_by_key("exif_extras")); - if (list) - { - gtk_widget_show(eb->custom_sep); - } - else - { - gtk_widget_hide(eb->custom_sep); - } - i = 0; - while (list && i < EXIF_BAR_CUSTOM_COUNT) + if (ExifUIList[i].current == EXIF_UI_OFF) { - gchar *text; - gchar *name; - gchar *buf; - gchar *description; - - name = list->data; - list = list->prev; - - text = metadata_read_string(eb->fd, name, METADATA_FORMATTED); - - description = exif_get_tag_description_by_key(name); - if (!description || *description == '\0') - { - g_free(description); - description = g_strdup(name); - } - buf = g_strconcat(description, ":", NULL); - g_free(description); - - gtk_label_set_text(GTK_LABEL(eb->custom_name[i]), buf); - g_free(buf); - gtk_label_set_text(GTK_LABEL(eb->custom_value[i]), text); + gtk_widget_hide(ped->labels[i]); + gtk_widget_hide(ped->keys[i]); + continue; + } + text = metadata_read_string(ped->fd, ExifUIList[i].key, METADATA_FORMATTED); + if (ExifUIList[i].current == EXIF_UI_IFSET + && (!text || !*text)) + { + gtk_widget_hide(ped->labels[i]); + gtk_widget_hide(ped->keys[i]); g_free(text); - - gtk_widget_show(eb->custom_name[i]); - gtk_widget_show(eb->custom_value[i]); - g_object_set_data(G_OBJECT(eb->custom_remove[i]), "key", name); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(eb->custom_remove[i]), TRUE); - gtk_widget_show(eb->custom_remove[i]); - - i++; + continue; } - while (i < EXIF_BAR_CUSTOM_COUNT) - { - g_object_set_data(G_OBJECT(eb->custom_remove[i]), "key", NULL); - gtk_widget_hide(eb->custom_name[i]); - gtk_widget_hide(eb->custom_value[i]); - gtk_widget_hide(eb->custom_remove[i]); - - i++; - } + gtk_widget_show(ped->labels[i]); + gtk_widget_show(ped->keys[i]); + gtk_label_set_text(GTK_LABEL(ped->labels[i]), text); + g_free(text); } - if (eb->advanced_scrolled && GTK_WIDGET_VISIBLE(eb->advanced_scrolled)) + list = g_list_last(history_list_get_by_key("exif_extras")); + if (list) + { + gtk_widget_show(ped->custom_sep); + } + else { - GtkListStore *store; - GtkTreeIter iter; - ExifData *exif_original; - ExifItem *item; - - exif = exif_read_fd(eb->fd); - if (!exif) return; - - exif_original = exif_get_original(exif); + gtk_widget_hide(ped->custom_sep); + } + i = 0; + while (list && i < EXIF_BAR_CUSTOM_COUNT) + { + gchar *text; + gchar *name; + gchar *buf; + gchar *description; - store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview))); - gtk_list_store_clear(store); - - item = exif_get_first_item(exif_original); - while (item) - { - gchar *tag; - gchar *tag_name; - gchar *text; - gchar *utf8_text; - const gchar *format; - gchar *elements; - gchar *description; + name = list->data; + list = list->prev; + + text = metadata_read_string(ped->fd, name, METADATA_FORMATTED); - tag = g_strdup_printf("0x%04x", exif_item_get_tag_id(item)); - tag_name = exif_item_get_tag_name(item); - format = exif_item_get_format_name(item, TRUE); - text = exif_item_get_data_as_text(item); - utf8_text = utf8_validate_or_convert(text); - g_free(text); - elements = g_strdup_printf("%d", exif_item_get_elements(item)); - description = exif_item_get_description(item); - if (!description || *description == '\0') - { - g_free(description); - description = g_strdup(tag_name); - } + description = exif_get_tag_description_by_key(name); + if (!description || *description == '\0') + { + g_free(description); + description = g_strdup(name); + } + buf = g_strconcat(description, ":", NULL); + g_free(description); + + gtk_label_set_text(GTK_LABEL(ped->custom_name[i]), buf); + g_free(buf); + gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), text); + g_free(text); - gtk_list_store_append(store, &iter); - gtk_list_store_set(store, &iter, - EXIF_ADVCOL_ENABLED, bar_exif_row_enabled(tag_name), - EXIF_ADVCOL_TAG, tag, - EXIF_ADVCOL_NAME, tag_name, - EXIF_ADVCOL_VALUE, utf8_text, - EXIF_ADVCOL_FORMAT, format, - EXIF_ADVCOL_ELEMENTS, elements, - EXIF_ADVCOL_DESCRIPTION, description, -1); - g_free(tag); - g_free(utf8_text); - g_free(elements); - g_free(description); - g_free(tag_name); - item = exif_get_next_item(exif_original); - } - exif_free_fd(eb->fd, exif); + gtk_widget_show(ped->custom_name[i]); + gtk_widget_show(ped->custom_value[i]); + g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", name); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ped->custom_remove[i]), TRUE); + gtk_widget_show(ped->custom_remove[i]); + + i++; } + while (i < EXIF_BAR_CUSTOM_COUNT) + { + g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", NULL); + gtk_widget_hide(ped->custom_name[i]); + gtk_widget_hide(ped->custom_value[i]); + gtk_widget_hide(ped->custom_remove[i]); + i++; + } } -static void bar_exif_clear(ExifBar *eb) +static void bar_pane_exif_clear(PaneExifData *ped) { gint i; - if (!GTK_WIDGET_SENSITIVE(eb->labels[0])) return; + if (!GTK_WIDGET_SENSITIVE(ped->labels[0])) return; for (i = 0; ExifUIList[i].key; i++) { - gtk_label_set_text(GTK_LABEL(eb->labels[i]), ""); + gtk_label_set_text(GTK_LABEL(ped->labels[i]), ""); } for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++) { - gtk_label_set_text(GTK_LABEL(eb->custom_value[i]), ""); - } - - if (eb->listview) - { - GtkListStore *store; - - store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview))); - gtk_list_store_clear(store); + gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), ""); } } -void bar_exif_set(GtkWidget *bar, FileData *fd) +void bar_pane_exif_set_fd(GtkWidget *widget, FileData *fd) { - ExifBar *eb; + PaneExifData *ped; - eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data"); - if (!eb) return; + ped = g_object_get_data(G_OBJECT(widget), "pane_data"); + if (!ped) return; /* store this, advanced view toggle needs to reload data */ - file_data_unref(eb->fd); - eb->fd = file_data_ref(fd); + file_data_unref(ped->fd); + ped->fd = file_data_ref(fd); - bar_exif_clear(eb); - bar_exif_update(eb); + bar_pane_exif_clear(ped); + bar_pane_exif_update(ped); } -static void bar_exif_row_toggled_cb(GtkCellRendererToggle *toggle, const gchar *path, gpointer data) +static void bar_pane_exif_remove_advanced_cb(GtkWidget *widget, gpointer data) { - GtkWidget *listview = data; - GtkTreeModel *store; - GtkTreeIter iter; - GtkTreePath *tpath; - gchar *name = NULL; - gboolean active; - - store = gtk_tree_view_get_model(GTK_TREE_VIEW(listview)); - - tpath = gtk_tree_path_new_from_string(path); - gtk_tree_model_get_iter(store, &iter, tpath); - gtk_tree_path_free(tpath); - - gtk_tree_model_get(store, &iter, EXIF_ADVCOL_ENABLED, &active, - EXIF_ADVCOL_NAME, &name, -1); - active = (!active); - - if (active && - g_list_length(history_list_get_by_key("exif_extras")) >= EXIF_BAR_CUSTOM_COUNT) - { - active = FALSE; - } - - gtk_list_store_set(GTK_LIST_STORE(store), &iter, EXIF_ADVCOL_ENABLED, active, -1); - - if (active) - { - history_list_add_to_key("exif_extras", name, EXIF_BAR_CUSTOM_COUNT); - } - else - { - history_list_item_change("exif_extras", name, NULL); - } - - g_free(name); -} - -static void bar_exif_remove_advanced_cb(GtkWidget *widget, gpointer data) -{ - ExifBar *eb = data; + PaneExifData *ped = data; const gchar *key; /* continue only if the toggle was deactivated */ @@ -438,311 +294,105 @@ history_list_item_change("exif_extras", key, NULL); - bar_exif_update(eb); -} - -static void bar_exif_add_column_check(GtkWidget *listview, const gchar *title, gint n) -{ - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, title); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - - renderer = gtk_cell_renderer_toggle_new(); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_add_attribute(column, renderer, "active", n); - gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); - - g_signal_connect(G_OBJECT(renderer), "toggled", - G_CALLBACK(bar_exif_row_toggled_cb), listview); + bar_pane_exif_update(ped); } -static void bar_exif_add_column(GtkWidget *listview, const gchar *title, gint n, gint sizable) +void bar_pane_exif_close(GtkWidget *widget) { - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - column = gtk_tree_view_column_new(); - gtk_tree_view_column_set_title(column, title); + PaneExifData *ped; - if (sizable) - { - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); - gtk_tree_view_column_set_fixed_width(column, BAR_EXIF_DATA_COLUMN_WIDTH); - gtk_tree_view_column_set_resizable(column, TRUE); - } - else - { - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - } + ped = g_object_get_data(G_OBJECT(widget), "pane_data"); + if (!ped) return; - renderer = gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, renderer, TRUE); - gtk_tree_view_column_add_attribute(column, renderer, "text", n); - gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column); + gtk_widget_destroy(ped->vbox); } -static void bar_exif_advanced_build_view(ExifBar *eb) +static void bar_pane_exif_destroy(GtkWidget *widget, gpointer data) { - GtkListStore *store; - - if (eb->listview) return; - - store = gtk_list_store_new(7, G_TYPE_BOOLEAN, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - eb->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); - g_object_unref(store); - - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(eb->listview), TRUE); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(eb->listview), TRUE); + PaneExifData *ped = data; - if (eb->allow_search) - { - gtk_tree_view_set_search_column(GTK_TREE_VIEW(eb->listview), EXIF_ADVCOL_NAME); - } - else - { - gtk_tree_view_set_enable_search(GTK_TREE_VIEW(eb->listview), FALSE); - } - - bar_exif_add_column_check(eb->listview, "", EXIF_ADVCOL_ENABLED); - - bar_exif_add_column(eb->listview, _("Description"), EXIF_ADVCOL_DESCRIPTION, FALSE); - bar_exif_add_column(eb->listview, _("Value"), EXIF_ADVCOL_VALUE, TRUE); - bar_exif_add_column(eb->listview, _("Name"), EXIF_ADVCOL_NAME, FALSE); - bar_exif_add_column(eb->listview, _("Tag"), EXIF_ADVCOL_TAG, FALSE); - bar_exif_add_column(eb->listview, _("Format"), EXIF_ADVCOL_FORMAT, FALSE); - bar_exif_add_column(eb->listview, _("Elements"), EXIF_ADVCOL_ELEMENTS, FALSE); - - eb->advanced_scrolled = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(eb->advanced_scrolled), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->advanced_scrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); - gtk_box_pack_start(GTK_BOX(eb->vbox), eb->advanced_scrolled, TRUE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(eb->advanced_scrolled), eb->listview); - gtk_widget_show(eb->listview); + g_free(ped->keys); + g_free(ped->labels); + file_data_unref(ped->fd); + g_free(ped); } -static void bar_exif_advanced_cb(GtkWidget *widget, gpointer data) -{ - ExifBar *eb = data; - gint advanced; - - advanced = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); - - if (advanced) - { - gtk_widget_hide(eb->scrolled); - bar_exif_advanced_build_view(eb); - gtk_widget_show(eb->advanced_scrolled); - } - else - { - gtk_widget_hide(eb->advanced_scrolled); - gtk_widget_show(eb->scrolled); - } - - bar_exif_update(eb); -} - -gint bar_exif_is_advanced(GtkWidget *bar) -{ - ExifBar *eb; - - eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data"); - if (!eb) return FALSE; - - return (eb->advanced_scrolled && GTK_WIDGET_VISIBLE(eb->advanced_scrolled)); -} - -void bar_exif_close(GtkWidget *bar) +GtkWidget *bar_pane_exif_new(const gchar *title) { - ExifBar *eb; - - eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data"); - if (!eb) return; - - gtk_widget_destroy(eb->vbox); -} - -static void bar_exif_width(ExifBar *eb, gint val) -{ - gint size; - - size = eb->vbox->allocation.width; - size = CLAMP(size + val, EXIF_BAR_SIZE_INCREMENT * 2, EXIF_BAR_SIZE_INCREMENT * 16); - - gtk_widget_set_size_request(eb->vbox, size, -1); - options->panels.exif.width = eb->vbox->allocation.width; -} - -static void bar_exif_larger(GtkWidget *widget, gpointer data) -{ - ExifBar *eb = data; - - bar_exif_width(eb, EXIF_BAR_SIZE_INCREMENT); -} - -static void bar_exif_smaller(GtkWidget *widget, gpointer data) -{ - ExifBar *eb = data; - - bar_exif_width(eb, -EXIF_BAR_SIZE_INCREMENT); -} - -static void bar_exif_destroy(GtkWidget *widget, gpointer data) -{ - ExifBar *eb = data; - - g_free(eb->keys); - g_free(eb->labels); - file_data_unref(eb->fd); - g_free(eb); -} - -GtkWidget *bar_exif_new(gint show_title, FileData *fd, gint advanced, GtkWidget *bounding_widget) -{ - ExifBar *eb; + PaneExifData *ped; GtkWidget *table; GtkWidget *viewport; GtkWidget *hbox; - GtkWidget *button; gint i; gint exif_len; for (exif_len = 0; ExifUIList[exif_len].key; exif_len++) ; - eb = g_new0(ExifBar, 1); - - eb->keys = g_new0(GtkWidget *, exif_len); - eb->labels = g_new0(GtkWidget *, exif_len); - - eb->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); - g_object_set_data(G_OBJECT(eb->vbox), "bar_exif_data", eb); - g_signal_connect_after(G_OBJECT(eb->vbox), "destroy", - G_CALLBACK(bar_exif_destroy), eb); - - eb->allow_search = !show_title; + ped = g_new0(PaneExifData, 1); - if (show_title) - { - GtkWidget *box; - GtkWidget *label; - GtkWidget *button; - GtkWidget *arrow; - - box = gtk_hbox_new(FALSE, 0); - - label = sizer_new(eb->vbox, bounding_widget, SIZER_POS_LEFT); - sizer_set_limits(label, EXIF_BAR_SIZE_INCREMENT * 2, -1, -1 , -1); - gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); - gtk_widget_show(label); + ped->pane.pane_set_fd = bar_pane_exif_set_fd; + ped->pane.title = g_strdup(title); - label = gtk_label_new(_("Exif")); - pref_label_bold(label, TRUE, FALSE); - gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0); - gtk_widget_show(label); + ped->keys = g_new0(GtkWidget *, exif_len); + ped->labels = g_new0(GtkWidget *, exif_len); - button = gtk_button_new(); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(bar_exif_smaller), eb); - gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0); - arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); - gtk_widget_set_size_request(arrow, EXIF_BAR_ARROW_SIZE, EXIF_BAR_ARROW_SIZE); - gtk_container_add(GTK_CONTAINER(button), arrow); - gtk_widget_show(arrow); - gtk_widget_show(button); - - button = gtk_button_new(); - gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); - g_signal_connect(G_OBJECT(button), "clicked", - G_CALLBACK(bar_exif_larger), eb); - gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0); - arrow = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE); - gtk_widget_set_size_request(arrow, EXIF_BAR_ARROW_SIZE, EXIF_BAR_ARROW_SIZE); - gtk_container_add(GTK_CONTAINER(button), arrow); - gtk_widget_show(arrow); - gtk_widget_show(button); - - gtk_box_pack_start(GTK_BOX(eb->vbox), box, FALSE, FALSE, 0); - gtk_widget_show(box); - } + ped->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP); + g_object_set_data(G_OBJECT(ped->vbox), "pane_data", ped); + g_signal_connect_after(G_OBJECT(ped->vbox), "destroy", + G_CALLBACK(bar_pane_exif_destroy), ped); table = gtk_table_new(3, exif_len + 1 + EXIF_BAR_CUSTOM_COUNT, FALSE); - eb->table = table; + ped->table = table; for (i = 0; ExifUIList[i].key; i++) { gchar *text; text = exif_get_description_by_key(ExifUIList[i].key); - eb->labels[i] = table_add_line(table, 0, i, text, NULL, - &eb->keys[i]); + ped->labels[i] = table_add_line(table, 0, i, text, NULL, + &ped->keys[i]); g_free(text); } - eb->custom_sep = gtk_hseparator_new(); - gtk_table_attach(GTK_TABLE(table), eb->custom_sep, 0, 3, + ped->custom_sep = gtk_hseparator_new(); + gtk_table_attach(GTK_TABLE(table), ped->custom_sep, 0, 3, exif_len, exif_len + 1, GTK_FILL, GTK_FILL, 2, 2); for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++) { table_add_line_custom(table, 0, exif_len + 1 + i, - "", "", &eb->custom_name[i], &eb->custom_value[i], - &eb->custom_remove[i]); - g_signal_connect(G_OBJECT(eb->custom_remove[i]), "clicked", - G_CALLBACK(bar_exif_remove_advanced_cb), eb); + "", "", &ped->custom_name[i], &ped->custom_value[i], + &ped->custom_remove[i]); + g_signal_connect(G_OBJECT(ped->custom_remove[i]), "clicked", + G_CALLBACK(bar_pane_exif_remove_advanced_cb), ped); } - eb->scrolled = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->scrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + ped->scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ped->scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); viewport = gtk_viewport_new(NULL, NULL); gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE); - gtk_container_add(GTK_CONTAINER(eb->scrolled), viewport); + gtk_container_add(GTK_CONTAINER(ped->scrolled), viewport); gtk_widget_show(viewport); gtk_container_add(GTK_CONTAINER(viewport), table); gtk_widget_show(table); - gtk_box_pack_start(GTK_BOX(eb->vbox), eb->scrolled, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(ped->vbox), ped->scrolled, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE); - gtk_box_pack_end(GTK_BOX(eb->vbox), hbox, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(ped->vbox), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); - button = gtk_check_button_new_with_label(_("Advanced view")); - if (advanced) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); - g_signal_connect(G_OBJECT(button), "toggled", - G_CALLBACK(bar_exif_advanced_cb), eb); - gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); - gtk_widget_show(button); - - eb->advanced_scrolled = NULL; - eb->listview = NULL; + gtk_widget_show(ped->scrolled); - if (advanced) - { - bar_exif_advanced_build_view(eb); - gtk_widget_show(eb->advanced_scrolled); - } - else - { - gtk_widget_show(eb->scrolled); - } + gtk_widget_show(ped->vbox); - eb->fd = file_data_ref(fd); - bar_exif_update(eb); - - return eb->vbox; + return ped->vbox; } /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/bar_exif.h --- a/src/bar_exif.h Sat Feb 14 20:26:30 2009 +0000 +++ b/src/bar_exif.h Sun Feb 15 09:36:53 2009 +0000 @@ -27,13 +27,10 @@ }; extern ExifUI ExifUIList[]; - -GtkWidget *bar_exif_new(gint show_title, FileData *fd, gint advanced, GtkWidget *bounding_widget); -void bar_exif_close(GtkWidget *bar); +#define EXIF_BAR_CUSTOM_COUNT 20 -void bar_exif_set(GtkWidget *bar, FileData *fd); -gint bar_exif_is_advanced(GtkWidget *bar); +GtkWidget *bar_pane_exif_new(const gchar *title); /* these are exposed for when duplication of the exif bar's text is needed */ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/layout.c --- a/src/layout.c Sat Feb 14 20:26:30 2009 +0000 +++ b/src/layout.c Sun Feb 15 09:36:53 2009 +0000 @@ -1921,7 +1921,8 @@ layout_window_list = g_list_remove(layout_window_list, lw); - + if (lw->exif_window) g_signal_handlers_disconnect_matched(G_OBJECT(lw->exif_window), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, lw); + layout_bars_close(lw); gtk_widget_destroy(lw->window); @@ -1975,13 +1976,10 @@ lw->bar_sort = NULL; lw->bar_sort_enabled = options->panels.sort.enabled; - lw->bar_exif = NULL; - lw->bar_exif_enabled = options->panels.exif.enabled; - lw->bar_exif_advanced = FALSE; - lw->bar = NULL; lw->bar_enabled = options->panels.info.enabled; + lw->exif_window = NULL; /* default layout */ layout_config_parse(options->layout.style, options->layout.order, @@ -1998,7 +1996,6 @@ lw->div_h = options->layout.main_window.hdivider_pos; lw->div_v = options->layout.main_window.vdivider_pos; lw->div_float = options->layout.float_window.vdivider_pos; - lw->bar_exif_width = options->panels.exif.width; lw->bar_width = options->panels.info.width; } else @@ -2006,7 +2003,6 @@ lw->div_h = MAIN_WINDOW_DIV_HPOS; lw->div_v = MAIN_WINDOW_DIV_VPOS; lw->div_float = MAIN_WINDOW_DIV_VPOS; - lw->bar_exif_width = PANEL_DEFAULT_WIDTH; lw->bar_width = PANEL_DEFAULT_WIDTH; } diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/layout_util.c --- a/src/layout_util.c Sat Feb 14 20:26:30 2009 +0000 +++ b/src/layout_util.c Sun Feb 15 09:36:53 2009 +0000 @@ -14,7 +14,7 @@ #include "main.h" #include "layout_util.h" -#include "bar_exif.h" +#include "advanced_exif.h" #include "bar_sort.h" #include "bar.h" #include "cache_maint.h" @@ -679,8 +679,7 @@ layout_exit_fullscreen(lw); - if (lw->bar_exif_enabled == gtk_toggle_action_get_active(action)) return; - layout_bar_exif_toggle(lw); + layout_exif_window_new(lw); } static void layout_menu_bar_sort_cb(GtkToggleAction *action, gpointer data) @@ -1211,7 +1210,7 @@ { "FloatTools", NULL, N_("_Float file list"), "L", NULL, CB(layout_menu_float_cb), FALSE }, { "HideToolbar", NULL, N_("Hide tool_bar"), NULL, NULL, CB(layout_menu_toolbar_cb), FALSE }, { "SBar", NULL, N_("_Info"), "K", NULL, CB(layout_menu_bar_cb), FALSE }, - { "SBarExif", NULL, N_("E_xif data"), "E", NULL, CB(layout_menu_bar_exif_cb), FALSE }, + { "ExifWin", NULL, N_("E_xif window"), "E", NULL, CB(layout_menu_bar_exif_cb), FALSE }, { "SBarSort", NULL, N_("Sort _manager"), "S", NULL, CB(layout_menu_bar_sort_cb), FALSE }, { "SlideShow", NULL, N_("Toggle _slideshow"),"S", NULL, CB(layout_menu_slideshow_cb), FALSE }, }; @@ -1368,7 +1367,7 @@ " " " " " " -" " +" " " " " " " " @@ -1865,9 +1864,6 @@ action = gtk_action_group_get_action(lw->action_group, "SBar"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->bar_enabled); - action = gtk_action_group_get_action(lw->action_group, "SBarExif"); - gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->bar_exif_enabled); - action = gtk_action_group_get_action(lw->action_group, "SBarSort"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->bar_sort_enabled); @@ -1879,6 +1875,10 @@ action = gtk_action_group_get_action(lw->action_group, "SlideShow"); gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), layout_image_slideshow_active(lw)); + + action = gtk_action_group_get_action(lw->action_group, "ExifWin"); + gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), !!lw->exif_window); + } void layout_util_sync_thumb(LayoutWindow *lw) @@ -2034,81 +2034,6 @@ // bar_maint_renamed(lw->bar_info, layout_image_get_fd(lw)); } -static void layout_bar_exif_destroyed(GtkWidget *widget, gpointer data) -{ - LayoutWindow *lw = data; - - if (lw->bar_exif) - { - lw->bar_exif_advanced = bar_exif_is_advanced(lw->bar_exif); - } - - lw->bar_exif = NULL; - if (lw->utility_box) - { - /* destroyed from within itself */ - lw->bar_exif_enabled = FALSE; - layout_util_sync_views(lw); - } -} - -static void layout_bar_exif_sized(GtkWidget *widget, GtkAllocation *allocation, gpointer data) -{ - LayoutWindow *lw = data; - - if (!lw->bar_exif) return; - - options->panels.exif.width = lw->bar_exif_width = allocation->width; -} - -static void layout_bar_exif_new(LayoutWindow *lw) -{ - if (!lw->utility_box) return; - - lw->bar_exif = bar_exif_new(TRUE, layout_image_get_fd(lw), - lw->bar_exif_advanced, lw->utility_box); - g_signal_connect(G_OBJECT(lw->bar_exif), "destroy", - G_CALLBACK(layout_bar_exif_destroyed), lw); - g_signal_connect(G_OBJECT(lw->bar_exif), "size_allocate", - G_CALLBACK(layout_bar_exif_sized), lw); - - options->panels.exif.enabled = lw->bar_exif_enabled = TRUE; - gtk_widget_set_size_request(lw->bar_exif, lw->bar_exif_width, -1); - - gtk_box_pack_start(GTK_BOX(lw->utility_box), lw->bar_exif, FALSE, FALSE, 0); - if (lw->bar) gtk_box_reorder_child(GTK_BOX(lw->utility_box), lw->bar_exif, 1); - gtk_widget_show(lw->bar_exif); -} - -static void layout_bar_exif_close(LayoutWindow *lw) -{ - if (lw->bar_exif) - { - bar_exif_close(lw->bar_exif); - lw->bar_exif = NULL; - } - options->panels.exif.enabled = lw->bar_exif_enabled = FALSE; -} - -void layout_bar_exif_toggle(LayoutWindow *lw) -{ - if (lw->bar_exif_enabled) - { - layout_bar_exif_close(lw); - } - else - { - layout_bar_exif_new(lw); - } -} - -static void layout_bar_exif_new_image(LayoutWindow *lw) -{ - if (!lw->bar_exif || !lw->bar_exif_enabled) return; - - bar_exif_set(lw->bar_exif, layout_image_get_fd(lw)); -} - static void layout_bar_sort_destroyed(GtkWidget *widget, gpointer data) { LayoutWindow *lw = data; @@ -2162,7 +2087,8 @@ void layout_bars_new_image(LayoutWindow *lw) { layout_bar_new_image(lw); - layout_bar_exif_new_image(lw); + + if (lw->exif_window) advanced_exif_set_fd(lw->exif_window, layout_image_get_fd(lw)); /* this should be called here to handle the metadata edited in bars */ if (options->metadata.confirm_on_image_change) @@ -2190,18 +2116,12 @@ layout_bar_new(lw); } - if (lw->bar_exif_enabled) - { - layout_bar_exif_new(lw); - } - return lw->utility_box; } void layout_bars_close(LayoutWindow *lw) { layout_bar_sort_close(lw); - layout_bar_exif_close(lw); layout_bar_close(lw); } @@ -2209,4 +2129,23 @@ { layout_bar_maint_renamed(lw); } + +static void layout_exif_window_destroy(GtkWidget *widget, gpointer data) +{ + LayoutWindow *lw = data; + lw->exif_window = NULL; +} + +void layout_exif_window_new(LayoutWindow *lw) +{ + if (!lw->exif_window) + { + lw->exif_window = advanced_exif_new(); + if (!lw->exif_window) return; + g_signal_connect(G_OBJECT(lw->exif_window), "destroy", + G_CALLBACK(layout_exif_window_destroy), lw); + advanced_exif_set_fd(lw->exif_window, layout_image_get_fd(lw)); + } +} + /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/layout_util.h --- a/src/layout_util.h Sat Feb 14 20:26:30 2009 +0000 +++ b/src/layout_util.h Sun Feb 15 09:36:53 2009 +0000 @@ -56,6 +56,7 @@ void layout_bars_maint_renamed(LayoutWindow *lw); +void layout_exif_window_new(LayoutWindow *lw); #endif /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff -r 4a3ae0e6f1eb -r 48e064b37ba6 src/typedefs.h --- a/src/typedefs.h Sat Feb 14 20:26:30 2009 +0000 +++ b/src/typedefs.h Sun Feb 15 09:36:53 2009 +0000 @@ -567,16 +567,14 @@ GtkWidget *utility_box; GtkWidget *bar_sort; - GtkWidget *bar_exif; GtkWidget *bar; gint bar_sort_enabled; - gint bar_exif_enabled; gint bar_enabled; - gint bar_exif_width; - gint bar_exif_advanced; gint bar_width; + + GtkWidget *exif_window; }; struct _ViewDir