static void _update_picker_output(dt_lib_module_t *self) { GdkColor c; dt_lib_colorpicker_t *data = self->data; char colstring[512]; dt_iop_module_t *module = get_colorout_module(); if(module) { darktable.gui->reset = 1; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data->picker_button), module->request_color_pick != DT_REQUEST_COLORPICK_OFF); darktable.gui->reset = 0; int input_color = dt_conf_get_int("ui_last/colorpicker_model"); // always adjust picked color: int m = dt_conf_get_int("ui_last/colorpicker_mode"); float fallback_col[] = {0,0,0}; uint8_t fallback_rgb[] = {0,0,0}; uint8_t *rgb = fallback_rgb; float *lab = fallback_col; switch(m) { case 0: // mean rgb = darktable.lib->proxy.colorpicker.picked_color_rgb_mean; lab = darktable.lib->proxy.colorpicker.picked_color_lab_mean; break; case 1: //min rgb = darktable.lib->proxy.colorpicker.picked_color_rgb_min; lab = darktable.lib->proxy.colorpicker.picked_color_lab_min; break; default: rgb = darktable.lib->proxy.colorpicker.picked_color_rgb_max; lab = darktable.lib->proxy.colorpicker.picked_color_lab_max; break; } switch(input_color) { case 0: // rgb snprintf(colstring, sizeof(colstring), "(%d, %d, %d)", rgb[0], rgb[1], rgb[2]); break; case 1: // Lab snprintf(colstring, sizeof(colstring), "(%.03f, %.03f, %.03f)", lab[0], lab[1], lab[2]); break; } gtk_label_set_label(GTK_LABEL(data->output_label), colstring); // Setting the button color c.red = rgb[0] * 65535 / 255; c.green = rgb[1] * 65535 / 255; c.blue = rgb[2] * 65535 / 255; gtk_widget_modify_bg(data->output_button, GTK_STATE_INSENSITIVE, &c); } }
static void _picker_button_toggled(GtkToggleButton *button, gpointer p) { dt_lib_colorpicker_t *data = ((dt_lib_module_t *)p)->data; gtk_widget_set_sensitive(GTK_WIDGET(data->add_sample_button), gtk_toggle_button_get_active(button)); if(darktable.gui->reset) return; dt_iop_module_t *module = get_colorout_module(); if(module) { dt_iop_request_focus(module); module->request_color_pick = gtk_toggle_button_get_active(button) ? DT_REQUEST_COLORPICK_MODULE : DT_REQUEST_COLORPICK_OFF; dt_dev_invalidate_from_gui(darktable.develop); } else { dt_iop_request_focus(NULL); } dt_control_queue_redraw(); }
static void _add_sample(GtkButton *widget, gpointer self) { dt_lib_colorpicker_t *data = ((dt_lib_module_t *)self)->data; dt_colorpicker_sample_t *sample = (dt_colorpicker_sample_t *)malloc(sizeof(dt_colorpicker_sample_t)); darktable.lib->proxy.colorpicker.live_samples = g_slist_append(darktable.lib->proxy.colorpicker.live_samples, sample); dt_iop_module_t *module = get_colorout_module(); int i; sample->locked = 0; sample->rgb.red = 0.7; sample->rgb.green = 0.7; sample->rgb.blue = 0.7; sample->rgb.alpha = 1.0; // Initializing the UI sample->container = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2); gtk_box_pack_start(GTK_BOX(data->samples_container), sample->container, TRUE, TRUE, 0); sample->color_patch = gtk_drawing_area_new(); gtk_widget_set_size_request(sample->color_patch, DT_PIXEL_APPLY_DPI(40), -1); gtk_widget_set_events(sample->color_patch, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK); gtk_widget_set_tooltip_text(sample->color_patch, _("hover to highlight sample on canvas, " "click to lock sample")); gtk_box_pack_start(GTK_BOX(sample->container), sample->color_patch, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(sample->color_patch), "enter-notify-event", G_CALLBACK(_live_sample_enter), sample); g_signal_connect(G_OBJECT(sample->color_patch), "leave-notify-event", G_CALLBACK(_live_sample_leave), sample); g_signal_connect(G_OBJECT(sample->color_patch), "button-press-event", G_CALLBACK(_sample_lock_toggle), sample); g_signal_connect(G_OBJECT(sample->color_patch), "draw", G_CALLBACK(sample_draw_callback), sample); sample->output_label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(sample->container), sample->output_label, TRUE, TRUE, 0); sample->delete_button = gtk_button_new_with_label(_("remove")); gtk_box_pack_start(GTK_BOX(sample->container), sample->delete_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(sample->delete_button), "clicked", G_CALLBACK(_remove_sample), sample); gtk_widget_show_all(data->samples_container); // Setting the actual data if(dt_conf_get_int("ui_last/colorpicker_size")) { sample->size = DT_COLORPICKER_SIZE_BOX; for(i = 0; i < 4; i++) sample->box[i] = module->color_picker_box[i]; } else { sample->size = DT_COLORPICKER_SIZE_POINT; for(i = 0; i < 2; i++) sample->point[i] = module->color_picker_point[i]; } for(i = 0; i < 3; i++) sample->picked_color_lab_max[i] = darktable.lib->proxy.colorpicker.picked_color_lab_max[i]; for(i = 0; i < 3; i++) sample->picked_color_lab_mean[i] = darktable.lib->proxy.colorpicker.picked_color_lab_mean[i]; for(i = 0; i < 3; i++) sample->picked_color_lab_min[i] = darktable.lib->proxy.colorpicker.picked_color_lab_min[i]; for(i = 0; i < 3; i++) sample->picked_color_rgb_max[i] = darktable.lib->proxy.colorpicker.picked_color_rgb_max[i]; for(i = 0; i < 3; i++) sample->picked_color_rgb_mean[i] = darktable.lib->proxy.colorpicker.picked_color_rgb_mean[i]; for(i = 0; i < 3; i++) sample->picked_color_rgb_min[i] = darktable.lib->proxy.colorpicker.picked_color_rgb_min[i]; // Updating the display _update_samples_output((dt_lib_module_t *)self); }
static void _add_sample(GtkButton *widget, gpointer self) { dt_lib_colorpicker_t *data = ((dt_lib_module_t*)self)->data; dt_colorpicker_sample_t *sample = (dt_colorpicker_sample_t*)malloc(sizeof(dt_colorpicker_sample_t)); darktable.lib->proxy.colorpicker.live_samples = g_slist_append(darktable.lib->proxy.colorpicker.live_samples, sample); dt_iop_module_t *module = get_colorout_module(); int i; // Initializing the UI sample->container = gtk_hbox_new(FALSE, 2); gtk_box_pack_start(GTK_BOX(data->samples_container), sample->container, TRUE, TRUE, 0); sample->output_button = dtgtk_button_new(NULL, CPF_STYLE_BOX); gtk_widget_set_size_request(sample->output_button, 40, -1); gtk_widget_set_events(sample->output_button, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); gtk_widget_set_tooltip_text(sample->output_button, _("hover to highlight sample on canvas, " "click to lock sample")); gtk_box_pack_start(GTK_BOX(sample->container), sample->output_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(sample->output_button), "enter-notify-event", G_CALLBACK(_live_sample_enter), sample); g_signal_connect(G_OBJECT(sample->output_button), "leave-notify-event", G_CALLBACK(_live_sample_leave), sample); g_signal_connect(G_OBJECT(sample->output_button), "button-press-event", G_CALLBACK(_sample_lock_toggle), sample); sample->output_label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(sample->container), sample->output_label, TRUE, TRUE, 0); sample->delete_button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(sample->container), sample->delete_button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(sample->delete_button), "clicked", G_CALLBACK(_remove_sample), sample); gtk_widget_show_all(data->samples_container); // Setting the actual data if(dt_conf_get_int("ui_last/colorpicker_size")) { sample->size = DT_COLORPICKER_SIZE_BOX; for(i = 0; i < 4; i++) sample->box[i] = module->color_picker_box[i]; } else { sample->size = DT_COLORPICKER_SIZE_POINT; for(i = 0; i < 2; i++) sample->point[i] = module->color_picker_point[i]; } for(i = 0; i < 3; i++) sample->picked_color_lab_max[i] = darktable.lib->proxy.colorpicker.picked_color_lab_max[i]; for(i = 0; i < 3; i++) sample->picked_color_lab_mean[i] = darktable.lib->proxy.colorpicker.picked_color_lab_mean[i]; for(i = 0; i < 3; i++) sample->picked_color_lab_min[i] = darktable.lib->proxy.colorpicker.picked_color_lab_min[i]; for(i = 0; i < 3; i++) sample->picked_color_rgb_max[i] = darktable.lib->proxy.colorpicker.picked_color_rgb_max[i]; for(i = 0; i < 3; i++) sample->picked_color_rgb_mean[i] = darktable.lib->proxy.colorpicker.picked_color_rgb_mean[i]; for(i = 0; i < 3; i++) sample->picked_color_rgb_min[i] = darktable.lib->proxy.colorpicker.picked_color_rgb_min[i]; sample->locked = 0; // Updating the display _update_samples_output((dt_lib_module_t*)self); }