Skip to content

Make it easier to select feather points close to path points #18896

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/develop/masks.h
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ typedef struct dt_masks_form_gui_t
gboolean border_selected;
gboolean source_selected;
gboolean pivot_selected;
gboolean select_only_border;
dt_masks_edit_mode_t edit_mode;
int point_selected;
int point_edited;
Expand Down
10 changes: 4 additions & 6 deletions src/develop/masks/circle.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,15 +622,13 @@ static int _circle_events_mouse_moved(dt_iop_module_t *module,
const float dist_b = sqf(x - gpt->border[2]) + sqf(y - gpt->border[3]);
const float dist_p = sqf(x - gpt->points[2]) + sqf(y - gpt->points[3]);

// prefer border point over shape itself in case of near overlap
// for ease of pickup
if(dist_b < as2)
if(!gui->select_only_border && dist_p < as2)
{
gui->point_border_selected = 1;
gui->point_selected = 1;
}
else if(dist_p < as2)
else if(dist_b < as2)
{
gui->point_selected = 1;
gui->point_border_selected = 1;
}
}

Expand Down
12 changes: 5 additions & 7 deletions src/develop/masks/ellipse.c
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ static int _ellipse_events_button_pressed(dt_iop_module_t *module,
dt_masks_form_gui_points_t *gpt = g_list_nth_data(gui->points, index);
if(!gpt) return 0;

if(gui->form_selected && dt_modifier_is(state, GDK_SHIFT_MASK))
if(gui->form_selected && dt_modifier_is(state, GDK_MOD1_MASK))
{
gui->border_toggling = TRUE;
return 1;
Expand Down Expand Up @@ -1185,16 +1185,14 @@ static int _ellipse_events_mouse_moved(dt_iop_module_t *module,
const float dist_b = sqf(x - gpt->border[i * 2]) + sqf(y - gpt->border[i * 2 +1]);
const float dist_p = sqf(x - gpt->points[i * 2]) + sqf(y - gpt->points[i * 2 + 1]);

// prefer border points over shape itself in case of near
// overlap for ease of pickup
if(dist_b < as2)
if(!gui->select_only_border && dist_p < as2)
{
gui->point_border_selected = i;
gui->point_selected = i;
break;
}
if(dist_p < as2)
if(dist_b < as2)
{
gui->point_selected = i;
gui->point_border_selected = i;
break;
}
}
Expand Down
13 changes: 13 additions & 0 deletions src/develop/masks/group.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,20 @@ static int _group_events_button_pressed(dt_iop_module_t *module,
dt_masks_form_t *sel = dt_masks_get_from_id(darktable.develop, fpt->formid);
if(!sel) return 0;
if(sel->functions)
{
// did we asked for feather only?
if(dt_modifier_is(state, GDK_SHIFT_MASK) ^ gui->select_only_border)
{
// then make sure we try to select the feather point
gui->select_only_border = dt_modifier_is(state, GDK_SHIFT_MASK);
sel->functions->mouse_moved(module, pzx, pzy, pressure,
which, dt_dev_get_zoom_scale_full(), sel, fpt->parentid,
gui, gui->group_edited);
}

return sel->functions->button_pressed(module, pzx, pzy, pressure, which, type, state, sel,
fpt->parentid, gui, gui->group_edited);
}
}
return 0;
}
Expand Down Expand Up @@ -180,6 +192,7 @@ static int _group_events_mouse_moved(dt_iop_module_t *module,
gui->seg_selected = -1;
gui->point_border_selected = -1;
gui->group_edited = gui->group_selected = -1;
gui->select_only_border = dt_modifier_is(which, GDK_SHIFT_MASK);

dt_masks_form_t *sel = NULL;
dt_masks_point_group_t *sel_fpt = NULL;
Expand Down
7 changes: 4 additions & 3 deletions src/develop/masks/path.c
Original file line number Diff line number Diff line change
Expand Up @@ -2707,7 +2707,7 @@ static int _path_events_mouse_moved(dt_iop_module_t *module,

if((gui->group_selected == index) && gui->point_edited >= 0)
{
const int k = gui->point_edited;
const int k = gui->point_edited;
// we only select feather if the point is not "sharp"
if(gpt->points[k * 6 + 2] != gpt->points[k * 6 + 4]
&& gpt->points[k * 6 + 3] != gpt->points[k * 6 + 5])
Expand Down Expand Up @@ -2749,7 +2749,8 @@ static int _path_events_mouse_moved(dt_iop_module_t *module,
for(int k = 0; k < nb; k++)
{
// corner ??
if(pzx - gpt->points[k * 6 + 2] > -as
if(!gui->select_only_border
&& pzx - gpt->points[k * 6 + 2] > -as
&& pzx - gpt->points[k * 6 + 2] < as
&& pzy - gpt->points[k * 6 + 3] > -as
&& pzy - gpt->points[k * 6 + 3] < as)
Expand All @@ -2776,7 +2777,7 @@ static int _path_events_mouse_moved(dt_iop_module_t *module,
int near = 0;
float dist = 0;
_path_get_distance(pzx, pzy, as, gui, index, nb, &in, &inb, &near, &ins, &dist);
gui->seg_selected = dist < sqf(as) ? near : -1;
gui->seg_selected = !gui->select_only_border && dist < sqf(as) ? near : -1;

// no segment selected, set form or source selection
if(near < 0)
Expand Down
Loading