summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Jeanmougin <marc@jeanmougin.fr>2018-11-04 09:35:02 +0000
committerMarc Jeanmougin <marc@jeanmougin.fr>2018-11-04 09:35:02 +0000
commit3fa952e8e632b366658ed0f7e676fd0736e2909b (patch)
treeee44ced77c014c0181bb9163fbc524b3ca550fa5 /src
parentUse monospace digits font in messages and spinbuttons (diff)
parentToolBase::root_handler: fix keyboard movement for KEY_Up and KEY_Down events (diff)
downloadinkscape-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.cpp2
-rw-r--r--src/knot-holder-entity.h1
-rw-r--r--src/knot.cpp4
-rw-r--r--src/knotholder.cpp54
-rw-r--r--src/knotholder.h1
-rw-r--r--src/ui/tools/tool-base.cpp8
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;