Issue #15 [GUI] Use CLogHistoryReplica in CLogComponent and swift applications

This commit is contained in:
Mat Sutcliffe
2020-04-24 19:28:30 +01:00
parent 3b1e10b51e
commit 86dd91a064
19 changed files with 94 additions and 115 deletions

View File

@@ -906,6 +906,18 @@ namespace BlackCore
return this->startCoreFacadeAndWebDataServices(); // will do nothing if setup is not yet loaded
}
CStatusMessageList CApplication::useFacadeNoContexts()
{
Q_ASSERT_X(m_parsed, Q_FUNC_INFO, "Call this function after parsing");
m_useContexts = true; // otherwise startCoreFacadeAndWebDataServices will early-return
m_coreFacadeConfig = CCoreFacadeConfig::allEmpty();
const CStatusMessage msg = this->initLocalSettings();
if (msg.isFailure()) { return msg; }
return this->startCoreFacadeAndWebDataServices(); // will do nothing if setup is not yet loaded
}
CStatusMessageList CApplication::useWebDataServices(const CWebReaderFlags::WebReader webReaders, const CDatabaseReaderConfigList &dbReaderConfig)
{
Q_ASSERT_X(m_webDataServices.isNull(), Q_FUNC_INFO, "Services already started");

View File

@@ -369,6 +369,11 @@ namespace BlackCore
//! \remark requires setup loaded
BlackMisc::CStatusMessageList useContexts(const CCoreFacadeConfig &coreConfig);
//! Init the core facade without any contexts
//! \sa coreFacadeStarted
//! \remark requires setup loaded
BlackMisc::CStatusMessageList useFacadeNoContexts();
//! Init web data services and start them
//! \sa webDataServicesStarted
//! \remark requires setup loaded

View File

@@ -111,6 +111,7 @@ namespace BlackCore
m_dataLinkDBus = new SharedState::CDataLinkDBus(this);
switch (m_config.getModeApplication())
{
case CCoreFacadeConfig::NotUsed:
case CCoreFacadeConfig::Local:
m_dataLinkDBus->initializeLocal(nullptr);
break;
@@ -133,6 +134,12 @@ namespace BlackCore
m_logHistory->initialize(m_dataLinkDBus);
}
if (m_config.all(CCoreFacadeConfig::NotUsed))
{
m_initalized = true;
return;
}
// contexts
if (m_contextApplication) { m_contextApplication->deleteLater(); }
m_contextApplication = IContextApplication::create(this, m_config.getModeApplication(), m_dbusServer, m_dbusConnection);

View File

@@ -37,6 +37,15 @@ namespace BlackCore
m_simulator == mode);
}
bool CCoreFacadeConfig::all(CCoreFacadeConfig::ContextMode mode) const
{
return (m_application == mode &&
m_audio == mode &&
m_network == mode &&
m_ownAircraft == mode &&
m_simulator == mode);
}
bool CCoreFacadeConfig::anyRemote() const
{
return this->any(Remote);

View File

@@ -91,6 +91,9 @@ namespace BlackCore
//! Any context in given mode
bool any(ContextMode mode) const;
//! All contexts in given mode
bool all(ContextMode mode) const;
//! Any remote context?
bool anyRemote() const;

View File

@@ -12,7 +12,10 @@
#include "blackgui/views/statusmessageview.h"
#include "blackgui/views/viewbase.h"
#include "blackgui/guiutility.h"
#include "blackcore/application.h"
#include "blackmisc/icons.h"
#include "blackmisc/logpattern.h"
#include "blackmisc/sharedstate/datalinkdbus.h"
#include "ui_logcomponent.h"
#include <QAction>
@@ -22,6 +25,7 @@
#include <QtGlobal>
using namespace BlackMisc;
using namespace BlackCore;
using namespace BlackGui;
using namespace BlackGui::Views;
using namespace BlackGui::Menus;
@@ -46,10 +50,21 @@ namespace BlackGui
}
CLogComponent::CLogComponent(QWidget *parent) :
QFrame(parent), ui(new Ui::CLogComponent)
QFrame(parent), ui(new Ui::CLogComponent), m_history(this)
{
ui->setupUi(this);
connect(ui->comp_StatusMessages, &CStatusMessagesDetail::modelDataChangedDigest, this, &CLogComponent::onStatusMessageDataChanged);
connect(&m_history, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage &message)
{
ui->comp_StatusMessages->appendStatusMessageToList(message);
});
connect(&m_history, &CLogHistoryReplica::elementsReplaced, this, [this](const CStatusMessageList &messages)
{
ui->comp_StatusMessages->appendStatusMessagesToList(messages);
});
m_history.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo));
m_history.initialize(sApp->getDataLinkDBus());
}
CLogComponent::~CLogComponent()
@@ -123,27 +138,11 @@ namespace BlackGui
ui->comp_StatusMessages->clear();
}
void CLogComponent::appendStatusMessageToConsole(const CStatusMessage &statusMessage)
{
if (statusMessage.isEmpty()) return;
ui->tep_StatusPageConsole->appendHtml(statusMessage.toHtml(false, true));
}
void CLogComponent::appendPlainTextToConsole(const QString &text)
{
ui->tep_StatusPageConsole->appendPlainText(text);
}
void CLogComponent::appendStatusMessageToList(const CStatusMessage &statusMessage)
{
ui->comp_StatusMessages->appendStatusMessageToList(statusMessage);
}
void CLogComponent::appendStatusMessagesToList(const CStatusMessageList &statusMessages)
{
ui->comp_StatusMessages->appendStatusMessagesToList(statusMessages);
}
void CLogComponent::onStatusMessageDataChanged(int count, bool withFilter)
{
Q_UNUSED(count);

View File

@@ -12,6 +12,7 @@
#define BLACKGUI_LOGCOMPONENT_H
#include "blackgui/blackguiexport.h"
#include "blackmisc/loghistory.h"
#include "blackmisc/statusmessagelist.h"
#include <QFrame>
@@ -94,24 +95,16 @@ namespace BlackGui
//! Clear
void clearMessages();
//! Append status message to console
void appendStatusMessageToConsole(const BlackMisc::CStatusMessage &statusMessage);
//! Append plain text to console
void appendPlainTextToConsole(const QString &text);
//! Append status message to list
void appendStatusMessageToList(const BlackMisc::CStatusMessage &statusMessage);
//! Append status messages to list
void appendStatusMessagesToList(const BlackMisc::CStatusMessageList &statusMessages);
signals:
//! Make me visible
void requestAttention();
private:
QScopedPointer<Ui::CLogComponent> ui;
BlackMisc::CLogHistoryReplica m_history;
//! Status messages changed
void onStatusMessageDataChanged(int count, bool withFilter);

View File

@@ -45,10 +45,10 @@ namespace BlackSimPlugin
//! Dtor
virtual ~CSimulatorEmulatedMonitorDialog() override;
//! \copydoc BlackGui::Components::CLogComponent::appendStatusMessageToList
//! Append status message
void appendStatusMessageToList(const BlackMisc::CStatusMessage &statusMessage);
//! \copydoc BlackGui::Components::CLogComponent::appendStatusMessagesToList
//! Append status messages
void appendStatusMessagesToList(const BlackMisc::CStatusMessageList &statusMessages);
//! Receiving call to be written in log widget

View File

@@ -68,8 +68,7 @@ CSwiftCore::CSwiftCore(QWidget *parent) :
this->initMenus();
// log
CStatusMessage m = CStatusMessage(this).info(u"Cmd: %1") << CGuiApplication::arguments().join(" ");
this->appendLogMessage(m);
CLogMessage(this).info(u"Cmd: %1") << CGuiApplication::arguments().join(" ");
// command line
ui->lep_CommandLineInput->setIdentifier(this->identifier());
@@ -92,11 +91,6 @@ void CSwiftCore::initStyleSheet()
this->setStyleSheet(s);
}
void CSwiftCore::appendLogMessage(const CStatusMessage &message)
{
ui->comp_InfoArea->getLogComponent()->appendStatusMessageToList(message);
}
void CSwiftCore::showSettingsDialog()
{
if (!m_settingsDialog)
@@ -125,10 +119,6 @@ void CSwiftCore::initLogDisplay()
m_mwaLogComponent->showDetails(false);
CLogHandler::instance()->install(true);
CLogHandler::instance()->enableConsoleOutput(false); // default disable
auto logHandler = CLogHandler::instance()->handlerForPattern(
CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo)
);
logHandler->subscribe(this, &CSwiftCore::appendLogMessage);
ui->comp_InfoArea->getLogComponent()->showFilterDialog(); // add a filter dialog
}

