summaryrefslogtreecommitdiffstats
path: root/src/desktop-events.cpp
diff options
context:
space:
mode:
authorAndrew Higginson <at.higginson@gmail.com>2011-12-27 21:04:47 +0000
committerAndrew <at.higginson@gmail.com>2011-12-27 21:04:47 +0000
commit80960b623a99aae1402ab651b2974ef544ed3b03 (patch)
treeba49d42c2789e9e11f805e2d5263e10f9fedeef8 /src/desktop-events.cpp
parenttry to fix bug (diff)
parentGDL: Cherry-pick upstream patch 73852 (2011-03-23) - Add missing return value. (diff)
downloadinkscape-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.cpp62
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);