Ref T424, altitude dialog for flight plans

This commit is contained in:
Klaus Basan
2018-11-04 00:40:46 +01:00
parent 19a910f887
commit b65ace7e48
3 changed files with 644 additions and 0 deletions

View File

@@ -0,0 +1,224 @@
/* Copyright (C) 2018
* swift project Community / Contributors
*
* This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
* including this file, may be copied, modified, propagated, or distributed except according to the terms
* contained in the LICENSE file.
*/
#include "altitudedialog.h"
#include "ui_altitudedialog.h"
#include "blackmisc/statusmessagelist.h"
#include "blackmisc/aviation/altitude.h"
#include <QValidator>
#include <QPushButton>
#include <QStringBuilder>
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
namespace BlackGui
{
namespace Components
{
CAltitudeDialog::CAltitudeDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CAltitudeDialog)
{
ui->setupUi(this);
this->setWindowFlags(this->windowFlags() & ~Qt::WindowContextHelpButtonHint);
/** override default button, not working
QPushButton *okBtn = ui->bb_AltitudeDialog->button(QDialogButtonBox::Ok);
okBtn->setAutoDefault(false);
okBtn->setDefault(false);
QPushButton *caBtn = ui->bb_AltitudeDialog->button(QDialogButtonBox::Cancel);
caBtn->setAutoDefault(false);
caBtn->setDefault(false);
**/
ui->le_FLft->setFocus();
// levels
ui->le_FLft->setValidator(new QIntValidator(10, 999, ui->le_FLft));
ui->le_AltitudeAFt->setValidator(new QIntValidator(10, 999, ui->le_AltitudeAFt));
ui->le_AltitudeMm->setValidator(new QIntValidator(10, 9999, ui->le_AltitudeMm));
ui->le_Sm->setValidator(new QIntValidator(10, 9999, ui->le_Sm));
// plain altitudes in ft/m
ui->le_AltitudeConvertedFt->setValidator(new QIntValidator(100, 99999, ui->le_AltitudeConvertedFt));
ui->le_AltitudeFt->setValidator(new QIntValidator(100, 99999, ui->le_AltitudeFt));
ui->le_AltitudeM->setValidator(new QIntValidator(100, 99999, ui->le_AltitudeM));
connect(ui->le_AltitudeAFt, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->le_AltitudeConvertedFt, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->le_AltitudeFt, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->le_AltitudeM, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->le_AltitudeMm, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->le_FLft, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->le_Sm, &QLineEdit::editingFinished, this, &CAltitudeDialog::onEditFinished);
connect(ui->rb_VFR, &QRadioButton::toggled, this, &CAltitudeDialog::onVFRSelected);
connect(ui->rb_StringOnly, &QRadioButton::toggled, this, &CAltitudeDialog::onStringOnlySelected);
connect(ui->cb_SimplifiedVATSIMFormat, &QCheckBox::toggled, this, &CAltitudeDialog::onSimplifiedVATSIMFormatChanged);
connect(ui->le_AltitudeAFt, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
connect(ui->le_AltitudeConvertedFt, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
connect(ui->le_AltitudeFt, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
connect(ui->le_AltitudeM, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
connect(ui->le_AltitudeMm, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
connect(ui->le_FLft, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
connect(ui->le_Sm, &QLineEdit::textEdited, this, &CAltitudeDialog::onTextEdit);
}
CAltitudeDialog::~CAltitudeDialog()
{ }
CAltitudeDialog::Mode CAltitudeDialog::getMode() const
{
if (ui->rb_AltitudeAFt->isChecked()) return AltitudeInHundredsOfFeet;
if (ui->rb_VFR->isChecked()) return VFR;
if (ui->rb_AltitudeConvertedFt->isChecked()) return AltitudeInMetersConvertedToFeet;
if (ui->rb_AltitudeFt->isChecked()) return AltitudeInFeet;
if (ui->rb_AltitudeM->isChecked()) return AltitudeInMeters;
if (ui->rb_AltitudeMm->isChecked()) return AltitudeInTensOfMeters;
if (ui->rb_FLft->isChecked()) return FlightFlevelInFeet;
if (ui->rb_Sm->isChecked()) return MetricLevelInTensOfMeters;
if (ui->rb_StringOnly->isChecked()) return StringOnly;
return Unknown;
}
void CAltitudeDialog::setVatsim(bool vatsim)
{
ui->cb_SimplifiedVATSIMFormat->setChecked(vatsim);
}
bool CAltitudeDialog::isStringOnly() const
{
return ui->rb_StringOnly->isChecked();
}
void CAltitudeDialog::onEditFinished()
{
const Mode mode = this->getMode();
switch (mode)
{
case VFR:
m_altitudeStr = QStringLiteral("VFR");
break;
case FlightFlevelInFeet:
m_altitudeStr = QStringLiteral("FL") % ui->le_FLft->text();
break;
case MetricLevelInTensOfMeters:
m_altitudeStr = QStringLiteral("S") % ui->le_Sm->text();
break;
case AltitudeInHundredsOfFeet:
m_altitudeStr = QStringLiteral("A") % ui->le_AltitudeAFt->text();
break;
case AltitudeInTensOfMeters:
m_altitudeStr = QStringLiteral("M") % ui->le_AltitudeMm->text();
break;
case AltitudeInFeet:
m_altitudeStr = ui->le_AltitudeFt->text() % QStringLiteral("ft");
break;
case AltitudeInMeters:
m_altitudeStr = ui->le_AltitudeM->text() % QStringLiteral("m");
break;
case AltitudeInMetersConvertedToFeet:
m_altitudeStr = ui->le_AltitudeConvertedFt->text() % QStringLiteral("m");
break;
case StringOnly:
return;
case Unknown:
default:
return;
}
CStatusMessageList msgs;
m_altitude.parseFromFpAltitudeString(m_altitudeStr, &msgs);
if (msgs.hasErrorMessages())
{
ui->le_String->setText(msgs.toSingleMessage().getMessage());
m_altitudeStr.clear();
}
else
{
if (mode == AltitudeInMetersConvertedToFeet)
{
m_altitude = m_altitude.roundedToNearest100ft();
m_altitudeStr = m_altitude.valueRoundedWithUnit(0);
}
if (ui->cb_SimplifiedVATSIMFormat->isChecked())
{
m_altitudeStr = m_altitude.asFpVatsimAltitudeString();
}
ui->le_String->setText(m_altitudeStr);
}
this->updateStyleSheet();
}
void CAltitudeDialog::onVFRSelected(bool selected)
{
if (!selected) { return; }
this->onEditFinished();
}
void CAltitudeDialog::onStringOnlySelected(bool selected)
{
ui->le_String->setReadOnly(!selected);
if (!selected) { return; }
this->onEditFinished();
this->updateStyleSheet();
}
void CAltitudeDialog::onTextEdit(const QString &text)
{
Q_UNUSED(text);
const QObject *sender = QObject::sender();
if (sender == ui->le_VFR) { ui->rb_VFR->setChecked(true); return; }
if (sender == ui->le_AltitudeAFt) { ui->rb_AltitudeAFt->setChecked(true); return; }
if (sender == ui->le_AltitudeConvertedFt) { ui->rb_AltitudeConvertedFt->setChecked(true); return; }
if (sender == ui->le_AltitudeFt) { ui->rb_AltitudeFt->setChecked(true); return; }
if (sender == ui->le_AltitudeM) { ui->rb_AltitudeM->setChecked(true); return; }
if (sender == ui->le_AltitudeMm) { ui->rb_AltitudeMm->setChecked(true); return; }
if (sender == ui->le_FLft) { ui->rb_FLft->setChecked(true); return; }
if (sender == ui->le_Sm) { ui->rb_Sm->setChecked(true); return; }
}
void CAltitudeDialog::onSimplifiedVATSIMFormatChanged(bool checked)
{
ui->rb_AltitudeAFt->setEnabled(!checked);
ui->le_AltitudeAFt->setEnabled(!checked);
ui->rb_AltitudeM->setEnabled(!checked);
ui->le_AltitudeM->setEnabled(!checked);
ui->rb_AltitudeMm->setEnabled(!checked);
ui->le_AltitudeMm->setEnabled(!checked);
ui->rb_Sm->setEnabled(!checked);
ui->le_Sm->setEnabled(!checked);
ui->rb_VFR->setEnabled(!checked);
if (checked)
{
m_altitudeStr = m_altitude.asFpVatsimAltitudeString();
ui->le_String->setText(m_altitudeStr);
ui->rb_StringOnly->setChecked(true);
}
this->updateStyleSheet();
}
void CAltitudeDialog::updateStyleSheet()
{
const QString ss = this->styleSheet();
this->setStyleSheet("");
this->setStyleSheet(ss);
}
} // ns
} // ns

View File

@@ -0,0 +1,95 @@
/* Copyright (C) 2018
* swift project Community / Contributors
*
* This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project,
* including this file, may be copied, modified, propagated, or distributed except according to the terms
* contained in the LICENSE file.
*/
//! \file
#ifndef BLACKGUI_COMPONENTS_ALTITUDEDIALOG_H
#define BLACKGUI_COMPONENTS_ALTITUDEDIALOG_H
#include "blackmisc/aviation/altitude.h"
#include <QDialog>
#include <QScopedPointer>
namespace Ui { class CAltitudeDialog; }
namespace BlackGui
{
namespace Components
{
/**
* Dialog to get a correct altitude
*/
class CAltitudeDialog : public QDialog
{
Q_OBJECT
public:
//! Which mode used to enter
enum Mode
{
Unknown,
StringOnly,
VFR,
FlightFlevelInFeet,
MetricLevelInTensOfMeters,
AltitudeInHundredsOfFeet,
AltitudeInTensOfMeters,
AltitudeInFeet,
AltitudeInMeters,
AltitudeInMetersConvertedToFeet
};
//! Constructor
explicit CAltitudeDialog(QWidget *parent = nullptr);
//! Destructor
virtual ~CAltitudeDialog();
//! Get mode
Mode getMode() const;
//! Set VATSIM flag
void setVatsim(bool vatsim);
//! Manual string mode
bool isStringOnly() const;
//! Altitude string
const BlackMisc::Aviation::CAltitude &getAltitude() const { return m_altitude; }
//! Altitude string
const QString &getAltitudeString() const { return m_altitudeStr; }
private:
QScopedPointer<Ui::CAltitudeDialog> ui;
BlackMisc::Aviation::CAltitude m_altitude;
QString m_altitudeStr;
//! Edit finished
void onEditFinished();
//! VFR selected
void onVFRSelected(bool selected);
//! String only selected
void onStringOnlySelected(bool selected);
//! On text edit
void onTextEdit(const QString &text);
//! Simplified format changed
void onSimplifiedVATSIMFormatChanged(bool checked);
//! Update style sheet
void updateStyleSheet();
};
} // ns
} // ns
#endif // guard

View File

@@ -0,0 +1,325 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CAltitudeDialog</class>
<widget class="QDialog" name="CAltitudeDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>342</width>
<height>494</height>
</rect>
</property>
<property name="windowTitle">
<string>Altitude dialog</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="gb_ICAOFormats">
<property name="title">
<string>ICAO formats</string>
</property>
<layout class="QGridLayout" name="gl_ICAFormats" columnstretch="4,1">
<item row="3" column="1">
<widget class="QLineEdit" name="le_AltitudeMm">
<property name="placeholderText">
<string>meters/10</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="le_AltitudeAFt">
<property name="placeholderText">
<string>feet/100</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QRadioButton" name="rb_AltitudeMm">
<property name="text">
<string>M0610 altitude in tens of meters</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="le_Sm">
<property name="placeholderText">
<string>level</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QRadioButton" name="rb_AltitudeAFt">
<property name="text">
<string>A055 altitude in hundreds of feet</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="le_VFR">
<property name="text">
<string>VFR</string>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rb_Sm">
<property name="text">
<string>S0150 metric level in tens of meters</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="rb_FLft">
<property name="text">
<string>FL085 flight level in hecto feets</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="le_FLft">
<property name="placeholderText">
<string>FL</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QRadioButton" name="rb_VFR">
<property name="text">
<string>VFR</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_FeetOrMeter">
<property name="title">
<string>Directly as feet or meters</string>
</property>
<layout class="QGridLayout" name="gl_Directly" columnstretch="4,1">
<item row="1" column="0">
<widget class="QRadioButton" name="rb_AltitudeM">
<property name="text">
<string>Altitude in meters</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="0" column="0">
<widget class="QRadioButton" name="rb_AltitudeFt">
<property name="text">
<string>Altitude in feet</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="le_AltitudeFt">
<property name="placeholderText">
<string>feet</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="le_AltitudeM">
<property name="placeholderText">
<string>meters</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_MetersConverted">
<property name="title">
<string>Meters converted to feet</string>
</property>
<layout class="QGridLayout" name="gl_Converted" columnstretch="3,0,1">
<item row="1" column="2">
<widget class="QLineEdit" name="le_AltitudeConvertedFt">
<property name="placeholderText">
<string>meters</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="rb_AltitudeConvertedFt">
<property name="text">
<string>Alt. in meters, will be converted to feet</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="lbl_CountryIcons">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;qrc:/misc/icons/misc/cn.png&quot;/&gt;&lt;img src=&quot;qrc:/misc/icons/misc/ru.png&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_Format">
<property name="title">
<string>Format</string>
</property>
<layout class="QVBoxLayout" name="vl_Format">
<item>
<widget class="QCheckBox" name="cb_SimplifiedVATSIMFormat">
<property name="toolTip">
<string>not supporting &quot;S&quot;, &quot;A&quot;, &quot;VFR&quot;, altitude in meters</string>
</property>
<property name="text">
<string>Simplified VATSIM format, some formats are unavailable</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="vs_AltitudeDialog">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="gb_Result">
<property name="title">
<string>Result used in flight plan</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="3">
<widget class="QLineEdit" name="le_String">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>value goes here</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QRadioButton" name="rb_StringOnly">
<property name="text">
<string>Override</string>
</property>
<attribute name="buttonGroup">
<string notr="true">bg_RadioButtons</string>
</attribute>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="bb_AltitudeDialog">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>rb_FLft</tabstop>
<tabstop>le_FLft</tabstop>
<tabstop>rb_Sm</tabstop>
<tabstop>le_Sm</tabstop>
<tabstop>rb_AltitudeAFt</tabstop>
<tabstop>le_AltitudeAFt</tabstop>
<tabstop>rb_AltitudeMm</tabstop>
<tabstop>le_AltitudeMm</tabstop>
<tabstop>rb_VFR</tabstop>
<tabstop>le_VFR</tabstop>
<tabstop>rb_AltitudeFt</tabstop>
<tabstop>le_AltitudeFt</tabstop>
<tabstop>rb_AltitudeM</tabstop>
<tabstop>le_AltitudeM</tabstop>
<tabstop>rb_AltitudeConvertedFt</tabstop>
<tabstop>le_AltitudeConvertedFt</tabstop>
<tabstop>cb_SimplifiedVATSIMFormat</tabstop>
<tabstop>rb_StringOnly</tabstop>
<tabstop>le_String</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>bb_AltitudeDialog</sender>
<signal>accepted()</signal>
<receiver>CAltitudeDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>bb_AltitudeDialog</sender>
<signal>rejected()</signal>
<receiver>CAltitudeDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
<buttongroups>
<buttongroup name="bg_RadioButtons"/>
</buttongroups>
</ui>