diff options
Diffstat (limited to 'src/arc-context.cpp')
| -rw-r--r-- | src/arc-context.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/arc-context.cpp b/src/arc-context.cpp index c2ec30a64..82c00fd05 100644 --- a/src/arc-context.cpp +++ b/src/arc-context.cpp @@ -433,7 +433,38 @@ static void sp_arc_drag(SPArcContext *ac, NR::Point pt, guint state) sp_canvas_force_full_redraw_after_interruptions(desktop->canvas, 5); } - NR::Rect const r = Inkscape::snap_rectangular_box(desktop, ac->item, pt, ac->center, state); + bool ctrl_save = false; + if ((state & GDK_MOD1_MASK) && (state & GDK_CONTROL_MASK) && !(state & GDK_SHIFT_MASK)) { + // if Alt is pressed without Shift in addition to Control, temporarily drop the CONTROL mask + // so that the ellipse is not constrained to integer ratios + ctrl_save = true; + state = state ^ GDK_CONTROL_MASK; + } + NR::Rect r = Inkscape::snap_rectangular_box(desktop, ac->item, pt, ac->center, state); + if (ctrl_save) { + state = state ^ GDK_CONTROL_MASK; + } + + NR::Point dir = r.dimensions() / 2; + if (state & GDK_MOD1_MASK) { + /* With Alt let the ellipse pass through the mouse pointer */ + NR::Point c = r.midpoint(); + if (!ctrl_save) { + if (fabs(dir[NR::X]) > 1E-6 && fabs(dir[NR::Y]) > 1E-6) { + NR::Matrix const i2d (sp_item_i2d_affine (ac->item)); + NR::Point new_dir = pt * i2d - c; + new_dir[NR::X] *= dir[NR::Y] / dir[NR::X]; + double lambda = NR::L2(new_dir) / dir[NR::Y]; + r = NR::Rect (c - lambda*dir, c + lambda*dir); + } + } else { + /* with Alt+Ctrl (without Shift) we generate a perfect circle + with diameter click point <--> mouse pointer */ + double l = NR::L2 (dir); + NR::Point d = NR::Point (l, l); + r = NR::Rect (c - d, c + d); + } + } sp_arc_position_set(SP_ARC(ac->item), r.midpoint()[NR::X], r.midpoint()[NR::Y], |
