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