refs #859, improved sending of ICAO code/callsign updates

* use digest signal
* restructured updateOwnAircaftIcaoValuesFromGuiValues / updateOwnAircraftCallsignAndPilotFromGuiValues
* also send change signal when login UI becomes invisible
This commit is contained in:
Klaus Basan
2017-01-13 04:41:57 +01:00
committed by Mathew Sutcliffe
parent 8b9b540c22
commit 5f2955916c
3 changed files with 112 additions and 74 deletions

View File

@@ -85,7 +85,7 @@ namespace BlackGui
ui->selector_AircraftIcao->displayMode(CDbAircraftIcaoSelectorComponent::DisplayIcaoAndId); ui->selector_AircraftIcao->displayMode(CDbAircraftIcaoSelectorComponent::DisplayIcaoAndId);
ui->selector_AirlineIcao->displayMode(CDbAirlineIcaoSelectorComponent::DisplayVDesignatorAndId); ui->selector_AirlineIcao->displayMode(CDbAirlineIcaoSelectorComponent::DisplayVDesignatorAndId);
setOkButtonString(false); this->setOkButtonString(false);
connect(ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CLoginComponent::ps_loginCancelled); connect(ui->bb_OkCancel, &QDialogButtonBox::rejected, this, &CLoginComponent::ps_loginCancelled);
connect(ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CLoginComponent::ps_toggleNetworkConnection); connect(ui->bb_OkCancel, &QDialogButtonBox::accepted, this, &CLoginComponent::ps_toggleNetworkConnection);
connect(ui->pb_OtherServersGotoSettings, &QPushButton::pressed, this, &CLoginComponent::requestNetworkSettings); connect(ui->pb_OtherServersGotoSettings, &QPushButton::pressed, this, &CLoginComponent::requestNetworkSettings);
@@ -171,8 +171,15 @@ namespace BlackGui
this->m_logoffCountdownTimer->stop(); // in any case stop the timer this->m_logoffCountdownTimer->stop(); // in any case stop the timer
if (currentWidget != this && currentWidget != this->parentWidget()) if (currentWidget != this && currentWidget != this->parentWidget())
{ {
const bool wasVisible = this->m_visible;
this->m_visible = false; this->m_visible = false;
this->m_logoffCountdownTimer->stop(); this->m_logoffCountdownTimer->stop();
if (wasVisible)
{
// set own values, and send signals
this->setOwnModelAndIcaoValues();
}
} }
else else
{ {
@@ -228,34 +235,8 @@ namespace BlackGui
} }
// sync values with GUI values // sync values with GUI values
CGuiAircraftValues aircraftValues = this->getAircraftValuesFromGui(); this->updateOwnAircraftCallsignAndPilotFromGuiValues();
ownAircraft = sGui->getIContextOwnAircraft()->getOwnAircraft(); this->updateOwnAircaftIcaoValuesFromGuiValues();
CAircraftIcaoCode aircraftCode(ownAircraft.getAircraftIcaoCode());
CAirlineIcaoCode airlineCode(ownAircraft.getAirlineIcaoCode());
bool setIcaoCodes = false;
if (!ownAircraft.hasAircraftDesignator() && aircraftValues.ownAircraftIcao.hasValidDesignator())
{
aircraftCode = aircraftValues.ownAircraftIcao;
setIcaoCodes = true;
}
if (!ownAircraft.hasAircraftDesignator() && aircraftValues.ownAirlineIcao.hasValidDesignator())
{
airlineCode = aircraftValues.ownAirlineIcao;
setIcaoCodes = true;
}
if (ownAircraft.getCallsign() != aircraftValues.ownCallsign)
{
ownAircraft.setCallsign(aircraftValues.ownCallsign);
this->updateOwnCallsignAndPilotFromGuiValue();
}
if (setIcaoCodes)
{
ownAircraft.setIcaoCodes(aircraftCode, airlineCode);
sGui->getIContextOwnAircraft()->updateOwnIcaoCodes(ownAircraft.getAircraftIcaoCode(), ownAircraft.getAirlineIcaoCode());
}
// Login mode // Login mode
INetwork::LoginMode mode = ui->gbp_LoginMode->getLoginMode(); INetwork::LoginMode mode = ui->gbp_LoginMode->getLoginMode();
@@ -396,7 +377,7 @@ namespace BlackGui
CUser CLoginComponent::getUserFromVatsimGuiValues() const CUser CLoginComponent::getUserFromVatsimGuiValues() const
{ {
CVatsimValues values = getVatsimValuesFromGui(); const CVatsimValues values = this->getVatsimValuesFromGui();
CUser user(values.vatsimId, values.vatsimRealName, "", values.vatsimPassword, getCallsignFromGui()); CUser user(values.vatsimId, values.vatsimRealName, "", values.vatsimPassword, getCallsignFromGui());
user.setHomeBase(values.vatsimHomeAirport); user.setHomeBase(values.vatsimHomeAirport);
return user; return user;
@@ -404,7 +385,7 @@ namespace BlackGui
CCallsign CLoginComponent::getCallsignFromGui() const CCallsign CLoginComponent::getCallsignFromGui() const
{ {
CCallsign cs(ui->le_Callsign->text().trimmed().toUpper()); const CCallsign cs(ui->le_Callsign->text().trimmed().toUpper());
return cs; return cs;
} }
@@ -420,7 +401,7 @@ namespace BlackGui
void CLoginComponent::setOkButtonString(bool connected) void CLoginComponent::setOkButtonString(bool connected)
{ {
QString s = connected ? "Disconnect" : "Connect"; const QString s = connected ? "Disconnect" : "Connect";
ui->bb_OkCancel->button(QDialogButtonBox::Ok)->setText(s); ui->bb_OkCancel->button(QDialogButtonBox::Ok)->setText(s);
} }
@@ -477,30 +458,42 @@ namespace BlackGui
} }
} }
this->updateOwnCallsignAndPilotFromGuiValue(); const bool changedOwnAircraftCallsignPilot = this->updateOwnAircraftCallsignAndPilotFromGuiValues();
this->triggerDataChangedSignal(1500); const bool changedOwnAircraftIcaoValues = this->updateOwnAircaftIcaoValuesFromGuiValues();
if (changedOwnAircraftIcaoValues || changedOwnAircraftCallsignPilot)
{
emit this->loginDataChanged();
}
} }
void CLoginComponent::setGuiIcaoValues(const CAircraftModel &model, bool onlyIfEmpty) bool CLoginComponent::setGuiIcaoValues(const CAircraftModel &model, bool onlyIfEmpty)
{ {
bool changed = false;
if (!onlyIfEmpty || !ui->selector_AircraftIcao->isSet()) if (!onlyIfEmpty || !ui->selector_AircraftIcao->isSet())
{ {
ui->selector_AircraftIcao->setAircraftIcao(model.getAircraftIcaoCode()); changed = ui->selector_AircraftIcao->setAircraftIcao(model.getAircraftIcaoCode());
} }
if (!onlyIfEmpty || !ui->selector_AirlineIcao->isSet()) if (!onlyIfEmpty || !ui->selector_AirlineIcao->isSet())
{ {
ui->selector_AirlineIcao->setAirlineIcao(model.getAirlineIcaoCode()); const bool c = ui->selector_AirlineIcao->setAirlineIcao(model.getAirlineIcaoCode());
changed |= c;
} }
if (!onlyIfEmpty || ui->le_AircraftCombinedType->text().trimmed().isEmpty()) if (!onlyIfEmpty || ui->le_AircraftCombinedType->text().trimmed().isEmpty())
{ {
ui->le_AircraftCombinedType->setText(model.getAircraftIcaoCode().getCombinedType()); const QString combined(model.getAircraftIcaoCode().getCombinedType());
if (ui->le_AircraftCombinedType->text() != combined)
{
ui->le_AircraftCombinedType->setText(combined);
changed = true;
} }
this->ps_validateAircraftValues(); }
const bool valid = this->ps_validateAircraftValues();
return valid ? changed : false;
} }
bool CLoginComponent::ps_validateAircraftValues() bool CLoginComponent::ps_validateAircraftValues()
{ {
CGuiAircraftValues values = getAircraftValuesFromGui(); const CGuiAircraftValues values = getAircraftValuesFromGui();
const bool validCombinedType = CAircraftIcaoCode::isValidCombinedType(values.ownAircraftCombinedType); const bool validCombinedType = CAircraftIcaoCode::isValidCombinedType(values.ownAircraftCombinedType);
ui->lblp_AircraftCombinedType->setTicked(validCombinedType); ui->lblp_AircraftCombinedType->setTicked(validCombinedType);
@@ -599,10 +592,10 @@ namespace BlackGui
} }
// check state of own aircraft // check state of own aircraft
this->updateOwnCallsignAndPilotFromGuiValue(); this->updateOwnAircraftCallsignAndPilotFromGuiValues();
// let others know data changed // let others know data changed
this->triggerDataChangedSignal(1500); emit this->loginDataChanged();
} }
void CLoginComponent::ps_mappingWizard() void CLoginComponent::ps_mappingWizard()
@@ -670,11 +663,6 @@ namespace BlackGui
ui->le_SimulatorModel->setStyleSheet(sheet.arg(color)); ui->le_SimulatorModel->setStyleSheet(sheet.arg(color));
} }
void CLoginComponent::triggerDataChangedSignal(int deferTimeMs)
{
QTimer::singleShot(deferTimeMs, this, &CLoginComponent::loginDataChanged);
}
CAircraftModel CLoginComponent::getPrefillModel() const CAircraftModel CLoginComponent::getPrefillModel() const
{ {
CAircraftModel model = this->m_currentAircraftModel.get(); CAircraftModel model = this->m_currentAircraftModel.get();
@@ -682,24 +670,60 @@ namespace BlackGui
return IContextOwnAircraft::getDefaultOwnAircraftModel(); return IContextOwnAircraft::getDefaultOwnAircraftModel();
} }
void CLoginComponent::updateOwnCallsignAndPilotFromGuiValue() bool CLoginComponent::updateOwnAircraftCallsignAndPilotFromGuiValues()
{ {
if (!sGui || !sGui->getIContextOwnAircraft()) { return; } if (!sGui || !sGui->getIContextOwnAircraft()) { return false; }
const CSimulatedAircraft ownAircaft(sGui->getIContextOwnAircraft()->getOwnAircraft()); CSimulatedAircraft ownAircraft(sGui->getIContextOwnAircraft()->getOwnAircraft());
const QString cs(ui->le_Callsign->text().trimmed().toUpper()); const QString cs(ui->le_Callsign->text().trimmed().toUpper());
if (!cs.isEmpty() && ownAircaft.getCallsignAsString() != cs) bool changedCallsign = false;
if (!cs.isEmpty() && ownAircraft.getCallsignAsString() != cs)
{ {
sGui->getIContextOwnAircraft()->updateOwnCallsign(CCallsign(cs)); const CCallsign callsign(cs);
sGui->getIContextOwnAircraft()->updateOwnCallsign(callsign);
ownAircraft.setCallsign(callsign); // also update
changedCallsign = true;
} }
CUser pilot = ownAircaft.getPilot(); CUser pilot = ownAircraft.getPilot();
pilot.setRealName(CUser::beautifyRealName(ui->le_VatsimRealName->text())); pilot.setRealName(CUser::beautifyRealName(ui->le_VatsimRealName->text()));
pilot.setHomeBase(CAirportIcaoCode(ui->le_VatsimHomeAirport->text())); pilot.setHomeBase(CAirportIcaoCode(ui->le_VatsimHomeAirport->text()));
pilot.setId(ui->le_VatsimId->text()); pilot.setId(ui->le_VatsimId->text());
pilot.setCallsign(CCallsign(cs)); pilot.setCallsign(CCallsign(cs));
if (ownAircaft.getPilot() != pilot) bool changedPilot = false;
if (ownAircraft.getPilot() != pilot)
{ {
sGui->getIContextOwnAircraft()->updateOwnAircraftPilot(pilot); // it can be that the callsign was changed and this results in unchanged here
changedPilot = sGui->getIContextOwnAircraft()->updateOwnAircraftPilot(pilot);
} }
return changedCallsign || changedPilot;
}
bool CLoginComponent::updateOwnAircaftIcaoValuesFromGuiValues()
{
if (!sGui || !sGui->getIContextOwnAircraft()) { return false; }
const CSimulatedAircraft ownAircraft(sGui->getIContextOwnAircraft()->getOwnAircraft());
const CGuiAircraftValues aircraftValues = this->getAircraftValuesFromGui();
CAircraftIcaoCode aircraftCode(ownAircraft.getAircraftIcaoCode());
CAirlineIcaoCode airlineCode(ownAircraft.getAirlineIcaoCode());
bool changedIcaoCodes = false;
if (aircraftValues.ownAircraftIcao.hasValidDesignator() && aircraftValues.ownAircraftIcao != aircraftCode)
{
aircraftCode = aircraftValues.ownAircraftIcao;
changedIcaoCodes = true;
}
if (aircraftValues.ownAirlineIcao.hasValidDesignator() && aircraftValues.ownAirlineIcao != airlineCode)
{
airlineCode = aircraftValues.ownAirlineIcao;
changedIcaoCodes = true;
}
if (changedIcaoCodes)
{
sGui->getIContextOwnAircraft()->updateOwnIcaoCodes(aircraftCode, airlineCode);
}
return changedIcaoCodes;
} }
} // namespace } // namespace
} // namespace } // namespace

