Skip to content

Commit fdd1d4b

Browse files
committed
paths: Use SHIFT modifier to select only feather points.
When the border and the feather are very close from each other it is difficult to select a specific point. The default are the border points, when using SHIFT modifier only the feather points are selectable. Note that for the ellipse the change of the feather mode (equidistant or proportional) is now controlled by the ALT key. This change seems ok as the feature is less frequent and SHIFT is the current key to resize the feather for all masks.
1 parent 335dd67 commit fdd1d4b

File tree

5 files changed

+26
-15
lines changed

5 files changed

+26
-15
lines changed

src/develop/masks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ typedef struct dt_masks_form_gui_t
387387
gboolean border_selected;
388388
gboolean source_selected;
389389
gboolean pivot_selected;
390+
gboolean select_only_border;
390391
dt_masks_edit_mode_t edit_mode;
391392
int point_selected;
392393
int point_edited;

src/develop/masks/circle.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -622,15 +622,13 @@ static int _circle_events_mouse_moved(dt_iop_module_t *module,
622622
const float dist_b = sqf(x - gpt->border[2]) + sqf(y - gpt->border[3]);
623623
const float dist_p = sqf(x - gpt->points[2]) + sqf(y - gpt->points[3]);
624624

625-
// prefer border point over shape itself in case of near overlap
626-
// for ease of pickup
627-
if(dist_b < as2)
625+
if(!gui->select_only_border && dist_p < as2)
628626
{
629-
gui->point_border_selected = 1;
627+
gui->point_selected = 1;
630628
}
631-
else if(dist_p < as2)
629+
else if(dist_b < as2)
632630
{
633-
gui->point_selected = 1;
631+
gui->point_border_selected = 1;
634632
}
635633
}
636634

src/develop/masks/ellipse.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ static int _ellipse_events_button_pressed(dt_iop_module_t *module,
577577
dt_masks_form_gui_points_t *gpt = g_list_nth_data(gui->points, index);
578578
if(!gpt) return 0;
579579

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

1188-
// prefer border points over shape itself in case of near
1189-
// overlap for ease of pickup
1190-
if(dist_b < as2)
1188+
if(!gui->select_only_border && dist_p < as2)
11911189
{
1192-
gui->point_border_selected = i;
1190+
gui->point_selected = i;
11931191
break;
11941192
}
1195-
if(dist_p < as2)
1193+
if(dist_b < as2)
11961194
{
1197-
gui->point_selected = i;
1195+
gui->point_border_selected = i;
11981196
break;
11991197
}
12001198
}

src/develop/masks/group.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,20 @@ static int _group_events_button_pressed(dt_iop_module_t *module,
8787
dt_masks_form_t *sel = dt_masks_get_from_id(darktable.develop, fpt->formid);
8888
if(!sel) return 0;
8989
if(sel->functions)
90+
{
91+
// did we asked for feather only?
92+
if(dt_modifier_is(state, GDK_SHIFT_MASK) ^ gui->select_only_border)
93+
{
94+
// then make sure we try to select the feather point
95+
gui->select_only_border = dt_modifier_is(state, GDK_SHIFT_MASK);
96+
sel->functions->mouse_moved(module, pzx, pzy, pressure,
97+
which, dt_dev_get_zoom_scale_full(), sel, fpt->parentid,
98+
gui, gui->group_edited);
99+
}
100+
90101
return sel->functions->button_pressed(module, pzx, pzy, pressure, which, type, state, sel,
91102
fpt->parentid, gui, gui->group_edited);
103+
}
92104
}
93105
return 0;
94106
}
@@ -180,6 +192,7 @@ static int _group_events_mouse_moved(dt_iop_module_t *module,
180192
gui->seg_selected = -1;
181193
gui->point_border_selected = -1;
182194
gui->group_edited = gui->group_selected = -1;
195+
gui->select_only_border = dt_modifier_is(which, GDK_SHIFT_MASK);
183196

184197
dt_masks_form_t *sel = NULL;
185198
dt_masks_point_group_t *sel_fpt = NULL;

src/develop/masks/path.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,7 +2749,8 @@ static int _path_events_mouse_moved(dt_iop_module_t *module,
27492749
for(int k = 0; k < nb; k++)
27502750
{
27512751
// corner ??
2752-
if(pzx - gpt->points[k * 6 + 2] > -as
2752+
if(!gui->select_only_border
2753+
&& pzx - gpt->points[k * 6 + 2] > -as
27532754
&& pzx - gpt->points[k * 6 + 2] < as
27542755
&& pzy - gpt->points[k * 6 + 3] > -as
27552756
&& pzy - gpt->points[k * 6 + 3] < as)
@@ -2776,7 +2777,7 @@ static int _path_events_mouse_moved(dt_iop_module_t *module,
27762777
int near = 0;
27772778
float dist = 0;
27782779
_path_get_distance(pzx, pzy, as, gui, index, nb, &in, &inb, &near, &ins, &dist);
2779-
gui->seg_selected = dist < sqf(as) ? near : -1;
2780+
gui->seg_selected = !gui->select_only_border && dist < sqf(as) ? near : -1;
27802781

27812782
// no segment selected, set form or source selection
27822783
if(near < 0)

0 commit comments

Comments
 (0)