fixes focus issue

This commit is contained in:
kazu
2018-07-26 08:44:53 +02:00
parent 0b7c8756a9
commit 9a07790ec6
5 changed files with 39 additions and 42 deletions

View File

@@ -72,22 +72,24 @@ private:
}
void processPress(QMouseEvent* e, MapView2D* m, const Point2 p, MapModelElement* elem) {
bool processPress(QMouseEvent* e, MapView2D* m, const Point2 p, MapModelElement* elem) {
MV2DElement* me = elem->getMV2D();
if (!me) {return;}
if (!me) {return false;}
// left mouse button?
if (e->button() == Qt::MouseButton::LeftButton) {
// element has selectedable nodes? try to select one
if (dynamic_cast<HasMoveableNodes*>(me)) {
if (selectNode(m, p, dynamic_cast<HasMoveableNodes*>(me))) {return;}
if (selectNode(m, p, dynamic_cast<HasMoveableNodes*>(me))) {return true;}
}
}
// let the element itself process all events
me->mousePressed(m, p);
return false;
}
void processMove(QMouseEvent* e, MapView2D* m, const Point2 p, MapModelElement* elem) {
@@ -248,34 +250,29 @@ private:
const float g = m->getScaler().sm(15); // increase each BBox by 15 px (needed mainly for hor/ver lines)
#pragma message "which elements to select? among all currently visible? or only among the selected layer?"
// get all elements with bounding-box matchings
std::vector<MapModelElement*> possible;
// for (MapModelElement* el : m->getModel()->getSelectedLayerElements()) {
for (MapModelElement* el : m->getModel()->getVisibleElements()) {
if (!el->getMV2D()) {continue;}
BBox2 bbox = el->getMV2D()->getBoundingBox(); // elements 2D bbox
bbox.grow(Point2(g, g)); // grow a little (needed for straight lines)
if (bbox.contains(p2)) {possible.push_back(el);} // intersection?
}
// among those, find the best-matching one (smallest distance to an intersection)
auto lambda = [&] (const MapModelElement* el1, const MapModelElement* el2) {return el1->getMV2D()->getMinDistanceXY(p2) < el2->getMV2D()->getMinDistanceXY(p2);};
auto it = std::min_element(possible.begin(), possible.end(), lambda);
MapModelElement* el = (it == possible.end()) ? (nullptr) : (*it);
// focus changed? -> unfocus the old one (if any)
if (setFocused(m, el)) {
if (focused && processPress(e, m, p2, focused)) {
;
} else {
// focus kept. provide the currently focused element with events
if (focused) {
processPress(e, m, p2, focused);
// get all elements with bounding-box matchings
std::vector<MapModelElement*> possible;
// for (MapModelElement* el : m->getModel()->getSelectedLayerElements()) {
for (MapModelElement* el : m->getModel()->getVisibleElements()) {
if (!el->getMV2D()) {continue;}
BBox2 bbox = el->getMV2D()->getBoundingBox(); // elements 2D bbox
bbox.grow(Point2(g, g)); // grow a little (needed for straight lines)
if (bbox.contains(p2)) {possible.push_back(el);} // intersection?
}
// among those, find the best-matching one (smallest distance to an intersection)
auto lambda = [&] (const MapModelElement* el1, const MapModelElement* el2) {return el1->getMV2D()->getMinDistanceXY(p2) < el2->getMV2D()->getMinDistanceXY(p2);};
auto it = std::min_element(possible.begin(), possible.end(), lambda);
MapModelElement* el = (it == possible.end()) ? (nullptr) : (*it);
// focus the new element, unfocus the old one
if (setFocused(m, el)) {
;
}
}