void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_splittoning_gui_data_t)); dt_iop_splittoning_gui_data_t *g = (dt_iop_splittoning_gui_data_t *)self->gui_data; dt_iop_splittoning_params_t *p = (dt_iop_splittoning_params_t *)self->params; self->widget = GTK_WIDGET(gtk_vbox_new(FALSE, DT_BAUHAUS_SPACE)); // Shadows gui_init_tab(self, _("shadows"), &g->colorpick1, &g->gslider1, &g->gslider2); // Highlights gui_init_tab(self, _("highlights"), &g->colorpick2, &g->gslider3, &g->gslider4); // Additional parameters GtkWidget* hbox=GTK_WIDGET(gtk_hbox_new(FALSE, 0)); GtkWidget* vbox = GTK_WIDGET(gtk_vbox_new(FALSE, 0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); g->scale1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0, 100.0, 0.1, p->balance*100.0, 2, 0); dt_bauhaus_slider_set_format(g->scale1, "%.2f"); dt_bauhaus_slider_set_stop(g->scale1, 0.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_slider_set_stop(g->scale1, 1.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_widget_set_label(g->scale1, NULL, _("balance")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale1), TRUE, TRUE, 0); g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compress, 2); dt_bauhaus_slider_set_format(g->scale2, "%.2f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compress")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale2), TRUE, TRUE, 0); g_object_set(G_OBJECT(g->scale1), "tooltip-text", _("the balance of center of splittoning"), (char *)NULL); g_object_set(G_OBJECT(g->scale2), "tooltip-text", _("compress the effect on highlights/shadows and\npreserve midtones"), (char *)NULL); g_signal_connect (G_OBJECT (g->gslider1), "value-changed", G_CALLBACK (hue_callback), self); g_signal_connect (G_OBJECT (g->gslider3), "value-changed", G_CALLBACK (hue_callback), self); g_signal_connect (G_OBJECT (g->gslider2), "value-changed", G_CALLBACK (saturation_callback), self); g_signal_connect (G_OBJECT (g->gslider4), "value-changed", G_CALLBACK (saturation_callback), self); g_signal_connect (G_OBJECT (g->scale1), "value-changed", G_CALLBACK (balance_callback), self); g_signal_connect (G_OBJECT (g->scale2), "value-changed", G_CALLBACK (compress_callback), self); g_signal_connect (G_OBJECT (g->colorpick1), "clicked", G_CALLBACK (colorpick_callback), self); g_signal_connect (G_OBJECT (g->colorpick2), "clicked", G_CALLBACK (colorpick_callback), self); }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_splittoning_gui_data_t)); dt_iop_splittoning_gui_data_t *g = (dt_iop_splittoning_gui_data_t *)self->gui_data; dt_iop_splittoning_params_t *p = (dt_iop_splittoning_params_t *)self->params; self->widget = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_VERTICAL, DT_BAUHAUS_SPACE)); float rgb[3]; // Shadows hsl2rgb(rgb, p->shadow_hue, p->shadow_saturation, 0.5f); GdkRGBA sh_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; gui_init_tab(self, _("shadows"), &g->colorpick1, &sh_color, &g->gslider1, &g->gslider2); // Highlights hsl2rgb(rgb, p->highlight_hue, p->highlight_saturation, 0.5f); GdkRGBA hi_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; gui_init_tab(self, _("highlights"), &g->colorpick2, &hi_color, &g->gslider3, &g->gslider4); // Additional parameters GtkWidget *hbox = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); GtkWidget *vbox = GTK_WIDGET(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), GTK_WIDGET(hbox), TRUE, TRUE, 0); g->scale1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0, 100.0, 0.1, p->balance * 100.0, 2, 0); dt_bauhaus_slider_set_format(g->scale1, "%.2f"); dt_bauhaus_slider_set_stop(g->scale1, 0.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_slider_set_stop(g->scale1, 1.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_widget_set_label(g->scale1, NULL, _("balance")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale1), TRUE, TRUE, 0); g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compress, 2); dt_bauhaus_slider_set_format(g->scale2, "%.2f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compress")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(g->scale2), TRUE, TRUE, 0); g_object_set(G_OBJECT(g->scale1), "tooltip-text", _("the balance of center of splittoning"), (char *)NULL); g_object_set(G_OBJECT(g->scale2), "tooltip-text", _("compress the effect on highlights/shadows and\npreserve midtones"), (char *)NULL); g_signal_connect(G_OBJECT(g->gslider1), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider3), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider2), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->gslider4), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->scale1), "value-changed", G_CALLBACK(balance_callback), self); g_signal_connect(G_OBJECT(g->scale2), "value-changed", G_CALLBACK(compress_callback), self); g_signal_connect(G_OBJECT(g->colorpick1), "color-set", G_CALLBACK(colorpick_callback), self); g_signal_connect(G_OBJECT(g->colorpick2), "color-set", G_CALLBACK(colorpick_callback), self); } void gui_cleanup(struct dt_iop_module_t *self) { free(self->gui_data); self->gui_data = NULL; }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_splittoning_gui_data_t)); dt_iop_splittoning_gui_data_t *g = (dt_iop_splittoning_gui_data_t *)self->gui_data; dt_iop_splittoning_params_t *p = (dt_iop_splittoning_params_t *)self->params; int line = 0; self->widget = gtk_grid_new(); GtkGrid *grid = GTK_GRID(self->widget); gtk_grid_set_row_spacing(grid, DT_BAUHAUS_SPACE); gtk_grid_set_column_spacing(grid, DT_BAUHAUS_SPACE); gtk_grid_set_column_homogeneous(grid, FALSE); float rgb[3]; // Shadows hsl2rgb(rgb, p->shadow_hue, p->shadow_saturation, 0.5f); GdkRGBA sh_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; line = gui_init_tab(self, line, _("shadows"), &g->colorpick1, &sh_color, &g->gslider1, &g->gslider2); // Highlights hsl2rgb(rgb, p->highlight_hue, p->highlight_saturation, 0.5f); GdkRGBA hi_color = (GdkRGBA){.red = rgb[0], .green = rgb[1], .blue = rgb[2], .alpha = 1.0 }; line = gui_init_tab(self, line, _("highlights"), &g->colorpick2, &hi_color, &g->gslider3, &g->gslider4); // Additional parameters g->scale1 = dt_bauhaus_slider_new_with_range_and_feedback(self, 0.0, 100.0, 0.1, p->balance * 100.0, 2, 0); dt_bauhaus_slider_set_format(g->scale1, "%.2f"); dt_bauhaus_slider_set_stop(g->scale1, 0.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_slider_set_stop(g->scale1, 1.0f, 0.5f, 0.5f, 0.5f); dt_bauhaus_widget_set_label(g->scale1, NULL, _("balance")); gtk_widget_set_margin_top(g->scale1, 6 * DT_BAUHAUS_SPACE); gtk_grid_attach(grid, g->scale1, 0, line++, 2, 1); g->scale2 = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->compress, 2); dt_bauhaus_slider_set_format(g->scale2, "%.2f%%"); dt_bauhaus_widget_set_label(g->scale2, NULL, _("compress")); gtk_grid_attach(grid, g->scale2, 0, line++, 2, 1); g_object_set(G_OBJECT(g->scale1), "tooltip-text", _("the balance of center of splittoning"), (char *)NULL); g_object_set(G_OBJECT(g->scale2), "tooltip-text", _("compress the effect on highlights/shadows and\npreserve midtones"), (char *)NULL); g_signal_connect(G_OBJECT(g->gslider1), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider3), "value-changed", G_CALLBACK(hue_callback), self); g_signal_connect(G_OBJECT(g->gslider2), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->gslider4), "value-changed", G_CALLBACK(saturation_callback), self); g_signal_connect(G_OBJECT(g->scale1), "value-changed", G_CALLBACK(balance_callback), self); g_signal_connect(G_OBJECT(g->scale2), "value-changed", G_CALLBACK(compress_callback), self); g_signal_connect(G_OBJECT(g->colorpick1), "color-set", G_CALLBACK(colorpick_callback), self); g_signal_connect(G_OBJECT(g->colorpick2), "color-set", G_CALLBACK(colorpick_callback), self); } void gui_cleanup(struct dt_iop_module_t *self) { free(self->gui_data); self->gui_data = NULL; }