View File

@@ -61,9 +61,6 @@ private:
void initMenus();
//! @}
//! Add a message to log UI
void appendLogMessage(const BlackMisc::CStatusMessage &message);
//! Toggled P2P mode
void p2pModeToggled(bool checked);

View File

@@ -35,6 +35,7 @@ int main(int argc, char *argv[])
a.splashScreen(CIcons::swiftDatabase256());
if (!a.parseAndSynchronizeSetup()) { return EXIT_FAILURE; }
a.useWebDataServices(BlackCore::CWebReaderFlags::AllSwiftDbReaders, CDatabaseReaderConfigList::forMappingTool());
a.useFacadeNoContexts();
if (!a.start())
{
a.gracefulShutdown();

View File

@@ -17,6 +17,7 @@
#include "blackcore/data/globalsetup.h"
#include "blackmisc/simulation/autopublishdata.h"
#include "blackmisc/simulation/distributorlist.h"
#include "blackmisc/sharedstate/datalinkdbus.h"
#include "blackmisc/loghandler.h"
#include "blackmisc/statusmessage.h"
#include "blackmisc/logmessage.h"
@@ -80,17 +81,6 @@ void CSwiftData::closeEvent(QCloseEvent *event)
this->performGracefulShutdown();
}
void CSwiftData::appendLogMessage(const CStatusMessage &message)
{
if (!ui->comp_MainInfoArea) { return; } // not initialized yet
CLogComponent *logComponent = ui->comp_MainInfoArea->getLogComponent();
Q_ASSERT_X(logComponent, Q_FUNC_INFO, "missing log component");
logComponent->appendStatusMessageToList(message);
// status bar
m_statusBar.displayStatusMessage(message);
}
void CSwiftData::onStyleSheetsChanged()
{
this->initStyleSheet();
@@ -134,12 +124,15 @@ void CSwiftData::initLogDisplay()
m_statusBar.initStatusBar(ui->sb_SwiftData);
// m_statusBar.setSizeGripEnabled(false);
connect(&m_logHistory, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage &message)
{
m_statusBar.displayStatusMessage(message);
});
m_logHistory.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo));
m_logHistory.initialize(sApp->getDataLinkDBus());
CLogHandler::instance()->install(true);
CLogHandler::instance()->enableConsoleOutput(false); // default disable
auto logHandler = CLogHandler::instance()->handlerForPattern(
CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo)
);
logHandler->subscribe(this, &CSwiftData::appendLogMessage);
}
void CSwiftData::initMenu()

View File

@@ -15,6 +15,7 @@
#include "blackgui/mainwindowaccess.h"
#include "blackgui/managedstatusbar.h"
#include "blackcore/db/backgrounddataupdater.h"
#include "blackmisc/loghistory.h"
#include "blackmisc/identifiable.h"
#include "blackmisc/statusmessage.h"
@@ -50,9 +51,6 @@ protected:
//! @}
private:
//! Append log message
void appendLogMessage(const BlackMisc::CStatusMessage &message);
//! Style sheet has changed
void onStyleSheetsChanged();
@@ -83,6 +81,7 @@ private:
BlackGui::CManagedStatusBar m_statusBar;
BlackCore::Db::CBackgroundDataUpdater *m_updater = nullptr; //!< consolidate with DB data
BlackMisc::CSettingReadOnly<BlackGui::Settings::TBackgroundConsolidation> m_consolidationSettings { this, &CSwiftData::consolidationSettingChanged }; //!< consolidation time
BlackMisc::CLogHistoryReplica m_logHistory { this };
// auto update
BlackGui::Components::CAutoPublishDialog *m_autoPublishDialog = nullptr; //!< auto publishing dialog

View File

@@ -272,27 +272,6 @@ void SwiftGuiStd::loginRequested()
}
}
void SwiftGuiStd::displayStatusMessageInGui(const CStatusMessage &statusMessage)
{
if (!m_init) { return; }
// used with log subscriber
if (statusMessage.wasHandledBy(this)) { return; }
statusMessage.markAsHandledBy(this);
m_statusBar.displayStatusMessage(statusMessage);
// main info areas
ui->comp_MainInfoArea->displayStatusMessage(statusMessage);
// list
ui->comp_MainInfoArea->getLogComponent()->appendStatusMessageToList(statusMessage);
// display overlay for errors, but not for validation
if (statusMessage.getSeverity() == CStatusMessage::SeverityError && ! statusMessage.getCategories().contains(CLogCategory::validation()))
{
ui->fr_CentralFrameInside->showOverlayMessage(statusMessage);
}
}
void SwiftGuiStd::onKickedFromNetwork(const QString &kickMessage)
{
this->updateGuiStatusInformation();
@@ -363,7 +342,6 @@ void SwiftGuiStd::setContextAvailability()
{
// core has just become available (startup)
// this HERE is called with and without DBus
sGui->getIContextApplication()->synchronizeLogSubscriptions();
sGui->getIContextApplication()->synchronizeLocalSettings();
}
}

View File

@@ -33,6 +33,7 @@
#include "blackmisc/identifiable.h"
#include "blackmisc/variant.h"
#include "blackmisc/loghandler.h"
#include "blackmisc/loghistory.h"
#include "blackmisc/statusmessage.h"
#include "blackmisc/icons.h"
@@ -127,7 +128,8 @@ private:
BlackCore::CActionBind m_actionPtt2 { BlackMisc::Input::pttCom2HotkeyAction(), BlackMisc::CIcons::StandardIconRadio16, this, &SwiftGuiStd::onPttChanged };
BlackCore::CActionBindings m_menuHotkeyHandlers;
BlackGui::CManagedStatusBar m_statusBar;
BlackMisc::CLogSubscriber m_logSubscriber { this, &SwiftGuiStd::displayStatusMessageInGui };
BlackMisc::CLogHistoryReplica m_logHistoryForStatus { this };
BlackMisc::CLogHistoryReplica m_logHistoryForOverlay { this };
// contexts
static constexpr int MaxCoreFailures = 5; //!< Failures counted before reconnecting
@@ -207,9 +209,6 @@ private:
//! Reload own aircraft
bool reloadOwnAircraft();
//! Display status message
void displayStatusMessageInGui(const BlackMisc::CStatusMessage &statusMessage);
//! Connection status changed
//! \param from old status
//! \param to new status

View File

@@ -33,6 +33,7 @@
#include "blackcore/context/contextaudio.h"
#include "blacksound/audioutilities.h"
#include "blackmisc/network/networkutils.h"
#include "blackmisc/sharedstate/datalinkdbus.h"
#include "blackmisc/loghandler.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/logpattern.h"
@@ -83,7 +84,20 @@ void SwiftGuiStd::init()
// if (CBuildConfig::isLocalDeveloperDebugBuild()) { BlackSound::occupyAudioInputDevice(); }
// log messages
m_logSubscriber.changeSubscription(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo));
m_logHistoryForStatus.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo));
m_logHistoryForOverlay.setFilter(CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityError));
connect(&m_logHistoryForStatus, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage& message)
{
m_statusBar.displayStatusMessage(message);
ui->comp_MainInfoArea->displayStatusMessage(message);
});
connect(&m_logHistoryForOverlay, &CLogHistoryReplica::elementAdded, this, [this](const CStatusMessage& message)
{
//! \todo filter out validation messages at CLogPattern level
if (!message.getCategories().contains(CLogCategory::validation())) { ui->fr_CentralFrameInside->showOverlayMessage(message); }
});
m_logHistoryForStatus.initialize(sApp->getDataLinkDBus());
m_logHistoryForOverlay.initialize(sApp->getDataLinkDBus());
// style
this->initStyleSheet();

View File

@@ -37,6 +37,7 @@ int main(int argc, char *argv[])
a.addParserOption({{"i", "installer"}, QCoreApplication::translate("main", "Installer setup.")});
if (!a.parseAndSynchronizeSetup()) { return EXIT_FAILURE; }
a.useWebDataServices(BlackCore::CWebReaderFlags::AllSwiftDbReaders, CDatabaseReaderConfigList::forLauncher());
a.useFacadeNoContexts();
if (!a.start())
{
a.gracefulShutdown();

View File

@@ -24,6 +24,7 @@
#include "blackmisc/icons.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/loghandler.h"
#include "blackmisc/sharedstate/datalinkdbus.h"
#include "blackconfig/buildconfig.h"
#include <QMessageBox>
@@ -311,13 +312,13 @@ void CSwiftLauncher::initLogDisplay()
{
CLogHandler::instance()->install(true);
CLogHandler::instance()->enableConsoleOutput(false); // default disable
auto logHandler = CLogHandler::instance()->handlerForPattern(
CLogPattern().withSeverityAtOrAbove(CStatusMessage::SeverityInfo)
);
logHandler->subscribe(this, &CSwiftLauncher::appendLogMessage);
ui->comp_SwiftLauncherLog->showFilterBar();
ui->comp_SwiftLauncherLog->filterUseRadioButtonDescriptiveIcons(false);
m_logHistory.setFilter(CLogPattern().withSeverity(CStatusMessage::SeverityError));
connect(&m_logHistory, &CLogHistoryReplica::elementAdded, this, qOverload<const CStatusMessage &>(&CSwiftLauncher::showStatusMessage));
m_logHistory.initialize(sApp->getDataLinkDBus());
}
void CSwiftLauncher::setHeaderInfo(const CArtifact &latestArtifact)
@@ -559,24 +560,6 @@ void CSwiftLauncher::showStatusMessage(const QString &htmlMsg)
ui->fr_SwiftLauncherMain->showOverlayMessage(htmlMsg, 5000);
}
void CSwiftLauncher::appendLogMessage(const CStatusMessage &message)
{
ui->comp_SwiftLauncherLog->appendStatusMessageToList(message);
if (message.getSeverity() == CStatusMessage::SeverityError)
{
this->showStatusMessage(message);
}
}
void CSwiftLauncher::appendLogMessages(const CStatusMessageList &messages)
{
ui->comp_SwiftLauncherLog->appendStatusMessagesToList(messages);
if (messages.hasErrorMessages())
{
this->showStatusMessage(messages.getErrorMessages().toSingleMessage());
}
}
void CSwiftLauncher::showMainPage()
{
ui->sw_SwiftLauncher->setCurrentWidget(ui->pg_SwiftLauncherMain);

View File

@@ -20,6 +20,7 @@
#include "blackmisc/simulation/data/modelcaches.h"
#include "blackmisc/db/artifact.h"
#include "blackmisc/identifiable.h"
#include "blackmisc/loghistory.h"
#ifdef Q_OS_MAC
#include "blackmisc/macos/microphoneaccess.h"
@@ -102,6 +103,7 @@ private:
QScopedPointer<BlackGui::Components::CConfigurationWizard> m_wizard;
QScopedPointer<BlackGui::Components::CTextEditDialog> m_textEditDialog;
BlackMisc::CData<BlackCore::Data::TLauncherSetup> m_setup { this }; //!< setup, i.e. last user selection
BlackMisc::CLogHistoryReplica m_logHistory { this }; //!< for the overlay
#ifdef Q_OS_MAC
BlackMisc::CMacOSMicrophoneAccess m_micAccess;
#endif
@@ -177,12 +179,6 @@ private:
//! Display status message as overlay
void showStatusMessage(const QString &htmlMsg);
//! Append status message
void appendLogMessage(const BlackMisc::CStatusMessage &message);
//! Append status messages
void appendLogMessages(const BlackMisc::CStatusMessageList &messages);
//! Show set main page
void showMainPage();