source: flair-src/trunk/tools/FlairGCS/src/mapwidget.cpp @ 9

Last change on this file since 9 was 9, checked in by Sanahuja Guillaume, 5 years ago

gcs

File size: 11.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the documentation of Qt. It was originally
8** published as part of Qt Quarterly.
9**
10** $QT_BEGIN_LICENSE:LGPL$
11** Commercial Usage
12** Licensees holding valid Qt Commercial licenses may use this file in
13** accordance with the Qt Commercial License Agreement provided with the
14** Software or, alternatively, in accordance with the terms contained in
15** a written agreement between you and Nokia.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 2.1 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL included in the
21** packaging of this file.  Please review the following information to
22** ensure the GNU Lesser General Public License version 2.1 requirements
23** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24**
25** In addition, as a special exception, Nokia gives you certain additional
26** rights.  These rights are described in the Nokia Qt LGPL Exception
27** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28**
29** GNU General Public License Usage
30** Alternatively, this file may be used under the terms of the GNU
31** General Public License version 3.0 as published by the Free Software
32** Foundation and appearing in the file LICENSE.GPL included in the
33** packaging of this file.  Please review the following information to
34** ensure the GNU General Public License version 3.0 requirements will be
35** met: http://www.gnu.org/copyleft/gpl.html.
36**
37** If you have questions regarding the use of this file, please contact
38** Nokia at qt-info@nokia.com.
39** $QT_END_LICENSE$
40**
41****************************************************************************/
42
43#include <QApplication>
44#include <QGeoCoordinate>
45#include <QGraphicsScene>
46
47#include <QTimer>
48#include <QMenu>
49#include "mapwidget.h"
50#include "Landmark.h"
51#include "Map.h"
52
53using namespace QtMobility;
54
55MapWidget::MapWidget(Map* map,QWidget *parent)
56    : QGraphicsView(parent) {
57    setCursor(Qt::ArrowCursor);
58    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
59    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
60
61    geoMap = 0;
62    dragging = false;
63    pressed = false;
64    landmark_match=NULL;
65    is_uptodate=true;
66    this->map=map;
67
68    m_scene = new QGraphicsScene(this);
69    setScene(m_scene);
70    setMouseTracking(true);
71
72    landmarks=new QList<Landmark*>;
73    landmarks_old=new QList<Landmark*>;
74}
75
76QGraphicsScene *MapWidget::scene(void) const
77{
78    return m_scene;
79}
80
81void MapWidget::setMap(QGraphicsGeoMap *geoMap)
82{
83    m_scene->clear();
84    m_scene->addItem(geoMap);
85    this->geoMap = geoMap;
86    geoMap->resize(m_scene->sceneRect().width(), m_scene->sceneRect().height());
87}
88
89void MapWidget::mousePressEvent(QMouseEvent *event)
90{
91    if (event->button() == Qt::LeftButton)
92    {
93        pressed = true;
94        dragStartPosition = event->pos();
95        QTimer::singleShot(qApp->startDragTime(), this, SLOT(initDrag()));
96        event->accept();
97    }
98
99    if (event->button() == Qt::RightButton)
100    {
101        QMenu *menu = new QMenu("nom", this);
102
103        if(cursor().shape()!=Qt::PointingHandCursor)
104        {
105            QAction *b,*z;//*a,
106            QList<QAction*> go_to_actions;
107            QList<QAction*> centered_actions;
108
109            QMenu *centered_menu=menu->addMenu("centered");
110            for(int i=0;i<points.count();i++)
111            {
112                QAction* action=centered_menu->addAction(points.at(i));
113                centered_actions.append(action);
114                action->setCheckable(true);
115                if(map->centeredPoint()==i)
116                {
117                    action->setChecked(true);
118                }
119                else
120                {
121                    action->setChecked(false);
122                }
123            }
124
125            menu->addSeparator();
126
127            b=menu->addAction("place checkpoint");
128            QMenu *go_to_menu=menu->addMenu("go to");
129            for(int i=0;i<landmarks->count();i++)
130            {
131                QAction* action=go_to_menu->addAction(QString("checkpoint %1").arg(i+1));
132                go_to_actions.append(action);
133            }
134            if(landmarks->count()==0) go_to_menu->setEnabled(false);
135
136            map->appendmenu(menu);
137            z=map->execmenu(this,menu,event->globalPos());
138
139            for(int i=0;i<centered_actions.count();i++)
140            {
141                if(z==centered_actions.at(i))
142                {
143                    if(centered_actions.at(i)->isChecked())
144                    {
145                        map->setCenteredPoint(i);
146                    }
147                    else
148                    {
149                        map->setCenteredPoint(-1);
150                    }
151
152                    break;
153                }
154            }
155
156            if(z==b)
157            {
158                Landmark* landmark=new Landmark(geoMap,geoMap->screenPositionToCoordinate(event->pos()),QString("%1").arg(landmarks->count()+1));
159                landmarks->append(landmark);
160                is_uptodate=false;
161            }
162            for(int i=0;i<go_to_actions.count();i++)
163            {
164                if(z==go_to_actions.at(i))
165                {
166                    map->setCenteredPoint(-1);
167                    geoMap->setCenter(landmarks->at(i)->coordinate());
168                    break;
169                }
170            }
171
172        }
173        else
174        {
175            QAction *a,*z;
176            a=menu->addAction("delete");
177            z=menu->exec(event->globalPos());
178
179            if(z==a)
180            {
181                int i;
182                for(i=0;i<landmarks->count();i++)
183                {
184                    if(landmarks->at(i)->contains(geoMap->screenPositionToCoordinate(event->pos())))
185                    {
186                        delete landmarks->at(i);
187                        landmarks->removeAt(i);
188                        break;
189                    }
190                }
191                for(int j=i;j<landmarks->count();j++)
192                {
193                    landmarks->at(j)->setText(QString("%1").arg(j+1));
194                }
195            }
196        }
197
198        delete menu;
199    }
200}
201
202void MapWidget::initDrag(void)
203{
204    if (pressed && map->isCentered() && landmark_match==NULL) {
205        dragging = true;
206    }
207}
208
209void MapWidget::mouseMoveEvent(QMouseEvent *event)
210{
211    if (!geoMap)
212        return;
213
214    Qt::CursorShape new_cursor;
215    if(dragging==true)
216    {
217        new_cursor=Qt::ClosedHandCursor;
218    }
219    else
220    {
221        if(map->isCentered())
222        {
223            if(pressed==true)
224            {
225                new_cursor=Qt::ForbiddenCursor;
226            }
227            else
228            {
229                new_cursor=Qt::ArrowCursor;
230            }
231        }
232        else
233        {
234            new_cursor=Qt::OpenHandCursor;
235        }
236        if(landmark_match!=NULL) new_cursor=Qt::PointingHandCursor;
237    }
238
239
240    for(int i=0;i<landmarks->count();i++)
241    {
242        if(landmarks->at(i)->contains(geoMap->screenPositionToCoordinate(event->pos())))
243        {
244            if(pressed && landmark_match==NULL)
245            {
246                landmark_match=landmarks->at(i);
247                landmark_match->setColor(Qt::red);
248                is_uptodate=false;
249            }
250            new_cursor=Qt::PointingHandCursor;
251            break;
252        }
253    }
254
255    if(new_cursor!=cursor().shape()) setCursor(new_cursor);
256
257    QPoint v = event->pos() - dragStartPosition;
258
259    if (dragging) {
260        geoMap->pan(-v.x(), -v.y());
261        dragStartPosition = event->pos();
262
263    } else if(landmark_match!=NULL){
264        landmark_match->setCoordinate(geoMap->screenPositionToCoordinate(event->pos()));
265
266    } else if (pressed && !map->isCentered() &&
267        v.manhattanLength() >= qApp->startDragDistance()) {
268        dragging = true;
269
270    } else {
271        dragStartPosition = event->pos();
272        emit positionChanged(geoMap->screenPositionToCoordinate(event->pos()));
273    }
274
275    event->accept();
276}
277
278void MapWidget::mouseReleaseEvent(QMouseEvent *event)
279{
280    pressed = false;
281    landmark_match=NULL;
282
283    if (dragging) {
284        QPoint v = event->pos() - dragStartPosition;
285        geoMap->pan(-v.x(), -v.y());
286        dragging = false;
287    }
288
289    event->accept();
290}
291
292void MapWidget::resizeEvent(QResizeEvent *event)
293{
294    if (geoMap) {
295        m_scene->setSceneRect(QRectF(0, 0, event->size().width(), event->size().height()));
296        geoMap->resize(event->size().width(), event->size().height());
297    }
298
299    QGraphicsView::resizeEvent(event);
300}
301
302void MapWidget::wheelEvent(QWheelEvent *event)
303{
304    int steps = event->delta() / 120;
305    int zoom = qBound(geoMap->minimumZoomLevel(), geoMap->zoomLevel() + steps,
306                      geoMap->maximumZoomLevel());
307
308    if (zoom != geoMap->zoomLevel()) geoMap->setZoomLevel(zoom);
309    //if(!centered) geoMap->setCenter(geoMap->screenPositionToCoordinate(event->pos()));
310}
311
312void MapWidget::mouseDoubleClickEvent(QMouseEvent *event)
313{
314    if(!map->isCentered()) geoMap->setCenter(geoMap->screenPositionToCoordinate(event->pos()));
315}
316
317bool MapWidget::IsUptodate(void)
318{
319    return is_uptodate;
320}
321
322void MapWidget::SetUptodate(void)
323{
324    for(int i=0;i<landmarks_old->count();i++)
325    {
326        delete landmarks_old->at(i);
327    }
328    landmarks_old->clear();
329
330    for(int i=0;i<landmarks->count();i++)
331    {
332        landmarks->at(i)->setColor(Qt::white);
333        Landmark* landmark=new Landmark(geoMap,landmarks->at(i)->coordinate(),QString("%1").arg(landmarks->count()+1));
334        landmarks_old->append(landmark);
335        landmarks_old->at(i)->setVisible(false);
336    }
337
338    is_uptodate=true;
339}
340
341void MapWidget::Reset(void)
342{
343    for(int i=0;i<landmarks->count();i++)
344    {
345        delete landmarks->at(i);
346    }
347    landmarks->clear();
348
349    for(int i=0;i<landmarks_old->count();i++)
350    {
351        Landmark* landmark=new Landmark(geoMap,landmarks_old->at(i)->coordinate(),QString("%1").arg(landmarks->count()+1));
352        landmarks->append(landmark);
353        landmarks->at(i)->setColor(Qt::white);
354    }
355
356    is_uptodate=true;
357}
358
359QList<Landmark*>* MapWidget::Landmarks(void)
360{
361    return landmarks;
362}
363
364bool MapWidget::LandmarkToSend(int index)
365{
366    if(index>=landmarks_old->count()) return true;
367
368    if(landmarks->at(index)->coordinate()!=landmarks_old->at(index)->coordinate())
369        return true;
370    else
371        return false;
372}
373void MapWidget::RemoveLandmarks(void)
374{
375    for(int i=0;i<landmarks->count();i++)
376    {
377        landmarks->at(i)->RemoveLandmark();
378    }
379    for(int i=0;i<landmarks_old->count();i++)
380    {
381        landmarks_old->at(i)->RemoveLandmark();
382    }
383}
384
385void MapWidget::AddLandmarks(QGraphicsGeoMap *geoMap)
386{
387    for(int i=0;i<landmarks->count();i++)
388    {
389        landmarks->at(i)->AddLandmark(geoMap);
390    }
391    for(int i=0;i<landmarks_old->count();i++)
392    {
393        landmarks_old->at(i)->AddLandmark(geoMap);
394    }
395}
396
397void MapWidget::AddLandmark(const QGeoCoordinate &coordinate)
398{
399    Landmark* landmark=new Landmark(geoMap,coordinate,QString("%1").arg(landmarks->count()+1));
400    landmarks->append(landmark);
401    landmark->setColor(Qt::white);
402    landmark=new Landmark(geoMap,coordinate,QString("%1").arg(landmarks_old->count()+1));
403    landmarks_old->append(landmark);
404    landmark->setColor(Qt::white);
405    landmark->setVisible(false);
406}
407
408void MapWidget::AddPoint(QString name)
409{
410    points.append(name);
411}
Note: See TracBrowser for help on using the repository browser.