Mercurial > geeqie
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: */ |