void enter(dt_view_t *self) { dt_map_t *lib = (dt_map_t *)self->data; lib->selected_image = 0; lib->start_drag = FALSE; /* replace center widget */ GtkWidget *parent = gtk_widget_get_parent(dt_ui_center(darktable.gui->ui)); gtk_widget_hide(dt_ui_center(darktable.gui->ui)); gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(lib->map), 2); gtk_widget_show_all(GTK_WIDGET(lib->map)); /* setup proxy functions */ darktable.view_manager->proxy.map.view = self; darktable.view_manager->proxy.map.center_on_location = _view_map_center_on_location; darktable.view_manager->proxy.map.show_osd = _view_map_show_osd; darktable.view_manager->proxy.map.set_map_source = _view_map_set_map_source; /* restore last zoom,location in map */ const float lon = dt_conf_get_float("plugins/map/longitude"); const float lat = dt_conf_get_float("plugins/map/latitude"); const int zoom = dt_conf_get_int("plugins/map/zoom"); osm_gps_map_set_center_and_zoom(lib->map, lat, lon, zoom); /* connect signal for filmstrip image activate */ dt_control_signal_connect(darktable.signals, DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE, G_CALLBACK(_view_map_filmstrip_activate_callback), self); }
static float dt_conf_get_sanitize_set(const char *name, float min, float max) { float value = dt_conf_get_float(name); value = MIN(max, value); value = MAX(min, value); dt_conf_set_float(name, value); return value; }
void gui_init (dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_spots_gui_data_t)); dt_iop_spots_gui_data_t *g = (dt_iop_spots_gui_data_t *)self->gui_data; g->dragging = -1; g->selected = -1; g->last_radius = MAX(0.01f, dt_conf_get_float("plugins/darkroom/spots/size")); self->widget = gtk_vbox_new(FALSE, 5); GtkWidget *label = gtk_label_new(_("click on a spot and drag on canvas to heal.\nuse the mouse wheel to adjust size.\nright click to remove a stroke.")); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(self->widget), label, FALSE, TRUE, 0); GtkWidget * hbox = gtk_hbox_new(FALSE, 5); label = gtk_label_new(_("number of strokes:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); g->label = GTK_LABEL(gtk_label_new("-1")); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(g->label), FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), hbox, TRUE, TRUE, 0); }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_watermark_gui_data_t)); dt_iop_watermark_gui_data_t *g = (dt_iop_watermark_gui_data_t *)self->gui_data; dt_iop_watermark_params_t *p = (dt_iop_watermark_params_t *)self->params; int line = 0; self->widget = gtk_grid_new(); gtk_grid_set_row_spacing(GTK_GRID(self->widget), DT_BAUHAUS_SPACE); gtk_grid_set_column_spacing(GTK_GRID(self->widget), DT_PIXEL_APPLY_DPI(10)); gtk_grid_attach(GTK_GRID(self->widget), dt_ui_section_label_new(_("content")), 0, line++, 3, 1); // Add the marker combobox gchar configdir[PATH_MAX] = { 0 }; gchar datadir[PATH_MAX] = { 0 }; dt_loc_get_datadir(datadir, sizeof(datadir)); dt_loc_get_user_config_dir(configdir, sizeof(configdir)); GtkWidget *label = dtgtk_reset_label_new(_("marker"), self, &p->filename, sizeof(p->filename)); g->watermarks = dt_bauhaus_combobox_new(self); gtk_widget_set_hexpand(GTK_WIDGET(g->watermarks), TRUE); char *tooltip = g_strdup_printf(_("SVG watermarks in %s/watermarks or %s/watermarks"), configdir, datadir); gtk_widget_set_tooltip_text(g->watermarks, tooltip); g_free(tooltip); g->refresh = dtgtk_button_new(dtgtk_cairo_paint_refresh, CPF_STYLE_FLAT | CPF_DO_NOT_USE_BORDER); gtk_grid_attach(GTK_GRID(self->widget), label, 0, line++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), g->watermarks, label, GTK_POS_RIGHT, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), g->refresh, g->watermarks, GTK_POS_RIGHT, 1, 1); // Watermark color float red = dt_conf_get_float("plugins/darkroom/watermark/color_red"); float green = dt_conf_get_float("plugins/darkroom/watermark/color_green"); float blue = dt_conf_get_float("plugins/darkroom/watermark/color_blue"); GdkRGBA color = (GdkRGBA){.red = red, .green = green, .blue = blue, .alpha = 1.0 }; label = dtgtk_reset_label_new(_("color"), self, &p->color, 3 * sizeof(float)); g->colorpick = gtk_color_button_new_with_rgba(&color); gtk_widget_set_tooltip_text(g->colorpick, _("watermark color, tag:\n$(WATERMARK_COLOR)")); gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(g->colorpick), FALSE); gtk_widget_set_size_request(GTK_WIDGET(g->colorpick), DT_PIXEL_APPLY_DPI(24), DT_PIXEL_APPLY_DPI(24)); gtk_color_button_set_title(GTK_COLOR_BUTTON(g->colorpick), _("select watermark color")); gtk_grid_attach(GTK_GRID(self->widget), label, 0, line++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), g->colorpick, label, GTK_POS_RIGHT, 2, 1); // Simple text label = gtk_label_new(_("text")); gtk_widget_set_halign(label, GTK_ALIGN_START); g->text = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(g->text), 1); gtk_widget_set_tooltip_text(g->text, _("text string, tag:\n$(WATERMARK_TEXT)")); dt_gui_key_accel_block_on_focus_connect(g->text); gtk_grid_attach(GTK_GRID(self->widget), label, 0, line++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), g->text, label, GTK_POS_RIGHT, 2, 1); gchar *str = dt_conf_get_string("plugins/darkroom/watermark/text"); gtk_entry_set_text(GTK_ENTRY(g->text), str); g_free(str); // Text font label = dtgtk_reset_label_new(_("font"), self, &p->font, sizeof(p->font)); str = dt_conf_get_string("plugins/darkroom/watermark/font"); g->fontsel = gtk_font_button_new_with_font(str==NULL?"DejaVu Sans 10":str); GList *childs = gtk_container_get_children(GTK_CONTAINER(gtk_bin_get_child(GTK_BIN(g->fontsel)))); gtk_label_set_ellipsize(GTK_LABEL(childs->data), PANGO_ELLIPSIZE_MIDDLE); g_list_free(childs); gtk_widget_set_tooltip_text(g->fontsel, _("text font, tags:\n$(WATERMARK_FONT_FAMILY)\n" "$(WATERMARK_FONT_STYLE)\n$(WATERMARK_FONT_WEIGHT)")); gtk_font_button_set_show_size (GTK_FONT_BUTTON(g->fontsel), FALSE); g_free(str); gtk_grid_attach(GTK_GRID(self->widget), label, 0, line++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), g->fontsel, label, GTK_POS_RIGHT, 2, 1); gtk_grid_attach(GTK_GRID(self->widget), dt_ui_section_label_new(_("properties")), 0, line++, 3, 1); // Add opacity/scale sliders to table g->opacity = dt_bauhaus_slider_new_with_range(self, 0.0, 100.0, 1.0, p->opacity, 0); dt_bauhaus_slider_set_format(g->opacity, "%.f%%"); dt_bauhaus_widget_set_label(g->opacity, NULL, _("opacity")); g->scale = dt_bauhaus_slider_new_with_range(self, 1.0, 100.0, 1.0, p->scale, 0); dt_bauhaus_slider_enable_soft_boundaries(g->scale, 1.0, 500.0); dt_bauhaus_slider_set_format(g->scale, "%.f%%"); dt_bauhaus_widget_set_label(g->scale, NULL, _("scale")); g->rotate = dt_bauhaus_slider_new_with_range(self, -180.0, 180.0, 1.0, p->rotate, 2); dt_bauhaus_slider_set_format(g->rotate, "%.02f°"); dt_bauhaus_widget_set_label(g->rotate, NULL, _("rotation")); gtk_grid_attach(GTK_GRID(self->widget), g->opacity, 0, line++, 3, 1); gtk_grid_attach(GTK_GRID(self->widget), g->scale, 0, line++, 3, 1); gtk_grid_attach(GTK_GRID(self->widget), g->rotate, 0, line++, 3, 1); g->sizeto = dt_bauhaus_combobox_new(self); dt_bauhaus_combobox_add(g->sizeto, C_("size", "image")); dt_bauhaus_combobox_add(g->sizeto, _("larger border")); dt_bauhaus_combobox_add(g->sizeto, _("smaller border")); dt_bauhaus_combobox_set(g->sizeto, p->sizeto); dt_bauhaus_widget_set_label(g->sizeto, NULL, _("scale on")); gtk_widget_set_tooltip_text(g->sizeto, _("size is relative to")); gtk_grid_attach(GTK_GRID(self->widget), g->sizeto, 0, line++, 3, 1); gtk_grid_attach(GTK_GRID(self->widget), dt_ui_section_label_new(_("position")), 0, line++, 3, 1); // Create the 3x3 gtk table toggle button table... label = dtgtk_reset_label_new(_("alignment"), self, &p->alignment, sizeof(p->alignment)); GtkWidget *bat = gtk_grid_new(); gtk_grid_set_row_spacing(GTK_GRID(bat), DT_PIXEL_APPLY_DPI(3)); gtk_grid_set_column_spacing(GTK_GRID(bat), DT_PIXEL_APPLY_DPI(3)); for(int i = 0; i < 9; i++) { g->align[i] = dtgtk_togglebutton_new(dtgtk_cairo_paint_alignment, CPF_STYLE_FLAT | (CPF_SPECIAL_FLAG << i)); gtk_widget_set_size_request(GTK_WIDGET(g->align[i]), DT_PIXEL_APPLY_DPI(16), DT_PIXEL_APPLY_DPI(16)); gtk_grid_attach(GTK_GRID(bat), GTK_WIDGET(g->align[i]), i%3, i/3, 1, 1); g_signal_connect(G_OBJECT(g->align[i]), "toggled", G_CALLBACK(alignment_callback), self); } gtk_grid_attach(GTK_GRID(self->widget), label, 0, line++, 1, 1); gtk_grid_attach_next_to(GTK_GRID(self->widget), bat, label, GTK_POS_RIGHT, 2, 1); // x/y offset g->x_offset = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.001, p->xoffset, 3); dt_bauhaus_slider_set_format(g->x_offset, "%.3f"); dt_bauhaus_widget_set_label(g->x_offset, NULL, _("x offset")); g->y_offset = dt_bauhaus_slider_new_with_range(self, -1.0, 1.0, 0.001, p->yoffset, 3); dt_bauhaus_slider_set_format(g->y_offset, "%.3f"); dt_bauhaus_widget_set_label(g->y_offset, NULL, _("y offset")); gtk_grid_attach(GTK_GRID(self->widget), g->x_offset, 0, line++, 3, 1); gtk_grid_attach(GTK_GRID(self->widget), g->y_offset, 0, line++, 3, 1); // Let's add some tooltips and hook up some signals... gtk_widget_set_tooltip_text(g->opacity, _("the opacity of the watermark")); gtk_widget_set_tooltip_text(g->scale, _("the scale of the watermark")); gtk_widget_set_tooltip_text(g->rotate, _("the rotation of the watermark")); g_signal_connect(G_OBJECT(g->opacity), "value-changed", G_CALLBACK(opacity_callback), self); g_signal_connect(G_OBJECT(g->scale), "value-changed", G_CALLBACK(scale_callback), self); g_signal_connect(G_OBJECT(g->rotate), "value-changed", G_CALLBACK(rotate_callback), self); g_signal_connect(G_OBJECT(g->x_offset), "value-changed", G_CALLBACK(xoffset_callback), self); g_signal_connect(G_OBJECT(g->y_offset), "value-changed", G_CALLBACK(yoffset_callback), self); g_signal_connect(G_OBJECT(g->refresh), "clicked", G_CALLBACK(refresh_callback), self); refresh_watermarks(self); g_signal_connect(G_OBJECT(g->watermarks), "value-changed", G_CALLBACK(watermark_callback), self); g_signal_connect(G_OBJECT(g->sizeto), "value-changed", G_CALLBACK(sizeto_callback), self); g_signal_connect(G_OBJECT(g->text), "changed", G_CALLBACK(text_callback), self); g_signal_connect(G_OBJECT(g->colorpick), "color-set", G_CALLBACK(colorpick_color_set), self); g_signal_connect(G_OBJECT(g->fontsel), "font-set", G_CALLBACK(fontsel_callback), self); } void gui_cleanup(struct dt_iop_module_t *self) { free(self->gui_data); self->gui_data = NULL; }
void enter(dt_view_t *self) { dt_map_t *lib = (dt_map_t *)self->data; lib->map = g_object_new (OSM_TYPE_GPS_MAP, "map-source", OSM_GPS_MAP_SOURCE_OPENSTREETMAP, "proxy-uri",g_getenv("http_proxy"), NULL); if(dt_conf_get_bool("plugins/map/show_map_osd")) { OsmGpsMapLayer *osd = g_object_new (OSM_TYPE_GPS_MAP_OSD, "show-scale",TRUE, "show-coordinates",TRUE, "show-dpad",TRUE, "show-zoom",TRUE, NULL); osm_gps_map_layer_add(OSM_GPS_MAP(lib->map), osd); g_object_unref(G_OBJECT(osd)); } /* replace center widget */ GtkWidget *parent = gtk_widget_get_parent(dt_ui_center(darktable.gui->ui)); gtk_widget_hide(dt_ui_center(darktable.gui->ui)); gtk_box_pack_start(GTK_BOX(parent), GTK_WIDGET(lib->map) ,TRUE, TRUE, 0); gtk_box_reorder_child(GTK_BOX(parent), GTK_WIDGET(lib->map), 2); gtk_widget_show_all(GTK_WIDGET(lib->map)); /* setup proxy functions */ darktable.view_manager->proxy.map.view = self; darktable.view_manager->proxy.map.center_on_location = _view_map_center_on_location; /* setup collection listener and initialize main_query statement */ dt_control_signal_connect(darktable.signals, DT_SIGNAL_COLLECTION_CHANGED, G_CALLBACK(_view_map_collection_changed), (gpointer) self); osm_gps_map_set_post_expose_callback(lib->map, _view_map_post_expose, lib); /* restore last zoom,location in map */ OsmGpsMapPoint *pt; float lon, lat; const float rlon = dt_conf_get_float("plugins/map/longitude"); const float rlat = dt_conf_get_float("plugins/map/latitude"); const int zoom = dt_conf_get_int("plugins/map/zoom"); pt = osm_gps_map_point_new_radians(rlat,rlon); osm_gps_map_point_get_degrees (pt, &lat, &lon); osm_gps_map_set_center_and_zoom(lib->map, lat, lon, zoom); osm_gps_map_point_free(pt); _view_map_collection_changed(NULL, self); /* connect signal for filmstrip image activate */ dt_control_signal_connect(darktable.signals, DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE, G_CALLBACK(_view_map_filmstrip_activate_callback), self); /* allow drag&drop of images from filmstrip */ gtk_drag_dest_set(GTK_WIDGET(lib->map), GTK_DEST_DEFAULT_ALL, target_list, n_targets, GDK_ACTION_COPY); g_signal_connect(GTK_WIDGET(lib->map), "drag-data-received", G_CALLBACK(drag_and_drop_received), self); }
static int dt_circle_events_button_pressed(struct dt_iop_module_t *module,float pzx, float pzy, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if (which != 1) return 0; if (!gui) return 0; if (gui->source_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *) g_list_nth_data(gui->points,index); if (!gpt) return 0; //we start the form dragging gui->source_dragging = TRUE; gui->posx = pzx*darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy*darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->source[0] - gui->posx; gui->dy = gpt->source[1] - gui->posy; return 1; } else if (gui->form_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *) g_list_nth_data(gui->points,index); if (!gpt) return 0; //we start the form dragging gui->form_dragging = TRUE; gui->posx = pzx*darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy*darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->points[0] - gui->posx; gui->dy = gpt->points[1] - gui->posy; return 1; } else if (gui->creation) { dt_iop_module_t *crea_module = gui->creation_module; //we create the circle dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *) (malloc(sizeof(dt_masks_point_circle_t))); //we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = {pzx*wd,pzy*ht}; dt_dev_distort_backtransform(darktable.develop,pts,1); circle->center[0] = pts[0]/darktable.develop->preview_pipe->iwidth; circle->center[1] = pts[1]/darktable.develop->preview_pipe->iheight; if (form->type & DT_MASKS_CLONE) { const float spots_size = MIN(0.5f,dt_conf_get_float("plugins/darkroom/spots/circle_size")); const float spots_border = MIN(0.5f,dt_conf_get_float("plugins/darkroom/spots/circle_border")); circle->radius = MAX(0.01f, spots_size); circle->border = MAX(0.005f, spots_border); form->source[0] = circle->center[0] + 0.02f; form->source[1] = circle->center[1] + 0.02f; } else { const float circle_size = MIN(0.5f,dt_conf_get_float("plugins/darkroom/masks/circle/size")); const float circle_border = MIN(0.5f,dt_conf_get_float("plugins/darkroom/masks/circle/border")); circle->radius = MAX(0.01f, circle_size); circle->border = MAX(0.005f, circle_border); // not used for masks form->source[0] = form->source[1] = 0.0f; } form->points = g_list_append(form->points,circle); dt_masks_gui_form_save_creation(crea_module,form,gui); if (crea_module) { //we save the move dt_dev_add_history_item(darktable.develop, crea_module, TRUE); //and we switch in edit mode to show all the forms dt_masks_set_edit_mode(crea_module, TRUE); dt_masks_iop_update(crea_module); gui->creation_module = NULL; } else { //we select the new form dt_dev_masks_selection_change(darktable.develop,form->formid,TRUE); } //if we draw a clone circle, we start now the source dragging if (form->type & DT_MASKS_CLONE) { dt_masks_form_t *grp = darktable.develop->form_visible; if (!grp || !(grp->type & DT_MASKS_GROUP)) return 1; int pos3 = 0, pos2 = -1; GList *fs = g_list_first(grp->points); while(fs) { dt_masks_point_group_t *pt = (dt_masks_point_group_t *)fs->data; if (pt->formid == form->formid) { pos2 = pos3; break; } pos3++; fs = g_list_next(fs); } if (pos2 < 0) return 1; dt_masks_form_gui_t *gui2 = darktable.develop->form_gui; if (!gui2) return 1; gui2->source_dragging = TRUE; gui2->group_edited = gui2->group_selected = pos2; gui2->posx = pzx*darktable.develop->preview_pipe->backbuf_width; gui2->posy = pzy*darktable.develop->preview_pipe->backbuf_height; gui2->dx = 0.0; gui2->dy = 0.0; gui2->scrollx = pzx; gui2->scrolly = pzy; } return 1; } return 0; }
static int dt_ellipse_events_button_pressed(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if(!gui) return 0; if(gui->source_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; // we start the source dragging gui->source_dragging = TRUE; gui->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->source[0] - gui->posx; gui->dy = gpt->source[1] - gui->posy; return 1; } else if(gui->point_selected >= 1 && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL && !((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; gui->point_dragging = gui->point_selected; gui->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->points[0] - gui->posx; gui->dy = gpt->points[1] - gui->posy; return 1; } else if(gui->form_selected && !gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL && !((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; // we start the form dragging or rotating if((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) gui->form_rotating = TRUE; else gui->form_dragging = TRUE; gui->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->points[0] - gui->posx; gui->dy = gpt->points[1] - gui->posy; return 1; } else if(gui->form_selected && !gui->creation && ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *)g_list_nth_data(gui->points, index); if(!gpt) return 0; gui->border_toggling = TRUE; return 1; } else if(gui->creation && (which == 3)) { dt_masks_set_edit_mode(module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(module); dt_control_queue_redraw_center(); return 1; } else if(gui->creation) { dt_iop_module_t *crea_module = gui->creation_module; // we create the ellipse dt_masks_point_ellipse_t *ellipse = (dt_masks_point_ellipse_t *)(malloc(sizeof(dt_masks_point_ellipse_t))); // we change the center value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = { pzx * wd, pzy * ht }; dt_dev_distort_backtransform(darktable.develop, pts, 1); ellipse->center[0] = pts[0] / darktable.develop->preview_pipe->iwidth; ellipse->center[1] = pts[1] / darktable.develop->preview_pipe->iheight; if(form->type & DT_MASKS_CLONE) { const float a = dt_conf_get_float("plugins/darkroom/spots/ellipse_radius_a"); const float b = dt_conf_get_float("plugins/darkroom/spots/ellipse_radius_b"); const float ellipse_border = dt_conf_get_float("plugins/darkroom/spots/ellipse_border"); const float rotation = dt_conf_get_float("plugins/darkroom/spots/ellipse_rotation"); const int flags = dt_conf_get_int("plugins/darkroom/spots/ellipse_flags"); ellipse->radius[0] = MAX(0.01f, MIN(0.5f, a)); ellipse->radius[1] = MAX(0.01f, MIN(0.5f, b)); ellipse->flags = flags; ellipse->rotation = rotation; const float min_radius = fmin(ellipse->radius[0], ellipse->radius[1]); const float reference = (ellipse->flags & DT_MASKS_ELLIPSE_PROPORTIONAL ? 1.0f/min_radius : 1.0f); ellipse->border = MAX(0.005f * reference, MIN(0.5f * reference, ellipse_border)); form->source[0] = ellipse->center[0] + 0.02f; form->source[1] = ellipse->center[1] + 0.02f; } else { const float a = dt_conf_get_float("plugins/darkroom/masks/ellipse/radius_a"); const float b = dt_conf_get_float("plugins/darkroom/masks/ellipse/radius_b"); const float ellipse_border = dt_conf_get_float("plugins/darkroom/masks/ellipse/border"); const float rotation = dt_conf_get_float("plugins/darkroom/masks/ellipse/rotation"); const int flags = dt_conf_get_int("plugins/darkroom/masks/ellipse/flags"); ellipse->radius[0] = MAX(0.01f, MIN(0.5f, a)); ellipse->radius[1] = MAX(0.01f, MIN(0.5f, b)); ellipse->flags = flags; ellipse->rotation = rotation; const float min_radius = fmin(ellipse->radius[0], ellipse->radius[1]); const float reference = (ellipse->flags & DT_MASKS_ELLIPSE_PROPORTIONAL ? 1.0f/min_radius : 1.0f); ellipse->border = MAX(0.005f * reference, MIN(0.5f * reference, ellipse_border)); // not used for masks form->source[0] = form->source[1] = 0.0f; } form->points = g_list_append(form->points, ellipse); dt_masks_gui_form_save_creation(crea_module, form, gui); if(crea_module) { // we save the move dt_dev_add_history_item(darktable.develop, crea_module, TRUE); // and we switch in edit mode to show all the forms dt_masks_set_edit_mode(crea_module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(crea_module); gui->creation_module = NULL; } else { // we select the new form dt_dev_masks_selection_change(darktable.develop, form->formid, TRUE); } // if we draw a clone ellipse, we start now the source dragging if(form->type & DT_MASKS_CLONE) { dt_masks_form_t *grp = darktable.develop->form_visible; if(!grp || !(grp->type & DT_MASKS_GROUP)) return 1; int pos3 = 0, pos2 = -1; GList *fs = g_list_first(grp->points); while(fs) { dt_masks_point_group_t *pt = (dt_masks_point_group_t *)fs->data; if(pt->formid == form->formid) { pos2 = pos3; break; } pos3++; fs = g_list_next(fs); } if(pos2 < 0) return 1; dt_masks_form_gui_t *gui2 = darktable.develop->form_gui; if(!gui2) return 1; gui2->source_dragging = TRUE; gui2->group_edited = gui2->group_selected = pos2; gui2->posx = pzx * darktable.develop->preview_pipe->backbuf_width; gui2->posy = pzy * darktable.develop->preview_pipe->backbuf_height; gui2->dx = 0.0; gui2->dy = 0.0; gui2->scrollx = pzx; gui2->scrolly = pzy; } return 1; } return 0; }
static int dt_gradient_events_button_pressed(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, int type, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if (!gui) return 0; if (!gui->creation && gui->edit_mode == DT_MASKS_EDIT_FULL) { dt_masks_form_gui_points_t *gpt = (dt_masks_form_gui_points_t *) g_list_nth_data(gui->points,index); if (!gpt) return 0; //we start the form rotating or dragging if(gui->pivot_selected) gui->form_rotating = TRUE; else gui->form_dragging = TRUE; gui->posx = pzx*darktable.develop->preview_pipe->backbuf_width; gui->posy = pzy*darktable.develop->preview_pipe->backbuf_height; gui->dx = gpt->points[0] - gui->posx; gui->dy = gpt->points[1] - gui->posy; return 1; } else if (gui->creation && (which == 3)) { darktable.develop->form_visible = NULL; dt_masks_clear_form_gui(darktable.develop); dt_masks_set_edit_mode(module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(module); dt_control_queue_redraw_center(); return 1; } else if (gui->creation) { dt_iop_module_t *crea_module = gui->creation_module; //we create the circle dt_masks_point_gradient_t *gradient = (dt_masks_point_gradient_t *) (malloc(sizeof(dt_masks_point_gradient_t))); //we change the offset value float wd = darktable.develop->preview_pipe->backbuf_width; float ht = darktable.develop->preview_pipe->backbuf_height; float pts[2] = {pzx*wd,pzy*ht}; dt_dev_distort_backtransform(darktable.develop,pts,1); gradient->anchor[0] = pts[0]/darktable.develop->preview_pipe->iwidth; gradient->anchor[1] = pts[1]/darktable.develop->preview_pipe->iheight; const float compression = MIN(1.0f,dt_conf_get_float("plugins/darkroom/masks/gradient/compression")); const float steepness = 0.0f; //MIN(1.0f,dt_conf_get_float("plugins/darkroom/masks/gradient/steepness")); // currently not used const float rotation = dt_conf_get_float("plugins/darkroom/masks/gradient/rotation"); gradient->rotation = rotation; gradient->compression = MAX(0.0f, compression); gradient->steepness = MAX(0.0f, steepness); // not used for masks form->source[0] = form->source[1] = 0.0f; form->points = g_list_append(form->points,gradient); dt_masks_gui_form_save_creation(crea_module,form,gui); if (crea_module) { //we save the move dt_dev_add_history_item(darktable.develop, crea_module, TRUE); //and we switch in edit mode to show all the forms dt_masks_set_edit_mode(crea_module, DT_MASKS_EDIT_FULL); dt_masks_iop_update(crea_module); gui->creation_module = NULL; } else { //we select the new form dt_dev_masks_selection_change(darktable.develop,form->formid,TRUE); } return 1; } return 0; }
static int dt_circle_events_mouse_scrolled(struct dt_iop_module_t *module, float pzx, float pzy, int up, uint32_t state, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { // add a preview when creating a circle if(gui->creation) { if((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { float masks_border; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) masks_border = dt_conf_get_float("plugins/darkroom/spots/circle_border"); else masks_border = dt_conf_get_float("plugins/darkroom/masks/circle/border"); if(up && masks_border > 0.0005f) masks_border *= 0.97f; else if(!up && masks_border < 1.0f) masks_border *= 1.0f / 0.97f; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_border", masks_border); else dt_conf_set_float("plugins/darkroom/masks/circle/border", masks_border); } else if(state == 0) { float masks_size; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) masks_size = dt_conf_get_float("plugins/darkroom/spots/circle_size"); else masks_size = dt_conf_get_float("plugins/darkroom/masks/circle/size"); if(up && masks_size > 0.001f) masks_size *= 0.97f; else if(!up && masks_size < 1.0f) masks_size *= 1.0f / 0.97f; if(form->type & (DT_MASKS_CLONE | DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_size", masks_size); else dt_conf_set_float("plugins/darkroom/masks/circle/size", masks_size); } return 1; } if(gui->form_selected) { // we register the current position if(gui->scrollx == 0.0f && gui->scrolly == 0.0f) { gui->scrollx = pzx; gui->scrolly = pzy; } if((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) { // we try to change the opacity dt_masks_form_change_opacity(form, parentid, up); } else { dt_masks_point_circle_t *circle = (dt_masks_point_circle_t *)(g_list_first(form->points)->data); // resize don't care where the mouse is inside a shape if((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK) { if(up && circle->border > 0.0005f) circle->border *= 0.97f; else if(!up && circle->border < 1.0f) circle->border *= 1.0f / 0.97f; else return 1; dt_masks_write_form(form, darktable.develop); dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); if(form->type & (DT_MASKS_CLONE|DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_border", circle->border); else dt_conf_set_float("plugins/darkroom/masks/circle/border", circle->border); } else if(gui->edit_mode == DT_MASKS_EDIT_FULL) { if(up && circle->radius > 0.001f) circle->radius *= 0.97f; else if(!up && circle->radius < 1.0f) circle->radius *= 1.0f / 0.97f; else return 1; dt_masks_write_form(form, darktable.develop); dt_masks_gui_form_remove(form, gui, index); dt_masks_gui_form_create(form, gui, index); if(form->type & (DT_MASKS_CLONE|DT_MASKS_NON_CLONE)) dt_conf_set_float("plugins/darkroom/spots/circle_size", circle->radius); else dt_conf_set_float("plugins/darkroom/masks/circle/size", circle->radius); } else { return 0; } dt_masks_update_image(darktable.develop); } return 1; } return 0; }