[Bf-blender-cvs] [e625c5a6b18] soc-2019-bevel-profiles: Profile Widget: Add shortcuts for moving and deleting
Hans Goudey
noreply at git.blender.org
Fri Aug 2 20:08:36 CEST 2019
Commit: e625c5a6b1828e6b4781035edaf24dfb24f6d8b2
Author: Hans Goudey
Date: Fri Aug 2 10:07:43 2019 -0400
Branches: soc-2019-bevel-profiles
https://developer.blender.org/rBe625c5a6b1828e6b4781035edaf24dfb24f6d8b2
Profile Widget: Add shortcuts for moving and deleting
This speeds up interaction with the widget significantly.
Like other shortcuts in the interface_handlers.c file, these shortcuts are
hardcoded, so ideally they would be operators.
===================================================================
M source/blender/editors/interface/interface_handlers.c
===================================================================
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 9b953ad002e..4c5dbe9953f 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -6861,7 +6861,6 @@ static bool ui_numedit_but_PROFILE(uiBlock *block,
return changed;
}
-/* HANS-TODO: Add move (G) and delete (X) shortcuts for the widget if it's possible */
static int ui_do_but_PROFILE(bContext *C,
uiBlock *block,
uiBut *but,
@@ -6869,18 +6868,37 @@ static int ui_do_but_PROFILE(bContext *C,
const wmEvent *event)
{
int mx, my, i;
- bool changed = false;
mx = event->x;
my = event->y;
ui_window_to_block(data->region, block, &mx, &my);
+ /* Move selected control points (hardcoded keymap) */
+ if (event->type == GKEY && event->val == KM_RELEASE) {
+ data->dragstartx = mx;
+ data->dragstarty = my;
+ data->draglastx = mx;
+ data->draglasty = my;
+ button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
+ return WM_UI_HANDLER_BREAK;
+ }
+
+ ProfileWidget *prwdgt = (ProfileWidget *)but->poin;
+
+ /* Delete selected control points (hardcoded keymap) */
+ if (event->type == XKEY && event->val == KM_RELEASE) {
+ profilewidget_remove(prwdgt, PROF_SELECT);
+ profilewidget_changed(prwdgt, false);
+ ED_region_tag_redraw(data->region);
+ return WM_UI_HANDLER_BREAK;
+ }
+
+ /* Selecting, adding, and starting point movements */
if (data->state == BUTTON_STATE_HIGHLIGHT) {
if (event->type == LEFTMOUSE && event->val == KM_PRESS) {
- ProfileWidget *prwdgt = (ProfileWidget *)but->poin;
ProfilePoint *pts; /* Path or table */
const float m_xy[2] = {mx, my};
- float dist_min_sq = SQUARE(U.dpi_fac * 14.0f); /* 14 pixels radius */
+ float dist_min_sq;
int i_selected = -1;
if (event->ctrl) {
@@ -6889,10 +6907,10 @@ static int ui_do_but_PROFILE(bContext *C,
profilewidget_insert(prwdgt, f_xy[0], f_xy[1]);
profilewidget_changed(prwdgt, false);
- changed = true;
}
- /* check for selecting of a point */
+ /* Check for selecting of a point by finding closest point in radius */
+ dist_min_sq = SQUARE(U.dpi_fac * 14.0f); /* 14 pixels radius for selecting points */
pts = prwdgt->path; /* ctrl adds point, new malloc */
for (i = 0; i < prwdgt->totpoint; i++) {
float f_xy[2];
@@ -6904,19 +6922,15 @@ static int ui_do_but_PROFILE(bContext *C,
}
}
+ /* Add a point if the click was close to the path but not a control point */
if (i_selected == -1) {
float f_xy[2], f_xy_prev[2];
-
- /* if the click didn't select anything, check if it's clicked on the
- * curve itself, and if so, add a point */
pts = prwdgt->table;
-
BLI_rctf_transform_pt_v(&but->rect, &prwdgt->view_rect, f_xy, &pts[0].x);
- /* with 160px height 8px should translate to the old 0.05 coefficient at no zoom */
- dist_min_sq = SQUARE(U.dpi_fac * 8.0f);
+ dist_min_sq = SQUARE(U.dpi_fac * 8.0f); /* 8 pixel radius from each table point */
- /* loop through the curve segment table and find what's near the mouse. */
+ /* Loop through the path's high resolution table and find what's near the click. */
for (i = 1; i <= PROF_N_TABLE(prwdgt->totpoint); i++) {
copy_v2_v2(f_xy_prev, f_xy);
BLI_rctf_transform_pt_v(&but->rect, &prwdgt->view_rect, f_xy, &pts[i].x);
@@ -6927,12 +6941,10 @@ static int ui_do_but_PROFILE(bContext *C,
ProfilePoint *new_pt = profilewidget_insert(prwdgt, f_xy[0], f_xy[1]);
profilewidget_changed(prwdgt, false);
- changed = true;
-
- /* reset cmp back to the curve points again rather than drawing segments */
+ /* reset pts back to the control points */
pts = prwdgt->path;
- /* find newly added point and make it 'sel' */
+ /* Get the index of the newly added point */
for (i = 0; i < prwdgt->totpoint; i++) {
if (&pts[i] == new_pt) {
i_selected = i;
@@ -6943,8 +6955,8 @@ static int ui_do_but_PROFILE(bContext *C,
}
}
+ /* Change the flag for the point(s) if one was selected */
if (i_selected != -1) {
- /* ok, we move a point */
/* deselect all if this one is deselect. except if we hold shift */
if (!event->shift) {
for (i = 0; i < prwdgt->totpoint; i++) {
@@ -6963,19 +6975,19 @@ static int ui_do_but_PROFILE(bContext *C,
data->dragsel = i_selected;
- data->dragstartx = event->x;
- data->dragstarty = event->y;
- data->draglastx = event->x;
- data->draglasty = event->y;
+ data->dragstartx = mx;
+ data->dragstarty = my;
+ data->draglastx = mx;
+ data->draglasty = my;
button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
return WM_UI_HANDLER_BREAK;
}
}
- else if (data->state == BUTTON_STATE_NUM_EDITING) {
+ else if (data->state == BUTTON_STATE_NUM_EDITING) { /* Do control point movement */
if (event->type == MOUSEMOVE) {
- if (event->x != data->draglastx || event->y != data->draglasty) {
- if (ui_numedit_but_PROFILE(block, but, data, event->x, event->y, event->ctrl != 0,
+ if (mx != data->draglastx || my != data->draglasty) {
+ if (ui_numedit_but_PROFILE(block, but, data, mx, my, event->ctrl != 0,
event->shift != 0)) {
ui_numedit_apply(C, block, but, data);
}
@@ -6983,7 +6995,6 @@ static int ui_do_but_PROFILE(bContext *C,
}
else if (event->type == LEFTMOUSE && event->val == KM_RELEASE) {
if (data->dragsel != -1) {
- ProfileWidget *prwdgt = (ProfileWidget *)but->poin;
ProfilePoint *pts = prwdgt->path;
if (data->dragchange == false) {
@@ -7004,9 +7015,6 @@ static int ui_do_but_PROFILE(bContext *C,
return WM_UI_HANDLER_BREAK;
}
- /* UNUSED but keep for now */
- (void)changed;
-
return WM_UI_HANDLER_CONTINUE;
}
More information about the Bf-blender-cvs
mailing list