diff --git a/src/desktop-events.cpp b/src/desktop-events.cpp
index a2dc1a492bfcef863b2180273d25237db3ebfaa6..90c02a7723b0fffc5d8d51748442de777a5d5000 100644 (file)
--- a/src/desktop-events.cpp
+++ b/src/desktop-events.cpp
#include "message-context.h"
#include "xml/repr.h"
#include "dialogs/guidelinedialog.h"
+#include "snap.h"
/* Root item handler */
-
int sp_desktop_root_handler(SPCanvasItem *item, GdkEvent *event, SPDesktop *desktop)
{
return sp_event_context_root_handler(desktop->event_context, event);
}
-/*
- * fixme: this conatins a hack, to deal with deleting a view, which is
- * completely on another view, in which case active_desktop will not be updated
- *
- */
-
-int sp_desktop_item_handler(SPCanvasItem *item, GdkEvent *event, gpointer data)
-{
- gpointer ddata = gtk_object_get_data(GTK_OBJECT(item->canvas), "SPDesktop");
- g_return_val_if_fail(ddata != NULL, FALSE);
-
- SPDesktop *desktop = static_cast<SPDesktop*>(ddata);
-
- return sp_event_context_item_handler(desktop->event_context, SP_ITEM(data), event);
-}
-
static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dtw, bool horiz)
{
@@ -93,10 +77,15 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge
case GDK_MOTION_NOTIFY:
if (dragging) {
NR::Point const event_w(sp_canvas_window_to_world(dtw->canvas, event_win));
- NR::Point const event_dt(desktop->w2d(event_w));
+ NR::Point event_dt(desktop->w2d(event_w));
+
+ SnapManager const &m = desktop->namedview->snap_manager;
+ event_dt = m.guideSnap(event_dt, component_vectors[horiz ? NR::Y : NR::X]).getPoint();
+
double const guide_pos_dt = event_dt[ horiz
? NR::Y
: NR::X ];
+
sp_guideline_set_position(SP_GUIDELINE(guide), guide_pos_dt);
desktop->set_coordinate_status(event_dt);
desktop->setPosition (event_dt);
@@ -115,7 +104,8 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge
: wx )
>= 0 )
{
- Inkscape::XML::Node *repr = sp_repr_new("sodipodi:guide");
+ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(desktop->doc());
+ Inkscape::XML::Node *repr = xml_doc->createElement("sodipodi:guide");
repr->setAttribute("orientation", (horiz) ? "horizontal" : "vertical");
double const guide_pos_dt = event_dt[ horiz
? NR::Y
@@ -123,7 +113,8 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge
sp_repr_set_svg_double(repr, "position", guide_pos_dt);
SP_OBJECT_REPR(desktop->namedview)->appendChild(repr);
Inkscape::GC::release(repr);
- sp_document_done(sp_desktop_document(desktop));
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_NONE,
+ _("Create guide"));
}
desktop->set_coordinate_status(event_dt);
}
SPGuide *guide = SP_GUIDE(data);
SPDesktop *desktop = static_cast<SPDesktop*>(gtk_object_get_data(GTK_OBJECT(item->canvas), "SPDesktop"));
- switch (event->type) {
+ switch (event->type) {
case GDK_2BUTTON_PRESS:
if (event->button.button == 1) {
dragging = false;
if (dragging) {
NR::Point const motion_w(event->motion.x,
event->motion.y);
- NR::Point const motion_dt(desktop->w2d(motion_w));
+ NR::Point motion_dt(desktop->w2d(motion_w));
+
+ // This is for snapping while dragging existing guidelines. New guidelines,
+ // which are dragged off the ruler, are being snapped in sp_dt_ruler_event
+ SnapManager const &m = desktop->namedview->snap_manager;
+ motion_dt = m.guideSnap(motion_dt, guide->normal).getPoint();
+
sp_guide_moveto(*guide, sp_guide_position_from_pt(guide, motion_dt), false);
moved = true;
desktop->set_coordinate_status(motion_dt);
if (moved) {
NR::Point const event_w(event->button.x,
event->button.y);
- NR::Point const event_dt(desktop->w2d(event_w));
+ NR::Point event_dt(desktop->w2d(event_w));
+
+ //If we don't snap here again, it will end up at the current mouse position
+ //whereas it might have been at a snapped position a millisecond before.
+ //See GDK_MOTION_NOTIFY above. Why's that????
+ SnapManager const &m = desktop->namedview->snap_manager;
+ event_dt = m.guideSnap(event_dt, guide->normal).getPoint();
+
if (sp_canvas_world_pt_inside_window(item->canvas, event_w)) {
sp_guide_moveto(*guide, sp_guide_position_from_pt(guide, event_dt), true);
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_NONE,
+ _("Move guide"));
} else {
/* Undo movement of any attached shapes. */
sp_guide_moveto(*guide, guide->position, false);
sp_guide_remove(guide);
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_NONE,
+ _("Delete guide"));
}
moved = false;
- sp_document_done(sp_desktop_document(desktop));
desktop->set_coordinate_status(event_dt);
desktop->setPosition (event_dt);
}