Ref T561, remember remarks history for remakrs/additional remarks

* settings
* use string list dialog
* adjust FP UI, "remark buttons"
This commit is contained in:
Klaus Basan
2019-03-20 17:34:19 +01:00
committed by Mat Sutcliffe
parent 76e34d05ab
commit 22cedfe710
3 changed files with 295 additions and 213 deletions

View File

@@ -6,9 +6,11 @@
* or distributed except according to the terms contained in the LICENSE file.
*/
#include "flightplancomponent.h"
#include "altitudedialog.h"
#include "selcalcodeselector.h"
#include "stringlistdialog.h"
#include "blackgui/uppercasevalidator.h"
#include "blackgui/components/flightplancomponent.h"
#include "blackgui/components/selcalcodeselector.h"
#include "blackgui/guiapplication.h"
#include "blackcore/context/contextnetwork.h"
#include "blackcore/context/contextownaircraft.h"
@@ -135,6 +137,9 @@ namespace BlackGui
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);
// web services
connect(sGui->getWebDataServices(), &CWebDataServices::swiftDbAllDataRead, this, &CFlightPlanComponent::swiftWebDataRead, Qt::QueuedConnection);
@@ -322,7 +327,7 @@ namespace BlackGui
v = ui->pte_Remarks->toPlainText().trimmed();
if (v.isEmpty())
{
messages.push_back(CStatusMessage(this).validationError(u"No '%1', voice capabilities are mandatory") << ui->lbl_Remarks->text());
messages.push_back(CStatusMessage(this).validationError(u"No '%1', voice capabilities are mandatory") << ui->pb_Remarks->text());
}
else if (v.length() > CFlightPlan::MaxRemarksLength)
{
@@ -450,6 +455,7 @@ namespace BlackGui
if (m.isSeverityInfoOrLess())
{
this->showOverlayHTMLMessage(m, OverlayTimeoutMs);
this->updateRemarksHistories(); // all OK, we keep that in history
}
else
{
@@ -665,10 +671,10 @@ namespace BlackGui
{
if (ui->cb_Tcas->isChecked())
{
const QPointer<CFlightPlanComponent> guard(this);
const QPointer<CFlightPlanComponent> myself(this);
QTimer::singleShot(10, this, [ = ]
{
if (guard.isNull()) { return; }
if (!myself) { return; }
ui->cb_Heavy->setChecked(false);
this->buildPrefixIcaoSuffix();
});
@@ -832,6 +838,59 @@ namespace BlackGui
}
}
void CFlightPlanComponent::updateRemarksHistories()
{
QString r = ui->pte_Remarks->toPlainText();
if (!r.isEmpty())
{
QStringList h = m_remarksHistory.get();
if (consolidateRemarks(h, r))
{
CStatusMessage m = m_remarksHistory.setAndSave(h);
CLogMessage::preformatted(m);
}
}
r = ui->pte_AdditionalRemarks->toPlainText();
if (!r.isEmpty())
{
QStringList h = m_remarksHistoryAdditional.get();
if (consolidateRemarks(h, r))
{
CStatusMessage m = m_remarksHistoryAdditional.setAndSave(h);
CLogMessage::preformatted(m);
}
}
}
bool CFlightPlanComponent::consolidateRemarks(QStringList &remarks, const QString &newRemarks)
{
if (newRemarks.isEmpty()) { return false; }
remarks.removeAll(newRemarks);
remarks.push_front(newRemarks);
return true;
}
void CFlightPlanComponent::remarksHistory()
{
const QObject *sender = QObject::sender();
if (!m_fpRemarksDialog)
{
m_fpRemarksDialog = new CStringListDialog(this);
m_fpRemarksDialog->setModal(true);
}
if (sender == ui->pb_Remarks) { m_fpRemarksDialog->setStrings(m_remarksHistory.getThreadLocal()); }
else if (sender == ui->pb_AddRemarks) { m_fpRemarksDialog->setStrings(m_remarksHistoryAdditional.getThreadLocal()); }
const int rv = m_fpRemarksDialog->exec();
if (rv != QDialog::Accepted) { return; }
const QString remarks = m_fpRemarksDialog->getSelectedValue();
if (remarks.isEmpty()) { return; }
if (sender == ui->pb_Remarks) { ui->pte_Remarks->setPlainText(remarks); }
else if (sender == ui->pb_AddRemarks) { ui->pte_AdditionalRemarks->setPlainText(remarks); }
}
void CFlightPlanComponent::initCompleters()
{
if (!sGui || !sGui->hasWebDataServices()) { return; }

View File

@@ -12,7 +12,6 @@
#define BLACKGUI_COMPONENTS_FLIGHTPLANCOMPONENT_H
#include "blackgui/overlaymessagesframe.h"
#include "blackgui/components/altitudedialog.h"
#include "blackgui/blackguiexport.h"
#include "blackmisc/simulation/data/lastmodel.h"
#include "blackmisc/simulation/simulatedaircraft.h"
@@ -28,7 +27,7 @@
#include <QObject>
#include <QScopedPointer>
#include <QString>
#include <QStringList>
#include <QTabWidget>
#include <QtGlobal>
#include <QFileDialog>
@@ -38,6 +37,32 @@ namespace BlackGui
{
namespace Components
{
namespace FlightPlanSettings
{
//! Remarks history
struct TRemarksHistory : public BlackMisc::TSettingTrait<QStringList>
{
//! \copydoc BlackMisc::TSettingTrait::key
static const char *key() { return "flightplan/remarkshistory"; }
//! \copydoc BlackMisc::TSettingTrait::humanReadable
static const QString &humanReadable() { static const QString name("FP remarks history"); return name; }
};
//! Additional remarks history
struct TRemarksHistoryAdditional : public BlackMisc::TSettingTrait<QStringList>
{
//! \copydoc BlackMisc::TSettingTrait::key
static const char *key() { return "flightplan/remarkshistoryadd"; }
//! \copydoc BlackMisc::TSettingTrait::humanReadable
static const QString &humanReadable() { static const QString name("FP remarks history (add)"); return name; }
};
}
class CStringListDialog;
class CAltitudeDialog;
//! Flight plan widget
class BLACKGUI_EXPORT CFlightPlanComponent : public COverlayMessagesTabWidget
{
@@ -66,12 +91,15 @@ namespace BlackGui
static constexpr int OverlayTimeoutMs = 5000;
QScopedPointer<Ui::CFlightPlanComponent> ui;
CAltitudeDialog *m_altitudeDialog = nullptr;
CStringListDialog *m_fpRemarksDialog = nullptr;
BlackMisc::Aviation::CFlightPlan m_sentFlightPlan; //!< My flight plan
BlackMisc::Simulation::CAircraftModel m_model; //!< currently used model
BlackMisc::CIdentifier m_identifier { "FlightPlanComponent", this }; //!< Flightplan identifier
BlackMisc::CSetting<BlackMisc::Settings::TDirectorySettings> m_directories { this }; //!< the swift directories
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)
BlackMisc::CSetting<BlackMisc::Settings::TDirectorySettings> m_directories { this }; //!< the swift directories
BlackMisc::CSetting<FlightPlanSettings::TRemarksHistory> m_remarksHistory { this }; //!< remarks history
BlackMisc::CSetting<FlightPlanSettings::TRemarksHistoryAdditional> m_remarksHistoryAdditional { this }; //!< remarks history
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)
//! Validate, generates status messages
BlackMisc::CStatusMessageList validateAndInitializeFlightPlan(BlackMisc::Aviation::CFlightPlan &fligtPlan);
@@ -183,6 +211,15 @@ namespace BlackGui
//! Altitude dialog
void altitudeDialog();
//! FP remarks history selection
void remarksHistory();
//! Update the remarks histories
void updateRemarksHistories();
//! Consolidate the new remarks list, latest on front
static bool consolidateRemarks(QStringList &remarks, const QString &newRemarks);
};
} // ns
} // ns

View File

@@ -42,7 +42,7 @@
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<y>-137</y>
<width>383</width>
<height>480</height>
</rect>
@@ -312,13 +312,6 @@
</layout>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="lbl_Remarks">
<property name="text">
<string>11. Remarks</string>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QPushButton" name="pb_Load">
<property name="toolTip">
@@ -739,6 +732,13 @@
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QPushButton" name="pb_Remarks">
<property name="text">
<string>11.remarks</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@@ -773,7 +773,7 @@
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<y>-93</y>
<width>383</width>
<height>436</height>
</rect>
@@ -811,114 +811,21 @@
<property name="spacing">
<number>6</number>
</property>
<item row="9" column="0">
<widget class="QLabel" name="lbl_RemarksGenerated">
<property name="text">
<string>Remarks</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="lbl_RequiredNavigationPerformance">
<property name="text">
<string>Required Navigation Performance</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QFrame" name="fr_Buttons">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QPushButton" name="pb_Parse">
<property name="text">
<string>Parse</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pb_CopyOver">
<property name="text">
<string>Copy over</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="7" column="1">
<widget class="QComboBox" name="cb_PilotRating">
<item row="6" column="1">
<widget class="QComboBox" name="cb_VoiceCapabilities">
<item>
<property name="text">
<string>P0 - unrated</string>
<string>Full voice</string>
</property>
</item>
<item>
<property name="text">
<string>P1</string>
<string>Text only</string>
</property>
</item>
<item>
<property name="text">
<string>P2</string>
</property>
</item>
<item>
<property name="text">
<string>P3</string>
</property>
</item>
<item>
<property name="text">
<string>P4</string>
</property>
</item>
<item>
<property name="text">
<string>P5</string>
</property>
</item>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="le_AirlineOperator"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="lbl_PerformanceCategory">
<property name="text">
<string>Performance category</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="cb_RequiredNavigationPerformance">
<item>
<property name="text">
<string>VFR - not required</string>
</property>
</item>
<item>
<property name="text">
<string>10 miles radius</string>
</property>
</item>
<item>
<property name="text">
<string>4 miles radius</string>
<string>Receive voice</string>
</property>
</item>
</widget>
@@ -933,40 +840,13 @@
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="BlackGui::Components::CSelcalCodeSelector" name="frp_SelcalCode">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="lbl_AirlineOperator">
<item row="9" column="0">
<widget class="QLabel" name="lbl_RemarksGenerated">
<property name="text">
<string>Airline operator</string>
<string>Remarks</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="lbl_PilotRating">
<property name="text">
<string>Pilot rating</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lbl_NavigationEquipment">
<property name="text">
<string>Navigation equipment</string>
</property>
<property name="wordWrap">
<bool>true</bool>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
@@ -1007,27 +887,22 @@
</item>
</widget>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="cb_VoiceCapabilities">
<item>
<property name="text">
<string>Full voice</string>
</property>
</item>
<item>
<property name="text">
<string>Text only</string>
</property>
</item>
<item>
<property name="text">
<string>Receive voice</string>
</property>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lbl_NavigationEquipment">
<property name="text">
<string>Navigation equipment</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="le_AircraftRegistration"/>
<item row="2" column="0">
<widget class="QLabel" name="lbl_SidsStars">
<property name="text">
<string>SIDs / STARs</string>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="lbl_Selcal">
@@ -1036,7 +911,67 @@
</property>
</widget>
</item>
<item row="10" column="1">
<item row="0" column="1">
<widget class="QLineEdit" name="le_AirlineOperator"/>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="cb_NoSidsStarts">
<property name="text">
<string>no SIDs / STARs</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QComboBox" name="cb_PilotRating">
<item>
<property name="text">
<string>P0 - unrated</string>
</property>
</item>
<item>
<property name="text">
<string>P1</string>
</property>
</item>
<item>
<property name="text">
<string>P2</string>
</property>
</item>
<item>
<property name="text">
<string>P3</string>
</property>
</item>
<item>
<property name="text">
<string>P4</string>
</property>
</item>
<item>
<property name="text">
<string>P5</string>
</property>
</item>
</widget>
</item>
<item row="9" column="1">
<widget class="QPlainTextEdit" name="pte_RemarksGenerated">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>75</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>generated remarks</string>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QPlainTextEdit" name="pte_AdditionalRemarks">
<property name="maximumSize">
<size>
@@ -1049,16 +984,101 @@
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="lbl_AdditionalRemarks">
<item row="0" column="0">
<widget class="QLabel" name="lbl_AirlineOperator">
<property name="text">
<string>Additional remarks</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
<string>Airline operator</string>
</property>
<property name="wordWrap">
<bool>false</bool>
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="lbl_PerformanceCategory">
<property name="text">
<string>Performance category</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QFrame" name="fr_Buttons">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1" alignment="Qt::AlignRight">
<widget class="QPushButton" name="pb_CopyOver">
<property name="text">
<string>Copy over</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="cb_RequiredNavigationPerformance">
<item>
<property name="text">
<string>VFR - not required</string>
</property>
</item>
<item>
<property name="text">
<string>10 miles radius</string>
</property>
</item>
<item>
<property name="text">
<string>4 miles radius</string>
</property>
</item>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="le_AircraftRegistration"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="lbl_RequiredNavigationPerformance">
<property name="text">
<string>Required Navigation Performance</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="lbl_PilotRating">
<property name="text">
<string>Pilot rating</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="BlackGui::Components::CSelcalCodeSelector" name="frp_SelcalCode">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="lbl_VoiceCapabilities">
<property name="text">
<string>Voice capabilities</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
@@ -1094,43 +1114,10 @@
</item>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="cb_NoSidsStarts">
<item row="11" column="0" alignment="Qt::AlignTop">
<widget class="QPushButton" name="pb_AddRemarks">
<property name="text">
<string>no SIDs / STARs</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="lbl_VoiceCapabilities">
<property name="text">
<string>Voice capabilities</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lbl_SidsStars">
<property name="text">
<string>SIDs / STARs</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QPlainTextEdit" name="pte_RemarksGenerated">
<property name="maximumSize">
<size>
<width>16777215</width>
<height>75</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="placeholderText">
<string>generated remarks</string>
<string>add.remarks</string>
</property>
</widget>
</item>
@@ -1265,7 +1252,6 @@ p, li { white-space: pre-wrap; }
<tabstop>cb_PilotRating</tabstop>
<tabstop>pte_RemarksGenerated</tabstop>
<tabstop>pte_AdditionalRemarks</tabstop>
<tabstop>pb_Parse</tabstop>
<tabstop>pb_CopyOver</tabstop>
<tabstop>tbr_EquipmentCodes</tabstop>
</tabstops>