1 /**********************************************************************************************
2 Copyright (C) 2014 Oliver Eichler <oliver.eichler@gmx.de>
3 Copyright (C) 2017 Norbert Truchsess <norbert.truchsess@t-online.de>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 **********************************************************************************************/
19
20 #include "canvas/CCanvas.h"
21 #include "gis/CGisDraw.h"
22 #include "gis/CGisWorkspace.h"
23 #include "gis/GeoMath.h"
24 #include "gis/proj_x.h"
25 #include "gis/wpt/CGisItemWpt.h"
26 #include "helpers/CDraw.h"
27 #include "helpers/CWptIconManager.h"
28 #include "mouse/CMouseAdapter.h"
29 #include "mouse/CMouseRadiusWpt.h"
30 #include "units/IUnit.h"
31
32 #include <QtWidgets>
33
CMouseRadiusWpt(CGisItemWpt & wpt,CGisDraw * gis,CCanvas * canvas,CMouseAdapter * mouse)34 CMouseRadiusWpt::CMouseRadiusWpt(CGisItemWpt& wpt, CGisDraw* gis, CCanvas* canvas, CMouseAdapter* mouse)
35 : IMouse(gis, canvas, mouse),
36 key(wpt.getKey()),
37 wptPosition(wpt.getPosition() * DEG_TO_RAD),
38 avoid(wpt.isNogo()),
39 initial(true)
40 {
41 startPos = GPS_Math_Wpt_Projection(wptPosition, wpt.getProximity(), 90 * DEG_TO_RAD);
42 gis->convertRad2Px(startPos);
43 cursor = QCursor(QPixmap(":/cursors/cursorRadiusWpt.png"), 0, 0);
44 wpt.setHideArea(true);
45 canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
46 }
47
~CMouseRadiusWpt()48 CMouseRadiusWpt::~CMouseRadiusWpt()
49 {
50 }
51
draw(QPainter & p,CCanvas::redraw_e,const QRect &)52 void CMouseRadiusWpt::draw(QPainter& p, CCanvas::redraw_e, const QRect&)
53 {
54 QPointF pos = initial ? startPos : mouse->getPoint();
55 gis->convertPx2Rad(pos);
56 dist = GPS_Math_Distance(pos.rx(), pos.ry(), wptPosition.x(), wptPosition.y());
57 QPointF screenPos = wptPosition;
58 gis->convertRad2Px(screenPos);
59 qreal radius = CGisItemWpt::calcRadius(wptPosition, screenPos, dist, gis);
60
61 CGisItemWpt::drawCircle(p, screenPos, radius, avoid, initial);
62 }
63
rightButtonDown(const QPoint & point)64 void CMouseRadiusWpt::rightButtonDown(const QPoint& point)
65 {
66 QMutexLocker lock(&IGisItem::mutexItems);
67
68 CGisItemWpt* wpt = dynamic_cast<CGisItemWpt*>(CGisWorkspace::self().getItemByKey(key));
69 if(wpt != nullptr)
70 {
71 wpt->setHideArea(false);
72 }
73 canvas->resetMouse();
74 canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
75 initial = false;
76 }
77
mouseMoved(const QPoint & pos)78 void CMouseRadiusWpt::mouseMoved(const QPoint& pos)
79 {
80 canvas->update();
81 initial = false;
82 }
83
mouseDragged(const QPoint & start,const QPoint & last,const QPoint & end)84 void CMouseRadiusWpt::mouseDragged(const QPoint& start, const QPoint& last, const QPoint& end)
85 {
86 IMouse::mouseDragged(start, last, end);
87 initial = false;
88 }
89
leftClicked(const QPoint & point)90 void CMouseRadiusWpt::leftClicked(const QPoint& point)
91 {
92 QMutexLocker lock(&IGisItem::mutexItems);
93
94 CGisItemWpt* wpt = dynamic_cast<CGisItemWpt*>(CGisWorkspace::self().getItemByKey(key));
95 if(wpt != nullptr)
96 {
97 wpt->setProximity(dist);
98 wpt->setHideArea(false);
99 }
100 canvas->resetMouse();
101 canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
102 initial = false;
103 }
104
scaleChanged()105 void CMouseRadiusWpt::scaleChanged()
106 {
107 canvas->update();
108 }
109