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); }
void gui_init(dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_colorbalance_gui_data_t)); dt_iop_colorbalance_gui_data_t *g = (dt_iop_colorbalance_gui_data_t *)self->gui_data; dt_iop_colorbalance_params_t *p = (dt_iop_colorbalance_params_t *)self->params; self->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE); GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, DT_BAUHAUS_SPACE); gtk_box_pack_start(GTK_BOX(self->widget), hbox, FALSE, FALSE, 0); #ifdef SHOW_COLOR_WHEELS GtkWidget *area = dtgtk_drawing_area_new_with_aspect_ratio(1.0); gtk_box_pack_start(GTK_BOX(hbox), area, TRUE, TRUE, 0); // gtk_widget_add_events(g->area, // GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | // GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(dt_iop_area_draw), self); // g_signal_connect (G_OBJECT (area), "button-press-event", // G_CALLBACK (dt_iop_colorbalance_button_press), self); // g_signal_connect (G_OBJECT (area), "motion-notify-event", // G_CALLBACK (dt_iop_colorbalance_motion_notify), self); // g_signal_connect (G_OBJECT (area), "leave-notify-event", // G_CALLBACK (dt_iop_colorbalance_leave_notify), self); area = dtgtk_drawing_area_new_with_aspect_ratio(1.0); gtk_box_pack_start(GTK_BOX(hbox), area, TRUE, TRUE, 0); // gtk_widget_add_events(g->area, // GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | // GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(dt_iop_area_draw), self); // g_signal_connect (G_OBJECT (area), "button-press-event", // G_CALLBACK (dt_iop_colorbalance_button_press), self); // g_signal_connect (G_OBJECT (area), "motion-notify-event", // G_CALLBACK (dt_iop_colorbalance_motion_notify), self); // g_signal_connect (G_OBJECT (area), "leave-notify-event", // G_CALLBACK (dt_iop_colorbalance_leave_notify), self); area = dtgtk_drawing_area_new_with_aspect_ratio(1.0); gtk_box_pack_start(GTK_BOX(hbox), area, TRUE, TRUE, 0); // gtk_widget_add_events(g->area, // GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | // GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(area), "draw", G_CALLBACK(dt_iop_area_draw), self); // g_signal_connect (G_OBJECT (area), "button-press-event", // G_CALLBACK (dt_iop_colorbalance_button_press), self); // g_signal_connect (G_OBJECT (area), "motion-notify-event", // G_CALLBACK (dt_iop_colorbalance_motion_notify), self); // g_signal_connect (G_OBJECT (area), "leave-notify-event", // G_CALLBACK (dt_iop_colorbalance_leave_notify), self); #endif /* lift */ gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(_("lift")), FALSE, FALSE, 5); g->lift_factor = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_FACTOR] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_factor, 0.0, 0.0, 0.0, 0.0); dt_bauhaus_slider_set_stop(g->lift_factor, 1.0, 1.0, 1.0, 1.0); g_object_set(g->lift_factor, "tooltip-text", _("factor of lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_factor, _("lift"), _("factor")); g_signal_connect(G_OBJECT(g->lift_factor), "value-changed", G_CALLBACK(lift_factor_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_factor, TRUE, TRUE, 0); g->lift_r = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_RED] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_r, 0.0, 0.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_r, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_r, 1.0, 1.0, 0.0, 0.0); g_object_set(g->lift_r, "tooltip-text", _("factor of red for lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_r, _("lift"), _("red")); g_signal_connect(G_OBJECT(g->lift_r), "value-changed", G_CALLBACK(lift_red_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_r, TRUE, TRUE, 0); g->lift_g = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_GREEN] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_g, 0.0, 1.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_g, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_g, 1.0, 0.0, 1.0, 0.0); g_object_set(g->lift_g, "tooltip-text", _("factor of green for lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_g, _("lift"), _("green")); g_signal_connect(G_OBJECT(g->lift_g), "value-changed", G_CALLBACK(lift_green_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_g, TRUE, TRUE, 0); g->lift_b = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->lift[CHANNEL_BLUE] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->lift_b, 0.0, 1.0, 1.0, 0.0); dt_bauhaus_slider_set_stop(g->lift_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->lift_b, 1.0, 0.0, 0.0, 1.0); g_object_set(g->lift_b, "tooltip-text", _("factor of blue for lift"), (char *)NULL); dt_bauhaus_widget_set_label(g->lift_b, _("lift"), _("blue")); g_signal_connect(G_OBJECT(g->lift_b), "value-changed", G_CALLBACK(lift_blue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->lift_b, TRUE, TRUE, 0); /* gamma */ gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(_("gamma")), FALSE, FALSE, 5); g->gamma_factor = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_FACTOR] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_factor, 0.0, 0.0, 0.0, 0.0); dt_bauhaus_slider_set_stop(g->gamma_factor, 1.0, 1.0, 1.0, 1.0); g_object_set(g->gamma_factor, "tooltip-text", _("factor of gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_factor, _("gamma"), _("factor")); g_signal_connect(G_OBJECT(g->gamma_factor), "value-changed", G_CALLBACK(gamma_factor_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_factor, TRUE, TRUE, 0); g->gamma_r = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_RED] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_r, 0.0, 0.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_r, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_r, 1.0, 1.0, 0.0, 0.0); g_object_set(g->gamma_r, "tooltip-text", _("factor of red for gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_r, _("gamma"), _("red")); g_signal_connect(G_OBJECT(g->gamma_r), "value-changed", G_CALLBACK(gamma_red_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_r, TRUE, TRUE, 0); g->gamma_g = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_GREEN] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_g, 0.0, 1.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_g, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_g, 1.0, 0.0, 1.0, 0.0); g_object_set(g->gamma_g, "tooltip-text", _("factor of green for gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_g, _("gamma"), _("green")); g_signal_connect(G_OBJECT(g->gamma_g), "value-changed", G_CALLBACK(gamma_green_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_g, TRUE, TRUE, 0); g->gamma_b = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gamma[CHANNEL_BLUE] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gamma_b, 0.0, 1.0, 1.0, 0.0); dt_bauhaus_slider_set_stop(g->gamma_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gamma_b, 1.0, 0.0, 0.0, 1.0); g_object_set(g->gamma_b, "tooltip-text", _("factor of blue for gamma"), (char *)NULL); dt_bauhaus_widget_set_label(g->gamma_b, _("gamma"), _("blue")); g_signal_connect(G_OBJECT(g->gamma_b), "value-changed", G_CALLBACK(gamma_blue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gamma_b, TRUE, TRUE, 0); /* gain */ gtk_box_pack_start(GTK_BOX(self->widget), dt_ui_section_label_new(_("gain")), FALSE, FALSE, 5); g->gain_factor = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_FACTOR] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_factor, 0.0, 0.0, 0.0, 0.0); dt_bauhaus_slider_set_stop(g->gain_factor, 1.0, 1.0, 1.0, 1.0); g_object_set(g->gain_factor, "tooltip-text", _("factor of gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_factor, _("gain"), _("factor")); g_signal_connect(G_OBJECT(g->gain_factor), "value-changed", G_CALLBACK(gain_factor_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_factor, TRUE, TRUE, 0); g->gain_r = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_RED] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_r, 0.0, 0.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_r, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_r, 1.0, 1.0, 0.0, 0.0); g_object_set(g->gain_r, "tooltip-text", _("factor of red for gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_r, _("gain"), _("red")); g_signal_connect(G_OBJECT(g->gain_r), "value-changed", G_CALLBACK(gain_red_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_r, TRUE, TRUE, 0); g->gain_g = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_GREEN] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_g, 0.0, 1.0, 0.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_g, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_g, 1.0, 0.0, 1.0, 0.0); g_object_set(g->gain_g, "tooltip-text", _("factor of green for gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_g, _("gain"), _("green")); g_signal_connect(G_OBJECT(g->gain_g), "value-changed", G_CALLBACK(gain_green_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_g, TRUE, TRUE, 0); g->gain_b = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.005, p->gain[CHANNEL_BLUE] - 1.0f, 3); dt_bauhaus_slider_set_stop(g->gain_b, 0.0, 1.0, 1.0, 0.0); dt_bauhaus_slider_set_stop(g->gain_b, 0.5, 1.0, 1.0, 1.0); dt_bauhaus_slider_set_stop(g->gain_b, 1.0, 0.0, 0.0, 1.0); g_object_set(g->gain_b, "tooltip-text", _("factor of blue for gain"), (char *)NULL); dt_bauhaus_widget_set_label(g->gain_b, _("gain"), _("blue")); g_signal_connect(G_OBJECT(g->gain_b), "value-changed", G_CALLBACK(gain_blue_callback), self); gtk_box_pack_start(GTK_BOX(self->widget), g->gain_b, TRUE, TRUE, 0); }
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(); gtk_grid_set_column_spacing(GTK_GRID(self->widget), DT_PIXEL_APPLY_DPI(5)); lib->gui.main_grid = GTK_GRID(self->widget); gtk_grid_set_row_spacing(GTK_GRID(self->widget), DT_PIXEL_APPLY_DPI(5)); GtkBox *hbox; // 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 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_start = lib->gui.rows -1; lib->gui.prop_end = lib->gui.rows; // 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")); gtk_widget_set_halign(label, GTK_ALIGN_START); 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")); gtk_widget_set_halign(label, GTK_ALIGN_START); 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); }