separated "normal" and advanced exif, "Normal" exif is now in the
authorVladimir Nadvornik <nadvornik@suse.cz>
Sun, 15 Feb 2009 09:36:53 +0000 (09:36 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sun, 15 Feb 2009 09:36:53 +0000 (09:36 +0000)
generic bar, advanced exif is in separate window.

src/Makefile.am
src/advanced_exif.c [new file with mode: 0644]
src/advanced_exif.h [new file with mode: 0644]
src/bar.c
src/bar_exif.c
src/bar_exif.h
src/layout.c
src/layout_util.c
src/layout_util.h
src/typedefs.h

index 0ffca1b..2e2226d 100644 (file)
@@ -76,6 +76,8 @@ geeqie_SOURCES = \
        $(module_SLIK)  \
        ClayRGB1998.icc \
        ClayRGB1998_icc.h \
+       advanced_exif.c \
+       advanced_exif.h \
        bar.c           \
        bar.h           \
        bar_comment.c   \
diff --git a/src/advanced_exif.c b/src/advanced_exif.c
new file mode 100644 (file)
index 0000000..eb92dd2
--- /dev/null
@@ -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 <math.h>
+
+#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 --git a/src/advanced_exif.h b/src/advanced_exif.h
new file mode 100644 (file)
index 0000000..dcffd2e
--- /dev/null
@@ -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: */
index dd7fe0f..bd38a4b 100644 (file)
--- a/src/bar.c
+++ b/src/bar.c
@@ -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 @@ GtkWidget *bar_new(GtkWidget *bounding_widget)
 
        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 @@ GtkWidget *bar_new(GtkWidget *bounding_widget)
        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;
 }
 
index c64ef23..179d2c2 100644 (file)
 #include "history_list.h"
 #include "misc.h"
 #include "ui_misc.h"
+#include "bar.h"
 
