summaryrefslogtreecommitdiffstats
path: root/src/arc-context.cpp
diff options
context:
space:
mode:
authorMaximilian Albert <maximilian.albert@gmail.com>2007-12-13 09:45:27 +0000
committercilix42 <cilix42@users.sourceforge.net>2007-12-13 09:45:27 +0000
commitcae2409c94b11d17643f7c19829e2653d759ff8e (patch)
treea8399ab9b3e8ff2570a92bef06e63f2307fef592 /src/arc-context.cpp
parentlibgdl: avoid setting a negative preferred height for dock items, (diff)
downloadinkscape-cae2409c94b11d17643f7c19829e2653d759ff8e.tar.gz
inkscape-cae2409c94b11d17643f7c19829e2653d759ff8e.zip
Fundamentally reworked version of the 3D box tool (among many other things, this fixes bugs #168900 and #168868). See mailing list for details. Sorry for this single large commit but it was unfeasible to keep the history.
(bzr r4224)
Diffstat (limited to 'src/arc-context.cpp')
-rw-r--r--src/arc-context.cpp33
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],