feat: Add ICAOEQ capability to FSD client

This commit is contained in:
Lars Toenning
2023-12-27 21:51:08 +01:00
parent cdd4690adf
commit 23e2dc9057
20 changed files with 817 additions and 964 deletions

View File

@@ -35,6 +35,7 @@
#include <QCheckBox>
#include <QComboBox>
#include <QDateTime>
#include <QDesktopServices>
#include <QLabel>
#include <QLineEdit>
#include <QPlainTextEdit>
@@ -48,6 +49,7 @@
#include <QFile>
#include <QMessageBox>
#include <Qt>
#include <QWidgetAction>
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
@@ -70,6 +72,12 @@ namespace BlackGui::Components
ui->setupUi(this);
this->setCurrentIndex(0);
// Initialize wake turbulence category selection
for (const WakeTurbulenceEntry &item : std::as_const(m_wakeTurbulenceCategories))
{
ui->cb_Wtc->addItem(item.m_name);
}
// fix style
this->tabBar()->setExpanding(false);
this->tabBar()->setUsesScrollButtons(true);
@@ -80,6 +88,9 @@ namespace BlackGui::Components
this->setForceSmall(true);
this->showKillButton(false);
setupNavComContextMenu();
setupSsrContextMenu();
// rules
ui->cb_FlightRule->clear();
ui->cb_FlightRule->addItems(CFlightPlan::flightRules());
@@ -93,15 +104,8 @@ namespace BlackGui::Components
ui->le_AirlineOperator->setValidator(new CUpperCaseValidator(ui->le_AirlineOperator));
ui->le_AircraftRegistration->setValidator(new CUpperCaseValidator(ui->le_AircraftRegistration));
CUpperCaseValidator *ucv = new CUpperCaseValidator(true, 0, 1, ui->le_EquipmentSuffix);
ucv->setRestrictions(CFlightPlan::equipmentCodes());
ui->le_EquipmentSuffix->setValidator(ucv);
ui->le_EquipmentSuffix->setToolTip(ui->tbr_EquipmentCodes->toHtml());
QCompleter *completer = new QCompleter(CFlightPlan::equipmentCodesInfo(), ui->le_EquipmentSuffix);
completer->setMaxVisibleItems(10);
completer->popup()->setMinimumWidth(225);
completer->setCompletionMode(QCompleter::PopupCompletion);
ui->le_EquipmentSuffix->setCompleter(completer);
ui->le_NavComEquipment->setReadOnly(true);
ui->le_SsrEquipment->setReadOnly(true);
CUpperCaseEventFilter *ef = new CUpperCaseEventFilter(ui->pte_Route);
ef->setOnlyAscii();
@@ -151,13 +155,19 @@ namespace BlackGui::Components
connect(ui->pb_GetFromGenerator, &QPushButton::pressed, this, &CFlightPlanComponent::copyRemarksConfirmed, Qt::QueuedConnection);
connect(ui->pb_RemarksGenerator, &QPushButton::clicked, this, &CFlightPlanComponent::currentTabGenerator, Qt::QueuedConnection);
connect(ui->tb_HelpEquipment, &QToolButton::clicked, this, &CFlightPlanComponent::showEquipmentCodesTab, Qt::QueuedConnection);
connect(
ui->tb_EditNavComEquipment, &QToolButton::clicked, this, [this]() { m_navComEquipmentMenu->popup(QCursor::pos()); }, Qt::QueuedConnection);
connect(
ui->tb_NavComHelp, &QToolButton::clicked, this, []() { QDesktopServices::openUrl(sGui->getGlobalSetup().getComNavEquipmentHelpUrl()); }, Qt::QueuedConnection);
connect(
ui->tb_EditSsrEquipment, &QToolButton::clicked, this, [this]() { m_ssrEquipmentMenu->popup(QCursor::pos()); }, Qt::QueuedConnection);
connect(
ui->tb_SsrHelp, &QToolButton::clicked, this, []() { QDesktopServices::openUrl(sGui->getGlobalSetup().getSsrEquipmentHelpUrl()); }, Qt::QueuedConnection);
connect(ui->tb_AltitudeDialog, &QToolButton::clicked, this, &CFlightPlanComponent::altitudeDialog, Qt::QueuedConnection);
connect(ui->le_AircraftType, &QLineEdit::editingFinished, this, &CFlightPlanComponent::aircraftTypeChanged, Qt::QueuedConnection);
connect(ui->le_EquipmentSuffix, &QLineEdit::editingFinished, this, &CFlightPlanComponent::buildPrefixIcaoSuffix, Qt::QueuedConnection);
connect(ui->cb_Heavy, &QCheckBox::released, this, &CFlightPlanComponent::prefixCheckBoxChanged, Qt::QueuedConnection);
connect(ui->cb_Tcas, &QCheckBox::released, this, &CFlightPlanComponent::prefixCheckBoxChanged, Qt::QueuedConnection);
connect(ui->pb_Remarks, &QPushButton::pressed, this, &CFlightPlanComponent::remarksHistory, Qt::QueuedConnection);
connect(ui->pb_AddRemarks, &QPushButton::pressed, this, &CFlightPlanComponent::remarksHistory, Qt::QueuedConnection);
@@ -225,13 +235,10 @@ namespace BlackGui::Components
if (aircraft.getAircraftIcaoCode().isLoadedFromDb() && aircraft.getAircraftIcaoCode().hasValidWtc())
{
const QString wtc = toSingleLetterCode(aircraft.getAircraftIcaoCode().getWtc());
const bool heavyFlag = (wtc.startsWith("H", Qt::CaseInsensitive) || wtc.startsWith("S", Qt::CaseInsensitive));
ui->cb_Heavy->setChecked(heavyFlag);
updateWakeTurbulenceCategorySelector(aircraft.getAircraftIcaoCode().getWtc());
}
this->prefillWithUserData(aircraft.getPilot());
this->buildPrefixIcaoSuffix();
}
void CFlightPlanComponent::prefillWithUserData(const CUser &user)
@@ -276,7 +283,7 @@ namespace BlackGui::Components
else if (flightPlan.getFlightRules() == CFlightPlan::UNKNOWN)
{
ui->cb_FlightRule->setCurrentText(CFlightPlan::flightRulesToString(CFlightPlan::IFR));
const CStatusMessage m = CStatusMessage(this).validationWarning(u"Unknown fligh rule, setting to default");
const CStatusMessage m = CStatusMessage(this).validationWarning(u"Unknown flight rule, setting to default");
this->showOverlayMessage(m);
}
@@ -285,6 +292,14 @@ namespace BlackGui::Components
const QString rem = flightPlan.getRemarks();
this->setRemarksUIValues(rem);
}
updateWakeTurbulenceCategorySelector(flightPlan.getAircraftInfo().getWtc());
m_navComEquipment = flightPlan.getAircraftInfo().getComNavEquipment();
updateNavComEquipmentUi();
m_ssrEquipment = flightPlan.getAircraftInfo().getSsrEquipment();
updateSsrEquipmentUi();
}
const QStringList &CFlightPlanComponent::getLogCategories()
@@ -331,22 +346,9 @@ namespace BlackGui::Components
{
messages.push_back(CStatusMessage(this).validationWarning(u"Are you sure '%1' is a valid type?") << v);
}
flightPlan.setAircraftIcao(this->getAircraftIcaoCode());
// prefix / equipment code
v = this->getPrefix();
if (!v.isEmpty() && !CFlightPlan::prefixCodes().contains(v))
{
messages.push_back(CStatusMessage(this).validation(severity, u"Invalid prefix"));
}
flightPlan.setPrefix(v);
v = this->getEquipmentSuffix();
if (!v.isEmpty() && !CFlightPlan::equipmentCodes().contains(v))
{
messages.push_back(CStatusMessage(this).validation(severity, u"Invalid equipment code"));
}
flightPlan.setEquipmentSuffix(v);
CFlightPlanAircraftInfo info(this->getAircraftIcaoCode(), m_navComEquipment, m_ssrEquipment, getSelectedWakeTurbulenceCategory());
flightPlan.setAircraftInfo(info);
// route
v = ui->pte_Route->toPlainText().trimmed();
@@ -781,43 +783,6 @@ namespace BlackGui::Components
this->initCompleters();
}
void CFlightPlanComponent::buildPrefixIcaoSuffix()
{
ui->le_PrefixIcaoSuffix->setText(this->getCombinedPrefixIcaoSuffix());
}
void CFlightPlanComponent::prefixCheckBoxChanged()
{
QObject *sender = QObject::sender();
if (sender == ui->cb_Heavy)
{
if (ui->cb_Heavy->isChecked())
{
const QPointer<CFlightPlanComponent> myself(this);
QTimer::singleShot(10, this, [=] {
if (!myself) { return; }
ui->cb_Tcas->setChecked(false);
this->buildPrefixIcaoSuffix();
});
return;
}
}
else if (sender == ui->cb_Tcas)
{
if (ui->cb_Tcas->isChecked())
{
const QPointer<CFlightPlanComponent> myself(this);
QTimer::singleShot(10, this, [=] {
if (!myself) { return; }
ui->cb_Heavy->setChecked(false);
this->buildPrefixIcaoSuffix();
});
return;
}
}
this->buildPrefixIcaoSuffix();
}
void CFlightPlanComponent::aircraftTypeChanged()
{
const CAircraftIcaoCode icao = this->getAircraftIcaoCode();
@@ -825,10 +790,7 @@ namespace BlackGui::Components
QPointer<CFlightPlanComponent> myself(this);
QTimer::singleShot(25, this, [=] {
if (!myself || !sGui || sGui->isShuttingDown()) { return; }
const bool heavy = icao.getWtc() == BlackMisc::Aviation::WakeTurbulenceCategory::HEAVY;
ui->cb_Heavy->setChecked(heavy);
if (heavy) { ui->cb_Tcas->setChecked(false); }
this->buildPrefixIcaoSuffix();
updateWakeTurbulenceCategorySelector(icao.getWtc());
});
}
@@ -842,13 +804,6 @@ namespace BlackGui::Components
this->prefillWithAircraftData(aircraft, true);
}
QString CFlightPlanComponent::getPrefix() const
{
if (ui->cb_Heavy->isChecked()) { return QStringLiteral("H"); }
else if (ui->cb_Tcas->isChecked()) { return QStringLiteral("T"); }
return {};
}
CAircraftIcaoCode CFlightPlanComponent::getAircraftIcaoCode() const
{
const QString designator(ui->le_AircraftType->text());
@@ -861,21 +816,6 @@ namespace BlackGui::Components
return designator;
}
QString CFlightPlanComponent::getEquipmentSuffix() const
{
return ui->le_EquipmentSuffix->text().trimmed().toUpper();
}
QString CFlightPlanComponent::getCombinedPrefixIcaoSuffix() const
{
return CFlightPlan::concatPrefixIcaoSuffix(this->getPrefix(), this->getAircraftIcaoCode().getDesignator(), this->getEquipmentSuffix());
}
void CFlightPlanComponent::showEquipmentCodesTab()
{
this->setCurrentWidget(ui->tb_EquipmentCodes);
}
bool CFlightPlanComponent::isVfr() const
{
const bool vfr = CFlightPlan::isVFRRules(ui->cb_FlightRule->currentText());
@@ -1093,6 +1033,118 @@ namespace BlackGui::Components
}
}
void CFlightPlanComponent::setupNavComContextMenu()
{
m_navComEquipmentMenu = new QMenu(ui->tb_EditNavComEquipment);
auto list = new QListWidget(m_navComEquipmentMenu);
list->setSelectionMode(QAbstractItemView::MultiSelection);
list->addItems(BlackMisc::Aviation::CComNavEquipment::allEquipmentLetters());
connect(list, &QListWidget::itemSelectionChanged, this, &CFlightPlanComponent::updateNavComEquipmentFromSelection);
auto action = new QWidgetAction(ui->tb_EditNavComEquipment);
action->setDefaultWidget(list);
m_navComEquipmentMenu->addAction(action);
updateNavComEquipmentUi();
}
void CFlightPlanComponent::setupSsrContextMenu()
{
m_ssrEquipmentMenu = new QMenu(ui->tb_EditSsrEquipment);
auto list = new QListWidget(m_ssrEquipmentMenu);
list->setSelectionMode(QAbstractItemView::MultiSelection);
list->addItems(BlackMisc::Aviation::CSsrEquipment::allEquipmentLetters());
connect(list, &QListWidget::itemSelectionChanged, this, &CFlightPlanComponent::updateSsrEquipmentFromSelection);
auto action = new QWidgetAction(ui->tb_EditSsrEquipment);
action->setDefaultWidget(list);
m_ssrEquipmentMenu->addAction(action);
updateSsrEquipmentUi();
}
void CFlightPlanComponent::updateNavComEquipmentFromSelection()
{
const QListWidget *list = getMenuEquipmentList(m_navComEquipmentMenu);
QString equipmentString;
for (auto equipment : list->selectedItems())
{
equipmentString.append(equipment->text());
}
m_navComEquipment = CComNavEquipment(equipmentString);
updateNavComEquipmentUi();
}
void CFlightPlanComponent::updateSsrEquipmentFromSelection()
{
const QListWidget *list = getMenuEquipmentList(m_ssrEquipmentMenu);
QString ssrEquipmentString;
for (auto equipment : list->selectedItems())
{
ssrEquipmentString.append(equipment->text());
}
m_ssrEquipment = CSsrEquipment(ssrEquipmentString);
updateSsrEquipmentUi();
}
QListWidget *CFlightPlanComponent::getMenuEquipmentList(QMenu *menu)
{
Q_ASSERT_X(menu->actions().size() == 1, Q_FUNC_INFO, "should only contain a single action");
const QWidgetAction *action = qobject_cast<QWidgetAction *>(menu->actions().at(0));
Q_ASSERT_X(action, Q_FUNC_INFO, "equipment menu contains invalid action item");
auto list = qobject_cast<QListWidget *>(action->defaultWidget());
Q_ASSERT_X(list, Q_FUNC_INFO, "Action widget contains invalid widget");
return list;
}
void CFlightPlanComponent::updateSsrEquipmentUi()
{
ui->le_SsrEquipment->setText(m_ssrEquipment.toQString());
updateListSelection(m_ssrEquipmentMenu, m_ssrEquipment.enabledOptions());
}
void CFlightPlanComponent::updateNavComEquipmentUi()
{
ui->le_NavComEquipment->setText(m_navComEquipment.toQString());
updateListSelection(m_navComEquipmentMenu, m_navComEquipment.enabledOptions());
}
void CFlightPlanComponent::updateListSelection(QMenu *menu, const QStringList &enabledOptions)
{
QListWidget *list = getMenuEquipmentList(menu);
list->blockSignals(true);
list->clearSelection();
for (const auto &enabledOption : enabledOptions)
{
auto item = list->findItems(enabledOption, Qt::MatchExactly);
Q_ASSERT_X(item.size() == 1, Q_FUNC_INFO, "Expected exactly one item per option");
list->setItemSelected(item[0], true);
}
list->blockSignals(false);
}
void CFlightPlanComponent::updateWakeTurbulenceCategorySelector(const BlackMisc::Aviation::CWakeTurbulenceCategory &wtc)
{
if (wtc.isUnknown()) return; // Unknown should not be shown to the user
const auto it = std::find_if(m_wakeTurbulenceCategories.cbegin(), m_wakeTurbulenceCategories.cend(), [&wtc](const WakeTurbulenceEntry &item) { return item.m_wtc == wtc; });
Q_ASSERT_X(it != m_wakeTurbulenceCategories.cend(), Q_FUNC_INFO, "Invalid wake turbulence category selected");
const int newIndex = static_cast<int>(std::distance(m_wakeTurbulenceCategories.cbegin(), it));
ui->cb_Wtc->setCurrentIndex(newIndex);
}
CWakeTurbulenceCategory CFlightPlanComponent::getSelectedWakeTurbulenceCategory() const
{
return m_wakeTurbulenceCategories.at(ui->cb_Wtc->currentIndex()).m_wtc;
}
bool CFlightPlanComponent::consolidateRemarks(QStringList &remarks, const QString &newRemarks)
{
if (newRemarks.isEmpty()) { return false; }

View File

@@ -11,6 +11,8 @@
#include "blackmisc/simulation/data/lastmodel.h"
#include "blackmisc/simulation/simulatedaircraft.h"
#include "blackmisc/aviation/flightplan.h"
#include "blackmisc/aviation/comnavequipment.h"
#include "blackmisc/aviation/ssrequipment.h"
#include "blackmisc/network/data/lastserver.h"
#include "blackmisc/network/user.h"
#include "blackmisc/directories.h"
@@ -27,6 +29,7 @@
#include <QtGlobal>
#include <QFileDialog>
#include <QNetworkReply>
#include <QListWidget>
namespace Ui
{
@@ -99,8 +102,12 @@ namespace BlackGui::Components
CAltitudeDialog *m_altitudeDialog = nullptr;
CStringListDialog *m_fpRemarksDialog = nullptr;
CSimBriefDownloadDialog *m_simBriefDialog = nullptr;
QMenu *m_navComEquipmentMenu = nullptr;
QMenu *m_ssrEquipmentMenu = nullptr;
BlackMisc::Aviation::CFlightPlan m_sentFlightPlan; //!< my flight plan
BlackMisc::Simulation::CAircraftModel m_model; //!< currently used model
BlackMisc::Aviation::CComNavEquipment m_navComEquipment; //!< current NAV/COM equipment
BlackMisc::Aviation::CSsrEquipment m_ssrEquipment; //!< current SSR equipment
BlackMisc::CIdentifier m_identifier { "FlightPlanComponent", this }; //!< Flightplan identifier
BlackMisc::CSetting<BlackMisc::Settings::TDirectorySettings> m_directories { this }; //!< the swift directories
BlackMisc::CSetting<FlightPlanSettings::TRemarksHistory> m_remarksHistory { this }; //!< remarks history
@@ -108,6 +115,19 @@ namespace BlackGui::Components
BlackMisc::CDataReadOnly<BlackMisc::Simulation::Data::TLastModel> m_lastAircraftModel { this }; //!< recently used aircraft model
BlackMisc::CDataReadOnly<BlackMisc::Network::Data::TLastServer> m_lastServer { this }; //!< recently used server (VATSIM, other)
struct WakeTurbulenceEntry
{
QString m_name; //!< Name displayed to the user
BlackMisc::Aviation::CWakeTurbulenceCategory m_wtc; //!< Wake turbulence category
};
const QList<WakeTurbulenceEntry> m_wakeTurbulenceCategories = {
{ "Light", BlackMisc::Aviation::CWakeTurbulenceCategory::LIGHT },
{ "Medium", BlackMisc::Aviation::CWakeTurbulenceCategory::MEDIUM },
{ "Heavy", BlackMisc::Aviation::CWakeTurbulenceCategory::HEAVY },
{ "Super", BlackMisc::Aviation::CWakeTurbulenceCategory::SUPER }
}; //!< Mapping CWakeTurbulenceCategory <=> UI name that is shown to the user
//! Validate, generates status messages
BlackMisc::CStatusMessageList validateAndInitializeFlightPlan(BlackMisc::Aviation::CFlightPlan &fligtPlan);
@@ -204,30 +224,15 @@ namespace BlackGui::Components
//! GUI init complete
void swiftWebDataRead();
//! Build "H/B737/F"
void buildPrefixIcaoSuffix();
//! Prefix check box changed
void prefixCheckBoxChanged();
//! Aircraft type changed
void aircraftTypeChanged();
//! Sync.with simulator
void syncWithSimulator();
//! Get prefix
QString getPrefix() const;
//! Aircraft type as ICAO code
BlackMisc::Aviation::CAircraftIcaoCode getAircraftIcaoCode() const;
//! Get equipment code (1 char)
QString getEquipmentSuffix() const;
//! Something like "H/B737/F"
QString getCombinedPrefixIcaoSuffix() const;
//! Show tab of equipment codes
void showEquipmentCodesTab();
@@ -264,6 +269,36 @@ namespace BlackGui::Components
//! Response from SimBrief
void handleSimBriefResponse(QNetworkReply *nwReplyPtr);
//! Setup NAV/COM context menu
void setupNavComContextMenu();
//! Setup SSR context menu
void setupSsrContextMenu();
//! Update the current NAV/COM equipment from the menu selection
void updateNavComEquipmentFromSelection();
//! Update the current SSR equipment from the menu selection
void updateSsrEquipmentFromSelection();
//! Update the selection and label according to current NAV/COM equipment
void updateNavComEquipmentUi();
//! Update the selection and label according to current SSR equipment
void updateSsrEquipmentUi();
//! Update the wake turbulence category selector
void updateWakeTurbulenceCategorySelector(const BlackMisc::Aviation::CWakeTurbulenceCategory &wtc);
//! Get the selected wake turbulence category
BlackMisc::Aviation::CWakeTurbulenceCategory getSelectedWakeTurbulenceCategory() const;
//! Helper to get the QListWidget from a given NAV/COM or SSR menu
static QListWidget *getMenuEquipmentList(QMenu *menu);
//! Helper to mark all options in \p enabledOptions as "selected" in the QListWidget, contained in the NAV/COM or SSR \p menu
static void updateListSelection(QMenu *menu, const QStringList &enabledOptions);
//! Consolidate the new remarks list, latest on front
static bool consolidateRemarks(QStringList &remarks, const QString &newRemarks);
};

File diff suppressed because it is too large Load Diff

View File

@@ -34,7 +34,7 @@ namespace BlackGui::Editors
ui->cb_AircraftPartsSend->isChecked(), ui->cb_AircraftPartsReceive->isChecked(),
ui->cb_GndFlagSend->isChecked(), ui->cb_GndFlagReceive->isChecked(),
ui->cb_FastPositionSend->isChecked(), ui->cb_FastPositionReceive->isChecked(),
ui->cb_VisualPositionSend->isChecked(), ui->cb_EuroscopeSimData->isChecked());
ui->cb_VisualPositionSend->isChecked(), ui->cb_EuroscopeSimData->isChecked(), ui->cb_IcaoEquipment->isChecked());
s.setForce3LetterAirlineCodes(ui->cb_3LetterAirlineICAO->isChecked());
return s;
}
@@ -56,6 +56,7 @@ namespace BlackGui::Editors
ui->cb_FastPositionSend->setChecked(d & CFsdSetup::SendInterimPositions);
ui->cb_3LetterAirlineICAO->setChecked(setup.force3LetterAirlineCodes());
ui->cb_EuroscopeSimData->setChecked(d & CFsdSetup::ReceiveEuroscopeSimData);
ui->cb_IcaoEquipment->setChecked(d & CFsdSetup::SendFplWithIcaoEquipment);
}
void CFsdSetupForm::setAlwaysAllowOverride(bool allow)