-#include <math.h>
-
-#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
+#include <math.h>
 
 ExifUI ExifUIList[]={
        { 0, 0, EXIF_UI_IFSET,  EXIF_FORMATTED("Camera")},
@@ -121,18 +116,17 @@ static GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,
 
 /*
  *-------------------------------------------------------------------
- * 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 @@ struct _ExifBar
        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);
+       bar_pane_exif_sensitive(ped, TRUE);
 
-       if (GTK_WIDGET_VISIBLE(eb->scrolled))
+       for (i = 0; ExifUIList[i].key; i++)
                {
-               GList *list;
-               for (i = 0; ExifUIList[i].key; i++)
-                       {
-                       gchar *text;
-
-                       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);
-                       }
+               gchar *text;
 
-               list = g_list_last(history_list_get_by_key("exif_extras"));
-               if (list)
-                       {
-                       gtk_widget_show(eb->custom_sep);
-                       }
-               else
+               if (ExifUIList[i].current == EXIF_UI_OFF)
                        {
-                       gtk_widget_hide(eb->custom_sep);
+                       gtk_widget_hide(ped->labels[i]);
+                       gtk_widget_hide(ped->keys[i]);
+                       continue;
                        }
-               i = 0;
-               while (list && i < EXIF_BAR_CUSTOM_COUNT)
+               text =  metadata_read_string(ped->fd, ExifUIList[i].key, METADATA_FORMATTED);
+               if (ExifUIList[i].current == EXIF_UI_IFSET
+                   && (!text || !*text))
                        {
-                       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]);
                        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++;
-                       }
-               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++;
+                       continue;
                        }
+               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
+               {
+               gtk_widget_hide(ped->custom_sep);
+               }
+       i = 0;
+       while (list && i < EXIF_BAR_CUSTOM_COUNT)
                {
-               GtkListStore *store;
-               GtkTreeIter iter;
-               ExifData *exif_original;
-               ExifItem *item;
+               gchar *text;
+               gchar *name;
+               gchar *buf;
+               gchar *description;
 
-               exif = exif_read_fd(eb->fd);
-               if (!exif) return;
+               name = list->data;
+               list = list->prev;
                
-               exif_original = exif_get_original(exif);
-
-               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
-               gtk_list_store_clear(store);
+               text =  metadata_read_string(ped->fd, name, METADATA_FORMATTED);
 
-               item = exif_get_first_item(exif_original);
-               while (item)
+               description = exif_get_tag_description_by_key(name);
+               if (!description || *description == '\0') 
                        {
-                       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, 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);
+                       description = g_strdup(name);
                        }
-               exif_free_fd(eb->fd, exif);
+               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_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 @@ static void bar_exif_remove_advanced_cb(GtkWidget *widget, gpointer data)
 
        history_list_item_change("exif_extras", key, NULL);
 
-       bar_exif_update(eb);
+       bar_pane_exif_update(ped);
 }
 
-static void bar_exif_add_column_check(GtkWidget *listview, const gchar *title, gint n)
+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);
-       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+       PaneExifData *ped;
 
-       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);
+       ped = g_object_get_data(G_OBJECT(widget), "pane_data");
+       if (!ped) return;
 
-       g_signal_connect(G_OBJECT(renderer), "toggled",
-                        G_CALLBACK(bar_exif_row_toggled_cb), listview);
+       gtk_widget_destroy(ped->vbox);
 }
 
-static void bar_exif_add_column(GtkWidget *listview, const gchar *title, gint n, gint sizable)
+static void bar_pane_exif_destroy(GtkWidget *widget, gpointer data)
 {
-       GtkTreeViewColumn *column;
-       GtkCellRenderer *renderer;
+       PaneExifData *ped = data;
 
-       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, 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);
-               }
-
-       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);
-}
-
-static void bar_exif_advanced_build_view(ExifBar *eb)
-{
-       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);
-
-       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);
-}
-
-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));
+       g_free(ped->keys);
+       g_free(ped->labels);
+       file_data_unref(ped->fd);
+       g_free(ped);
 }
 
-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);
+       ped = g_new0(PaneExifData, 1);
 
-       eb->keys = g_new0(GtkWidget *, exif_len);
-       eb->labels = g_new0(GtkWidget *, exif_len);
+       ped->pane.pane_set_fd = bar_pane_exif_set_fd;
+       ped->pane.title = g_strdup(title);
 
-       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);
+       ped->keys = g_new0(GtkWidget *, exif_len);
+       ped->labels = g_new0(GtkWidget *, exif_len);
 
-       eb->allow_search = !show_title;
-
-       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);
-
-               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);
-
-               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;
-
-       if (advanced)
-               {
-               bar_exif_advanced_build_view(eb);
-               gtk_widget_show(eb->advanced_scrolled);
-               }
-       else
-               {
-               gtk_widget_show(eb->scrolled);
-               }
+       gtk_widget_show(ped->scrolled);
 
-       eb->fd = file_data_ref(fd);
-       bar_exif_update(eb);
+       gtk_widget_show(ped->vbox);
 
-       return eb->vbox;
+       return ped->vbox;
 }
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index cdfbc50..984286f 100644 (file)
@@ -27,13 +27,10 @@ struct _ExifUI {
 };
 extern ExifUI ExifUIList[];
 
+#define EXIF_BAR_CUSTOM_COUNT 20
 
-GtkWidget *bar_exif_new(gint show_title, FileData *fd, gint advanced, GtkWidget *bounding_widget);
-void bar_exif_close(GtkWidget *bar);
 
-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 */
index 6f1443b..4f6bf20 100644 (file)
@@ -1921,7 +1921,8 @@ void layout_free(LayoutWindow *lw)
 
        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 @@ LayoutWindow *layout_new_with_geometry(FileData *dir_fd, gint popped, gint hidde
        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 @@ LayoutWindow *layout_new_with_geometry(FileData *dir_fd, gint popped, gint hidde
                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 @@ LayoutWindow *layout_new_with_geometry(FileData *dir_fd, gint popped, gint hidde
                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;
                }
 
index 72caedf..2b43a27 100644 (file)
@@ -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 @@ static void layout_menu_bar_exif_cb(GtkToggleAction *action, gpointer data)
        
        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 @@ static GtkToggleActionEntry menu_toggle_entries[] = {
   { "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"),            "<control>K",   NULL,   CB(layout_menu_bar_cb),          FALSE  },
-  { "SBarExif",                NULL,           N_("E_xif data"),       "<control>E",   NULL,   CB(layout_menu_bar_exif_cb),     FALSE  },
+  { "ExifWin",         NULL,           N_("E_xif window"),     "<control>E",   NULL,   CB(layout_menu_bar_exif_cb),     FALSE  },
   { "SBarSort",                NULL,           N_("Sort _manager"),    "<control>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 @@ static const gchar *menu_ui_description =
 "      <placeholder name='ToolsSection'/>"
 "      <separator/>"
 "      <menuitem action='SBar'/>"
-"      <menuitem action='SBarExif'/>"
+"      <menuitem action='ExifWin'/>"
 "      <menuitem action='SBarSort'/>"
 "      <placeholder name='SideBarSection'/>"
 "      <separator/>"
@@ -1865,9 +1864,6 @@ static void layout_util_sync_views(LayoutWindow *lw)
        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 @@ static void layout_util_sync_views(LayoutWindow *lw)
 
        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 @@ static void layout_bar_maint_renamed(LayoutWindow *lw)
 //     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_bar_sort_toggle(LayoutWindow *lw)
 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 @@ GtkWidget *layout_bars_prepare(LayoutWindow *lw, GtkWidget *image)
                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 @@ void layout_bars_maint_renamed(LayoutWindow *lw)
 {
        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: */
index fc6236d..6fecd61 100644 (file)
@@ -56,6 +56,7 @@ void layout_bars_close(LayoutWindow *lw);
 
 void layout_bars_maint_renamed(LayoutWindow *lw);
 
+void layout_exif_window_new(LayoutWindow *lw);
 
 #endif
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */
index 4210d10..762490d 100644 (file)
@@ -567,16 +567,14 @@ struct _LayoutWindow
 
        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