View File

@@ -16,13 +16,14 @@
#include "blackcore/data/vatsimsetup.h" #include "blackcore/data/vatsimsetup.h"
#include "blackgui/blackguiexport.h" #include "blackgui/blackguiexport.h"
#include "blackgui/settings/guisettings.h" #include "blackgui/settings/guisettings.h"
#include "blackmisc/aviation/callsign.h" #include "blackmisc/simulation/simulatedaircraft.h"
#include "blackmisc/network/entityflags.h" #include "blackmisc/network/entityflags.h"
#include "blackmisc/network/server.h" #include "blackmisc/network/server.h"
#include "blackmisc/network/user.h" #include "blackmisc/network/user.h"
#include "blackmisc/digestsignal.h"
#include "blackmisc/aviation/callsign.h"
#include "blackmisc/settingscache.h" #include "blackmisc/settingscache.h"
#include "blackmisc/datacache.h" #include "blackmisc/datacache.h"
#include "blackmisc/simulation/simulatedaircraft.h"
#include <QFrame> #include <QFrame>
#include <QObject> #include <QObject>
@@ -50,8 +51,7 @@ namespace BlackGui
/*! /*!
* Login component to flight network * Login component to flight network
*/ */
class BLACKGUI_EXPORT CLoginComponent : class BLACKGUI_EXPORT CLoginComponent : public QFrame
public QFrame
{ {
Q_OBJECT Q_OBJECT
@@ -66,7 +66,7 @@ namespace BlackGui
void setAutoPopupWizad(bool autoPopup); void setAutoPopupWizad(bool autoPopup);
//! Destructor //! Destructor
~CLoginComponent(); virtual ~CLoginComponent();
signals: signals:
//! Login //! Login
@@ -79,8 +79,12 @@ namespace BlackGui
void requestNetworkSettings(); void requestNetworkSettings();
//! Relevant login data changed //! Relevant login data changed
//! \private normally loginDataChangedDigest will be used
void loginDataChanged(); void loginDataChanged();
//! Relevant login data changed (digest version)
void loginDataChangedDigest();
public slots: public slots:
//! Main info area changed //! Main info area changed
void mainInfoAreaChanged(const QWidget *currentWidget); void mainInfoAreaChanged(const QWidget *currentWidget);
@@ -142,8 +146,7 @@ namespace BlackGui
QString vatsimHomeAirport; QString vatsimHomeAirport;
}; };
//! Load from settings // -------------- values from GUI -----------------
void loadRememberedVatsimData();
//! Values from GUI //! Values from GUI
CGuiAircraftValues getAircraftValuesFromGui() const; CGuiAircraftValues getAircraftValuesFromGui() const;
@@ -157,6 +160,25 @@ namespace BlackGui
//! Callsign from GUI //! Callsign from GUI
BlackMisc::Aviation::CCallsign getCallsignFromGui() const; BlackMisc::Aviation::CCallsign getCallsignFromGui() const;
//! Set ICAO values
//! \return changed values
bool setGuiIcaoValues(const BlackMisc::Simulation::CAircraftModel &model, bool onlyIfEmpty);
// -------------- values from GUI -----------------
//! Update own callsign (own aircraft from what is set in the GUI)
//! \return changed?
bool updateOwnAircraftCallsignAndPilotFromGuiValues();
//! Update own ICAO values (own aircraft from what is set in the GUI)
//! \return changed?
bool updateOwnAircaftIcaoValuesFromGuiValues();
// -------------- others -----------------
//! Own model and ICAO data for GUI and own aircraft
void setOwnModelAndIcaoValues();
//! Selected server (VATSIM) //! Selected server (VATSIM)
BlackMisc::Network::CServer getCurrentVatsimServer() const; BlackMisc::Network::CServer getCurrentVatsimServer() const;
@@ -172,29 +194,21 @@ namespace BlackGui
//! Logoff countdown //! Logoff countdown
void startLogoffTimerCountdown(); void startLogoffTimerCountdown();
//! Own model and ICAO data
void setOwnModelAndIcaoValues();
//! Set ICAO values
void setGuiIcaoValues(const BlackMisc::Simulation::CAircraftModel &model, bool onlyIfEmpty);
//! Completers //! Completers
void initCompleters(BlackMisc::Network::CEntityFlags::Entity entity); void initCompleters(BlackMisc::Network::CEntityFlags::Entity entity);
//! Highlight model field according to model data //! Highlight model field according to model data
void highlightModelField(const BlackMisc::Simulation::CAircraftModel &model = {}); void highlightModelField(const BlackMisc::Simulation::CAircraftModel &model = {});
//! Trigger the signal that data have been changed //! Load from settings
void triggerDataChangedSignal(int deferTimeMs); void loadRememberedVatsimData();
//! Get a prefill model //! Get a prefill model
BlackMisc::Simulation::CAircraftModel getPrefillModel() const; BlackMisc::Simulation::CAircraftModel getPrefillModel() const;
//! Update own callsign (own aircraft from what is set in the GUI)
void updateOwnCallsignAndPilotFromGuiValue();
QScopedPointer<Ui::CLoginComponent> ui; QScopedPointer<Ui::CLoginComponent> ui;
QScopedPointer<CDbQuickMappingWizard> m_mappingWizard; QScopedPointer<CDbQuickMappingWizard> m_mappingWizard;
BlackMisc::CDigestSignal m_changedLoginDataDigestSignal { this, &CLoginComponent::loginDataChanged, &CLoginComponent::loginDataChangedDigest, 1500, 10 };
bool m_autoPopupWizard = false; //!< automatically popup wizard if mapping is needed bool m_autoPopupWizard = false; //!< automatically popup wizard if mapping is needed
bool m_visible = false; //!< is this component selected? bool m_visible = false; //!< is this component selected?
const int LogoffIntervalSeconds = 20; //!< time before logoff const int LogoffIntervalSeconds = 20; //!< time before logoff

