diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2014-08-14 13:39:54 +0400 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2014-08-14 13:40:10 +0400 |
commit | f7dcec1f693f4f017385815c80cecfae18ac9692 (patch) | |
tree | 5db075a79adb50398870de207f472bcf694cb4a4 /source/blender/windowmanager/intern | |
parent | 9bbd3558134f27adac8c389598972c69c5f2dc2e (diff) |
Fix part of T41297.
Add precision mode to radial operator by keeping the shift key pressed.
Precision mode works by checking difference between absolute window
coordinates and the point where shift was pressed and adding those to
the distance between that point and the radial center. This allows
bigger negative/positive range than using a strict radial scheme.
Diffstat (limited to 'source/blender/windowmanager/intern')
-rw-r--r-- | source/blender/windowmanager/intern/wm_operators.c | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index d71beed3602..7eddd933da3 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -3677,6 +3677,8 @@ typedef struct { StructRNA *image_id_srna; float initial_value, current_value, min_value, max_value; int initial_mouse[2]; + int slow_mouse[2]; + bool slow_mode; unsigned int gltex; ListBase orig_paintcursors; bool use_secondary_tex; @@ -4129,24 +4131,48 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even { RadialControl *rc = op->customdata; float new_value, dist, zoom[2]; - float delta[2], snap, ret = OPERATOR_RUNNING_MODAL; - + float delta[2], ret = OPERATOR_RUNNING_MODAL; + bool snap; /* TODO: fix hardcoded events */ - snap = event->ctrl; + snap = event->ctrl != 0; switch (event->type) { case MOUSEMOVE: - delta[0] = rc->initial_mouse[0] - event->x; - delta[1] = rc->initial_mouse[1] - event->y; + if (rc->slow_mode) { + delta[0] = rc->initial_mouse[0] - rc->slow_mouse[0]; + delta[1] = rc->initial_mouse[1] - rc->slow_mouse[1]; + + if (rc->zoom_prop) { + RNA_property_float_get_array(&rc->zoom_ptr, rc->zoom_prop, zoom); + delta[0] /= zoom[0]; + delta[1] /= zoom[1]; + } + + dist = len_v2(delta); + + delta[0] = event->x - rc->slow_mouse[0]; + delta[1] = event->y - rc->slow_mouse[1]; - if (rc->zoom_prop) { - RNA_property_float_get_array(&rc->zoom_ptr, rc->zoom_prop, zoom); - delta[0] /= zoom[0]; - delta[1] /= zoom[1]; - } + if (rc->zoom_prop) { + delta[0] /= zoom[0]; + delta[1] /= zoom[1]; + } + + dist = dist + 0.1f * (delta[0] + delta[1]); + } + else { + delta[0] = rc->initial_mouse[0] - event->x; + delta[1] = rc->initial_mouse[1] - event->y; - dist = len_v2(delta); + if (rc->zoom_prop) { + RNA_property_float_get_array(&rc->zoom_ptr, rc->zoom_prop, zoom); + delta[0] /= zoom[0]; + delta[1] /= zoom[1]; + } + + dist = len_v2(delta); + } /* calculate new value and apply snapping */ switch (rc->subtype) { @@ -4188,6 +4214,18 @@ static int radial_control_modal(bContext *C, wmOperator *op, const wmEvent *even RNA_property_update(C, &rc->ptr, rc->prop); ret = OPERATOR_FINISHED; break; + + case LEFTSHIFTKEY: + case RIGHTSHIFTKEY: + if (event->val == KM_PRESS) { + rc->slow_mouse[0] = event->x; + rc->slow_mouse[1] = event->y; + rc->slow_mode = true; + } + if (event->val == KM_RELEASE) { + rc->slow_mode = false; + } + break; } ED_region_tag_redraw(CTX_wm_region(C)); |