diff --git a/src/node-context.cpp b/src/node-context.cpp
index 57af59bd4d8ce945d5d313c692936b5b05a8b480..7efa57290832fb23565c020ddf57e4f448cc8183 100644 (file)
--- a/src/node-context.cpp
+++ b/src/node-context.cpp
SPNodeContext *nc = SP_NODE_CONTEXT(object);
SPEventContext *ec = SP_EVENT_CONTEXT(object);
- sp_canvas_set_snap_delay_active(ec->desktop->canvas, false);
-
ec->enableGrDrag(false);
+
+ if (nc->grabbed) {
+ sp_canvas_item_ungrab(nc->grabbed, GDK_CURRENT_TIME);
+ nc->grabbed = NULL;
+ }
nc->sel_changed_connection.disconnect();
nc->sel_changed_connection.~connection();
nc->_node_message_context = new Inkscape::MessageContext((ec->desktop)->messageStack());
ec->shape_editor->update_statusbar();
-
- sp_canvas_set_snap_delay_active(ec->desktop->canvas, true);
}
static void
@@ -234,27 +235,46 @@ sp_node_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEve
{
gint ret = FALSE;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ SPDesktop *desktop = event_context->desktop;
- if (prefs->getBool("/tools/nodes/pathflash_enabled")) {
- if (prefs->getBool("/tools/nodes/pathflash_unselected")) {
- SPDesktop *desktop = event_context->desktop;
- ShapeEditor* se = event_context->shape_editor;
- Inkscape::Selection *selection = sp_desktop_selection (desktop);
- if (se->has_nodepath() && selection->singleItem()) {
- return ret;
- }
- }
- if (SP_IS_LPE_ITEM(item)) {
- Inkscape::LivePathEffect::Effect *lpe = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(item));
- if (lpe && (lpe->providesOwnFlashPaths() ||
- lpe->pathFlashType() == Inkscape::LivePathEffect::SUPPRESS_FLASH)) {
- // path should be suppressed or permanent; this is handled in
- // sp_node_context_selection_changed()
- return ret;
+ switch (event->type) {
+ case GDK_MOTION_NOTIFY:
+ {
+ // find out actual item we're over, disregarding groups
+ SPItem *actual_item = sp_event_context_find_item (desktop,
+ Geom::Point(event->button.x, event->button.y), FALSE, TRUE);
+ if (!actual_item)
+ break;
+
+
+ if (prefs->getBool("/tools/nodes/pathflash_enabled")) {
+ if (prefs->getBool("/tools/nodes/pathflash_unselected")) {
+ // do not flash if we have some path selected and a single item in selection (i.e. it
+ // is the same path that we're editing)
+ SPDesktop *desktop = event_context->desktop;
+ ShapeEditor* se = event_context->shape_editor;
+ Inkscape::Selection *selection = sp_desktop_selection (desktop);
+ if (se->has_nodepath() && selection->singleItem()) {
+ break;
+ }
+ }
+ if (SP_IS_LPE_ITEM(actual_item)) {
+ Inkscape::LivePathEffect::Effect *lpe = sp_lpe_item_get_current_lpe(SP_LPE_ITEM(actual_item));
+ if (lpe && (lpe->providesOwnFlashPaths() ||
+ lpe->pathFlashType() == Inkscape::LivePathEffect::SUPPRESS_FLASH)) {
+ // path should be suppressed or permanent; this is handled in
+ // sp_node_context_selection_changed()
+ break;
+ }
+ }
+ guint timeout = prefs->getInt("/tools/nodes/pathflash_timeout", 500);
+ sp_node_context_flash_path(event_context, actual_item, timeout);
}
}
- guint timeout = prefs->getInt("/tools/nodes/pathflash_timeout", 500);
- sp_node_context_flash_path(event_context, item, timeout);
+ break;
+
+ default:
+ break;
}
if (((SPEventContextClass *) parent_class)->item_handler)
if (!(event->button.state & GDK_SHIFT_MASK)) {
if (!nc->drag) {
if (se->has_nodepath() && selection->single() /* && item_over */) {
- // save drag origin
+ // save drag origin
bool over_stroke = se->is_over_stroke(Geom::Point(event->button.x, event->button.y), true);
//only dragging curves
if (over_stroke) {
event->button.y);
Geom::Point const button_dt(desktop->w2d(button_w));
Inkscape::Rubberband::get(desktop)->start(desktop, button_dt);
+
+ if (nc->grabbed) {
+ sp_canvas_item_ungrab(nc->grabbed, event->button.time);
+ nc->grabbed = NULL;
+ }
+
+ sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
+ GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK,
+ NULL, event->button.time);
+ nc->grabbed = SP_CANVAS_ITEM(desktop->acetate);
+
nc->current_state = SP_NODE_CONTEXT_INACTIVE;
desktop->updateNow();
ret = TRUE;
if (over_stroke || nc->added_node) {
switch (event->type) {
case GDK_BUTTON_RELEASE:
- if (event->button.state & GDK_CONTROL_MASK && event->button.state & GDK_MOD1_MASK) {
+ if (event->button.state & GDK_CONTROL_MASK && event->button.state & GDK_MOD1_MASK) {
//add a node
se->add_node_near_point();
} else {
}
desktop->updateNow();
}
- break;
+ break;
case GDK_2BUTTON_PRESS:
//add a node
se->add_node_near_point();
desktop->updateNow();
}
Inkscape::Rubberband::get(desktop)->stop();
+ if (nc->grabbed) {
+ sp_canvas_item_ungrab(nc->grabbed, event->button.time);
+ nc->grabbed = NULL;
+ }
ret = TRUE;
break;
}
}
if (event->type == GDK_BUTTON_RELEASE) {
- event_context->xp = event_context->yp = 0;
+ event_context->xp = event_context->yp = 0;
if (event->button.button == 1) {
- Geom::OptRect b = Inkscape::Rubberband::get(desktop)->getRectangle();
+ Geom::OptRect b = Inkscape::Rubberband::get(desktop)->getRectangle();
if (se->hits_curve() && !event_context->within_tolerance) { //drag curve
se->finish_drag();
} else if (b && !event_context->within_tolerance) { // drag to select
se->select_rect(*b, event->button.state & GDK_SHIFT_MASK);
} else {
- if (!(nc->rb_escaped)) { // unless something was cancelled
+ if (!(nc->rb_escaped)) { // unless something was canceled
if (se->has_selection())
se->deselect();
else
}
ret = TRUE;
Inkscape::Rubberband::get(desktop)->stop();
+
+ if (nc->grabbed) {
+ sp_canvas_item_ungrab(nc->grabbed, event->button.time);
+ nc->grabbed = NULL;
+ }
+
desktop->updateNow();
nc->rb_escaped = false;
nc->drag = FALSE;