6 #include <QStringBuilder>
9 #include "ui_radarcomponent.h"
18 using namespace swift::misc::aviation;
19 using namespace swift::misc::simulation;
20 using namespace swift::misc::geo;
21 using namespace swift::misc::physical_quantities;
26 CRadarComponent::CRadarComponent(
QWidget *parent)
31 ui->gv_RadarView->setScene(&m_scene);
34 for (
int r = 1; r <= 9; ++r) { ui->cb_RadarRange->addItem(
QString::number(r) % u
" nm", r); }
35 for (
int r = 10; r <= 90; r += 10) { ui->cb_RadarRange->addItem(
QString::number(r) % u
" nm", r); }
38 ui->sb_FontSize->setRange(1, 100);
41 connect(ui->gv_RadarView, &CRadarView::radarViewResized,
this, &CRadarComponent::fitInView);
42 connect(ui->gv_RadarView, &CRadarView::zoomEvent,
this, &CRadarComponent::changeRangeInSteps);
47 &CRadarComponent::changeRangeFromUserSelection);
57 m_updateTimer.
start(5000);
58 m_headingTimer.
start(50);
67 &CRadarComponent::onInfoAreaTabBarChanged);
68 Q_ASSERT_X(c, Q_FUNC_INFO,
"failed connect");
69 Q_ASSERT_X(parentDockableWidget, Q_FUNC_INFO,
"missing parent");
70 return c && parentDockableWidget;
73 void CRadarComponent::prepareScene()
76 m_scene.
addItem(&m_macroGraticule);
77 m_scene.
addItem(&m_microGraticule);
79 m_scene.
addItem(&m_radarTargets);
86 void CRadarComponent::addCenter()
89 pen.setCosmetic(
true);
99 void CRadarComponent::addGraticules()
102 pen.setCosmetic(
true);
105 for (
int range = 10; range <= 100; range += 10)
112 pen.setCosmetic(
true);
115 for (qreal range = 1; range <= 3; ++range)
118 new QGraphicsEllipseItem(-range * 2.5, -range * 2.5, 5.0 * range, 5.0 * range, &m_microGraticule);
123 void CRadarComponent::addRadials()
126 pen.setCosmetic(
true);
128 for (
int angle = 0; angle < 360; angle += 30)
130 const QLineF line({ 0.0, 0.0 }, polarPoint(1000.0, qDegreesToRadians(
static_cast<qreal
>(angle))));
137 void CRadarComponent::refreshTargets()
150 const double distanceNM = sa.getRelativeDistance().value(CLengthUnit::NM());
151 const double bearingRad = sa.getRelativeBearing().value(CAngleUnit::rad());
152 const int groundSpeedKts = sa.getGroundSpeed().valueInteger(CSpeedUnit::kts());
154 QPointF position(polarPoint(distanceNM, bearingRad));
158 dot->
setPen(m_radarTargetPen);
164 if (ui->cb_Callsign->isChecked()) { tagText += sa.getCallsignAsString() % u
"\n"; }
165 if (ui->cb_Altitude->isChecked())
167 int flightLeveL = sa.getAltitude().valueInteger(CLengthUnit::ft()) / 100;
168 tagText += u
"FL" % QStringLiteral(
"%1").
arg(flightLeveL, 3, 10,
QChar(
'0'));
170 if (ui->cb_GroundSpeed->isChecked())
172 if (!tagText.
isEmpty()) tagText += QStringLiteral(
" ");
182 if (ui->cb_Heading->isChecked() && groundSpeedKts > 3.0)
184 const double headingRad = sa.getHeading().value(CAngleUnit::rad());
186 pen.setCosmetic(
true);
197 void CRadarComponent::rotateView()
203 int headingDegree = 0;
204 if (!ui->cb_LockNorth->isChecked())
210 if (m_rotatenAngle != headingDegree)
214 ui->gv_RadarView->rotate(m_rotatenAngle);
215 ui->gv_RadarView->rotate(-headingDegree);
216 m_rotatenAngle = headingDegree;
222 void CRadarComponent::toggleGrid(
bool checked)
229 void CRadarComponent::fitInView()
231 ui->gv_RadarView->fitInView(-m_rangeNM, -m_rangeNM, 2.0 * m_rangeNM, 2.0 * m_rangeNM,
Qt::KeepAspectRatio);
234 void CRadarComponent::changeRangeInSteps(
bool zoomIn)
236 qreal direction = zoomIn ? 1.0 : -1.0;
237 double factor = 10.0;
238 if (m_rangeNM < 10.0 || (qFuzzyCompare(m_rangeNM, 10.0) && zoomIn)) { factor = 1.0; }
240 if (m_rangeNM < 1.0 || (qFuzzyCompare(m_rangeNM, 1.0) && zoomIn)) { factor = 0.5; }
242 m_rangeNM = m_rangeNM - direction * factor;
243 m_rangeNM = qMin(90.0, qMax(0.5, m_rangeNM));
244 ui->cb_RadarRange->setCurrentText(
QString::number(m_rangeNM) % u
" nm");
248 void CRadarComponent::changeRangeFromUserSelection(
int index)
250 double range = ui->cb_RadarRange->itemData(index).toDouble();
251 if (!qFuzzyCompare(m_rangeNM, range))
258 void CRadarComponent::updateFont(
int pointSize)
261 this->refreshTargets();
264 void CRadarComponent::onInfoAreaTabBarChanged(
int index)
276 if (!myself) {
return; }
277 myself->refreshTargets();
281 QPointF CRadarComponent::polarPoint(
double distance,
double angleRadians)
283 angleRadians = -angleRadians;
286 QPointF p(distance * qCos(angleRadians), distance * qSin(angleRadians));
const context::IContextOwnAircraft * getIContextOwnAircraft() const
Direct access to contexts if a CCoreFacade has been initialized.
const context::IContextNetwork * getIContextNetwork() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
virtual swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const =0
Aircraft list.
virtual bool isConnected() const =0
Network connected?
virtual swift::misc::aviation::CAircraftSituation getOwnAircraftSituation() const =0
Get own aircraft.
void changedInfoAreaTabBarIndex(int index)
Tab bar changed.
GUI displaying a radar like view with aircrafts nearby.
virtual ~CRadarComponent()
Destructor.
virtual bool setParentDockWidgetInfoArea(swift::gui::CDockWidgetInfoArea *parentDockableWidget)
Corresponding dockable widget in info area.
const CHeading & getHeading() const
Get heading.
int valueInteger(MU unit) const
As integer value.
Comprehensive information of an aircraft.
Value object encapsulating a list of aircraft.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
High level reusable GUI components.
Views, mainly QTableView.
Free functions in swift::misc.
void swap(Optional< T > &a, Optional< T > &b) noexcept(std::is_nothrow_swappable_v< T >)
Efficient swap for two Optional objects.
void setBrush(const QBrush &brush)
void setPen(const QPen &pen)
void currentIndexChanged(int index)
void setPointSize(int pointSize)
ItemIgnoresTransformations
QList< QGraphicsItem * > childItems() const const
void setFlags(QGraphicsItem::GraphicsItemFlags flags)
void setPos(const QPointF &pos)
void setVisible(bool visible)
void setPen(const QPen &pen)
void addItem(QGraphicsItem *item)
void setDefaultTextColor(const QColor &col)
void setFont(const QFont &font)
void setPlainText(const QString &text)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QColor color() const const
void setCosmetic(bool cosmetic)
QString arg(Args &&... args) const const
bool isEmpty() const const
QString number(double n, char format, int precision)