diff --git a/src/node-context.cpp b/src/node-context.cpp
index 44dbabcb0dbf059310b0002621f10148d8464c95..7efa57290832fb23565c020ddf57e4f448cc8183 100644 (file)
--- a/src/node-context.cpp
+++ b/src/node-context.cpp
SPEventContext *ec = SP_EVENT_CONTEXT(object);
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();
@@ -230,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 */) {
- sp_event_context_snap_window_open(event_context);
// save drag origin
bool over_stroke = se->is_over_stroke(Geom::Point(event->button.x, event->button.y), true);
//only dragging curves
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;
}
desktop->updateNow();
}
- sp_event_context_snap_window_closed(event_context);
- break;
+ break;
case GDK_2BUTTON_PRESS:
//add a node
se->add_node_near_point();
nc->added_node = true;
- sp_event_context_snap_window_closed(event_context);
break;
default:
break;
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;
}
}
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;