diff options
| author | Marc Jeanmougin <marc@jeanmougin.fr> | 2018-11-04 09:35:02 +0000 |
|---|---|---|
| committer | Marc Jeanmougin <marc@jeanmougin.fr> | 2018-11-04 09:35:02 +0000 |
| commit | 3fa952e8e632b366658ed0f7e676fd0736e2909b (patch) | |
| tree | ee44ced77c014c0181bb9163fbc524b3ca550fa5 /src | |
| parent | Use monospace digits font in messages and spinbuttons (diff) | |
| parent | ToolBase::root_handler: fix keyboard movement for KEY_Up and KEY_Down events (diff) | |
| download | inkscape-3fa952e8e632b366658ed0f7e676fd0736e2909b.tar.gz inkscape-3fa952e8e632b366658ed0f7e676fd0736e2909b.zip | |
Merge branch 'fix-knot-selection' of gitlab.com:ao2/inkscape
Diffstat (limited to 'src')
| -rw-r--r-- | src/knot-holder-entity.cpp | 2 | ||||
| -rw-r--r-- | src/knot-holder-entity.h | 1 | ||||
| -rw-r--r-- | src/knot.cpp | 4 | ||||
| -rw-r--r-- | src/knotholder.cpp | 54 | ||||
| -rw-r--r-- | src/knotholder.h | 1 | ||||
| -rw-r--r-- | src/ui/tools/tool-base.cpp | 8 |
6 files changed, 35 insertions, 35 deletions
diff --git a/src/knot-holder-entity.cpp b/src/knot-holder-entity.cpp index 3664bbc81..9408e7942 100644 --- a/src/knot-holder-entity.cpp +++ b/src/knot-holder-entity.cpp @@ -58,6 +58,7 @@ void KnotHolderEntity::create(SPDesktop *desktop, SPItem *item, KnotHolder *pare update_knot(); knot->show(); + _mousedown_connection = knot->mousedown_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_mousedown_handler)); _moved_connection = knot->moved_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_moved_handler)); _click_connection = knot->click_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_clicked_handler)); _ungrabbed_connection = knot->ungrabbed_signal.connect(sigc::mem_fun(*parent_holder, &KnotHolder::knot_ungrabbed_handler)); @@ -66,6 +67,7 @@ void KnotHolderEntity::create(SPDesktop *desktop, SPItem *item, KnotHolder *pare KnotHolderEntity::~KnotHolderEntity() { + _mousedown_connection.disconnect(); _moved_connection.disconnect(); _click_connection.disconnect(); _ungrabbed_connection.disconnect(); diff --git a/src/knot-holder-entity.h b/src/knot-holder-entity.h index e6efaa7e8..5e7868b70 100644 --- a/src/knot-holder-entity.h +++ b/src/knot-holder-entity.h @@ -87,6 +87,7 @@ public: unsigned int _ungrab_handler_id; private: + sigc::connection _mousedown_connection; sigc::connection _moved_connection; sigc::connection _click_connection; sigc::connection _ungrabbed_connection; diff --git a/src/knot.cpp b/src/knot.cpp index d861004f4..ab83eff42 100644 --- a/src/knot.cpp +++ b/src/knot.cpp @@ -81,8 +81,8 @@ SPKnot::SPKnot(SPDesktop *desktop, gchar const *tip) this->fill[SP_KNOT_STATE_NORMAL] = 0xffffff00; this->fill[SP_KNOT_STATE_MOUSEOVER] = 0xff0000ff; - this->fill[SP_KNOT_STATE_DRAGGING] = 0x0000ffff; - this->fill[SP_KNOT_STATE_SELECTED] = 0xff0000ff; + this->fill[SP_KNOT_STATE_DRAGGING] = 0xff0000ff; + this->fill[SP_KNOT_STATE_SELECTED] = 0x0000ffff; this->stroke[SP_KNOT_STATE_NORMAL] = 0x01000000; this->stroke[SP_KNOT_STATE_MOUSEOVER] = 0x01000000; diff --git a/src/knotholder.cpp b/src/knotholder.cpp index 1c5e59b2d..7d62ff6a5 100644 --- a/src/knotholder.cpp +++ b/src/knotholder.cpp @@ -76,7 +76,7 @@ KnotHolder::KnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderReleasedFun } KnotHolder::~KnotHolder() { - sp_object_unref(item); + sp_object_unref(item); for (std::list<KnotHolderEntity *>::iterator i = entity.begin(); i != entity.end(); ++i) { @@ -127,22 +127,17 @@ bool KnotHolder::knot_mouseover() const { } void -KnotHolder::knot_clicked_handler(SPKnot *knot, guint state) +KnotHolder::knot_mousedown_handler(SPKnot *knot, guint state) { - KnotHolder *knot_holder = this; - SPItem *saved_item = this->item; - if (!(state & GDK_SHIFT_MASK)) { unselect_knots(); } - for(std::list<KnotHolderEntity *>::iterator i = knot_holder->entity.begin(); i != knot_holder->entity.end(); ++i) { + for(std::list<KnotHolderEntity *>::iterator i = this->entity.begin(); i != this->entity.end(); ++i) { KnotHolderEntity *e = *i; if (!(state & GDK_SHIFT_MASK)) { e->knot->selectKnot(false); } if (e->knot == knot) { - // no need to test whether knot_click exists since it's virtual now - e->knot_click(state); if (!(e->knot->flags & SP_KNOT_SELECTED) || !(state & GDK_SHIFT_MASK)){ e->knot->selectKnot(true); } else { @@ -150,6 +145,19 @@ KnotHolder::knot_clicked_handler(SPKnot *knot, guint state) } } } +} + +void +KnotHolder::knot_clicked_handler(SPKnot *knot, guint state) +{ + SPItem *saved_item = this->item; + + for(std::list<KnotHolderEntity *>::iterator i = this->entity.begin(); i != this->entity.end(); ++i) { + KnotHolderEntity *e = *i; + if (e->knot == knot) + // no need to test whether knot_click exists since it's virtual now + e->knot_click(state); + } { SPShape *savedShape = dynamic_cast<SPShape *>(saved_item); @@ -158,7 +166,7 @@ KnotHolder::knot_clicked_handler(SPKnot *knot, guint state) } } - knot_holder->update_knots(); + this->update_knots(); unsigned int object_verb = SP_VERB_NONE; @@ -185,7 +193,7 @@ KnotHolder::knot_clicked_handler(SPKnot *knot, guint state) } // for drag, this is done by ungrabbed_handler, but for click we must do it here - + if (saved_item) { //increasingly aggressive sanity checks if (saved_item->document) { // enum is unsigned so can't be less than SP_VERB_INVALID @@ -208,7 +216,7 @@ KnotHolder::transform_selected(Geom::Affine transform){ } } -void +void KnotHolder::unselect_knots(){ if (tools_isactive(desktop, TOOLS_NODES)) { Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(desktop->event_context); @@ -238,7 +246,7 @@ KnotHolder::knot_moved_handler(SPKnot *knot, Geom::Point const &p, guint state) this->dragging = true; } - // this was a local change and the knotholder does not need to be recreated: + // this was a local change and the knotholder does not need to be recreated: this->local_change = TRUE; for(std::list<KnotHolderEntity *>::iterator i = this->entity.begin(); i != this->entity.end(); ++i) { @@ -266,23 +274,11 @@ KnotHolder::knot_ungrabbed_handler(SPKnot *knot, guint state) if (this->released) { this->released(this->item); } else { - if (!(state & GDK_SHIFT_MASK)) { - unselect_knots(); - } - for(std::list<KnotHolderEntity *>::iterator i = this->entity.begin(); i != this->entity.end(); ++i) { - KnotHolderEntity *e = *i; - if (!(state & GDK_SHIFT_MASK)) { - e->knot->selectKnot(false); - } - if (e->knot == knot) { - // no need to test whether knot_click exists since it's virtual now - if (!(e->knot->flags & SP_KNOT_SELECTED) || !(state & GDK_SHIFT_MASK)){ - e->knot->selectKnot(true); - } else { - e->knot->selectKnot(false); - } - } - } + // if a point is dragged while not selected, it should select itself, + // even if it was just unselected in the mousedown event handler. + if (!(knot->flags & SP_KNOT_SELECTED)) + knot->selectKnot(true); + SPObject *object = (SPObject *) this->item; // Caution: this call involves a screen update, which may process events, and as a diff --git a/src/knotholder.h b/src/knotholder.h index b82ba61f9..05adb2241 100644 --- a/src/knotholder.h +++ b/src/knotholder.h @@ -51,6 +51,7 @@ public: void update_knots(); void unselect_knots(); + void knot_mousedown_handler(SPKnot *knot, unsigned int state); void knot_moved_handler(SPKnot *knot, Geom::Point const &p, unsigned int state); void knot_clicked_handler(SPKnot *knot, unsigned int state); void knot_ungrabbed_handler(SPKnot *knot, unsigned int state); diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index 8637b640d..20aad1424 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -651,10 +651,10 @@ bool ToolBase::root_handler(GdkEvent* event) { acceleration, desktop->getCanvas())); gobble_key_events(get_latin_keyval(&event->key), GDK_CONTROL_MASK); - this->desktop->scroll_relative(Geom::Point(0, i)); + this->desktop->scroll_relative(Geom::Point(0, -i * desktop->yaxisdir())); ret = TRUE; } else { - ret = _keyboardMove(event->key, Geom::Point(0, 1)); + ret = _keyboardMove(event->key, Geom::Point(0, -desktop->yaxisdir())); } break; @@ -681,10 +681,10 @@ bool ToolBase::root_handler(GdkEvent* event) { acceleration, desktop->getCanvas())); gobble_key_events(get_latin_keyval(&event->key), GDK_CONTROL_MASK); - this->desktop->scroll_relative(Geom::Point(0, -i)); + this->desktop->scroll_relative(Geom::Point(0, i * desktop->yaxisdir())); ret = TRUE; } else { - ret = _keyboardMove(event->key, Geom::Point(0, -1)); + ret = _keyboardMove(event->key, Geom::Point(0, desktop->yaxisdir())); } break; |
