4 * Copyright (C) 2008 - 2009 The Geeqie Team
8 * This software is released under the GNU General Public License (GNU GPL).
9 * Please read the included file COPYING for more information.
10 * This software comes with no warranty of any kind, use at your own risk!
20 #include "history_list.h"
29 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Camera")},
30 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("DateTime")},
31 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ShutterSpeed")},
32 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Aperture")},
33 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ExposureBias")},
34 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ISOSpeedRating")},
35 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("FocalLength")},
36 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("FocalLength35mmFilm")},
37 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Flash")},
38 { 0, 0, EXIF_UI_IFSET, "Exif.Photo.ExposureProgram"},
39 { 0, 0, EXIF_UI_IFSET, "Exif.Photo.MeteringMode"},
40 { 0, 0, EXIF_UI_IFSET, "Exif.Photo.LightSource"},
41 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ColorProfile")},
42 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("SubjectDistance")},
43 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Resolution")},
44 { 0, 0, EXIF_UI_IFSET, "Exif.Image.Orientation"},
45 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("GPSPosition")},
46 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("GPSAltitude")},
47 { 0, 0, EXIF_UI_IFSET, "Exif.Image.ImageDescription"},
48 { 0, 0, EXIF_UI_IFSET, "Exif.Image.Copyright"},
49 { 0, 0, EXIF_UI_OFF, NULL}
54 *-------------------------------------------------------------------
56 *-------------------------------------------------------------------
59 static void table_add_line_custom(GtkWidget *table, gint x, gint y,
60 const gchar *text1, const gchar *text2,
61 GtkWidget **label1, GtkWidget **label2,
67 buf = g_strconcat((text1) ? text1 : "fixme", ":", NULL);
68 if (!text2) text2 = "";
70 label = gtk_label_new(buf);
71 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0);
72 pref_label_bold(label, TRUE, FALSE);
73 gtk_table_attach(GTK_TABLE(table), label,
74 x + 1, x + 2, y, y + 1,
79 label = gtk_label_new(text2);
80 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
81 gtk_table_attach(GTK_TABLE(table), label,
82 x + 2, x + 3, y, y + 1,
89 *remove = gtk_check_button_new();
90 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(*remove), TRUE);
92 gtk_table_attach(GTK_TABLE(table), *remove,
101 static GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,
102 const gchar *description, const gchar *text,
108 table_add_line_custom(table, x, y, description, text, &key, &label, NULL);
109 gtk_widget_show(key);
110 gtk_widget_show(label);
111 if (keyret) *keyret = key;
118 *-------------------------------------------------------------------
120 *-------------------------------------------------------------------
123 typedef struct _PaneExifData PaneExifData;
133 GtkWidget *custom_sep;
134 GtkWidget *custom_name[EXIF_BAR_CUSTOM_COUNT];
135 GtkWidget *custom_value[EXIF_BAR_CUSTOM_COUNT];
136 GtkWidget *custom_remove[EXIF_BAR_CUSTOM_COUNT];
143 static void bar_pane_exif_sensitive(PaneExifData *ped, gint enable)
145 gtk_widget_set_sensitive(ped->table, enable);
148 static void bar_pane_exif_update(PaneExifData *ped)
154 /* do we have any exif at all ? */
155 exif = exif_read_fd(ped->fd);
159 bar_pane_exif_sensitive(ped, FALSE);
164 /* we will use high level functions so we can release it for now.
165 it will stay in the cache */
166 exif_free_fd(ped->fd, exif);
171 bar_pane_exif_sensitive(ped, TRUE);
173 for (i = 0; ExifUIList[i].key; i++)
177 if (ExifUIList[i].current == EXIF_UI_OFF)
179 gtk_widget_hide(ped->labels[i]);
180 gtk_widget_hide(ped->keys[i]);
183 text = metadata_read_string(ped->fd, ExifUIList[i].key, METADATA_FORMATTED);
184 if (ExifUIList[i].current == EXIF_UI_IFSET
185 && (!text || !*text))
187 gtk_widget_hide(ped->labels[i]);
188 gtk_widget_hide(ped->keys[i]);
192 gtk_widget_show(ped->labels[i]);
193 gtk_widget_show(ped->keys[i]);
194 gtk_label_set_text(GTK_LABEL(ped->labels[i]), text);
198 list = g_list_last(history_list_get_by_key("exif_extras"));
201 gtk_widget_show(ped->custom_sep);
205 gtk_widget_hide(ped->custom_sep);
208 while (list && i < EXIF_BAR_CUSTOM_COUNT)
218 text = metadata_read_string(ped->fd, name, METADATA_FORMATTED);
220 description = exif_get_tag_description_by_key(name);
221 if (!description || *description == '\0')
224 description = g_strdup(name);
226 buf = g_strconcat(description, ":", NULL);
229 gtk_label_set_text(GTK_LABEL(ped->custom_name[i]), buf);
231 gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), text);
234 gtk_widget_show(ped->custom_name[i]);
235 gtk_widget_show(ped->custom_value[i]);
236 g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", name);
237 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ped->custom_remove[i]), TRUE);
238 gtk_widget_show(ped->custom_remove[i]);
242 while (i < EXIF_BAR_CUSTOM_COUNT)
244 g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", NULL);
245 gtk_widget_hide(ped->custom_name[i]);
246 gtk_widget_hide(ped->custom_value[i]);
247 gtk_widget_hide(ped->custom_remove[i]);
253 static void bar_pane_exif_clear(PaneExifData *ped)
257 if (!GTK_WIDGET_SENSITIVE(ped->labels[0])) return;
259 for (i = 0; ExifUIList[i].key; i++)
261 gtk_label_set_text(GTK_LABEL(ped->labels[i]), "");
263 for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
265 gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), "");
269 void bar_pane_exif_set_fd(GtkWidget *widget, FileData *fd)
273 ped = g_object_get_data(G_OBJECT(widget), "pane_data");
276 /* store this, advanced view toggle needs to reload data */
277 file_data_unref(ped->fd);
278 ped->fd = file_data_ref(fd);
280 bar_pane_exif_clear(ped);
281 bar_pane_exif_update(ped);
284 static void bar_pane_exif_remove_advanced_cb(GtkWidget *widget, gpointer data)
286 PaneExifData *ped = data;
289 /* continue only if the toggle was deactivated */
290 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) return;
292 key = g_object_get_data(G_OBJECT(widget), "key");
295 history_list_item_change("exif_extras", key, NULL);
297 bar_pane_exif_update(ped);
300 void bar_pane_exif_close(GtkWidget *widget)
304 ped = g_object_get_data(G_OBJECT(widget), "pane_data");
307 gtk_widget_destroy(ped->vbox);
310 static void bar_pane_exif_destroy(GtkWidget *widget, gpointer data)
312 PaneExifData *ped = data;
316 file_data_unref(ped->fd);
320 GtkWidget *bar_pane_exif_new(const gchar *title)
329 for (exif_len = 0; ExifUIList[exif_len].key; exif_len++)
332 ped = g_new0(PaneExifData, 1);
334 ped->pane.pane_set_fd = bar_pane_exif_set_fd;
335 ped->pane.title = g_strdup(title);
337 ped->keys = g_new0(GtkWidget *, exif_len);
338 ped->labels = g_new0(GtkWidget *, exif_len);
340 ped->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
341 g_object_set_data(G_OBJECT(ped->vbox), "pane_data", ped);
342 g_signal_connect_after(G_OBJECT(ped->vbox), "destroy",
343 G_CALLBACK(bar_pane_exif_destroy), ped);
346 table = gtk_table_new(3, exif_len + 1 + EXIF_BAR_CUSTOM_COUNT, FALSE);
350 for (i = 0; ExifUIList[i].key; i++)
354 text = exif_get_description_by_key(ExifUIList[i].key);
355 ped->labels[i] = table_add_line(table, 0, i, text, NULL,
360 ped->custom_sep = gtk_hseparator_new();
361 gtk_table_attach(GTK_TABLE(table), ped->custom_sep, 0, 3,
362 exif_len, exif_len + 1,
363 GTK_FILL, GTK_FILL, 2, 2);
365 for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
367 table_add_line_custom(table, 0, exif_len + 1 + i,
368 "", "", &ped->custom_name[i], &ped->custom_value[i],
369 &ped->custom_remove[i]);
370 g_signal_connect(G_OBJECT(ped->custom_remove[i]), "clicked",
371 G_CALLBACK(bar_pane_exif_remove_advanced_cb), ped);
374 ped->scrolled = gtk_scrolled_window_new(NULL, NULL);
375 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ped->scrolled),
376 GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
378 viewport = gtk_viewport_new(NULL, NULL);
379 gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
380 gtk_container_add(GTK_CONTAINER(ped->scrolled), viewport);
381 gtk_widget_show(viewport);
383 gtk_container_add(GTK_CONTAINER(viewport), table);
384 gtk_widget_show(table);
386 gtk_box_pack_start(GTK_BOX(ped->vbox), ped->scrolled, TRUE, TRUE, 0);
388 hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
389 gtk_box_pack_end(GTK_BOX(ped->vbox), hbox, FALSE, FALSE, 0);
390 gtk_widget_show(hbox);
392 gtk_widget_show(ped->scrolled);
394 gtk_widget_show(ped->vbox);
398 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */