12 #include <QPushButton>
13 #include <QStringListModel>
17 #include "ui_mappingcomponent.h"
41 using namespace swift::misc::simulation;
42 using namespace swift::misc::network;
43 using namespace swift::misc::aviation;
44 using namespace swift::misc::physical_quantities;
46 using namespace swift::core::context;
50 using namespace swift::gui::settings;
60 CMappingComponent::CMappingComponent(
QWidget *parent)
63 Q_ASSERT_X(
sGui, Q_FUNC_INFO,
"need sGui");
68 ui->tw_SpecializedViews->setCurrentIndex(0);
70 ui->tvp_AircraftModels->setAircraftModelMode(CAircraftModelListModel::OwnAircraftModelClient);
71 ui->tvp_AircraftModels->setResizeMode(CAircraftModelView::ResizingOff);
72 ui->tvp_AircraftModels->addFilterDialog();
73 ui->tvp_AircraftModels->menuRemoveItems(CAircraftModelView::MenuBackend);
74 ui->tvp_AircraftModels->menuAddItems(CAircraftModelView::MenuDisableModelsTemp);
76 ui->tvp_RenderedAircraft->setAircraftMode(CSimulatedAircraftListModel::RenderedMode);
77 ui->tvp_RenderedAircraft->setResizeMode(CAircraftModelView::ResizingOnce);
78 ui->tvp_RenderedAircraft->menuAddItems(CAircraftModelView::MenuDisableModelsTemp);
81 &CMappingComponent::onNetworkConnectionStatusChanged);
83 connect(ui->tvp_AircraftModels, &CAircraftModelView::requestUpdate,
this,
84 &CMappingComponent::onModelsUpdateRequested);
85 connect(ui->tvp_AircraftModels, &CAircraftModelView::modelDataChanged,
this,
86 &CMappingComponent::onRowCountChanged);
87 connect(ui->tvp_AircraftModels, &CAircraftModelView::clicked,
this, &CMappingComponent::onModelSelectedInView);
88 connect(ui->tvp_AircraftModels, &CAircraftModelView::requestTempDisableModelsForMatching,
this,
89 &CMappingComponent::onTempDisableModelsForMatchingRequested);
91 connect(ui->tvp_RenderedAircraft, &CSimulatedAircraftView::modelDataChanged,
this,
92 &CMappingComponent::onRowCountChanged);
93 connect(ui->tvp_RenderedAircraft, &CSimulatedAircraftView::clicked,
this,
94 &CMappingComponent::onAircraftSelectedInView);
95 connect(ui->tvp_RenderedAircraft, &CSimulatedAircraftView::requestUpdate,
this,
96 &CMappingComponent::tokenBucketUpdate);
97 connect(ui->tvp_RenderedAircraft, &CSimulatedAircraftView::requestTextMessageWidget,
this,
99 connect(ui->tvp_RenderedAircraft, &CSimulatedAircraftView::requestTempDisableModelsForMatching,
this,
100 &CMappingComponent::onTempDisableModelsForMatchingRequested);
108 m_currentMappingsViewDelegate =
new CCheckBoxDelegate(
":/diagona/icons/diagona/icons/tick.png",
109 ":/diagona/icons/diagona/icons/cross.png",
this);
110 ui->tvp_RenderedAircraft->setItemDelegateForColumn(0, m_currentMappingsViewDelegate);
118 &CMappingComponent::onModelPreviewChanged);
121 ui->completer_ModelStrings->setSourceVisible(CAircraftModelStringCompleter::OwnModels,
false);
122 ui->completer_ModelStrings->selectSource(CAircraftModelStringCompleter::ModelSet);
127 ui->tvp_AircraftModels->setDisplayAutomatically(
false);
128 this->settingsChanged();
131 ui->comp_SimulatorSelector->setRememberSelection(
false);
133 ui->comp_SimulatorSelector->setToConnectedSimulator();
135 &CMappingComponent::onModelSetSimulatorChanged);
168 connect(ui->tvp_RenderedAircraft, &CAircraftModelView::objectChanged,
this,
176 const CSimulatorInfo simulator(myself->getConnectedOrSelectedSimulator());
177 myself->onModelSetSimulatorChanged(simulator);
178 myself->onModelSetChanged(simulator);
186 Q_ASSERT(ui->tvp_RenderedAircraft);
187 return ui->tvp_RenderedAircraft->rowCount();
192 Q_ASSERT(ui->tvp_AircraftModels);
193 return ui->tvp_AircraftModels->rowCount();
198 const int tabIndex =
static_cast<int>(tab);
199 ui->tw_SpecializedViews->setCurrentIndex(tabIndex);
204 Q_ASSERT(ui->tvp_AircraftModels);
205 return ui->tvp_AircraftModels->container().findModelsStartingWith(modelName, cs);
208 void CMappingComponent::onModelSetChanged(
const CSimulatorInfo &dummy)
213 const CSimulatorInfo simulator(ui->comp_SimulatorSelector->getValue());
214 const bool changed = ui->completer_ModelStrings->setSimulator(simulator);
215 if (!changed) {
return; }
217 if (ui->tvp_AircraftModels->displayAutomatically()) { this->onModelsUpdateRequested(); }
220 CLogMessage(
this).
info(u
"Model set loaded ('%1'), you can update the model view")
221 << simulator.toQString(
true);
225 void CMappingComponent::onRowCountChanged(
int count,
bool withFilter)
228 Q_UNUSED(withFilter);
229 const int am = ui->tw_SpecializedViews->indexOf(ui->tb_AircraftModels);
230 const int cm = ui->tw_SpecializedViews->indexOf(ui->tb_CurrentMappings);
231 const QString amf = ui->tvp_AircraftModels->derivedModel()->hasFilter() ?
"F" :
"";
232 QString a = ui->tw_SpecializedViews->tabBar()->tabText(am);
233 QString c = ui->tw_SpecializedViews->tabBar()->tabText(cm);
236 ui->tw_SpecializedViews->tabBar()->setTabText(am, a);
237 ui->tw_SpecializedViews->tabBar()->setTabText(cm, c);
240 void CMappingComponent::onChangedSimulatedAircraftInView(
const CVariant &
object,
const CPropertyIndex &index)
242 if (!index.
contains(CSimulatedAircraft::IndexEnabled)) {
return; }
246 if (!saFromBackend.hasValidCallsign()) {
return; }
248 if (saFromBackend.isEnabled() == nowEnabled) {
return; }
250 << (nowEnabled ?
"enable" :
"disable") << saFromBackend.getCallsign().toQString();
254 void CMappingComponent::onAircraftSelectedInView(
const QModelIndex &index)
257 ui->cb_AircraftEnabled->setChecked(simAircraft.
isEnabled());
259 ui->completer_ModelStrings->setModel(simAircraft.
getModel());
262 void CMappingComponent::onModelSelectedInView(
const QModelIndex &index)
265 ui->completer_ModelStrings->setModel(model);
268 CCallsign CMappingComponent::validateRenderedCallsign()
270 const QString cs = ui->le_Callsign->text().trimmed();
271 if (!CCallsign::isValidAircraftCallsign(cs))
279 const bool hasCallsign = ui->tvp_RenderedAircraft->container().containsCallsign(callsign);
283 << callsign.asString();
290 void CMappingComponent::onModelSetSimulatorChanged(
const CSimulatorInfo &simulator)
292 if (!
sGui || this->isSimulatorAvailable()) {
return; }
300 Q_UNUSED(pluginInfo);
301 ui->comp_SimulatorSelector->setToConnectedSimulator(50);
304 void CMappingComponent::onSimulatorStatusChanged(
int status)
306 const ISimulator::SimulatorStatus simStatus =
static_cast<ISimulator::SimulatorStatus
>(status);
311 ui->comp_SimulatorSelector->setToConnectedSimulator(50);
315 void CMappingComponent::doMatchingsAgain()
317 using namespace std::chrono_literals;
323 const QString info = QStringLiteral(
"Triggered re-matching of %1 aircraft").
arg(rematchedNumber);
328 void CMappingComponent::onSaveAircraft()
334 const CCallsign callsign(this->validateRenderedCallsign());
335 if (callsign.isEmpty()) {
return; }
336 const QString modelString = ui->completer_ModelStrings->getModelString();
345 bool hasModel = ui->tvp_AircraftModels->container().containsModelString(modelString);
354 CStatusMessage(
this).validationError(u
"Invalid model for mapping, reloading model set"),
356 if (ui->tvp_AircraftModels->isEmpty()) { this->onModelsUpdateRequested(); }
362 const bool enabled = ui->cb_AircraftEnabled->isChecked();
363 bool changed =
false;
378 if (models.
size() > 1)
392 CLogMessage(
this).
info(u
"Requesting changes for '%1'") << callsign.asString();
410 void CMappingComponent::onResetAircraft()
412 using namespace std::chrono_literals;
418 const CCallsign callsign(this->validateRenderedCallsign());
419 if (callsign.isEmpty()) {
return; }
426 void CMappingComponent::onModelPreviewChanged(
Qt::CheckState state)
432 void CMappingComponent::onModelsUpdateRequested()
438 const bool hasDisabledModels = !disabledModels.
isEmpty();
440 ui->tvp_AircraftModels->setHighlightColor(
Qt::red);
441 ui->tvp_AircraftModels->setHighlight(hasDisabledModels);
442 ui->tvp_AircraftModels->setHighlightModels(disabledModels);
443 ui->tvp_AircraftModels->updateContainerMaybeAsync(modelSet);
444 ui->tw_SpecializedViews->setCurrentIndex(TabAircraftModels);
447 void CMappingComponent::onTempDisableModelsForMatchingRequested(
const CAircraftModelList &models)
449 if (models.
isEmpty()) {
return; }
456 this->onModelsUpdateRequested();
460 void CMappingComponent::onRemoteAircraftModelChanged(
const CSimulatedAircraft &aircraft,
463 if (CIdentifiable::isMyIdentifier(originator)) {
return; }
464 this->tokenBucketUpdateAircraft(aircraft);
472 this->tokenBucketUpdate();
473 ui->tvp_RenderedAircraft->clear();
481 ui->tvp_RenderedAircraft->configureMenuFastPositionUpdates(sendFast);
486 CSimulatorInfo CMappingComponent::getConnectedOrSelectedSimulator()
const
489 return ui->comp_SimulatorSelector->getValue();
492 bool CMappingComponent::isSimulatorAvailable()
const
498 void CMappingComponent::showAircraftModelDetails(
bool show)
500 QList<int> sizes = ui->sp_MappingComponentSplitter->sizes();
501 Q_ASSERT_X(sizes.
size() == 2, Q_FUNC_INFO,
"Wrong splitter sizes");
502 const int total = sizes[0] + sizes[1];
506 newSizes[0] = qRound(total * 0.8);
507 newSizes[1] = qRound(total * 0.2);
514 ui->sp_MappingComponentSplitter->setSizes(newSizes);
517 void CMappingComponent::onAddingRemoteAircraftFailed(
const CSimulatedAircraft &aircraft,
bool disabled,
520 this->tokenBucketUpdate();
527 void CMappingComponent::onTabWidgetChanged(
int index)
530 const auto w =
static_cast<TabWidget>(index);
531 const bool show = (w == TabAircraftModels) || (w == TabRenderedAircraft);
532 this->showAircraftModelDetails(
show);
535 void CMappingComponent::updateRenderedAircraftView(
bool forceUpdate)
538 m_updateTimer.
start();
541 m_missedRenderedAircraftUpdate =
true;
545 m_missedRenderedAircraftUpdate =
false;
546 m_updateTimer.
start();
550 ui->tvp_RenderedAircraft->updateContainerMaybeAsync(aircraft);
552 else { ui->tvp_RenderedAircraft->clear(); }
555 void CMappingComponent::timerUpdate()
558 this->updateRenderedAircraftView(
false);
564 this->tokenBucketUpdate();
567 void CMappingComponent::tokenBucketUpdate()
570 this->updateRenderedAircraftView(
true);
573 void CMappingComponent::settingsChanged()
585 ui->tvp_RenderedAircraft->clear();
586 m_updateTimer.
stop();
590 ui->comp_SimulatorSelector->setReadOnly(
true);
591 m_updateTimer.
start();
const context::IContextNetwork * getIContextNetwork() const
Direct access to contexts if a CCoreFacade has been initialized.
bool isShuttingDown() const
Is application shutting down?
const context::IContextSimulator * getIContextSimulator() const
Direct access to contexts if a CCoreFacade has been initialized.
virtual swift::misc::simulation::CSimulatedAircraft getAircraftInRangeForCallsign(const swift::misc::aviation::CCallsign &callsign) const =0
Aircraft for given callsign.
virtual bool updateAircraftModel(const swift::misc::aviation::CCallsign &callsign, const swift::misc::simulation::CAircraftModel &model, const swift::misc::CIdentifier &originator)=0
Change model (for remote aircraft)
virtual bool updateAircraftEnabled(const swift::misc::aviation::CCallsign &callsign, bool enabledForRendering)=0
Enable/disable rendering.
virtual swift::misc::simulation::CSimulatedAircraftList getAircraftInRange() const =0
Aircraft list.
virtual swift::misc::network::CServer getConnectedServer() const =0
Server which is connected, if not connected empty default object.
virtual bool resetToModelMatchingAircraft(const swift::misc::aviation::CCallsign &callsign)=0
Reset model by matching it again.
virtual bool isKnownModelInSet(const QString &modelstring) const =0
Known model?
virtual void disableModelsForMatching(const swift::misc::simulation::CAircraftModelList &removedModels, bool incremental)=0
Remove a model for matching.
virtual swift::misc::simulation::CAircraftModelList getDisabledModelsForMatching() const =0
The disabled models for matching.
bool isSimulatorAvailable() const
Simulator avialable (driver available)?
virtual int doMatchingsAgain()=0
Repeat all matchings.
virtual swift::misc::simulation::CAircraftModelList getModelSetModelsStartingWith(const QString &modelString) const =0
Models for model string.
virtual swift::misc::simulation::CAircraftModelList getModelSet() const =0
Installed models in simulator eco system.
bool isSimulatorSimulating() const
Is available simulator simulating? Returns false if no simulator is available.
virtual ISimulator::SimulatorStatus getSimulatorStatus() const =0
Simulator combined status.
virtual void setModelSetLoaderSimulator(const swift::misc::simulation::CSimulatorInfo &simulator)=0
Set the model set loader simulator directly.
static QString replaceTabCountValue(const QString &oldName, int count)
Replace count in name such as "stations (4)".
void closeOverlay()
Close button clicked.
bool showOverlayHTMLMessage(const QString &htmlMessage, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
HTML message.
bool showOverlayMessage(const swift::misc::CStatusMessage &message, std::chrono::milliseconds timeout=std::chrono::milliseconds(0))
Show single message.
void setForceSmall(bool force)
Force small (smaller layout)
void setReducedInfo(bool reduced)
Display reduced information.
Using this class provides a QFrame with the overlay functionality already integrated.
void requestTextMessageWidget(const swift::misc::aviation::CCallsign &callsign)
Request a text message widget.
void setTab(TabWidget tab)
Set tab.
int countAircraftModels() const
Numer of models.
int countCurrentMappings() const
Number of current mappings.
void requestValidationDialog()
Request the validation dialog.
~CMappingComponent()
Destructor.
swift::misc::simulation::CAircraftModelList findModelsStartingWith(const QString &modelName, Qt::CaseSensitivity cs)
Find models starting with.
void changed(const swift::misc::simulation::CSimulatorInfo &simulator)
Value has been changed.
Settings about view update rates.
const swift::misc::physical_quantities::CTime & getRenderingUpdateTime() const
Get time.
CheckBox for single column.
Base class with a member CIdentifier to be inherited by a class which has an identity in the environm...
const CIdentifier & identifier() const
Get identifier.
Value object encapsulating information identifying a component of a modular distributed swift process...
static const QString & guiComponent()
GUI components.
static const QString & mapping()
Mapping.
Class for emitting a log message.
Derived & validationError(const char16_t(&format)[N])
Set the severity to error, providing a format string, and adding the validation category.
Derived & validationInfo(const char16_t(&format)[N])
Set the severity to info, providing a format string, and adding the validation category.
Derived & info(const char16_t(&format)[N])
Set the severity to info, providing a format string.
bool contains(int index) const
Contains index?
size_type size() const
Returns number of elements in the sequence.
reference front()
Access the first element.
bool isEmpty() const
Synonym for empty.
Streamable status message, e.g.
bool tryConsume(int numTokens=1, qint64 msSinceEpoch=-1)
Try to consume a number of tokens.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Value object encapsulating information of a callsign.
const QString & asString() const
Get callsign (normalized)
QString getCallsignsAsString(const QString &separator, bool sorted=false) const
Get callsigns as strings.
QString toQString(bool i18n=false) const
Cast as QString.
Value object encapsulating information about a connection status.
bool isConnected() const
Query status.
bool isDisconnected() const
Query status.
bool sendInterimPositions() const
FSD setup flags.
Value object encapsulating information of a server.
const CFsdSetup & getFsdSetup() const
Get FSD setup.
int toMs() const
Convenience functions when used with timers etc.
Aircraft model (used by another pilot, my models on disk)
void setModelType(ModelType type)
Set type.
const QString & getModelString() const
Model key, either queried or loaded from simulator model.
Value object encapsulating a list of aircraft models.
CAircraftModelList findByModelString(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Find by model string.
bool containsModelString(const QString &modelString, Qt::CaseSensitivity sensitivity=Qt::CaseInsensitive) const
Contains model string?
Comprehensive information of an aircraft.
const aviation::CCallsign & getCallsign() const
Get callsign.
const simulation::CAircraftModel & getModel() const
Get model (model used for mapping)
bool isEnabled() const
Enabled? Enable means it shall be displayed in the simulator.
const QString & getModelString() const
Get model string.
Value object encapsulating a list of aircraft.
Simple hardcoded info about the corresponding simulator.
Describing a simulator plugin.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
High level reusable GUI components.
Filter to search data sets.
Models to be used with views, mainly QTableView.
Views, mainly QTableView.
Free functions in swift::misc.
void checkStateChanged(Qt::CheckState state)
qsizetype size() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void setObjectName(QAnyStringView name)
QString arg(Args &&... args) const const
bool isEmpty() const const
QTextStream & reset(QTextStream &stream)
void setInterval(int msec)