void RotateInteraction::snapMouseReleaseEvent(QMouseEvent * anEvent, Feature* /*Closer*/) { Q_UNUSED(anEvent); if (Angle != 0.0 && Rotating.size() && !panning()) { CommandList* theList; theList = new CommandList(MainWindow::tr("Rotate Feature").arg(Rotating[0]->id().numId), Rotating[0]); for (int i=0; i<Rotating.size(); ++i) { if (NodeOrigin && Rotating[i] == OriginNode) continue; Rotating[i]->setPosition(OriginalPosition[i]); if (Rotating[i]->layer()->isTrack()) theList->add(new MoveNodeCommand(Rotating[i],rotatePosition(OriginalPosition[i], Angle), Rotating[i]->layer())); else theList->add(new MoveNodeCommand(Rotating[i],rotatePosition(OriginalPosition[i], Angle), document()->getDirtyOrOriginLayer(Rotating[i]->layer()))); } document()->addHistory(theList); view()->invalidate(true, false); } Angle = 0.0; Rotating.clear(); OriginalPosition.clear(); clearNoSnap(); }
void ScaleInteraction::snapMouseReleaseEvent(QMouseEvent * anEvent, Feature* /*Closer*/) { Q_UNUSED(anEvent); if (Radius != 1.0 && Scaling.size() && !panning()) { CommandList* theList; theList = new CommandList(MainWindow::tr("Scale Feature").arg(Scaling[0]->id().numId), Scaling[0]); for (int i=0; i<Scaling.size(); ++i) { if (NodeOrigin && Scaling[i] == OriginNode) continue; Scaling[i]->setPosition(OriginalPosition[i]); if (Scaling[i]->layer()->isTrack()) theList->add(new MoveNodeCommand(Scaling[i],scalePosition(OriginalPosition[i], Radius), Scaling[i]->layer())); else theList->add(new MoveNodeCommand(Scaling[i],scalePosition(OriginalPosition[i], Radius), document()->getDirtyOrOriginLayer(Scaling[i]->layer()))); } document()->addHistory(theList); view()->invalidate(true, true, false); } view()->setInteracting(false); Radius = 1.0; Scaling.clear(); OriginalPosition.clear(); clearNoSnap(); }
bool EditInteraction::isIdle() const { if (Dragging && !(StartDrag == EndDrag)) return false; if (panning()) return false; return true; }
void RotateInteraction::snapMouseMoveEvent(QMouseEvent* anEvent, Feature* /*Closer*/) { if (Rotating.size() && !panning()) { Angle = calculateNewAngle(anEvent); for (int i=0; i<Rotating.size(); ++i) { if (NodeOrigin && Rotating[i] == OriginNode) continue; Rotating[i]->setPosition(rotatePosition(OriginalPosition[i], Angle)); } view()->invalidate(true, false); } }
void ScaleInteraction::snapMouseMoveEvent(QMouseEvent* anEvent, Feature* /*Closer*/) { if (Scaling.size() && !panning()) { Radius = distance(ScaleCenter,anEvent->pos()) / distance(ScaleCenter, COORD_TO_XY(StartDragPosition)); for (int i=0; i<Scaling.size(); ++i) { if (NodeOrigin && Scaling[i] == OriginNode) continue; Scaling[i]->setPosition(scalePosition(OriginalPosition[i], Radius)); } view()->invalidate(true, true, false); } }
void MoveNodeInteraction::snapMouseReleaseEvent(QMouseEvent * event, Feature* Closer) { if (event->button() != Qt::LeftButton) return; if (Moving.size() && !panning() && HasMoved) { Coord Diff(calculateNewPosition(event,Closer, theList)-StartDragPosition); if (Moving.size() > 1) { theList->setDescription(MainWindow::tr("Move Nodes")); theList->setFeature(Moving[0]); } else { if (!Virtual) { theList->setDescription(MainWindow::tr("Move Node %1").arg(Moving[0]->id().numId)); theList->setFeature(Moving[0]); } } QSet<Way*> WaysToUpdate; for (int i=0; i<Moving.size(); ++i) { Moving[i]->setPosition(OriginalPosition[i]); if (Moving[i]->layer()->isTrack()) theList->add(new MoveNodeCommand(Moving[i],OriginalPosition[i]+Diff, Moving[i]->layer())); else theList->add(new MoveNodeCommand(Moving[i],OriginalPosition[i]+Diff, document()->getDirtyOrOriginLayer(Moving[i]->layer()))); for (int j=0; j<Moving[i]->sizeParents(); ++j) { if (Way* aRoad = CAST_WAY(Moving[i]->getParent(j))) WaysToUpdate << aRoad; else { Feature* f = CAST_FEATURE(Moving[i]->getParent(j)); if (f) g_backend.sync(f); } } } foreach (Way* w, WaysToUpdate) { g_backend.sync(w); }
void EditInteraction::snapMouseReleaseEvent(QMouseEvent * ev , Feature* aLast) { Qt::KeyboardModifiers modifiers = ev->modifiers(); if (ev->button() != Qt::LeftButton) return; if (Dragging) { QList<Feature*> List; EndDrag = XY_TO_COORD(ev->pos()); CoordBox DragBox(StartDrag, EndDrag); for (VisibleFeatureIterator it(document()); !it.isEnd(); ++it) { if (it.get()->isReadonly()) continue; if (modifiersForGreedyAdd(modifiers)) { if (!DragBox.intersects(it.get()->boundingBox())) continue; if (DragBox.contains(it.get()->boundingBox())) List.push_back(it.get()); else { Coord A, B; if (Way* R = dynamic_cast<Way*>(it.get())) { for (int j=1; j<R->size(); ++j) { A = R->getNode(j-1)->position(); B = R->getNode(j)->position(); if (CoordBox::visibleLine(DragBox, A, B)) { List.push_back(R); break; } } } else if (Relation* r = dynamic_cast<Relation*>(it.get())) { for (int k=0; k<r->size(); ++k) { if (Way* R = dynamic_cast<Way*>(r->get(k))) { for (int j=1; j<R->size(); ++j) { A = R->getNode(j-1)->position(); B = R->getNode(j)->position(); if (CoordBox::visibleLine(DragBox, A, B)) { List.push_back(r); break; } } } } } } } else { if (DragBox.contains(it.get()->boundingBox())) List.push_back(it.get()); } } if (!List.isEmpty() || (!modifiersForAdd(modifiers) && !modifiersForToggle(modifiers))) PROPERTIES(setSelection(List)); PROPERTIES(checkMenuStatus()); Dragging = false; view()->update(); } else { if (!panning() && !modifiers) { PROPERTIES(setSelection(aLast)); PROPERTIES(checkMenuStatus()); view()->update(); } } }
Math::Point Blueprint::screenToWorld(QPointF point) const { return Math::Point(-panning() + (-QPointF(width(),height()) / 2.0 + point) / scale()); }