comparison src/bar_exif.c @ 1459:8c7bb5c1fb9c

implemented editing support in exif pane
author nadvornik
date Tue, 17 Mar 2009 22:41:09 +0000
parents 2908c28eb593
children e015b6573d36
comparison
equal deleted inserted replaced
1458:dc406812db14 1459:8c7bb5c1fb9c
35 * EXIF widget 35 * EXIF widget
36 *------------------------------------------------------------------- 36 *-------------------------------------------------------------------
37 */ 37 */
38 38
39 typedef struct _ExifEntry ExifEntry; 39 typedef struct _ExifEntry ExifEntry;
40 typedef struct _PaneExifData PaneExifData;
41
40 struct _ExifEntry 42 struct _ExifEntry
41 { 43 {
42 GtkWidget *ebox; 44 GtkWidget *ebox;
43 GtkWidget *hbox; 45 GtkWidget *box;
44 GtkWidget *title_label; 46 GtkWidget *title_label;
45 GtkWidget *value_label; 47 GtkWidget *value_widget;
46 48
47 gchar *key; 49 gchar *key;
48 gchar *title; 50 gchar *title;
49 gboolean if_set; 51 gboolean if_set;
50 gboolean auto_title; 52 gboolean auto_title;
53 gboolean editable;
54
55 PaneExifData *ped;
51 }; 56 };
52 57
53 58
54 typedef struct _PaneExifData PaneExifData;
55 struct _PaneExifData 59 struct _PaneExifData
56 { 60 {
57 PaneData pane; 61 PaneData pane;
58 GtkWidget *vbox; 62 GtkWidget *vbox;
59 GtkWidget *widget; 63 GtkWidget *widget;
75 /* dialog parts */ 79 /* dialog parts */
76 GenericDialog *gd; 80 GenericDialog *gd;
77 GtkWidget *key_entry; 81 GtkWidget *key_entry;
78 GtkWidget *title_entry; 82 GtkWidget *title_entry;
79 gboolean if_set; 83 gboolean if_set;
84 gboolean editable;
80 }; 85 };
81 86
82 static void bar_pane_exif_entry_dnd_init(GtkWidget *entry); 87 static void bar_pane_exif_entry_dnd_init(GtkWidget *entry);
83 static void bar_pane_exif_entry_update_title(ExifEntry *ee); 88 static void bar_pane_exif_entry_update_title(ExifEntry *ee);
84 static void bar_pane_exif_update(PaneExifData *ped); 89 static void bar_pane_exif_update(PaneExifData *ped);
85 static gboolean bar_pane_exif_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data); 90 static gboolean bar_pane_exif_menu_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
91 static void bar_pane_exif_notify_cb(FileData *fd, NotifyType type, gpointer data);
92
93
94 static void bar_pane_exif_entry_changed(GtkEntry *text_entry, gpointer data)
95 {
96 ExifEntry *ee = data;
97 gchar *text;
98 if (!ee->ped->fd) return;
99
100 text = text_widget_text_pull(ee->value_widget);
101 metadata_write_string(ee->ped->fd, ee->key, text);
102 g_free(text);
103 }
86 104
87 static void bar_pane_exif_entry_destroy(GtkWidget *widget, gpointer data) 105 static void bar_pane_exif_entry_destroy(GtkWidget *widget, gpointer data)
88 { 106 {
89 ExifEntry *ee = data; 107 ExifEntry *ee = data;
90 108
91 g_free(ee->key); 109 g_free(ee->key);
92 g_free(ee->title); 110 g_free(ee->title);
93 g_free(ee); 111 g_free(ee);
94 } 112 }
95 113
96 114 static void bar_pane_exif_setup_entry_box(PaneExifData *ped, ExifEntry *ee)
97 static GtkWidget *bar_pane_exif_add_entry(PaneExifData *ped, const gchar *key, const gchar *title, gint if_set) 115 {
116 gboolean horizontal = !ee->editable;
117 gboolean editable = ee->editable;
118
119 if (ee->box) gtk_widget_destroy(ee->box);
120
121 ee->box = horizontal ? gtk_hbox_new(FALSE, 0) : gtk_vbox_new(FALSE, 0);
122 gtk_container_add(GTK_CONTAINER(ee->ebox), ee->box);
123 gtk_widget_show(ee->box);
124
125 ee->title_label = gtk_label_new(NULL);
126 gtk_misc_set_alignment(GTK_MISC(ee->title_label), horizontal ? 1.0 : 0.0, 0.5);
127 gtk_size_group_add_widget(ped->size_group, ee->title_label);
128 gtk_box_pack_start(GTK_BOX(ee->box), ee->title_label, FALSE, TRUE, 0);
129 gtk_widget_show(ee->title_label);
130
131 if (editable)
132 {
133 ee->value_widget = gtk_entry_new();
134 g_signal_connect(G_OBJECT(ee->value_widget), "changed",
135 G_CALLBACK(bar_pane_exif_entry_changed), ee);
136
137 }
138 else
139 {
140 ee->value_widget = gtk_label_new(NULL);
141 // gtk_label_set_width_chars(GTK_LABEL(ee->value_widget), 20);
142 gtk_label_set_ellipsize(GTK_LABEL(ee->value_widget), PANGO_ELLIPSIZE_END);
143 // gtk_widget_set_size_request(ee->value_widget, 100, -1);
144 gtk_misc_set_alignment(GTK_MISC(ee->value_widget), 0.0, 0.5);
145 }
146
147 gtk_box_pack_start(GTK_BOX(ee->box), ee->value_widget, TRUE, TRUE, 1);
148 gtk_widget_show(ee->value_widget);
149 }
150
151 static GtkWidget *bar_pane_exif_add_entry(PaneExifData *ped, const gchar *key, const gchar *title, gboolean if_set, gboolean editable)
98 { 152 {
99 ExifEntry *ee = g_new0(ExifEntry, 1); 153 ExifEntry *ee = g_new0(ExifEntry, 1);
100 154
101 ee->key = g_strdup(key); 155 ee->key = g_strdup(key);
102 if (title && title[0]) 156 if (title && title[0])
108 ee->title = exif_get_description_by_key(key); 162 ee->title = exif_get_description_by_key(key);
109 ee->auto_title = TRUE; 163 ee->auto_title = TRUE;
110 } 164 }
111 165
112 ee->if_set = if_set; 166 ee->if_set = if_set;
167 ee->editable = editable;
168
169 ee->ped = ped;
113 170
114 ee->ebox = gtk_event_box_new(); 171 ee->ebox = gtk_event_box_new();
115 g_object_set_data(G_OBJECT(ee->ebox), "entry_data", ee); 172 g_object_set_data(G_OBJECT(ee->ebox), "entry_data", ee);
116 g_signal_connect_after(G_OBJECT(ee->ebox), "destroy", 173 g_signal_connect_after(G_OBJECT(ee->ebox), "destroy",
117 G_CALLBACK(bar_pane_exif_entry_destroy), ee); 174 G_CALLBACK(bar_pane_exif_entry_destroy), ee);
118 175
119 ee->hbox = gtk_hbox_new(FALSE, 0);
120 gtk_container_add(GTK_CONTAINER(ee->ebox), ee->hbox);
121 gtk_widget_show(ee->hbox);
122
123 ee->title_label = gtk_label_new(NULL);
124 gtk_misc_set_alignment(GTK_MISC(ee->title_label), 1.0, 0.5);
125 gtk_size_group_add_widget(ped->size_group, ee->title_label);
126 gtk_box_pack_start(GTK_BOX(ee->hbox), ee->title_label, FALSE, TRUE, 0);
127 gtk_widget_show(ee->title_label);
128
129 ee->value_label = gtk_label_new(NULL);
130 // gtk_label_set_width_chars(GTK_LABEL(ee->value_label), 20);
131 gtk_label_set_ellipsize(GTK_LABEL(ee->value_label), PANGO_ELLIPSIZE_END);
132 // gtk_widget_set_size_request(ee->value_label, 100, -1);
133 gtk_misc_set_alignment(GTK_MISC(ee->value_label), 0.0, 0.5);
134 gtk_box_pack_start(GTK_BOX(ee->hbox), ee->value_label, TRUE, TRUE, 1);
135 gtk_widget_show(ee->value_label);
136 gtk_box_pack_start(GTK_BOX(ped->vbox), ee->ebox, FALSE, FALSE, 0); 176 gtk_box_pack_start(GTK_BOX(ped->vbox), ee->ebox, FALSE, FALSE, 0);
137 177
138 bar_pane_exif_entry_dnd_init(ee->ebox); 178 bar_pane_exif_entry_dnd_init(ee->ebox);
139 g_signal_connect(ee->ebox, "button_press_event", G_CALLBACK(bar_pane_exif_menu_cb), ped); 179 g_signal_connect(ee->ebox, "button_press_event", G_CALLBACK(bar_pane_exif_menu_cb), ped);
140 180
181 bar_pane_exif_setup_entry_box(ped, ee);
182
141 bar_pane_exif_entry_update_title(ee); 183 bar_pane_exif_entry_update_title(ee);
142 bar_pane_exif_update(ped); 184 bar_pane_exif_update(ped);
143 185
144 return ee->ebox; 186 return ee->ebox;
145 } 187 }
146 188
147 static void bar_pane_exif_reparent_entry(GtkWidget *entry, GtkWidget *pane) 189 static void bar_pane_exif_reparent_entry(GtkWidget *entry, GtkWidget *pane)
148 { 190 {
149 GtkWidget *old_pane = entry->parent;
150 PaneExifData *ped = g_object_get_data(G_OBJECT(pane), "pane_data"); 191 PaneExifData *ped = g_object_get_data(G_OBJECT(pane), "pane_data");
151 PaneExifData *old_ped = g_object_get_data(G_OBJECT(old_pane), "pane_data"); 192 PaneExifData *old_ped;
152 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data"); 193 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data");
153 194
154 if (!ped || !old_ped || !ee) return; 195 if (!ped || !ee) return;
196
197 old_ped = ee->ped;
155 198
156 g_object_ref(entry); 199 g_object_ref(entry);
157 200
158 gtk_size_group_remove_widget(old_ped->size_group, ee->title_label); 201 gtk_size_group_remove_widget(old_ped->size_group, ee->title_label);
159 gtk_container_remove(GTK_CONTAINER(old_ped->vbox), entry); 202 gtk_container_remove(GTK_CONTAINER(old_ped->vbox), entry);
160 203
204 ee->ped = ped;
161 gtk_size_group_add_widget(ped->size_group, ee->title_label); 205 gtk_size_group_add_widget(ped->size_group, ee->title_label);
162 gtk_box_pack_start(GTK_BOX(ped->vbox), entry, FALSE, FALSE, 0); 206 gtk_box_pack_start(GTK_BOX(ped->vbox), entry, FALSE, FALSE, 0);
163 } 207 }
164 208
165 static void bar_pane_exif_entry_update_title(ExifEntry *ee) 209 static void bar_pane_exif_entry_update_title(ExifEntry *ee)
175 { 219 {
176 gchar *text; 220 gchar *text;
177 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data"); 221 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data");
178 222
179 if (!ee) return; 223 if (!ee) return;
180 text = metadata_read_string(ped->fd, ee->key, METADATA_FORMATTED); 224 text = metadata_read_string(ped->fd, ee->key, ee->editable ? METADATA_PLAIN : METADATA_FORMATTED);
181 225
182 if (!ped->show_all && ee->if_set && (!text || !*text)) 226 if (!ped->show_all && ee->if_set && !ee->editable && (!text || !*text))
183 { 227 {
184 gtk_label_set_text(GTK_LABEL(ee->value_label), NULL); 228 gtk_label_set_text(GTK_LABEL(ee->value_widget), NULL);
185 gtk_widget_hide(entry); 229 gtk_widget_hide(entry);
186 } 230 }
187 else 231 else
188 { 232 {
189 gtk_label_set_text(GTK_LABEL(ee->value_label), text); 233 if (ee->editable)
234 {
235 g_signal_handlers_block_by_func(ee->value_widget, bar_pane_exif_entry_changed, ee);
236 gtk_entry_set_text(GTK_ENTRY(ee->value_widget), text ? text : "");
237 g_signal_handlers_unblock_by_func(ee->value_widget, bar_pane_exif_entry_changed, ee);
190 #if GTK_CHECK_VERSION(2,12,0) 238 #if GTK_CHECK_VERSION(2,12,0)
191 gtk_widget_set_tooltip_text(ee->hbox, text); 239 gtk_widget_set_tooltip_text(ee->box, NULL);
192 #endif 240 #endif
241 }
242 else
243 {
244 gtk_label_set_text(GTK_LABEL(ee->value_widget), text);
245 #if GTK_CHECK_VERSION(2,12,0)
246 gtk_widget_set_tooltip_text(ee->box, text);
247 #endif
248 }
193 gtk_widget_show(entry); 249 gtk_widget_show(entry);
194 ped->all_hidden = FALSE; 250 ped->all_hidden = FALSE;
195 } 251 }
196 252
197 g_free(text); 253 g_free(text);
230 ped->fd = file_data_ref(fd); 286 ped->fd = file_data_ref(fd);
231 287
232 bar_pane_exif_update(ped); 288 bar_pane_exif_update(ped);
233 } 289 }
234 290
291 gint bar_pane_exif_event(GtkWidget *bar, GdkEvent *event)
292 {
293 PaneExifData *ped;
294 gboolean ret = FALSE;
295 GList *list, *work;
296
297 ped = g_object_get_data(G_OBJECT(bar), "pane_data");
298 if (!ped) return FALSE;
299
300 list = gtk_container_get_children(GTK_CONTAINER(ped->vbox));
301 work = list;
302 while (!ret && work)
303 {
304 GtkWidget *entry = work->data;
305 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data");
306 work = work->next;
307
308 if (ee->editable && GTK_WIDGET_HAS_FOCUS(ee->value_widget)) ret = gtk_widget_event(ee->value_widget, event);
309 }
310 g_list_free(list);
311 return ret;
312 }
313
235 static void bar_pane_exif_notify_cb(FileData *fd, NotifyType type, gpointer data) 314 static void bar_pane_exif_notify_cb(FileData *fd, NotifyType type, gpointer data)
236 { 315 {
237 PaneExifData *ped = data; 316 PaneExifData *ped = data;
238 if ((type & (NOTIFY_REREAD | NOTIFY_CHANGE | NOTIFY_METADATA)) && fd == ped->fd) bar_pane_exif_update(ped); 317 if ((type & (NOTIFY_REREAD | NOTIFY_CHANGE | NOTIFY_METADATA)) && fd == ped->fd) bar_pane_exif_update(ped);
239 } 318 }
319
240 320
241 /* 321 /*
242 *------------------------------------------------------------------- 322 *-------------------------------------------------------------------
243 * dnd 323 * dnd
244 *------------------------------------------------------------------- 324 *-------------------------------------------------------------------
299 if (new_entry->parent && new_entry->parent != ped->vbox) bar_pane_exif_reparent_entry(new_entry, pane); 379 if (new_entry->parent && new_entry->parent != ped->vbox) bar_pane_exif_reparent_entry(new_entry, pane);
300 380
301 break; 381 break;
302 default: 382 default:
303 /* FIXME: this needs a check for valid exif keys */ 383 /* FIXME: this needs a check for valid exif keys */
304 new_entry = bar_pane_exif_add_entry(ped, (gchar *)selection_data->data, NULL, TRUE); 384 new_entry = bar_pane_exif_add_entry(ped, (gchar *)selection_data->data, NULL, TRUE, FALSE);
305 break; 385 break;
306 } 386 }
307 387
308 list = gtk_container_get_children(GTK_CONTAINER(ped->vbox)); 388 list = gtk_container_get_children(GTK_CONTAINER(ped->vbox));
309 work = list; 389 work = list;
392 if (ped) 472 if (ped)
393 { 473 {
394 bar_pane_exif_add_entry(ped, 474 bar_pane_exif_add_entry(ped,
395 gtk_entry_get_text(GTK_ENTRY(cdd->key_entry)), 475 gtk_entry_get_text(GTK_ENTRY(cdd->key_entry)),
396 gtk_entry_get_text(GTK_ENTRY(cdd->title_entry)), 476 gtk_entry_get_text(GTK_ENTRY(cdd->title_entry)),
397 cdd->if_set); 477 cdd->if_set, cdd->editable);
398 } 478 }
399 479
400 if (ee) 480 if (ee)
401 { 481 {
402 const gchar *title; 482 const gchar *title;
420 ee->title = g_strdup(title); 500 ee->title = g_strdup(title);
421 ee->auto_title = FALSE; 501 ee->auto_title = FALSE;
422 } 502 }
423 503
424 ee->if_set = cdd->if_set; 504 ee->if_set = cdd->if_set;
505 ee->editable = cdd->editable;
506
507 bar_pane_exif_setup_entry_box(ped, ee);
425 508
426 bar_pane_exif_entry_update_title(ee); 509 bar_pane_exif_entry_update_title(ee);
427 bar_pane_exif_update(ped); 510 bar_pane_exif_update(ped);
428 } 511 }
429 } 512 }
442 525
443 cdd->widget = widget; 526 cdd->widget = widget;
444 527
445 528
446 cdd->if_set = ee ? ee->if_set : TRUE; 529 cdd->if_set = ee ? ee->if_set : TRUE;
447 530 cdd->editable = ee ? ee->editable : FALSE;
531
448 cdd->gd = gd = generic_dialog_new(ee ? _("Configure entry") : _("Add entry"), "exif_entry_edit", 532 cdd->gd = gd = generic_dialog_new(ee ? _("Configure entry") : _("Add entry"), "exif_entry_edit",
449 widget, TRUE, 533 widget, TRUE,
450 bar_pane_exif_edit_cancel_cb, cdd); 534 bar_pane_exif_edit_cancel_cb, cdd);
451 g_signal_connect(G_OBJECT(gd->dialog), "destroy", 535 g_signal_connect(G_OBJECT(gd->dialog), "destroy",
452 G_CALLBACK(bar_pane_exif_edit_destroy_cb), cdd); 536 G_CALLBACK(bar_pane_exif_edit_destroy_cb), cdd);
478 gtk_table_attach_defaults(GTK_TABLE(table), cdd->title_entry, 1, 2, 1, 2); 562 gtk_table_attach_defaults(GTK_TABLE(table), cdd->title_entry, 1, 2, 1, 2);
479 generic_dialog_attach_default(gd, cdd->title_entry); 563 generic_dialog_attach_default(gd, cdd->title_entry);
480 gtk_widget_show(cdd->title_entry); 564 gtk_widget_show(cdd->title_entry);
481 565
482 pref_checkbox_new_int(gd->vbox, _("Show only if set"), cdd->if_set, &cdd->if_set); 566 pref_checkbox_new_int(gd->vbox, _("Show only if set"), cdd->if_set, &cdd->if_set);
567 pref_checkbox_new_int(gd->vbox, _("Editable (supported only for XMP)"), cdd->editable, &cdd->editable);
483 568
484 gtk_widget_show(gd->dialog); 569 gtk_widget_show(gd->dialog);
485 } 570 }
486 571
487 static void bar_pane_exif_conf_dialog_cb(GtkWidget *menu_widget, gpointer data) 572 static void bar_pane_exif_conf_dialog_cb(GtkWidget *menu_widget, gpointer data)
541 bar_pane_exif_menu_popup(widget, ped); 626 bar_pane_exif_menu_popup(widget, ped);
542 return TRUE; 627 return TRUE;
543 } 628 }
544 return FALSE; 629 return FALSE;
545 } 630 }
631
632
546 633
547 static void bar_pane_exif_entry_write_config(GtkWidget *entry, GString *outstr, gint indent) 634 static void bar_pane_exif_entry_write_config(GtkWidget *entry, GString *outstr, gint indent)
548 { 635 {
549 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data"); 636 ExifEntry *ee = g_object_get_data(G_OBJECT(entry), "entry_data");
550 if (!ee) return; 637 if (!ee) return;
552 WRITE_STRING("<entry\n"); 639 WRITE_STRING("<entry\n");
553 indent++; 640 indent++;
554 WRITE_CHAR(*ee, key); 641 WRITE_CHAR(*ee, key);
555 if (!ee->auto_title) WRITE_CHAR(*ee, title); 642 if (!ee->auto_title) WRITE_CHAR(*ee, title);
556 WRITE_BOOL(*ee, if_set); 643 WRITE_BOOL(*ee, if_set);
644 WRITE_BOOL(*ee, editable);
557 indent--; 645 indent--;
558 WRITE_STRING("/>\n"); 646 WRITE_STRING("/>\n");
559 } 647 }
560 648
561 static void bar_pane_exif_write_config(GtkWidget *pane, GString *outstr, gint indent) 649 static void bar_pane_exif_write_config(GtkWidget *pane, GString *outstr, gint indent)
630 718
631 ped = g_new0(PaneExifData, 1); 719 ped = g_new0(PaneExifData, 1);
632 720
633 ped->pane.pane_set_fd = bar_pane_exif_set_fd; 721 ped->pane.pane_set_fd = bar_pane_exif_set_fd;
634 ped->pane.pane_write_config = bar_pane_exif_write_config; 722 ped->pane.pane_write_config = bar_pane_exif_write_config;
723 ped->pane.pane_event = bar_pane_exif_event;
635 ped->pane.title = bar_pane_expander_title(title); 724 ped->pane.title = bar_pane_expander_title(title);
636 ped->pane.expanded = expanded; 725 ped->pane.expanded = expanded;
637 726
638 ped->size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); 727 ped->size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
639 ped->widget = gtk_event_box_new(); 728 ped->widget = gtk_event_box_new();
655 744
656 file_data_register_notify_func(bar_pane_exif_notify_cb, ped, NOTIFY_PRIORITY_LOW); 745 file_data_register_notify_func(bar_pane_exif_notify_cb, ped, NOTIFY_PRIORITY_LOW);
657 746
658 if (populate) 747 if (populate)
659 { 748 {
660 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Camera"), NULL, TRUE); 749 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Camera"), NULL, TRUE, FALSE);
661 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("DateTime"), NULL, TRUE); 750 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("DateTime"), NULL, TRUE, FALSE);
662 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ShutterSpeed"), NULL, TRUE); 751 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ShutterSpeed"), NULL, TRUE, FALSE);
663 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Aperture"), NULL, TRUE); 752 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Aperture"), NULL, TRUE, FALSE);
664 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ExposureBias"), NULL, TRUE); 753 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ExposureBias"), NULL, TRUE, FALSE);
665 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ISOSpeedRating"), NULL, TRUE); 754 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ISOSpeedRating"), NULL, TRUE, FALSE);
666 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("FocalLength"), NULL, TRUE); 755 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("FocalLength"), NULL, TRUE, FALSE);
667 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("FocalLength35mmFilm"), NULL, TRUE); 756 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("FocalLength35mmFilm"), NULL, TRUE, FALSE);
668 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Flash"), NULL, TRUE); 757 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Flash"), NULL, TRUE, FALSE);
669 bar_pane_exif_add_entry(ped, "Exif.Photo.ExposureProgram", NULL, TRUE); 758 bar_pane_exif_add_entry(ped, "Exif.Photo.ExposureProgram", NULL, TRUE, FALSE);
670 bar_pane_exif_add_entry(ped, "Exif.Photo.MeteringMode", NULL, TRUE); 759 bar_pane_exif_add_entry(ped, "Exif.Photo.MeteringMode", NULL, TRUE, FALSE);
671 bar_pane_exif_add_entry(ped, "Exif.Photo.LightSource", NULL, TRUE); 760 bar_pane_exif_add_entry(ped, "Exif.Photo.LightSource", NULL, TRUE, FALSE);
672 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ColorProfile"), NULL, TRUE); 761 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("ColorProfile"), NULL, TRUE, FALSE);
673 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("SubjectDistance"), NULL, TRUE); 762 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("SubjectDistance"), NULL, TRUE, FALSE);
674 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Resolution"), NULL, TRUE); 763 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("Resolution"), NULL, TRUE, FALSE);
675 bar_pane_exif_add_entry(ped, "Exif.Image.Orientation", NULL, TRUE); 764 bar_pane_exif_add_entry(ped, "Exif.Image.Orientation", NULL, TRUE, FALSE);
676 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("GPSPosition"), NULL, TRUE); 765 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("GPSPosition"), NULL, TRUE, FALSE);
677 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("GPSAltitude"), NULL, TRUE); 766 bar_pane_exif_add_entry(ped, EXIF_FORMATTED("GPSAltitude"), NULL, TRUE, FALSE);
678 bar_pane_exif_add_entry(ped, "Exif.Image.ImageDescription", NULL, TRUE); 767 bar_pane_exif_add_entry(ped, "Exif.Image.ImageDescription", NULL, TRUE, FALSE);
679 bar_pane_exif_add_entry(ped, "Exif.Image.Copyright", NULL, TRUE); 768 bar_pane_exif_add_entry(ped, "Exif.Image.Copyright", NULL, TRUE, FALSE);
680 } 769 }
681 770
682 gtk_widget_show(ped->widget); 771 gtk_widget_show(ped->widget);
683 772
684 return ped->widget; 773 return ped->widget;
707 { 796 {
708 PaneExifData *ped; 797 PaneExifData *ped;
709 gchar *key = NULL; 798 gchar *key = NULL;
710 gchar *title = NULL; 799 gchar *title = NULL;
711 gboolean if_set = TRUE; 800 gboolean if_set = TRUE;
801 gboolean editable = FALSE;
712 802
713 ped = g_object_get_data(G_OBJECT(pane), "pane_data"); 803 ped = g_object_get_data(G_OBJECT(pane), "pane_data");
714 if (!ped) return; 804 if (!ped) return;
715 805
716 while (*attribute_names) 806 while (*attribute_names)
719 const gchar *value = *attribute_values++; 809 const gchar *value = *attribute_values++;
720 810
721 if (READ_CHAR_FULL("key", key)) continue; 811 if (READ_CHAR_FULL("key", key)) continue;
722 if (READ_CHAR_FULL("title", title)) continue; 812 if (READ_CHAR_FULL("title", title)) continue;
723 if (READ_BOOL_FULL("if_set", if_set)) continue; 813 if (READ_BOOL_FULL("if_set", if_set)) continue;
814 if (READ_BOOL_FULL("editable", editable)) continue;
724 815
725 DEBUG_1("unknown attribute %s = %s", option, value); 816 DEBUG_1("unknown attribute %s = %s", option, value);
726 } 817 }
727 818
728 if (key && key[0]) bar_pane_exif_add_entry(ped, key, title, if_set); 819 if (key && key[0]) bar_pane_exif_add_entry(ped, key, title, if_set, editable);
729 } 820 }
730 821
731 822
732 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ 823 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */