1
#include "Interaction/CreateSingleWayInteraction.h"
2
#include "Command/DocumentCommands.h"
3
#include "Command/RoadCommands.h"
4
#include "Command/TrackPointCommands.h"
5
#include "Map/Painting.h"
7
#include "Map/TrackPoint.h"
8
#include "Utils/LineF.h"
9
#include "MainWindow.h"
10
#include "PropertiesDock.h"
12
#include <QtGui/QDockWidget>
13
#include <QtGui/QPainter>
15
CreateSingleWayInteraction::CreateSingleWayInteraction(MainWindow* aMain, MapView* aView, TrackPoint *firstNode, bool aCurved)
16
: GenericFeatureSnapInteraction<MapFeature>(aView), Main(aMain), theRoad(0), FirstPoint(0,0),
17
FirstNode(firstNode), HaveFirst(false), Prepend(false), IsCurved(aCurved), Creating(false)
21
FirstPoint = firstNode->position();
22
LastCursor = view()->projection().project(FirstPoint);
24
if ((theRoad = Road::GetSingleParentRoad(firstNode))) {
25
if (theRoad->isExtrimity(firstNode)) {
26
Prepend = (theRoad->get(0) == firstNode) ? true : false;
34
CreateSingleWayInteraction::~CreateSingleWayInteraction()
38
void CreateSingleWayInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter)
40
if (theRoad && (!theRoad->layer() || theRoad->isDeleted())) { // The road was begon and then undoed. Restarting....
47
QPointF PreviousPoint;
48
if (theRoad && theRoad->size() && !Prepend)
49
PreviousPoint = view()->projection().project(CAST_NODE(theRoad->get(theRoad->size()-1))->position());
51
PreviousPoint = view()->projection().project(FirstPoint);
52
QBrush SomeBrush(QColor(0xff,0x77,0x11,128));
53
QPen TP(SomeBrush,projection().pixelPerM()*4+2);
54
::draw(thePainter,TP,MapFeature::UnknownDirection, PreviousPoint,LastCursor ,4 ,view()->projection());
56
Coord NewPoint = view()->projection().inverse(LastCursor);
57
const double distance = FirstPoint.distanceFrom(NewPoint);
61
distanceTag = QString("%1 m").arg(int(distance * 1000));
63
distanceTag = QString("%1 km").arg(distance, 0, 'f', 3);
65
thePainter.drawText(LastCursor + QPointF(10,-10), distanceTag);
67
GenericFeatureSnapInteraction<MapFeature>::paintEvent(anEvent,thePainter);
70
void CreateSingleWayInteraction::snapMouseMoveEvent(QMouseEvent* ev, MapFeature* aFeature)
72
if (TrackPoint* Pt = dynamic_cast<TrackPoint*>(aFeature))
73
LastCursor = view()->projection().project(Pt);
74
else if (Road* R = dynamic_cast<Road*>(aFeature))
76
Coord P(projection().inverse(ev->pos()));
77
findSnapPointIndex(R, P);
78
LastCursor = projection().project(P);
81
LastCursor = ev->pos();
85
void CreateSingleWayInteraction::snapMousePressEvent(QMouseEvent* anEvent, MapFeature* aFeature)
88
if ((anEvent->buttons() & Qt::LeftButton) )
92
void CreateSingleWayInteraction::snapMouseReleaseEvent(QMouseEvent* anEvent, MapFeature* aFeature)
94
if ( Creating && !panning() )
96
TrackPoint* Pt = dynamic_cast<TrackPoint*>(aFeature);
102
else if (Road* aRoad = dynamic_cast<Road*>(aFeature))
104
Coord P(projection().inverse(anEvent->pos()));
105
unsigned int SnapIdx = findSnapPointIndex(aRoad, P);
106
TrackPoint* N = new TrackPoint(P);
107
if (M_PREFS->apiVersionNum() < 0.6)
108
N->setTag("created_by", QString("Merkaartor %1").arg(VERSION));
109
CommandList* theList = new CommandList(MainWindow::tr("Create Node %1 in Road %2").arg(N->description()).arg(aRoad->description()), N);
110
theList->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),N,true));
111
theList->add(new RoadAddTrackPointCommand(aRoad,N,SnapIdx));
112
document()->addHistory(theList);
113
view()->invalidate(true, false);
119
CommandList* L = new CommandList();
122
TrackPoint* From = 0;
124
if (M_PREFS->apiVersionNum() < 0.6)
125
theRoad->setTag("created_by", QString("Merkaartor %1").arg(VERSION));
127
theRoad->setTag("smooth","yes");
130
if (!From->isDirty() && !From->hasOSMId() && From->isUploadable())
131
L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),From,true));
135
From = new TrackPoint(FirstPoint);
136
if (M_PREFS->apiVersionNum() < 0.6)
137
From->setTag("created_by", QString("Merkaartor %1").arg(VERSION));
138
L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),From,true));
140
L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),theRoad,true));
141
L->add(new RoadAddTrackPointCommand(theRoad,From));
142
L->setDescription(MainWindow::tr("Create Road: %1").arg(theRoad->description()));
143
L->setFeature(theRoad);
148
if (!To->isDirty() && !To->hasOSMId() && To->isUploadable()) {
149
L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),To,true));
150
L->setDescription(MainWindow::tr("Create Node: %1").arg(To->description()));
153
else if (Road* aRoad = dynamic_cast<Road*>(aFeature))
155
Coord P(projection().inverse(anEvent->pos()));
156
unsigned int SnapIdx = findSnapPointIndex(aRoad, P);
157
TrackPoint* N = new TrackPoint(P);
158
if (M_PREFS->apiVersionNum() < 0.6)
159
N->setTag("created_by", QString("Merkaartor %1").arg(VERSION));
160
CommandList* theList = new CommandList(MainWindow::tr("Create Node %1 in Road %2").arg(N->description()).arg(aRoad->description()), N);
161
theList->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),N,true));
162
theList->add(new RoadAddTrackPointCommand(aRoad,N,SnapIdx,Main->document()->getDirtyOrOriginLayer(aRoad)));
163
document()->addHistory(theList);
164
view()->invalidate(true, false);
169
To = new TrackPoint(view()->projection().inverse(anEvent->pos()));
170
if (M_PREFS->apiVersionNum() < 0.6)
171
To->setTag("created_by", QString("Merkaartor %1").arg(VERSION));
172
L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),To,true));
173
L->setDescription(MainWindow::tr("Create Node %1 in Road %2").arg(To->description()).arg(theRoad->description()));
176
L->setDescription(MainWindow::tr("Add Node %1 to Road %2").arg(To->description()).arg(theRoad->description()));
178
L->add(new RoadAddTrackPointCommand(theRoad,To,(unsigned int)0,Main->document()->getDirtyOrOriginLayer(theRoad)));
180
L->add(new RoadAddTrackPointCommand(theRoad,To,Main->document()->getDirtyOrOriginLayer(theRoad)));
181
document()->addHistory(L);
182
view()->invalidate(true, false);
183
Main->properties()->setSelection(theRoad);
185
FirstPoint = view()->projection().inverse(anEvent->pos());
188
LastCursor = anEvent->pos();
191
QCursor CreateSingleWayInteraction::cursor() const
193
return QCursor(Qt::CrossCursor);