diff options
| author | Andrew Higginson <at.higginson@gmail.com> | 2011-12-27 21:04:47 +0000 |
|---|---|---|
| committer | Andrew <at.higginson@gmail.com> | 2011-12-27 21:04:47 +0000 |
| commit | 80960b623a99aae1402ab651b2974ef544ed3b03 (patch) | |
| tree | ba49d42c2789e9e11f805e2d5263e10f9fedeef8 /src/desktop-events.cpp | |
| parent | try to fix bug (diff) | |
| parent | GDL: Cherry-pick upstream patch 73852 (2011-03-23) - Add missing return value. (diff) | |
| download | inkscape-80960b623a99aae1402ab651b2974ef544ed3b03.tar.gz inkscape-80960b623a99aae1402ab651b2974ef544ed3b03.zip | |
merged with trunk so I can build again...
(bzr r10092.1.36)
Diffstat (limited to 'src/desktop-events.cpp')
| -rw-r--r-- | src/desktop-events.cpp | 62 |
1 files changed, 40 insertions, 22 deletions
diff --git a/src/desktop-events.cpp b/src/desktop-events.cpp index b458827f0..0565402a2 100644 --- a/src/desktop-events.cpp +++ b/src/desktop-events.cpp @@ -1,5 +1,6 @@ -/** @file - * @brief Event handlers for SPDesktop +/** + * @file + * Event handlers for SPDesktop. */ /* Author: * Lauris Kaplinski <lauris@kaplinski.com> @@ -17,6 +18,7 @@ #include <map> #include <string> #include <2geom/line.h> +#include <2geom/angle.h> #include <glibmm/i18n.h> #include "desktop.h" @@ -131,7 +133,7 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge } } - guide = sp_guideline_new(desktop->guides, event_dt, normal); + guide = sp_guideline_new(desktop->guides, NULL, event_dt, normal); sp_guideline_set_color(SP_GUIDELINE(guide), desktop->namedview->guidehicolor); gdk_pointer_grab(widget->window, FALSE, (GdkEventMask)(GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK ), @@ -154,9 +156,9 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge m.unSetup(); } - sp_guideline_set_position(SP_GUIDELINE(guide), from_2geom(event_dt)); - desktop->set_coordinate_status(to_2geom(event_dt)); - desktop->setPosition(to_2geom(event_dt)); + sp_guideline_set_position(SP_GUIDELINE(guide), event_dt); + desktop->set_coordinate_status(event_dt); + desktop->setPosition(event_dt); } break; case GDK_BUTTON_RELEASE: @@ -185,13 +187,13 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); Inkscape::XML::Node *repr = xml_doc->createElement("sodipodi:guide"); sp_repr_set_point(repr, "orientation", normal); - sp_repr_set_point(repr, "position", from_2geom(event_dt)); + sp_repr_set_point(repr, "position", event_dt); desktop->namedview->appendChild(repr); Inkscape::GC::release(repr); DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_NONE, _("Create guide")); } - desktop->set_coordinate_status(from_2geom(event_dt)); + desktop->set_coordinate_status(event_dt); } default: break; @@ -230,7 +232,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data) gint ret = FALSE; SPGuide *guide = SP_GUIDE(data); - SPDesktop *desktop = static_cast<SPDesktop*>(gtk_object_get_data(GTK_OBJECT(item->canvas), "SPDesktop")); + SPDesktop *desktop = static_cast<SPDesktop*>(g_object_get_data(G_OBJECT(item->canvas), "SPDesktop")); switch (event->type) { case GDK_2BUTTON_PRESS: @@ -314,16 +316,24 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data) case SP_DRAG_ROTATE: { Geom::Point pt = motion_dt - guide->point_on_line; - double angle = std::atan2(pt[Geom::Y], pt[Geom::X]); + Geom::Angle angle(pt); if (event->motion.state & GDK_CONTROL_MASK) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); unsigned const snaps = abs(prefs->getInt("/options/rotationsnapsperpi/value", 12)); + bool const relative_snaps = abs(prefs->getBool("/options/relativeguiderotationsnap/value", false)); if (snaps) { - double sections = floor(angle * snaps / M_PI + .5); - angle = (M_PI / snaps) * sections; + if (relative_snaps) { + Geom::Angle orig_angle(guide->normal_to_line); + Geom::Angle snap_angle = angle - orig_angle; + double sections = floor(snap_angle.radians0() * snaps / M_PI + .5); + angle = (M_PI / snaps) * sections + orig_angle.radians0(); + } else { + double sections = floor(angle.radians0() * snaps / M_PI + .5); + angle = (M_PI / snaps) * sections; + } } } - sp_guide_set_normal(*guide, Geom::Point(1,0) * Geom::Rotate(angle + M_PI_2), false); + sp_guide_set_normal(*guide, Geom::Point::polar(angle).cw(), false); break; } case SP_DRAG_MOVE_ORIGIN: @@ -336,8 +346,8 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data) break; } moved = true; - desktop->set_coordinate_status(from_2geom(motion_dt)); - desktop->setPosition(from_2geom(motion_dt)); + desktop->set_coordinate_status(motion_dt); + desktop->setPosition(motion_dt); ret = TRUE; } @@ -380,16 +390,24 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data) case SP_DRAG_ROTATE: { Geom::Point pt = event_dt - guide->point_on_line; - double angle = std::atan2(pt[Geom::Y], pt[Geom::X]); - if (event->motion.state & GDK_CONTROL_MASK) { + Geom::Angle angle(pt); + if (event->motion.state & GDK_CONTROL_MASK) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); unsigned const snaps = abs(prefs->getInt("/options/rotationsnapsperpi/value", 12)); + bool const relative_snaps = abs(prefs->getBool("/options/relativeguiderotationsnap/value", false)); if (snaps) { - double sections = floor(angle * snaps / M_PI + .5); - angle = (M_PI / snaps) * sections; + if (relative_snaps) { + Geom::Angle orig_angle(guide->normal_to_line); + Geom::Angle snap_angle = angle - orig_angle; + double sections = floor(snap_angle.radians0() * snaps / M_PI + .5); + angle = (M_PI / snaps) * sections + orig_angle.radians0(); + } else { + double sections = floor(angle.radians0() * snaps / M_PI + .5); + angle = (M_PI / snaps) * sections; + } } } - sp_guide_set_normal(*guide, Geom::Point(1,0) * Geom::Rotate(angle + M_PI_2), true); + sp_guide_set_normal(*guide, Geom::Point::polar(angle).cw(), true); break; } case SP_DRAG_MOVE_ORIGIN: @@ -412,8 +430,8 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data) _("Delete guide")); } moved = false; - desktop->set_coordinate_status(from_2geom(event_dt)); - desktop->setPosition (from_2geom(event_dt)); + desktop->set_coordinate_status(event_dt); + desktop->setPosition (event_dt); } drag_type = SP_DRAG_NONE; sp_canvas_item_ungrab(item, event->button.time); |
