FlightGear next
NavaidDiagram.cxx
Go to the documentation of this file.
1// NavaidDiagram.cxx - part of GUI launcher using Qt5
2//
3// Written by James Turner, started October 2015.
4//
5// Copyright (C) 2014 James Turner <zakalawe@mac.com>
6//
7// This program is free software; you can redistribute it and/or
8// modify it under the terms of the GNU General Public License as
9// published by the Free Software Foundation; either version 2 of the
10// License, or (at your option) any later version.
11//
12// This program is distributed in the hope that it will be useful, but
13// WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15// General Public License for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with this program; if not, write to the Free Software
19// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
21#include "NavaidDiagram.hxx"
22
23#include <limits>
24
25#include <QPainter>
26#include <QDebug>
27#include <QVector2D>
28#include <QMouseEvent>
29
31
33 BaseDiagram(pr)
34{
35}
36
37void NavaidDiagram::setNavaid(qlonglong nav)
38{
40 m_projectionCenter = m_navaid ? m_navaid->geod() : SGGeod();
41 m_geod = m_projectionCenter;
42 recomputeBounds(true);
43 emit locationChanged();
44}
45
46qlonglong NavaidDiagram::navaid() const
47{
48 return m_navaid->guid();
49}
50
55
57{
58 return QmlGeod(m_geod);
59}
60
61void NavaidDiagram::setGeod(const SGGeod &geod)
62{
63 m_navaid.clear();
64 m_geod = geod;
65 m_projectionCenter = m_geod;
66 recomputeBounds(true);
67 emit locationChanged();
68}
69
71{
72 if (m_offsetEnabled == offset)
73 return;
74 m_offsetEnabled = offset;
75 recomputeBounds(true);
76 emit offsetChanged();
77}
78
80{
81 if (distanceNm == m_offsetDistance)
82 return;
83
84 m_offsetDistance = distanceNm;
85 update();
86 emit offsetChanged();
87}
88
90{
91 m_offsetBearing = bearing;
92 update();
93 emit offsetChanged();
94}
95
97{
98 m_heading = headingDeg;
99 update();
100 emit offsetChanged();
101}
102
103void NavaidDiagram::paintContents(QPainter *painter)
104{
105 QPointF base = project(m_geod);
106
107 SGGeod aircraftPos = m_geod;
108 if (m_offsetEnabled) {
109
110 double d = m_offsetDistance.convertToUnit(Units::Kilometers).value * 1000;
111 SGGeod offsetGeod = SGGeodesy::direct(m_geod, m_offsetBearing.value, d);
112 QPointF offset = project(offsetGeod);
113
114 QPen pen(Qt::green);
115 pen.setCosmetic(true);
116 painter->setPen(pen);
117 painter->drawLine(base, offset);
118
119 aircraftPos = offsetGeod;
120 }
121
122 paintAirplaneIcon(painter, aircraftPos, m_heading.value);
123}
124
126{
127 extendBounds(project(m_geod));
128
129// project four points around the base location at 20nm to give some
130// coverage
131 for (int i=0; i<4; ++i) {
132 SGGeod pt = SGGeodesy::direct(m_geod, i * 90, SG_NM_TO_METER * 20.0);
134 }
135
136 if (m_offsetEnabled) {
137 double d = m_offsetDistance.convertToUnit(Units::Kilometers).value * 1000;
138 SGGeod offsetPos = SGGeodesy::direct(m_geod, m_offsetBearing.value, d);
139 extendBounds(project(offsetPos));
140 }
141}
#define i(x)
BaseDiagram(QQuickItem *pr=nullptr)
void paintAirplaneIcon(QPainter *painter, const SGGeod &geod, int headingDeg)
SGGeod m_projectionCenter
void extendBounds(const QPointF &p, double radiusM=1.0)
QPointF project(const SGGeod &geod) const
void recomputeBounds(bool resetZoom)
void setOffsetBearing(QuantityValue bearing)
void setHeading(QuantityValue heading)
NavaidDiagram(QQuickItem *pr=nullptr)
void setNavaid(qlonglong nav)
void paintContents(QPainter *) override
void setOffsetEnabled(bool offset)
void locationChanged()
void setOffsetDistance(QuantityValue distance)
void setGeod(QmlGeod geod)
void doComputeBounds() override
void offsetChanged()
Expose an SGGeod as Qml-friendly class.
@ Kilometers
static NavDataCache * instance()
T * fgpositioned_cast(FGPositioned *p)