View File

@@ -29,6 +29,34 @@
<property name="spacing">
<number>4</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="lbl_FsdSetup">
<property name="text">
<string>FSD setup:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="cb_AircraftPartsSend">
<property name="text">
<string>send</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="cb_AircraftPartsReceive">
<property name="text">
<string>receive</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QCheckBox" name="cb_Override">
<property name="text">
<string>override</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="lbl_AircraftParts">
<property name="toolTip">
@@ -39,20 +67,6 @@
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QCheckBox" name="cb_FastPositionSend">
<property name="text">
<string>send</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QCheckBox" name="cb_GndFlagSend">
<property name="text">
<string>send</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="lbl_GndFlag">
<property name="text">
@@ -60,13 +74,6 @@
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="cb_AircraftPartsReceive">
<property name="text">
<string>receive</string>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QCheckBox" name="cb_FastPositionReceive">
<property name="text">
@@ -81,34 +88,13 @@
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QCheckBox" name="cb_GndFlagReceive">
<property name="text">
<string>receive</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="cb_AircraftPartsSend">
<item row="5" column="2">
<widget class="QCheckBox" name="cb_GndFlagSend">
<property name="text">
<string>send</string>
</property>
</widget>
</item>
<item row="4" column="5">
<widget class="QLabel" name="lbl_TextCodec">
<property name="text">
<string>Text codec</string>
</property>
</widget>
</item>
<item row="5" column="5">
<widget class="QLineEdit" name="le_TextCodec">
<property name="placeholderText">
<string>e.g. &quot;latin1&quot;</string>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="pb_SetDefaults">
<property name="text">
@@ -116,20 +102,6 @@
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QCheckBox" name="cb_Override">
<property name="text">
<string>override</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="lbl_FsdSetup">
<property name="text">
<string>FSD setup:</string>
</property>
</widget>
</item>
<item row="6" column="5">
<widget class="QCheckBox" name="cb_3LetterAirlineICAO">
<property name="toolTip">
@@ -140,10 +112,24 @@
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QCheckBox" name="cb_VisualPositionSend">
<item row="5" column="3">
<widget class="QCheckBox" name="cb_FastPositionSend">
<property name="text">
<string>Send visual pos.</string>
<string>send</string>
</property>
</widget>
</item>
<item row="4" column="5">
<widget class="QLabel" name="lbl_TextCodec">
<property name="text">
<string>Text codec</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QCheckBox" name="cb_GndFlagReceive">
<property name="text">
<string>receive</string>
</property>
</widget>
</item>
@@ -157,21 +143,43 @@
</property>
</widget>
</item>
<item row="5" column="5">
<widget class="QLineEdit" name="le_TextCodec">
<property name="placeholderText">
<string>e.g. &quot;latin1&quot;</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QCheckBox" name="cb_VisualPositionSend">
<property name="text">
<string>Send visual pos.</string>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QCheckBox" name="cb_IcaoEquipment">
<property name="text">
<string>ICAO Equipment</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>cb_Override</tabstop>
<tabstop>pb_SetDefaults</tabstop>
<tabstop>cb_AircraftPartsSend</tabstop>
<tabstop>cb_AircraftPartsReceive</tabstop>
<tabstop>cb_GndFlagSend</tabstop>
<tabstop>cb_GndFlagReceive</tabstop>
<tabstop>cb_FastPositionSend</tabstop>
<tabstop>cb_FastPositionReceive</tabstop>
<tabstop>cb_VisualPositionSend</tabstop>
<tabstop>cb_EuroscopeSimData</tabstop>
<tabstop>le_TextCodec</tabstop>
<tabstop>cb_IcaoEquipment</tabstop>
<tabstop>cb_AircraftPartsReceive</tabstop>
<tabstop>cb_GndFlagReceive</tabstop>
<tabstop>cb_FastPositionReceive</tabstop>
<tabstop>cb_EuroscopeSimData</tabstop>
<tabstop>cb_3LetterAirlineICAO</tabstop>
<tabstop>pb_SetDefaults</tabstop>
</tabstops>
<resources/>
<connections/>