static void bar_pane_exif_edit_ok_cb(GenericDialog *gd, gpointer data) { ConfDialogData *cdd = data; /* either one or the other */ PaneExifData *ped = g_object_get_data(G_OBJECT(cdd->widget), "pane_data"); ExifEntry *ee = g_object_get_data(G_OBJECT(cdd->widget), "entry_data"); if (ped) { bar_pane_exif_add_entry(ped, gtk_entry_get_text(GTK_ENTRY(cdd->key_entry)), gtk_entry_get_text(GTK_ENTRY(cdd->title_entry)), cdd->if_set, cdd->editable); } if (ee) { const gchar *title; GtkWidget *pane = gtk_widget_get_parent(cdd->widget); while (pane) { ped = g_object_get_data(G_OBJECT(pane), "pane_data"); if (ped) break; pane = gtk_widget_get_parent(pane); } if (!pane) return; g_free(ee->key); ee->key = g_strdup(gtk_entry_get_text(GTK_ENTRY(cdd->key_entry))); title = gtk_entry_get_text(GTK_ENTRY(cdd->title_entry)); if (!title || strlen(title) == 0) { g_free(ee->title); ee->title = exif_get_description_by_key(ee->key); ee->auto_title = TRUE; } else if (!ee->title || strcmp(ee->title, title) != 0) { g_free(ee->title); ee->title = g_strdup(title); ee->auto_title = FALSE; } ee->if_set = cdd->if_set; ee->editable = cdd->editable; bar_pane_exif_setup_entry_box(ped, ee); bar_pane_exif_entry_update_title(ee); bar_pane_exif_update(ped); } }
static GtkWidget *bar_pane_exif_add_entry(PaneExifData *ped, const gchar *key, const gchar *title, gboolean if_set, gboolean editable) { ExifEntry *ee = g_new0(ExifEntry, 1); ee->key = g_strdup(key); if (title && title[0]) { ee->title = g_strdup(title); } else { ee->title = exif_get_description_by_key(key); ee->auto_title = TRUE; } ee->if_set = if_set; ee->editable = editable; ee->ped = ped; ee->ebox = gtk_event_box_new(); g_object_set_data(G_OBJECT(ee->ebox), "entry_data", ee); g_signal_connect_after(G_OBJECT(ee->ebox), "destroy", G_CALLBACK(bar_pane_exif_entry_destroy), ee); gtk_box_pack_start(GTK_BOX(ped->vbox), ee->ebox, FALSE, FALSE, 0); bar_pane_exif_entry_dnd_init(ee->ebox); g_signal_connect(ee->ebox, "button_release_event", G_CALLBACK(bar_pane_exif_menu_cb), ped); g_signal_connect(ee->ebox, "button_press_event", G_CALLBACK(bar_pane_exif_copy_cb), ped); bar_pane_exif_setup_entry_box(ped, ee); bar_pane_exif_entry_update_title(ee); bar_pane_exif_update(ped); return ee->ebox; }
GtkWidget *bar_exif_new(gint show_title, const gchar *path, gint advanced, GtkWidget *bounding_widget) { ExifBar *eb; GtkWidget *table; GtkWidget *viewport; GtkWidget *hbox; GtkWidget *button; gint len; gint i; eb = g_new0(ExifBar, 1); eb->labels = g_new0(GtkWidget *, bar_exif_key_count); 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); 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); } table = gtk_table_new(2, bar_exif_key_count + 1 + EXIF_BAR_CUSTOM_COUNT, FALSE); eb->table = table; len = bar_exif_key_count; for (i = 0; i < len; i++) { const gchar *text; text = exif_get_description_by_key(bar_exif_key_list[i]); eb->labels[i] = table_add_line(table, 0, i, text, NULL); } eb->custom_sep = gtk_hseparator_new(); gtk_table_attach(GTK_TABLE(table), eb->custom_sep, 0, 1, bar_exif_key_count, bar_exif_key_count + 1, GTK_FILL, GTK_FILL, 2, 2); for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++) { table_add_line_custom(table, 0, bar_exif_key_count + 1 + i, "", "", &eb->custom_name[i], &eb->custom_value[i]); } eb->scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 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_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); hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE); gtk_box_pack_end(GTK_BOX(eb->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); } eb->path = g_strdup(path); bar_exif_update(eb); return eb->vbox; }