View File

@@ -212,7 +212,7 @@ void SwiftGuiStd::initGuiSignals()
connect(ui->comp_Login, &CLoginComponent::loginOrLogoffCancelled, this, &SwiftGuiStd::ps_setMainPageToInfoArea); connect(ui->comp_Login, &CLoginComponent::loginOrLogoffCancelled, this, &SwiftGuiStd::ps_setMainPageToInfoArea);
connect(ui->comp_Login, &CLoginComponent::loginOrLogoffSuccessful, this, &SwiftGuiStd::ps_setMainPageToInfoArea); connect(ui->comp_Login, &CLoginComponent::loginOrLogoffSuccessful, this, &SwiftGuiStd::ps_setMainPageToInfoArea);
connect(ui->comp_Login, &CLoginComponent::loginOrLogoffSuccessful, ui->comp_MainInfoArea->getFlightPlanComponent(), &CFlightPlanComponent::loginDataSet); connect(ui->comp_Login, &CLoginComponent::loginOrLogoffSuccessful, ui->comp_MainInfoArea->getFlightPlanComponent(), &CFlightPlanComponent::loginDataSet);
connect(ui->comp_Login, &CLoginComponent::loginDataChanged, ui->comp_MainInfoArea->getFlightPlanComponent(), &CFlightPlanComponent::loginDataSet); connect(ui->comp_Login, &CLoginComponent::loginDataChangedDigest, ui->comp_MainInfoArea->getFlightPlanComponent(), &CFlightPlanComponent::loginDataSet);
connect(this, &SwiftGuiStd::currentMainInfoAreaChanged, ui->comp_Login, &CLoginComponent::mainInfoAreaChanged); connect(this, &SwiftGuiStd::currentMainInfoAreaChanged, ui->comp_Login, &CLoginComponent::mainInfoAreaChanged);
connect(ui->comp_Login, &CLoginComponent::requestNetworkSettings, ui->comp_MainInfoArea->getFlightPlanComponent(), [ = ]() connect(ui->comp_Login, &CLoginComponent::requestNetworkSettings, ui->comp_MainInfoArea->getFlightPlanComponent(), [ = ]()
{ {