// modify the datetime_taken field in the db/cache static void _lib_geotagging_apply_offset_callback(GtkWidget *widget, gpointer user_data) { dt_lib_geotagging_t *l = (dt_lib_geotagging_t *)((dt_lib_module_t *)user_data)->data; long int offset = 0; _lib_geotagging_parse_offset(gtk_entry_get_text(GTK_ENTRY(l->offset_entry)), &offset); dt_control_time_offset(offset, -1); }
static gboolean _lib_geotagging_offset_focus_out(GtkWidget *widget, GdkEvent *event, dt_lib_module_t *self) { dt_lib_geotagging_t *d = (dt_lib_geotagging_t*)self->data; const gchar* value = gtk_entry_get_text(GTK_ENTRY(d->offset_entry)); if(_lib_geotagging_parse_offset(value, NULL)) dt_conf_set_string("plugins/lighttable/geotagging/offset", value); else gtk_entry_set_text(GTK_ENTRY(d->offset_entry), dt_conf_get_string("plugins/lighttable/geotagging/offset")); return FALSE; }
void gui_init(dt_lib_module_t *self) { dt_lib_geotagging_t *d = (dt_lib_geotagging_t *)malloc(sizeof(dt_lib_geotagging_t)); self->data = (void *)d; d->timezones = _lib_geotagging_get_timezones(); self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); GtkBox *hbox; GtkWidget *button, *label; /* the offset line */ hbox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5)); label = GTK_WIDGET(gtk_label_new(_("time offset"))); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_box_pack_start(hbox, label, TRUE, TRUE, 0); d->offset_entry = gtk_entry_new(); dt_gui_key_accel_block_on_focus_connect(d->offset_entry); gtk_entry_set_max_length(GTK_ENTRY(d->offset_entry), 9); gtk_entry_set_width_chars(GTK_ENTRY(d->offset_entry), 0); gtk_box_pack_start(hbox, d->offset_entry, TRUE, TRUE, 0); g_signal_connect(d->offset_entry, "key-press-event", G_CALLBACK(_lib_geotagging_offset_key_press), self); g_signal_connect(d->offset_entry, "focus-out-event", G_CALLBACK(_lib_geotagging_offset_focus_out), self); g_object_set(G_OBJECT(d->offset_entry), "tooltip-text", _("time offset\nformat: [+-]?[[hh:]mm:]ss"), (char *)NULL); gchar *str = dt_conf_get_string("plugins/lighttable/geotagging/offset"); if(_lib_geotagging_parse_offset(str, NULL)) gtk_entry_set_text(GTK_ENTRY(d->offset_entry), str); else gtk_entry_set_text(GTK_ENTRY(d->offset_entry), "+00:00:00"); g_free(str); GtkBox *button_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5)); button = dtgtk_button_new(dtgtk_cairo_paint_zoom, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER); g_object_set(G_OBJECT(button), "tooltip-text", _("calculate the time offset from an image"), (char *)NULL); gtk_box_pack_start(button_box, button, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(_lib_geotagging_show_offset_window), self); button = dtgtk_button_new(dtgtk_cairo_paint_check_mark, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER); g_object_set(G_OBJECT(button), "tooltip-text", _("apply time offset to selected images"), (char *)NULL); gtk_box_pack_start(button_box, button, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(_lib_geotagging_apply_offset_callback), self); gtk_box_pack_start(hbox, GTK_WIDGET(button_box), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); /* gpx */ button = gtk_button_new_with_label(_("apply GPX track file")); g_object_set(G_OBJECT(button), "tooltip-text", _("parses a GPX file and updates location of selected images"), (char *)NULL); gtk_box_pack_start(GTK_BOX(self->widget), button, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(_lib_geotagging_gpx_callback), self); }
static gboolean _lib_geotagging_offset_key_press(GtkWidget *entry, GdkEventKey *event, dt_lib_module_t *self) { dt_lib_geotagging_t *d = (dt_lib_geotagging_t *)self->data; switch(event->keyval) { case GDK_KEY_Escape: case GDK_KEY_Tab: { // reset gchar *str = dt_conf_get_string("plugins/lighttable/geotagging/offset"); if(_lib_geotagging_parse_offset(str, NULL)) { gtk_entry_set_text(GTK_ENTRY(d->offset_entry), str); } else { gtk_entry_set_text(GTK_ENTRY(d->offset_entry), "+00:00:00"); dt_conf_set_string("plugins/lighttable/geotagging/offset", "+00:00:00"); } g_free(str); gtk_window_set_focus(GTK_WINDOW(dt_ui_main_window(darktable.gui->ui)), NULL); return FALSE; } case GDK_KEY_Return: case GDK_KEY_KP_Enter: { const gchar *value = gtk_entry_get_text(GTK_ENTRY(d->offset_entry)); if(_lib_geotagging_parse_offset(value, NULL)) { dt_conf_set_string("plugins/lighttable/geotagging/offset", value); } else { gtk_entry_set_text(GTK_ENTRY(d->offset_entry), "+00:00:00"); dt_conf_set_string("plugins/lighttable/geotagging/offset", "+00:00:00"); } gtk_window_set_focus(GTK_WINDOW(dt_ui_main_window(darktable.gui->ui)), NULL); return FALSE; } // allow +, -, :, 0 .. 9, left/right/home/end movement using arrow keys and del/backspace case GDK_KEY_plus: case GDK_KEY_KP_Add: case GDK_KEY_minus: case GDK_KEY_KP_Subtract: case GDK_KEY_colon: case GDK_KEY_0: case GDK_KEY_KP_0: case GDK_KEY_1: case GDK_KEY_KP_1: case GDK_KEY_2: case GDK_KEY_KP_2: case GDK_KEY_3: case GDK_KEY_KP_3: case GDK_KEY_4: case GDK_KEY_KP_4: case GDK_KEY_5: case GDK_KEY_KP_5: case GDK_KEY_6: case GDK_KEY_KP_6: case GDK_KEY_7: case GDK_KEY_KP_7: case GDK_KEY_8: case GDK_KEY_KP_8: case GDK_KEY_9: case GDK_KEY_KP_9: case GDK_KEY_Left: case GDK_KEY_Right: case GDK_KEY_Home: case GDK_KEY_KP_Home: case GDK_KEY_End: case GDK_KEY_KP_End: case GDK_KEY_Delete: case GDK_KEY_KP_Delete: case GDK_KEY_BackSpace: return FALSE; default: // block everything else return TRUE; } }