~ubuntu-branches/ubuntu/saucy/merkaartor/saucy

« back to all changes in this revision

Viewing changes to Interaction/CreateSingleWayInteraction.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Bernd Zeimetz
  • Date: 2009-09-13 00:52:12 UTC
  • mto: (1.2.7 upstream) (0.1.3 upstream) (3.1.7 sid)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: james.westby@ubuntu.com-20090913005212-pjecal8zxm07x0fj
ImportĀ upstreamĀ versionĀ 0.14+svnfixes~20090912

Show diffs side-by-side

added added

removed removed

Lines of Context:
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"
6
 
#include "Map/Road.h"
7
 
#include "Map/TrackPoint.h"
8
 
#include "Utils/LineF.h"
9
 
#include "MainWindow.h"
10
 
#include "PropertiesDock.h"
11
 
 
12
 
#include <QtGui/QDockWidget>
13
 
#include <QtGui/QPainter>
14
 
 
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)
18
 
{
19
 
        if (firstNode)
20
 
        {
21
 
                FirstPoint = firstNode->position();
22
 
                LastCursor = view()->projection().project(FirstPoint);
23
 
                HaveFirst = true;
24
 
                if ((theRoad = Road::GetSingleParentRoad(firstNode))) {
25
 
                        if (theRoad->isExtrimity(firstNode)) {
26
 
                                Prepend = (theRoad->get(0) == firstNode) ? true : false;
27
 
                        } else
28
 
                                theRoad = NULL;
29
 
 
30
 
                }
31
 
        }
32
 
}
33
 
 
34
 
CreateSingleWayInteraction::~CreateSingleWayInteraction()
35
 
{
36
 
}
37
 
 
38
 
void CreateSingleWayInteraction::paintEvent(QPaintEvent* anEvent, QPainter& thePainter)
39
 
{
40
 
        if (theRoad && (!theRoad->layer() || theRoad->isDeleted())) { // The road was begon and then undoed. Restarting....
41
 
                HaveFirst = false;
42
 
                theRoad = NULL;
43
 
        }
44
 
 
45
 
        if (HaveFirst)
46
 
        {
47
 
                QPointF PreviousPoint;
48
 
                if (theRoad && theRoad->size() && !Prepend)
49
 
                        PreviousPoint = view()->projection().project(CAST_NODE(theRoad->get(theRoad->size()-1))->position());
50
 
                else
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());
55
 
 
56
 
                Coord NewPoint = view()->projection().inverse(LastCursor);
57
 
                const double distance = FirstPoint.distanceFrom(NewPoint);
58
 
 
59
 
                QString distanceTag;
60
 
                if (distance < 1.0)
61
 
                        distanceTag = QString("%1 m").arg(int(distance * 1000));
62
 
                else
63
 
                        distanceTag = QString("%1 km").arg(distance, 0, 'f', 3);
64
 
 
65
 
                thePainter.drawText(LastCursor + QPointF(10,-10), distanceTag);
66
 
        }
67
 
        GenericFeatureSnapInteraction<MapFeature>::paintEvent(anEvent,thePainter);
68
 
}
69
 
 
70
 
void CreateSingleWayInteraction::snapMouseMoveEvent(QMouseEvent* ev, MapFeature* aFeature)
71
 
{
72
 
        if (TrackPoint* Pt = dynamic_cast<TrackPoint*>(aFeature))
73
 
                LastCursor = view()->projection().project(Pt);
74
 
        else if (Road* R = dynamic_cast<Road*>(aFeature))
75
 
        {
76
 
                Coord P(projection().inverse(ev->pos()));
77
 
                findSnapPointIndex(R, P);
78
 
                LastCursor = projection().project(P);
79
 
        }
80
 
        else
81
 
                LastCursor = ev->pos();
82
 
        view()->update();
83
 
}
84
 
 
85
 
void CreateSingleWayInteraction::snapMousePressEvent(QMouseEvent* anEvent, MapFeature* aFeature)
86
 
{
87
 
        Q_UNUSED(aFeature)
88
 
        if ((anEvent->buttons() & Qt::LeftButton) )
89
 
                Creating = true;
90
 
}
91
 
 
92
 
void CreateSingleWayInteraction::snapMouseReleaseEvent(QMouseEvent* anEvent, MapFeature* aFeature)
93
 
{
94
 
        if ( Creating && !panning() )
95
 
        {
96
 
                TrackPoint* Pt = dynamic_cast<TrackPoint*>(aFeature);
97
 
                if (!HaveFirst)
98
 
                {
99
 
                        HaveFirst = true;
100
 
                        if (Pt)
101
 
                                FirstNode = Pt;
102
 
                        else if (Road* aRoad = dynamic_cast<Road*>(aFeature))
103
 
                        {
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);
114
 
                                FirstNode = N;
115
 
                        }
116
 
                }
117
 
                else
118
 
                {
119
 
                        CommandList* L  = new CommandList();
120
 
                        if (!theRoad)
121
 
                        {
122
 
                                TrackPoint* From = 0;
123
 
                                theRoad = new Road;
124
 
                                if (M_PREFS->apiVersionNum() < 0.6)
125
 
                                        theRoad->setTag("created_by", QString("Merkaartor %1").arg(VERSION));
126
 
                                if (IsCurved)
127
 
                                        theRoad->setTag("smooth","yes");
128
 
                                if (FirstNode) {
129
 
                                        From = FirstNode;
130
 
                                        if (!From->isDirty() && !From->hasOSMId() && From->isUploadable())
131
 
                                                L->add(new AddFeatureCommand(Main->document()->getDirtyOrOriginLayer(),From,true));
132
 
                                }
133
 
                                else
134
 
                                {
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));
139
 
                                }
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);
144
 
                        }
145
 
                        TrackPoint* To = 0;
146
 
                        if (Pt) {
147
 
                                To = Pt;
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()));
151
 
                                }
152
 
                        }
153
 
                        else if (Road* aRoad = dynamic_cast<Road*>(aFeature))
154
 
                        {
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);
165
 
                                To = N;
166
 
                        }
167
 
                        if (!To)
168
 
                        {
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()));
174
 
                                L->setFeature(To);
175
 
                        }
176
 
                        L->setDescription(MainWindow::tr("Add Node %1 to Road %2").arg(To->description()).arg(theRoad->description()));
177
 
                        if (Prepend)
178
 
                                L->add(new RoadAddTrackPointCommand(theRoad,To,(unsigned int)0,Main->document()->getDirtyOrOriginLayer(theRoad)));
179
 
                        else
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);
184
 
                }
185
 
                FirstPoint = view()->projection().inverse(anEvent->pos());
186
 
        }
187
 
        Creating = false;
188
 
        LastCursor = anEvent->pos();
189
 
}
190
 
 
191
 
QCursor CreateSingleWayInteraction::cursor() const
192
 
{
193
 
        return QCursor(Qt::CrossCursor);
194
 
}