static int dt_circle_events_mouse_moved(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, dt_masks_form_t *form, int parentid, dt_masks_form_gui_t *gui, int index) { if(gui->form_dragging || gui->source_dragging) { dt_control_queue_redraw_center(); return 1; } else if(!gui->creation) { dt_dev_zoom_t zoom = dt_control_get_dev_zoom(); int closeup = dt_control_get_dev_closeup(); float zoom_scale = dt_dev_get_zoom_scale(darktable.develop, zoom, 1<<closeup, 1); float as = 0.005f / zoom_scale * darktable.develop->preview_pipe->backbuf_width; int in, inb, near, ins; dt_circle_get_distance(pzx * darktable.develop->preview_pipe->backbuf_width, pzy * darktable.develop->preview_pipe->backbuf_height, as, gui, index, &in, &inb, &near, &ins); if(ins) { gui->form_selected = TRUE; gui->source_selected = TRUE; gui->border_selected = FALSE; } else if(inb) { gui->form_selected = TRUE; gui->border_selected = TRUE; gui->source_selected = FALSE; } else if(in) { gui->form_selected = TRUE; gui->border_selected = FALSE; gui->source_selected = FALSE; } else { gui->form_selected = FALSE; gui->border_selected = FALSE; gui->source_selected = FALSE; } dt_control_queue_redraw_center(); if(!gui->form_selected && !gui->border_selected) return 0; if(gui->edit_mode != DT_MASKS_EDIT_FULL) return 0; return 1; } // add a preview when creating a circle else if(gui->creation) { dt_control_queue_redraw_center(); return 1; } return 0; }
static int dt_group_events_mouse_moved(struct dt_iop_module_t *module, float pzx, float pzy, double pressure, int which, dt_masks_form_t *form, dt_masks_form_gui_t *gui) { dt_dev_zoom_t zoom = dt_control_get_dev_zoom(); int closeup = dt_control_get_dev_closeup(); float zoom_scale = dt_dev_get_zoom_scale(darktable.develop, zoom, closeup ? 2 : 1, 1); float as = 0.005f / zoom_scale * darktable.develop->preview_pipe->backbuf_width; // we first don't do anything if we are inside a scrolling session if(gui->scrollx != 0.0f && gui->scrolly != 0.0f) { float as2 = 0.015f / zoom_scale; if((gui->scrollx - pzx < as2 && gui->scrollx - pzx > -as2) && (gui->scrolly - pzy < as2 && gui->scrolly - pzy > -as2)) return 1; gui->scrollx = gui->scrolly = 0.0f; } // if a form is in edit mode, we first execute the corresponding event if(gui->group_edited >= 0) { // we get the form dt_masks_point_group_t *fpt = (dt_masks_point_group_t *)g_list_nth_data(form->points, gui->group_edited); dt_masks_form_t *sel = dt_masks_get_from_id(darktable.develop, fpt->formid); if(!sel) return 0; int rep = 0; if(sel->type & DT_MASKS_CIRCLE) rep = dt_circle_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, gui->group_edited); else if(sel->type & DT_MASKS_PATH) rep = dt_path_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, gui->group_edited); else if(sel->type & DT_MASKS_GRADIENT) rep = dt_gradient_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, gui->group_edited); else if(sel->type & DT_MASKS_ELLIPSE) rep = dt_ellipse_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, gui->group_edited); else if(sel->type & DT_MASKS_BRUSH) rep = dt_brush_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, gui->group_edited); if(rep) return 1; // if a point is in state editing, then we don't want that another form can be selected if(gui->point_edited >= 0) return 0; } // now we check if we are near a form GList *fpts = g_list_first(form->points); int pos = 0; gui->form_selected = gui->border_selected = FALSE; gui->source_selected = gui->source_dragging = FALSE; gui->pivot_selected = FALSE; gui->feather_selected = -1; gui->point_edited = gui->point_selected = -1; gui->seg_selected = -1; gui->point_border_selected = -1; gui->group_edited = gui->group_selected = -1; while(fpts) { dt_masks_point_group_t *fpt = (dt_masks_point_group_t *)fpts->data; dt_masks_form_t *sel = dt_masks_get_from_id(darktable.develop, fpt->formid); int inside, inside_border, near, inside_source; inside = inside_border = inside_source = 0; near = -1; float xx = pzx * darktable.develop->preview_pipe->backbuf_width, yy = pzy * darktable.develop->preview_pipe->backbuf_height; if(sel->type & DT_MASKS_CIRCLE) dt_circle_get_distance(xx, yy, as, gui, pos, &inside, &inside_border, &near, &inside_source); else if(sel->type & DT_MASKS_PATH) dt_path_get_distance(xx, yy, as, gui, pos, g_list_length(sel->points), &inside, &inside_border, &near, &inside_source); else if(sel->type & DT_MASKS_GRADIENT) dt_gradient_get_distance(xx, yy, as, gui, pos, &inside, &inside_border, &near, &inside_source); else if(sel->type & DT_MASKS_ELLIPSE) dt_ellipse_get_distance(xx, yy, as, gui, pos, &inside, &inside_border, &near, &inside_source); else if(sel->type & DT_MASKS_BRUSH) dt_brush_get_distance(xx, yy, as, gui, pos, g_list_length(sel->points), &inside, &inside_border, &near, &inside_source); if(inside || inside_border || near >= 0 || inside_source) { gui->group_edited = gui->group_selected = pos; if(sel->type & DT_MASKS_CIRCLE) return dt_circle_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, pos); else if(sel->type & DT_MASKS_PATH) return dt_path_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, pos); else if(sel->type & DT_MASKS_GRADIENT) return dt_gradient_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, pos); else if(sel->type & DT_MASKS_ELLIPSE) return dt_ellipse_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, pos); else if(sel->type & DT_MASKS_BRUSH) return dt_brush_events_mouse_moved(module, pzx, pzy, pressure, which, sel, fpt->parentid, gui, pos); } fpts = g_list_next(fpts); pos++; } dt_control_queue_redraw_center(); return 0; }