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"
30 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Camera")},
31 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("DateTime")},
32 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ShutterSpeed")},
33 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Aperture")},
34 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ExposureBias")},
35 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ISOSpeedRating")},
36 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("FocalLength")},
37 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("FocalLength35mmFilm")},
38 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Flash")},
39 { 0, 0, EXIF_UI_IFSET, "Exif.Photo.ExposureProgram"},
40 { 0, 0, EXIF_UI_IFSET, "Exif.Photo.MeteringMode"},
41 { 0, 0, EXIF_UI_IFSET, "Exif.Photo.LightSource"},
42 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("ColorProfile")},
43 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("SubjectDistance")},
44 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("Resolution")},
45 { 0, 0, EXIF_UI_IFSET, "Exif.Image.Orientation"},
46 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("GPSPosition")},
47 { 0, 0, EXIF_UI_IFSET, EXIF_FORMATTED("GPSAltitude")},
48 { 0, 0, EXIF_UI_IFSET, "Exif.Image.ImageDescription"},
49 { 0, 0, EXIF_UI_IFSET, "Exif.Image.Copyright"},
50 { 0, 0, EXIF_UI_OFF, NULL}
55 *-------------------------------------------------------------------
57 *-------------------------------------------------------------------
60 static void table_add_line_custom(GtkWidget *table, gint x, gint y,
61 const gchar *text1, const gchar *text2,
62 GtkWidget **label1, GtkWidget **label2,
68 buf = g_strconcat((text1) ? text1 : "fixme", ":", NULL);
69 if (!text2) text2 = "";
71 label = gtk_label_new(buf);
72 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0);
73 pref_label_bold(label, TRUE, FALSE);
74 gtk_table_attach(GTK_TABLE(table), label,
75 x + 1, x + 2, y, y + 1,
80 label = gtk_label_new(text2);
81 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
82 gtk_table_attach(GTK_TABLE(table), label,
83 x + 2, x + 3, y, y + 1,
90 *remove = gtk_check_button_new();
91 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(*remove), TRUE);
93 gtk_table_attach(GTK_TABLE(table), *remove,
102 static GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,
103 const gchar *description, const gchar *text,
109 table_add_line_custom(table, x, y, description, text, &key, &label, NULL);
110 gtk_widget_show(key);
111 gtk_widget_show(label);
112 if (keyret) *keyret = key;
119 *-------------------------------------------------------------------
121 *-------------------------------------------------------------------
124 typedef struct _PaneExifData PaneExifData;
134 GtkWidget *custom_sep;
135 GtkWidget *custom_name[EXIF_BAR_CUSTOM_COUNT];
136 GtkWidget *custom_value[EXIF_BAR_CUSTOM_COUNT];
137 GtkWidget *custom_remove[EXIF_BAR_CUSTOM_COUNT];
144 static void bar_pane_exif_sensitive(PaneExifData *ped, gint enable)
146 gtk_widget_set_sensitive(ped->table, enable);
149 static void bar_pane_exif_update(PaneExifData *ped)
155 /* do we have any exif at all ? */
156 exif = exif_read_fd(ped->fd);
160 bar_pane_exif_sensitive(ped, FALSE);
165 /* we will use high level functions so we can release it for now.
166 it will stay in the cache */
167 exif_free_fd(ped->fd, exif);
172 bar_pane_exif_sensitive(ped, TRUE);
174 for (i = 0; ExifUIList[i].key; i++)
178 if (ExifUIList[i].current == EXIF_UI_OFF)
180 gtk_widget_hide(ped->labels[i]);
181 gtk_widget_hide(ped->keys[i]);
184 text = metadata_read_string(ped->fd, ExifUIList[i].key, METADATA_FORMATTED);
185 if (ExifUIList[i].current == EXIF_UI_IFSET
186 && (!text || !*text))
188 gtk_widget_hide(ped->labels[i]);
189 gtk_widget_hide(ped->keys[i]);
193 gtk_widget_show(ped->labels[i]);
194 gtk_widget_show(ped->keys[i]);
195 gtk_label_set_text(GTK_LABEL(ped->labels[i]), text);
199 list = g_list_last(history_list_get_by_key("exif_extras"));
202 gtk_widget_show(ped->custom_sep);
206 gtk_widget_hide(ped->custom_sep);
209 while (list && i < EXIF_BAR_CUSTOM_COUNT)
219 text = metadata_read_string(ped->fd, name, METADATA_FORMATTED);
221 description = exif_get_tag_description_by_key(name);
222 if (!description || *description == '\0')
225 description = g_strdup(name);
227 buf = g_strconcat(description, ":", NULL);
230 gtk_label_set_text(GTK_LABEL(ped->custom_name[i]), buf);
232 gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), text);
235 gtk_widget_show(ped->custom_name[i]);
236 gtk_widget_show(ped->custom_value[i]);
237 g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", name);
238 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ped->custom_remove[i]), TRUE);
239 gtk_widget_show(ped->custom_remove[i]);
243 while (i < EXIF_BAR_CUSTOM_COUNT)
245 g_object_set_data(G_OBJECT(ped->custom_remove[i]), "key", NULL);
246 gtk_widget_hide(ped->custom_name[i]);
247 gtk_widget_hide(ped->custom_value[i]);
248 gtk_widget_hide(ped->custom_remove[i]);
254 static void bar_pane_exif_clear(PaneExifData *ped)
258 if (!GTK_WIDGET_SENSITIVE(ped->labels[0])) return;
260 for (i = 0; ExifUIList[i].key; i++)
262 gtk_label_set_text(GTK_LABEL(ped->labels[i]), "");
264 for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
266 gtk_label_set_text(GTK_LABEL(ped->custom_value[i]), "");
270 void bar_pane_exif_set_fd(GtkWidget *widget, FileData *fd)
274 ped = g_object_get_data(G_OBJECT(widget), "pane_data");
277 /* store this, advanced view toggle needs to reload data */
278 file_data_unref(ped->fd);
279 ped->fd = file_data_ref(fd);
281 bar_pane_exif_clear(ped);
282 bar_pane_exif_update(ped);
285 static void bar_pane_exif_write_config(GtkWidget *pane, GString *outstr, gint indent)
289 ped = g_object_get_data(G_OBJECT(pane), "pane_data");
292 WRITE_STRING("<pane_exif\n");
294 WRITE_CHAR(*ped, pane.title);
295 WRITE_BOOL(*ped, pane.expanded);
297 WRITE_STRING("/>\n");
301 static void bar_pane_exif_remove_advanced_cb(GtkWidget *widget, gpointer data)
303 PaneExifData *ped = data;
306 /* continue only if the toggle was deactivated */
307 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) return;
309 key = g_object_get_data(G_OBJECT(widget), "key");
312 history_list_item_change("exif_extras", key, NULL);
314 bar_pane_exif_update(ped);
317 void bar_pane_exif_close(GtkWidget *widget)
321 ped = g_object_get_data(G_OBJECT(widget), "pane_data");
324 gtk_widget_destroy(ped->vbox);
327 static void bar_pane_exif_destroy(GtkWidget *widget, gpointer data)
329 PaneExifData *ped = data;
333 file_data_unref(ped->fd);
337 GtkWidget *bar_pane_exif_new(const gchar *title, gboolean expanded)
346 for (exif_len = 0; ExifUIList[exif_len].key; exif_len++)
349 ped = g_new0(PaneExifData, 1);
351 ped->pane.pane_set_fd = bar_pane_exif_set_fd;
352 ped->pane.pane_write_config = bar_pane_exif_write_config;
353 ped->pane.title = g_strdup(title);
354 ped->pane.expanded = expanded;
356 ped->keys = g_new0(GtkWidget *, exif_len);
357 ped->labels = g_new0(GtkWidget *, exif_len);
359 ped->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
360 g_object_set_data(G_OBJECT(ped->vbox), "pane_data", ped);
361 g_signal_connect_after(G_OBJECT(ped->vbox), "destroy",
362 G_CALLBACK(bar_pane_exif_destroy), ped);
365 table = gtk_table_new(3, exif_len + 1 + EXIF_BAR_CUSTOM_COUNT, FALSE);
369 for (i = 0; ExifUIList[i].key; i++)
373 text = exif_get_description_by_key(ExifUIList[i].key);
374 ped->labels[i] = table_add_line(table, 0, i, text, NULL,
379 ped->custom_sep = gtk_hseparator_new();
380 gtk_table_attach(GTK_TABLE(table), ped->custom_sep, 0, 3,
381 exif_len, exif_len + 1,
382 GTK_FILL, GTK_FILL, 2, 2);
384 for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
386 table_add_line_custom(table, 0, exif_len + 1 + i,
387 "", "", &ped->custom_name[i], &ped->custom_value[i],
388 &ped->custom_remove[i]);
389 g_signal_connect(G_OBJECT(ped->custom_remove[i]), "clicked",
390 G_CALLBACK(bar_pane_exif_remove_advanced_cb), ped);
393 ped->scrolled = gtk_scrolled_window_new(NULL, NULL);
394 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ped->scrolled),
395 GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
397 viewport = gtk_viewport_new(NULL, NULL);
398 gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
399 gtk_container_add(GTK_CONTAINER(ped->scrolled), viewport);
400 gtk_widget_show(viewport);
402 gtk_container_add(GTK_CONTAINER(viewport), table);
403 gtk_widget_show(table);
405 gtk_box_pack_start(GTK_BOX(ped->vbox), ped->scrolled, TRUE, TRUE, 0);
407 hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
408 gtk_box_pack_end(GTK_BOX(ped->vbox), hbox, FALSE, FALSE, 0);
409 gtk_widget_show(hbox);
411 gtk_widget_show(ped->scrolled);
413 gtk_widget_show(ped->vbox);
418 GtkWidget *bar_pane_exif_new_from_config(const gchar **attribute_names, const gchar **attribute_values)
420 gchar *title = g_strdup(_("NoName"));
421 gboolean expanded = TRUE;
423 while (*attribute_names)
425 const gchar *option = *attribute_names++;
426 const gchar *value = *attribute_values++;
428 READ_CHAR_FULL("pane.title", title);
429 READ_BOOL_FULL("pane.expanded", expanded);
432 DEBUG_1("unknown attribute %s = %s", option, value);
435 return bar_pane_exif_new(title, expanded);
439 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */