swift
altitudedialog.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "altitudedialog.h"
5 
6 #include <QPushButton>
7 #include <QStringBuilder>
8 #include <QValidator>
9 
10 #include "ui_altitudedialog.h"
11 
12 #include "misc/aviation/altitude.h"
13 #include "misc/statusmessagelist.h"
14 
15 using namespace swift::misc;
16 using namespace swift::misc::aviation;
17 using namespace swift::misc::physical_quantities;
18 
19 namespace swift::gui::components
20 {
21  CAltitudeDialog::CAltitudeDialog(QWidget *parent) : QDialog(parent), ui(new Ui::CAltitudeDialog)
22  {
23  ui->setupUi(this);
24  this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
25 
34  ui->le_FLft->setFocus();
35 
36  // levels
37  ui->le_FLft->setValidator(new QIntValidator(10, 999, ui->le_FLft));
38  ui->le_AltitudeAFt->setValidator(new QIntValidator(10, 999, ui->le_AltitudeAFt));
39  ui->le_AltitudeMm->setValidator(new QIntValidator(10, 9999, ui->le_AltitudeMm));
40  ui->le_Sm->setValidator(new QIntValidator(10, 9999, ui->le_Sm));
41 
42  // plain altitudes in ft/m
43  ui->le_AltitudeConvertedFt->setValidator(new QIntValidator(100, 99999, ui->le_AltitudeConvertedFt));
44  ui->le_AltitudeFt->setValidator(new QIntValidator(100, 99999, ui->le_AltitudeFt));
45  ui->le_AltitudeM->setValidator(new QIntValidator(100, 99999, ui->le_AltitudeM));
46 
47  connect(ui->le_AltitudeAFt, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
48  connect(ui->le_AltitudeConvertedFt, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
49  connect(ui->le_AltitudeFt, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
50  connect(ui->le_AltitudeM, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
51  connect(ui->le_AltitudeMm, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
52  connect(ui->le_FLft, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
53  connect(ui->le_Sm, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
54 
55  connect(ui->rb_VFR, &QRadioButton::toggled, this, &CAltitudeDialog::onVFRSelected);
56  connect(ui->rb_StringOnly, &QRadioButton::toggled, this, &CAltitudeDialog::onStringOnlySelected);
57  connect(ui->cb_SimplifiedVATSIMFormat, &QCheckBox::toggled, this,
58  &CAltitudeDialog::onSimplifiedVATSIMFormatChanged);
59 
60  connect(ui->le_AltitudeAFt, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
61  connect(ui->le_AltitudeConvertedFt, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
62  connect(ui->le_AltitudeFt, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
63  connect(ui->le_AltitudeM, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
64  connect(ui->le_AltitudeMm, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
65  connect(ui->le_FLft, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
66  connect(ui->le_Sm, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
67  }
68 
70 
72  {
73  if (ui->rb_AltitudeAFt->isChecked()) return AltitudeInHundredsOfFeet;
74  if (ui->rb_VFR->isChecked()) return VFR;
75  if (ui->rb_AltitudeConvertedFt->isChecked()) return AltitudeInMetersConvertedToFeet;
76  if (ui->rb_AltitudeFt->isChecked()) return AltitudeInFeet;
77  if (ui->rb_AltitudeM->isChecked()) return AltitudeInMeters;
78  if (ui->rb_AltitudeMm->isChecked()) return AltitudeInTensOfMeters;
79  if (ui->rb_FLft->isChecked()) return FlightFlevelInFeet;
80  if (ui->rb_Sm->isChecked()) return MetricLevelInTensOfMeters;
81  if (ui->rb_StringOnly->isChecked()) return StringOnly;
82  return Unknown;
83  }
84 
85  void CAltitudeDialog::setVatsim(bool vatsim) { ui->cb_SimplifiedVATSIMFormat->setChecked(vatsim); }
86 
87  bool CAltitudeDialog::isStringOnly() const { return ui->rb_StringOnly->isChecked(); }
88 
89  void CAltitudeDialog::onEditFinished()
90  {
91  const Mode mode = this->getMode();
92  switch (mode)
93  {
94  case VFR: m_altitudeStr = QStringLiteral("VFR"); break;
95  case FlightFlevelInFeet: m_altitudeStr = u"FL" % ui->le_FLft->text(); break;
96  case MetricLevelInTensOfMeters: m_altitudeStr = u'S' % ui->le_Sm->text(); break;
97  case AltitudeInHundredsOfFeet: m_altitudeStr = u'A' % ui->le_AltitudeAFt->text(); break;
98  case AltitudeInTensOfMeters: m_altitudeStr = u'M' % ui->le_AltitudeMm->text(); break;
99  case AltitudeInFeet: m_altitudeStr = ui->le_AltitudeFt->text() % u"ft"; break;
100  case AltitudeInMeters: m_altitudeStr = ui->le_AltitudeM->text() % u"m"; break;
101  case AltitudeInMetersConvertedToFeet: m_altitudeStr = ui->le_AltitudeConvertedFt->text() % u"m"; break;
102  case StringOnly: m_altitudeStr = ui->le_String->text(); return;
103  case Unknown:
104  default: return;
105  }
106 
107  CStatusMessageList msgs;
108  m_altitude.parseFromFpAltitudeString(m_altitudeStr, &msgs);
109  if (msgs.hasErrorMessages())
110  {
111  ui->le_String->setText(msgs.toSingleMessage().getMessage());
112  m_altitudeStr.clear();
113  }
114  else
115  {
116  if (mode == AltitudeInMetersConvertedToFeet)
117  {
118  const int ft = CAltitude::findAltitudeForMetricAltitude(m_altitude.valueInteger(CLengthUnit::m()));
119  m_altitude = ft < 0 ? m_altitude.roundedToNearest100ft(true) :
120  m_altitude = CAltitude(ft, CAltitude::MeanSeaLevel, CLengthUnit::ft());
121  m_altitudeStr = m_altitude.valueRoundedWithUnit(0);
122  }
123 
124  if (ui->cb_SimplifiedVATSIMFormat->isChecked()) { m_altitudeStr = m_altitude.asFpVatsimAltitudeString(); }
125 
126  ui->le_String->setText(m_altitudeStr);
127  }
128 
129  this->updateStyleSheet();
130  }
131 
132  void CAltitudeDialog::onVFRSelected(bool selected)
133  {
134  if (!selected) { return; }
135  this->onEditFinished();
136  }
137 
138  void CAltitudeDialog::onStringOnlySelected(bool selected)
139  {
140  ui->le_String->setReadOnly(!selected);
141  if (!selected) { return; }
142 
143  this->onEditFinished();
144  this->updateStyleSheet();
145  }
146 
147  void CAltitudeDialog::onTextEdit(const QString &text)
148  {
149  Q_UNUSED(text);
150  const QObject *sender = QObject::sender();
151 
152  if (sender == ui->le_VFR)
153  {
154  ui->rb_VFR->setChecked(true);
155  return;
156  }
157  if (sender == ui->le_AltitudeAFt)
158  {
159  ui->rb_AltitudeAFt->setChecked(true);
160  return;
161  }
162  if (sender == ui->le_AltitudeConvertedFt)
163  {
164  ui->rb_AltitudeConvertedFt->setChecked(true);
165  return;
166  }
167  if (sender == ui->le_AltitudeFt)
168  {
169  ui->rb_AltitudeFt->setChecked(true);
170  return;
171  }
172  if (sender == ui->le_AltitudeM)
173  {
174  ui->rb_AltitudeM->setChecked(true);
175  return;
176  }
177  if (sender == ui->le_AltitudeMm)
178  {
179  ui->rb_AltitudeMm->setChecked(true);
180  return;
181  }
182  if (sender == ui->le_FLft)
183  {
184  ui->rb_FLft->setChecked(true);
185  return;
186  }
187  if (sender == ui->le_Sm)
188  {
189  ui->rb_Sm->setChecked(true);
190  return;
191  }
192  }
193 
194  void CAltitudeDialog::onSimplifiedVATSIMFormatChanged(bool checked)
195  {
196  ui->rb_AltitudeAFt->setEnabled(!checked);
197  ui->le_AltitudeAFt->setEnabled(!checked);
198  ui->rb_AltitudeM->setEnabled(!checked);
199  ui->le_AltitudeM->setEnabled(!checked);
200  ui->rb_AltitudeMm->setEnabled(!checked);
201  ui->le_AltitudeMm->setEnabled(!checked);
202  ui->rb_Sm->setEnabled(!checked);
203  ui->le_Sm->setEnabled(!checked);
204  ui->rb_VFR->setEnabled(!checked);
205 
206  if (checked)
207  {
208  m_altitudeStr = m_altitude.asFpVatsimAltitudeString();
209  ui->le_String->setText(m_altitudeStr);
210  ui->rb_StringOnly->setChecked(true);
211  }
212 
213  this->updateStyleSheet();
214  }
215 
216  void CAltitudeDialog::updateStyleSheet()
217  {
218  const QString ss = this->styleSheet();
219  this->setStyleSheet("");
220  this->setStyleSheet(ss);
221  }
222 } // namespace swift::gui::components
Dialog to get a correct altitude.
void setVatsim(bool vatsim)
Set VATSIM flag.
bool isStringOnly() const
Manual string mode.
QString getMessage() const
Message.
Status messages, e.g. from Core -> GUI.
CStatusMessage toSingleMessage() const
Merge into a single message.
bool hasErrorMessages() const
Error messages.
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
QString asFpVatsimAltitudeString() const
As simple VATSIM string, only FLxxx or altitude as ft.
Definition: altitude.cpp:363
bool parseFromFpAltitudeString(const QString &value, CStatusMessageList *msgs=nullptr)
Parse from FP altitude string.
Definition: altitude.cpp:188
CAltitude roundedToNearest100ft(bool roundDown) const
Round to the nearest 100ft, like needed for China and Russia.
Definition: altitude.cpp:409
int valueInteger(MU unit) const
As integer value.
QString valueRoundedWithUnit(const MU &unit, int digits=-1, bool withGroupSeparator=false, bool i18n=false) const
Value to QString with the given unit, e.g. "5.00m".
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Free functions in swift::misc.