static void _add_property_button_clicked(GtkWidget *widget, gpointer user_data) { dt_lib_camera_t *lib = (dt_lib_camera_t *)user_data; const gchar *label = gtk_entry_get_text(GTK_ENTRY(lib->gui.plabel)); const gchar *property = gtk_entry_get_text(GTK_ENTRY(lib->gui.pname)); /* let's try to add property */ if(label && property) { dt_lib_camera_property_t *prop = NULL; if((prop = _lib_property_add_new(lib, label, property)) != NULL) { _lib_property_add_to_gui(prop, lib); gchar key[256] = { "plugins/capture/tethering/properties/" }; g_strlcat(key, label, sizeof(key)); gchar *p = key; const char *end = key + strlen(key); while(p++ < end) if(*p == ' ') *p = '_'; dt_conf_set_string(key, property); /* clean entries */ gtk_entry_set_text(GTK_ENTRY(lib->gui.plabel), ""); gtk_entry_set_text(GTK_ENTRY(lib->gui.pname), ""); } } }
void view_enter(struct dt_lib_module_t *self,struct dt_view_t *old_view,struct dt_view_t *new_view) { dt_lib_camera_t *lib = self->data; /* add all camera properties to the widget */ dt_lib_camera_property_t *prop; if((prop = _lib_property_add_new(lib, _("program"), "expprogram")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("focus mode"), "focusmode")) != NULL) _lib_property_add_to_gui(prop, lib); else if((prop = _lib_property_add_new(lib, _("focus mode"), "drivemode")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("aperture"), "f-number")) != NULL) _lib_property_add_to_gui(prop, lib); else if((prop = _lib_property_add_new(lib, _("aperture"), "aperture")) != NULL) // for Canon cameras _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("focal length"), "focallength")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("shutterspeed2"), "shutterspeed2")) != NULL) _lib_property_add_to_gui(prop, lib); else if((prop = _lib_property_add_new(lib, _("shutterspeed"), "shutterspeed")) != NULL) // Canon, again _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("ISO"), "iso")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("WB"), "whitebalance")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("quality"), "imagequality")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("size"), "imagesize")) != NULL) _lib_property_add_to_gui(prop, lib); /* add user widgets */ GSList *options = dt_conf_all_string_entries("plugins/capture/tethering/properties"); if(options) { GSList *item = options; if(item) { do { dt_conf_string_entry_t *entry = (dt_conf_string_entry_t *)item->data; /* get the label from key */ char *p = entry->key; const char *end = entry->key + strlen(entry->key); while(p++ < end) if(*p == '_') *p = ' '; if((prop = _lib_property_add_new(lib, entry->key, entry->value)) != NULL) _lib_property_add_to_gui(prop, lib); } while((item = g_slist_next(item)) != NULL); } g_slist_free_full(options, dt_conf_string_entry_free); } /* build the propertymenu we do it now because it needs an actual camera */ dt_camctl_camera_build_property_menu(darktable.camctl, NULL, &lib->gui.properties_menu, G_CALLBACK(_property_choice_callback), lib); // Register listener dt_camctl_register_listener(darktable.camctl, lib->data.listener); dt_camctl_tether_mode(darktable.camctl, NULL, TRUE); // Get camera model name lib->data.camera_model = dt_camctl_camera_get_model(darktable.camctl, NULL); }
void gui_init(dt_lib_module_t *self) { self->data = calloc(1, sizeof(dt_lib_camera_t)); // Setup lib data dt_lib_camera_t *lib = self->data; lib->data.listener = calloc(1, sizeof(dt_camctl_listener_t)); lib->data.listener->data = lib; lib->data.listener->camera_error = _camera_error_callback; lib->data.listener->camera_property_value_changed = _camera_property_value_changed; lib->data.listener->camera_property_accessibility_changed = _camera_property_accessibility_changed; // Setup gui lib->gui.rows = 0; lib->gui.prop_end = 0; self->widget = gtk_grid_new(); lib->gui.main_grid = GTK_GRID(self->widget); gtk_grid_set_row_spacing(GTK_GRID(self->widget), DT_PIXEL_APPLY_DPI(5)); GtkBox *hbox/*, *vbox1, *vbox2*/; // Camera control GtkWidget *label = dt_ui_section_label_new(_("camera control")); gtk_grid_attach(GTK_GRID(self->widget), label, lib->gui.rows++, 0, 2, 1); lib->gui.label1 = gtk_label_new(_("modes")); lib->gui.label2 = gtk_label_new(_("timer (s)")); lib->gui.label3 = gtk_label_new(_("count")); lib->gui.label4 = gtk_label_new(_("brackets")); lib->gui.label5 = gtk_label_new(_("bkt. steps")); gtk_widget_set_halign(GTK_WIDGET(lib->gui.label1), GTK_ALIGN_START); gtk_widget_set_halign(GTK_WIDGET(lib->gui.label2), GTK_ALIGN_START); gtk_widget_set_halign(GTK_WIDGET(lib->gui.label3), GTK_ALIGN_START); gtk_widget_set_halign(GTK_WIDGET(lib->gui.label4), GTK_ALIGN_START); gtk_widget_set_halign(GTK_WIDGET(lib->gui.label5), GTK_ALIGN_START); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.label1), 0, lib->gui.rows++, 1, 1); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.label2), 0, lib->gui.rows++, 1, 1); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.label3), 0, lib->gui.rows++, 1, 1); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.label4), 0, lib->gui.rows++, 1, 1); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.label5), 0, lib->gui.rows++, 1, 1); // capture modes buttons lib->gui.tb1 = DTGTK_TOGGLEBUTTON( dtgtk_togglebutton_new(dtgtk_cairo_paint_timer, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER)); lib->gui.tb2 = DTGTK_TOGGLEBUTTON( dtgtk_togglebutton_new(dtgtk_cairo_paint_filmstrip, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER)); lib->gui.tb3 = DTGTK_TOGGLEBUTTON( dtgtk_togglebutton_new(dtgtk_cairo_paint_bracket, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER)); hbox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DT_PIXEL_APPLY_DPI(5))); gtk_box_pack_start(hbox, GTK_WIDGET(lib->gui.tb1), TRUE, TRUE, 0); gtk_box_pack_start(hbox, GTK_WIDGET(lib->gui.tb2), TRUE, TRUE, 0); gtk_box_pack_start(hbox, GTK_WIDGET(lib->gui.tb3), TRUE, TRUE, 0); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(hbox), GTK_WIDGET(lib->gui.label1), GTK_POS_RIGHT, 1, 1); lib->gui.sb1 = gtk_spin_button_new_with_range(1, 60, 1); lib->gui.sb2 = gtk_spin_button_new_with_range(1, 500, 1); lib->gui.sb3 = gtk_spin_button_new_with_range(1, 5, 1); lib->gui.sb4 = gtk_spin_button_new_with_range(1, 9, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.sb1), GTK_WIDGET(lib->gui.label2), GTK_POS_RIGHT, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.sb2), GTK_WIDGET(lib->gui.label3), GTK_POS_RIGHT, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.sb3), GTK_WIDGET(lib->gui.label4), GTK_POS_RIGHT, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.sb4), GTK_WIDGET(lib->gui.label5), GTK_POS_RIGHT, 1, 1); lib->gui.button1 = gtk_button_new_with_label(_("capture image(s)")); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.button1), 0, lib->gui.rows++, 2, 1); g_object_set(G_OBJECT(lib->gui.tb1), "tooltip-text", _("toggle delayed capture mode"), (char *)NULL); g_object_set(G_OBJECT(lib->gui.tb2), "tooltip-text", _("toggle sequenced capture mode"), (char *)NULL); g_object_set(G_OBJECT(lib->gui.tb3), "tooltip-text", _("toggle bracketed capture mode"), (char *)NULL); g_object_set(G_OBJECT(lib->gui.sb1), "tooltip-text", _("the count of seconds before actually doing a capture"), (char *)NULL); g_object_set(G_OBJECT(lib->gui.sb2), "tooltip-text", _("the amount of images to capture in a sequence,\nyou can use this in conjunction with " "delayed mode to create stop-motion sequences."), (char *)NULL); g_object_set(G_OBJECT(lib->gui.sb3), "tooltip-text", _("the amount of brackets on each side of centered shoot, amount of images = (brackets*2)+1."), (char *)NULL); g_object_set(G_OBJECT(lib->gui.sb4), "tooltip-text", _("the amount of steps per bracket, steps is camera configurable and usually 3 steps per " "stop\nwith other words, 3 steps is 1EV exposure step between brackets."), (char *)NULL); g_signal_connect(G_OBJECT(lib->gui.tb1), "clicked", G_CALLBACK(_toggle_capture_mode_clicked), lib); g_signal_connect(G_OBJECT(lib->gui.tb2), "clicked", G_CALLBACK(_toggle_capture_mode_clicked), lib); g_signal_connect(G_OBJECT(lib->gui.tb3), "clicked", G_CALLBACK(_toggle_capture_mode_clicked), lib); g_signal_connect(G_OBJECT(lib->gui.button1), "clicked", G_CALLBACK(_capture_button_clicked), lib); gtk_widget_set_sensitive(GTK_WIDGET(lib->gui.sb1), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(lib->gui.sb2), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(lib->gui.sb3), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(lib->gui.sb4), FALSE); // Camera settings dt_lib_camera_property_t *prop; label = dt_ui_section_label_new(_("properties")); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(label), 0, lib->gui.rows++, 2, 1); lib->gui.prop_end = lib->gui.rows; if((prop = _lib_property_add_new(lib, _("program"), "expprogram")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("focus mode"), "focusmode")) != NULL) _lib_property_add_to_gui(prop, lib); else if((prop = _lib_property_add_new(lib, _("focus mode"), "drivemode")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("aperture"), "f-number")) != NULL) _lib_property_add_to_gui(prop, lib); else if((prop = _lib_property_add_new(lib, _("aperture"), "aperture")) != NULL) // for Canon cameras _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("focal length"), "focallength")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("shutterspeed2"), "shutterspeed2")) != NULL) _lib_property_add_to_gui(prop, lib); else if((prop = _lib_property_add_new(lib, _("shutterspeed"), "shutterspeed")) != NULL) // Canon, again _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("ISO"), "iso")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("WB"), "whitebalance")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("quality"), "imagequality")) != NULL) _lib_property_add_to_gui(prop, lib); if((prop = _lib_property_add_new(lib, _("size"), "imagesize")) != NULL) _lib_property_add_to_gui(prop, lib); /* add user widgets */ GSList *options = dt_conf_all_string_entries("plugins/capture/tethering/properties"); if(options) { GSList *item = options; if(item) { do { dt_conf_string_entry_t *entry = (dt_conf_string_entry_t *)item->data; /* get the label from key */ char *p = entry->key; const char *end = entry->key + strlen(entry->key); while(p++ < end) if(*p == '_') *p = ' '; if((prop = _lib_property_add_new(lib, entry->key, entry->value)) != NULL) _lib_property_add_to_gui(prop, lib); } while((item = g_slist_next(item)) != NULL); } } /* build the propertymenu */ dt_camctl_camera_build_property_menu(darktable.camctl, NULL, &lib->gui.properties_menu, G_CALLBACK(_property_choice_callback), lib); // user specified properties label = dt_ui_section_label_new(_("additional properties")); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(label), 0, lib->gui.rows++, 2, 1); label = gtk_label_new(_("label")); lib->gui.plabel = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(lib->gui.plabel), 0); dt_gui_key_accel_block_on_focus_connect(lib->gui.plabel); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(label), 0, lib->gui.rows++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(lib->gui.plabel), GTK_WIDGET(label), GTK_POS_RIGHT, 1, 1); hbox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DT_PIXEL_APPLY_DPI(5))); label = gtk_label_new(_("property")); GtkWidget *widget = gtk_button_new_with_label("O"); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(_show_property_popupmenu_clicked), lib); lib->gui.pname = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(lib->gui.pname), 0); dt_gui_key_accel_block_on_focus_connect(lib->gui.pname); gtk_box_pack_start(hbox, GTK_WIDGET(lib->gui.pname), TRUE, TRUE, 0); gtk_box_pack_start(hbox, GTK_WIDGET(widget), FALSE, FALSE, 0); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(label), 0, lib->gui.rows++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), GTK_WIDGET(hbox), GTK_WIDGET(label), GTK_POS_RIGHT, 1, 1); widget = gtk_button_new_with_label(_("add user property")); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(_add_property_button_clicked), lib); gtk_widget_show(widget); gtk_grid_attach(GTK_GRID(self->widget), GTK_WIDGET(widget), 0, lib->gui.rows++, 2, 1); // Get camera model name lib->data.camera_model = dt_camctl_camera_get_model(darktable.camctl, NULL); // Register listener dt_camctl_register_listener(darktable.camctl, lib->data.listener); dt_camctl_tether_mode(darktable.camctl, NULL, TRUE); }