Initial commit
This commit is contained in:
commit
b7d90b9afe
16245 files changed
+3396666
No files matched your search
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Christian Ehrlicher, SLSE, 2016-02-29
|
||||
#
|
||||
|
||||
ADD_SUBDIRECTORY(Gui)
|
||||
|
||||
#
|
||||
# Gui Plugin Interface
|
||||
#
|
||||
ADD_INTERFACE_LIBRARY(SmoMonitorsGuiPluginInterface
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/smo_monitors_gui_plugin_interface.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||
GuiPluginInterface
|
||||
)
|
||||
|
||||
#
|
||||
# SystemMonitor Gui Plugin Interface
|
||||
#
|
||||
ADD_INTERFACE_LIBRARY(SmoSystemMonitorGuiPluginInterface
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/smo_system_monitor_gui_plugin_interface.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../../
|
||||
GuiPluginInterface
|
||||
)
|
||||
|
||||
#
|
||||
# HgrAndMineSearch Gui Plugin Interface
|
||||
#
|
||||
ADD_INTERFACE_LIBRARY(SmoHgrAndMineSearchGuiPluginInterface
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/smo_hgr_and_mine_search_gui_plugin_interface.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||
GuiPluginInterface
|
||||
)
|
||||
|
||||
##
|
||||
## EquipmentErrorRegistration Gui Plugin Interface
|
||||
##
|
||||
#ADD_INTERFACE_LIBRARY(EquipmentErrorRegistrationGuiPluginInterface
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/smo_hgr_and_mine_search_gui_plugin_interface.h
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/..
|
||||
# GuiPluginInterface
|
||||
#)
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Christian Ehrlicher, SLSE, 2016-02-29
|
||||
#
|
||||
ADD_SUBDIRECTORY(Common)
|
||||
ADD_SUBDIRECTORY(Monitors)
|
||||
ADD_SUBDIRECTORY(SystemMonitor)
|
||||
ADD_SUBDIRECTORY(HgrAndMineSearch)
|
||||
ADD_SUBDIRECTORY(EquipmentErrorRegistration)
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Christian Ehrlicher, SLSE, 2016-02-29
|
||||
#
|
||||
|
||||
NGL_ADD_LIBRARY(WS SmoCommon STATIC logger.cpp logger.h settings.cpp settings.h)
|
||||
NGL_TARGET_LINK_LIBRARIES(SmoCommon
|
||||
NGLLogger
|
||||
nglsettings
|
||||
ngltools
|
||||
)
|
||||
NGL_TARGET_INCLUDE_DIRECTORIES(SmoCommon
|
||||
PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../
|
||||
)
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Logging for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
*/
|
||||
|
||||
#include "logger.h"
|
||||
|
||||
#include <NGLLogger/NGLLoggerBootstrap.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
LOGGER_T getLogger(const char *name)
|
||||
{
|
||||
static const char ns[] = "SMO.";
|
||||
std::string loggerName;
|
||||
const size_t len = strlen(name);
|
||||
loggerName.reserve(sizeof(ns) + len);
|
||||
loggerName.append(ns, sizeof(ns) - 1);
|
||||
loggerName.append(name, len);
|
||||
|
||||
try
|
||||
{
|
||||
return NGL::NGLLoggerBootstrap::getNGLRootLogger().
|
||||
getNGLLogger(loggerName);
|
||||
}
|
||||
catch (const std::exception &ex)
|
||||
{
|
||||
fprintf(stderr, "Error retrieving logger: %s", ex.what());
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Logging for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <NGLLogger/INGLLogger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
using LOGGER_T = NGL::INGLLogger &;
|
||||
|
||||
LOGGER_T getLogger(const char *name);
|
||||
inline LOGGER_T getLogger(const QString &loggerName)
|
||||
{
|
||||
return getLogger(loggerName.toUtf8().constData());
|
||||
}
|
||||
} // namespace ServiceMonitor
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* Settings for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Filip Biedziak, SLTE, 2021-10-12
|
||||
*/
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <nglsettings/nglsettings_settings.h>
|
||||
#include <ngltools/ngltools_filesystem.h>
|
||||
|
||||
#include <QSettings>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class NGLSettingsClass : public NGL::Settings
|
||||
{
|
||||
public:
|
||||
NGLSettingsClass()
|
||||
: NGL::Settings(s_iniFile.isEmpty() ? NGL::findProjectConfigFile() : s_iniFile)
|
||||
{}
|
||||
static void setIniFile(const QString &fn)
|
||||
{
|
||||
s_iniFile = fn;
|
||||
}
|
||||
static QString s_iniFile;
|
||||
};
|
||||
QString NGLSettingsClass::s_iniFile;
|
||||
Q_GLOBAL_STATIC(NGLSettingsClass, s)
|
||||
|
||||
NGL::Settings *Settings::settings()
|
||||
{
|
||||
return s();
|
||||
}
|
||||
|
||||
void Settings::setIniFile(const QString &ini)
|
||||
{
|
||||
NGLSettingsClass::setIniFile(ini);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Settings for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Filip Biedziak, SLTE, 2021-10-12
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <QString>
|
||||
|
||||
namespace NGL { class Settings; }
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
namespace Settings
|
||||
{
|
||||
NGL::Settings *settings();
|
||||
void setIniFile(const QString &ini);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -0,0 +1,34 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
#
|
||||
|
||||
SET(smo_equipment_error_registration_gui_SRCS
|
||||
smo_equipment_error_registration_dialog.cpp
|
||||
smo_equipment_error_registration_dialog.h
|
||||
smo_equipment_error_registration_model.cpp
|
||||
smo_equipment_error_registration_model.h
|
||||
smo_equipment_error_registration_gui_plugin.cpp
|
||||
smo_equipment_error_registration_gui_plugin.h
|
||||
)
|
||||
|
||||
NGL_WRAP_UI(smo_equipment_error_registration_gui_SRCS
|
||||
smo_equipment_error_registration_dialog.ui
|
||||
)
|
||||
|
||||
NGL_ADD_LIBRARY(WS SmoEquipmentErrorRegistrationGuiPlugin MODULE ${smo_equipment_error_registration_gui_SRCS})
|
||||
NGL_TARGET_LINK_LIBRARIES(SmoEquipmentErrorRegistrationGuiPlugin
|
||||
ExmDataPluginInterface
|
||||
LtsDataView
|
||||
LtsPrinting
|
||||
LtsSession
|
||||
LtsUtilsSettings
|
||||
ngltools
|
||||
SmoCommon
|
||||
svcSmoDummy
|
||||
TlnDataPluginInterface
|
||||
)
|
||||
|
||||
NGL_INSTALL_TARGET(SmoEquipmentErrorRegistrationGuiPlugin)
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
*/
|
||||
|
||||
#include "smo_equipment_error_registration_dialog.h"
|
||||
#include "ui_smo_equipment_error_registration_dialog.h"
|
||||
|
||||
#include "smo_equipment_error_registration_model.h"
|
||||
|
||||
#include <Plugins/Timeline/tln_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/Data/ppm_data_plugin.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
#include <LtsPrinting/printing.h>
|
||||
#include <QTreeView>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
EquipmentErrorRegistrationDialog::EquipmentErrorRegistrationDialog(QWidget *parent)
|
||||
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly)
|
||||
, m_session(nullptr)
|
||||
, m_ui(new Ui::EquipmentErrorRegistrationDialog)
|
||||
, m_logger(getLogger("EquipmentErrorRegistrationDialog"))
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Print, this, &EquipmentErrorRegistrationDialog::onPrint);
|
||||
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Registration_Equipment_Failure"));
|
||||
}
|
||||
|
||||
EquipmentErrorRegistrationDialog::~EquipmentErrorRegistrationDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
bool EquipmentErrorRegistrationDialog::init(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc)
|
||||
{
|
||||
m_session = session;
|
||||
|
||||
auto model = new EquipmentErrorRegistrationModel(this);
|
||||
connect(model, &EquipmentErrorRegistrationModel::chunksUpdated,
|
||||
this, &EquipmentErrorRegistrationDialog::onChunksUpdated);
|
||||
model->initModel(m_session, eemForeign, exmDtc);
|
||||
|
||||
auto proxy = new EquipmentErrorRegistrationProxyModel(this);
|
||||
proxy->setSourceModel(model);
|
||||
m_ui->dvList->setModel(proxy);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationDialog::onChunksUpdated(int chunksReceived, int chunksRequested)
|
||||
{
|
||||
m_ui->pbLoading->setValue(chunksReceived);
|
||||
m_ui->pbLoading->setMaximum(chunksRequested);
|
||||
m_ui->pbLoading->setVisible(chunksReceived != chunksRequested);
|
||||
m_ui->lblLoading->setVisible(chunksReceived != chunksRequested);
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationDialog::onPrint()
|
||||
{
|
||||
LtsPrinting::printView(m_session, this, m_ui->dvList->treeView() );
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationDialog::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Equipment Error Registration"));
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationDialog::tableColumnOrganiserSetting()
|
||||
{
|
||||
//LtsColumnOrganiser
|
||||
m_ui->dvList->setColumnsOrganiserEnabled(identifier(), true);
|
||||
}
|
||||
|
||||
}
|
||||
Executable
+58
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
#include <LtsSession/lts_session.h>
|
||||
|
||||
namespace TimeLineManagement
|
||||
{
|
||||
class ForeignDataInterface;
|
||||
}
|
||||
namespace ExerciseManagement
|
||||
{
|
||||
namespace Interface
|
||||
{
|
||||
class Dtc;
|
||||
}
|
||||
}
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class EquipmentErrorRegistrationDialog;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class EquipmentErrorRegistrationDialog : public LtsWidgets::LtsDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit EquipmentErrorRegistrationDialog(QWidget *parent = nullptr);
|
||||
~EquipmentErrorRegistrationDialog();
|
||||
|
||||
bool init(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc);
|
||||
|
||||
public slots:
|
||||
void onChunksUpdated(int chunksReceived, int chunksRequested);
|
||||
void onPrint();
|
||||
|
||||
private:
|
||||
void retranslate() override;
|
||||
void tableColumnOrganiserSetting() override;
|
||||
|
||||
LtsSession::LtsSession *m_session;
|
||||
|
||||
Ui::EquipmentErrorRegistrationDialog *m_ui;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
};
|
||||
}
|
||||
Lts/Plugins/ServiceMonitor/Gui/EquipmentErrorRegistration/smo_equipment_error_registration_dialog.ui
Executable
+48
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>EquipmentErrorRegistrationDialog</class>
|
||||
<widget class="QWidget" name="EquipmentErrorRegistrationDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="lblLoading">
|
||||
<property name="text">
|
||||
<string>Loading:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="LtsDataView::LtsDataView" name="dvList" native="true"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QProgressBar" name="pbLoading">
|
||||
<property name="value">
|
||||
<number>24</number>
|
||||
</property>
|
||||
<property name="format">
|
||||
<string notr="true">%p%</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LtsDataView::LtsDataView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>LtsDataView/lts_data_view.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search GUI plugin
|
||||
* $Id: smo_equipment_error_registration_plugin.cpp 47083 2019-06-05 06:56:30Z karwat $
|
||||
* $HeadURL: svn://slssvn/TDS/branches/product/devel/trunk/Lts/Plugins/ServiceMonitor/Gui/EquipmentErrorRegistration/smo_equipment_error_registration_plugin.cpp $
|
||||
* $Author: karwat $
|
||||
* Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
*/
|
||||
|
||||
#include "smo_equipment_error_registration_gui_plugin.h"
|
||||
#include "smo_equipment_error_registration_dialog.h"
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <ServiceMonitor/smo_operator_rights.h>
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
std::shared_ptr<GuiPluginBase::Interface> GuiPlugin::createGuiInterface(LtsSession::LtsSession *session)
|
||||
{
|
||||
return std::make_shared<InterfaceImpl>(session);
|
||||
}
|
||||
|
||||
|
||||
InterfaceImpl::InterfaceImpl(LtsSession::LtsSession *session)
|
||||
: GuiPluginBase::Interface(session, getLogger("AppStarter"))
|
||||
, m_eemForeign(nullptr)
|
||||
, m_exmDtc(nullptr)
|
||||
{}
|
||||
|
||||
bool InterfaceImpl::fetchInterfaces()
|
||||
{
|
||||
//foreign
|
||||
if (!m_session->getForeignDataInterface<TimeLineManagement::DataInterface>(m_eemForeign))
|
||||
return false;
|
||||
if (!m_session->getDtc<ExerciseManagement::DataInterface>(m_exmDtc))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void InterfaceImpl::clearInterfaces()
|
||||
{
|
||||
m_eemForeign = nullptr;
|
||||
m_exmDtc = nullptr;
|
||||
}
|
||||
|
||||
|
||||
QVector<LtsWidgets::PluginData> InterfaceImpl::getActions()
|
||||
{
|
||||
QVector<LtsWidgets::PluginData> ret;
|
||||
|
||||
LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance();
|
||||
const bool enableEquipmentErrorRegistration = ps->value(QStringLiteral("smo"),
|
||||
QStringLiteral("enableEquipmentErrorRegistration")).toBool();
|
||||
|
||||
// TBC Rechte ....
|
||||
if (enableEquipmentErrorRegistration)
|
||||
{
|
||||
LtsWidgets::PluginData plData;
|
||||
plData.layoutArea = LtsWidgets::LayoutArea::eDialogTab;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.menuText = tr("Equipment Error Registration");
|
||||
plData.identifier = QLatin1String("smoEquipmentErrorRegistration");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:player_equipment_fault.svg"));
|
||||
plData.operatorRight = OperatorRights::HandgrenadeMineSearchShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eAfterAction;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onEquipmentErrorRegistrationDialog(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onEquipmentErrorRegistrationDialog(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new EquipmentErrorRegistrationDialog(parent),
|
||||
m_session, m_eemForeign, m_exmDtc);
|
||||
}
|
||||
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search GUI plugin
|
||||
* $Id: smo_equipment_error_registration_plugin.h 46393 2019-04-02 12:38:53Z hjl $
|
||||
* $HeadURL: svn://slssvn/TDS/branches/product/devel/trunk/Lts/Plugins/ServiceMonitor/Gui/EquipmentErrorRegistration/smo_equipment_error_registration_plugin.h $
|
||||
* $Author: hjl $
|
||||
* Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Plugins/ServiceMonitor/smo_hgr_and_mine_search_gui_plugin_interface.h>
|
||||
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <Common/ProjectConfig/project_defines.h>
|
||||
|
||||
#include <Plugins/ExerciseManagement/exm_data_plugin_interface.h>
|
||||
#include <Plugins/Timeline/tln_data_plugin_interface.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class GuiPlugin final : public QObject, public GuiPluginBase::Plugin
|
||||
{
|
||||
Q_PLUGIN_METADATA(IID "gui:3:smo.eer")
|
||||
Q_INTERFACES(GuiPluginBase::Plugin)
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GuiPlugin() = default;
|
||||
~GuiPlugin() = default;
|
||||
|
||||
QString pluginName() override { return QStringLiteral("ServiceMonitorEquipmentErrorRegistrationGui"); }
|
||||
std::shared_ptr<GuiPluginBase::Interface> createGuiInterface(LtsSession::LtsSession *session) override;
|
||||
bool availableInPartition(IDL::PartitionType partition) const override
|
||||
{
|
||||
return (partition == IDL::PartitionType::Exercise);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class InterfaceImpl final : public QObject, public GuiPluginBase::Interface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit InterfaceImpl(LtsSession::LtsSession *session);
|
||||
|
||||
bool fetchInterfaces() override;
|
||||
void clearInterfaces() override;
|
||||
QVector<LtsWidgets::PluginData> getActions() override;
|
||||
QString menuGroup() const override { return tr("Service Monitors"); }
|
||||
|
||||
private:
|
||||
LtsWidgets::LtsDialog *onEquipmentErrorRegistrationDialog(QWidget *parent);
|
||||
|
||||
std::shared_ptr<TimeLineManagement::ForeignDataInterface>m_eemForeign;
|
||||
std::shared_ptr<ExerciseManagement::Interface::Dtc> m_exmDtc;
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
Lts/Plugins/ServiceMonitor/Gui/EquipmentErrorRegistration/smo_equipment_error_registration_model.cpp
Executable
+181
@@ -0,0 +1,181 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search model
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
*/
|
||||
|
||||
#include "smo_equipment_error_registration_model.h"
|
||||
|
||||
#include <ngltools/ngltools_dtg.h>
|
||||
|
||||
#include <Common/logger.h>
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QJsonValue>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonDocument>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
//###############################################################################
|
||||
|
||||
EquipmentErrorRegistrationModel::EquipmentErrorRegistrationModel(QObject *parent)
|
||||
: LtsWidgets::LtsAbstractTableModel<EquipmentErrorRegistrationEntry>({tr("Sender"),
|
||||
tr("Timestamp"),
|
||||
tr("Fault Equipment Number"),
|
||||
tr("Device"),
|
||||
tr("Text")},
|
||||
parent)
|
||||
, m_eemForeign(nullptr)
|
||||
, m_exmDtc(nullptr)
|
||||
, m_chunksRequested(0)
|
||||
, m_chunksReceived(0)
|
||||
, m_session(nullptr)
|
||||
, m_logger(getLogger("EquipmentErrorRegistrationModel"))
|
||||
{
|
||||
}
|
||||
|
||||
bool EquipmentErrorRegistrationModel::initModel(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc)
|
||||
{
|
||||
m_session = session;
|
||||
|
||||
m_eemForeign = eemForeign;
|
||||
m_exmDtc = exmDtc;
|
||||
|
||||
if (!m_exmDtc->enableExercise())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable Exercise Data-Topic in EXM DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
connect(m_eemForeign.get(), &TimeLineManagement::ForeignDataInterface::requestedDataAvailable,
|
||||
this, &EquipmentErrorRegistrationModel::onRequestedDataAvailable);
|
||||
|
||||
connect(m_eemForeign.get(), &TimeLineManagement::ForeignDataInterface::liveEvent,
|
||||
this, &EquipmentErrorRegistrationModel::onLiveEvent);
|
||||
|
||||
doEventRequests();
|
||||
|
||||
emit chunksUpdated(m_chunksReceived, m_chunksRequested);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
QVariant EquipmentErrorRegistrationModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (role == Qt::DisplayRole && indexIsValid(index))
|
||||
{
|
||||
const EquipmentErrorRegistrationEntry &entry = m_vecData.at(index.row());
|
||||
|
||||
switch (index.column())
|
||||
{
|
||||
case EquipmentNumber:
|
||||
return entry.equipmentNumber;
|
||||
case SampleTime:
|
||||
return QDateTime::fromMSecsSinceEpoch(entry.sampleTime);
|
||||
case Participant:
|
||||
return entry.participant;
|
||||
case Device:
|
||||
return entry.device;
|
||||
case Text:
|
||||
return entry.text;
|
||||
}
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationModel::doEventRequests()
|
||||
{
|
||||
ExerciseManagement::Exercise ex = m_exmDtc->exercise(m_session->partitionId());
|
||||
int64_t startTime = ex.beginTime();
|
||||
const int64_t endTime = ex.stopTime() > 0 ? ex.stopTime() : m_session->partitionTime();
|
||||
|
||||
while (startTime < endTime)
|
||||
{
|
||||
int64_t reqEnd = ((startTime + 24 * 60 * 60 * 1000) > endTime ? endTime : startTime + 24 * 60 * 60 * 1000);
|
||||
|
||||
m_requests += m_eemForeign->requestData(startTime, reqEnd, {ProjectDataManagement::EventType_def::EquipmentErrorReport});
|
||||
|
||||
// set new start
|
||||
startTime += (24 * 60 * 60 * 1000) + 1;
|
||||
}
|
||||
m_chunksRequested += m_requests.size();
|
||||
}
|
||||
|
||||
static inline EquipmentErrorRegistrationEntry event2Entry(const ExerciseEventManagement::Event &event)
|
||||
{
|
||||
EquipmentErrorRegistrationEntry entry;
|
||||
const QJsonObject obj = QJsonDocument::fromJson(QByteArray::fromRawData(event.properties().c_str(),
|
||||
event.properties().size())).object();
|
||||
entry.equipmentNumber = event.equipmentNumber();
|
||||
entry.sampleTime = event.sampleTime();
|
||||
entry.participant = obj[QStringLiteral("participant")].toString();
|
||||
entry.device = obj[QStringLiteral("device")].toString();
|
||||
entry.text = obj[QStringLiteral("text")].toString();
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationModel::onRequestedDataAvailable(TimeLineManagement::TimelineDataProviderInterface *request)
|
||||
{
|
||||
auto it = m_requests.find(request);
|
||||
if (it == m_requests.end())
|
||||
return;
|
||||
m_requests.erase(it);
|
||||
|
||||
m_chunksReceived++;
|
||||
|
||||
const QVector<ExerciseEventManagement::Event> &events = request->eventData();
|
||||
for (const auto &event : events)
|
||||
insertRow(event2Entry(event));
|
||||
|
||||
emit chunksUpdated(m_chunksReceived, m_chunksRequested);
|
||||
}
|
||||
|
||||
void EquipmentErrorRegistrationModel::onLiveEvent(const ExerciseEventManagement::Event &ev)
|
||||
{
|
||||
if (ev.eventTypeId() != ProjectDataManagement::EventType_def::EquipmentErrorReport)
|
||||
return;
|
||||
INFO_LOG(m_logger) << "Event EquipmentNumber=" << ev.equipmentNumber();
|
||||
insertRow(event2Entry(ev));
|
||||
|
||||
emit chunksUpdated(m_chunksReceived, m_chunksRequested);
|
||||
}
|
||||
|
||||
//
|
||||
// EquipmentErrorRegistrationProxyModel
|
||||
//
|
||||
void EquipmentErrorRegistrationProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||
{
|
||||
m_sourceModel = qobject_cast<EquipmentErrorRegistrationModel*>(sourceModel);
|
||||
LtsWidgets::LtsColumnFilterProxyModel::setSourceModel(sourceModel);
|
||||
}
|
||||
|
||||
bool EquipmentErrorRegistrationProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||
{
|
||||
if (!m_sourceModel ||
|
||||
source_left.column() != source_right.column() ||
|
||||
!source_left.isValid() ||
|
||||
!source_right.isValid())
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
const auto &dataLeft = m_sourceModel->m_vecData.at(source_left.row());
|
||||
const auto dataRight = m_sourceModel->m_vecData.at(source_right.row());
|
||||
switch (source_left.column())
|
||||
{
|
||||
case EquipmentErrorRegistrationModel::SampleTime:
|
||||
return dataLeft.sampleTime < dataRight.sampleTime;
|
||||
case EquipmentErrorRegistrationModel::EquipmentNumber:
|
||||
case EquipmentErrorRegistrationModel::Participant:
|
||||
case EquipmentErrorRegistrationModel::Device:
|
||||
case EquipmentErrorRegistrationModel::Text:
|
||||
break;
|
||||
}
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
}
|
||||
}
|
||||
Executable
+92
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search model
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Christian Roeskens, NLSE, 2018-05-02
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Plugins/ExerciseManagement/Data/exm_data_plugin.h>
|
||||
#include <Plugins/ParticipantManagement/Data/ppm_data_plugin.h>
|
||||
#include <Plugins/ProjectDataManagement/Data/pdm_data_plugin.h>
|
||||
#include <Plugins/Timeline/tln_data_plugin_interface.h>
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsWidgets/lts_abstract_table_model.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
#include <QSet>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
struct EquipmentErrorRegistrationEntry
|
||||
{
|
||||
int32_t equipmentNumber = -1;
|
||||
int64_t sampleTime = -1;
|
||||
QString participant;
|
||||
QString device;
|
||||
QString text;
|
||||
};
|
||||
|
||||
//###############################################################################
|
||||
|
||||
class EquipmentErrorRegistrationModel final
|
||||
: public LtsWidgets::LtsAbstractTableModel<EquipmentErrorRegistrationEntry>
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum Columns
|
||||
{
|
||||
EquipmentNumber,
|
||||
SampleTime,
|
||||
Participant,
|
||||
Device,
|
||||
Text
|
||||
};
|
||||
explicit EquipmentErrorRegistrationModel(QObject *parent = nullptr);
|
||||
|
||||
bool initModel(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc);
|
||||
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
signals:
|
||||
void chunksUpdated(int chunksReceived, int chunksRequested);
|
||||
|
||||
private:
|
||||
void onRequestedDataAvailable(TimeLineManagement::TimelineDataProviderInterface *request);
|
||||
void onLiveEvent(const ExerciseEventManagement::Event &ev);
|
||||
|
||||
void doEventRequests();
|
||||
|
||||
std::shared_ptr<TimeLineManagement::ForeignDataInterface> m_eemForeign;
|
||||
std::shared_ptr<ExerciseManagement::Interface::Dtc> m_exmDtc;
|
||||
|
||||
int m_chunksRequested;
|
||||
int m_chunksReceived;
|
||||
QSet<TimeLineManagement::TimelineDataProviderInterface*> m_requests;
|
||||
|
||||
LtsSession::LtsSession *m_session;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
friend class EquipmentErrorRegistrationProxyModel;
|
||||
};
|
||||
|
||||
class EquipmentErrorRegistrationProxyModel final : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
private:
|
||||
EquipmentErrorRegistrationModel *m_sourceModel = nullptr;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
#
|
||||
|
||||
SET(smo_hgr_and_mine_search_gui_SRCS
|
||||
smo_hgr_and_mine_search_gui_plugin.cpp
|
||||
smo_hgr_and_mine_search_gui_plugin.h
|
||||
smo_hgr_and_mine_search_dialog.cpp
|
||||
smo_hgr_and_mine_search_dialog.h
|
||||
smo_hgr_and_mine_search_model.cpp
|
||||
smo_hgr_and_mine_search_model.h
|
||||
)
|
||||
|
||||
NGL_WRAP_UI(smo_hgr_and_mine_search_gui_SRCS
|
||||
smo_hgr_and_mine_search_dialog.ui
|
||||
)
|
||||
|
||||
NGL_ADD_LIBRARY(WS SmoHgrAndMineSearchGuiPlugin MODULE ${smo_hgr_and_mine_search_gui_SRCS})
|
||||
NGL_TARGET_LINK_LIBRARIES(SmoHgrAndMineSearchGuiPlugin
|
||||
ExmDataPluginInterface
|
||||
GuiPluginInterface
|
||||
LtsCoordTrans
|
||||
LtsDataView
|
||||
LtsPrinting
|
||||
LtsSession
|
||||
LtsUtilsSettings
|
||||
ngltools
|
||||
PpmDataPluginInterface
|
||||
PpmGuiComboboxPluginInterface
|
||||
SmoCommon
|
||||
SmoHgrAndMineSearchGuiPluginInterface
|
||||
svcSmoDummy
|
||||
TlnDataPluginInterface
|
||||
AesDataPluginInterface
|
||||
SituationMapGuiPluginInterface
|
||||
)
|
||||
|
||||
NGL_INSTALL_TARGET(SmoHgrAndMineSearchGuiPlugin)
|
||||
+128
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
|
||||
#include "smo_hgr_and_mine_search_dialog.h"
|
||||
#include "ui_smo_hgr_and_mine_search_dialog.h"
|
||||
|
||||
#include "smo_hgr_and_mine_search_model.h"
|
||||
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <Plugins/SituationMapPlugin/situation_map_gui_plugin_interface.h>
|
||||
#include <Plugins/Timeline/tln_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/Data/ppm_data_plugin.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
#include <LtsPrinting/printing.h>
|
||||
#include <QTreeView>
|
||||
#include <QHeaderView>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
HgrAndMineSearchDialog::HgrAndMineSearchDialog(QWidget *parent)
|
||||
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly)
|
||||
, m_session(nullptr)
|
||||
, m_ui(new Ui::HgrAndMineSearchDialog)
|
||||
, m_logger(getLogger("HgrAndMineSearchDialog"))
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Print, this, &HgrAndMineSearchDialog::onPrint);
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Save)->setText(tr("Center on Map"));
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Save)->setIcon(QIcon(QStringLiteral("icon:center_to_object.svg")));
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Save, this, &HgrAndMineSearchDialog::onCenterItem);
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Save)->setDisabled(true);
|
||||
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Handgrenades_and_Mine_search"));
|
||||
}
|
||||
|
||||
HgrAndMineSearchDialog::~HgrAndMineSearchDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
bool HgrAndMineSearchDialog::init(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> &ppmCbxIfc,
|
||||
const std::shared_ptr<AreaEffectSimulation::Interface::Dtc> &aesDtc)
|
||||
{
|
||||
m_session = session;
|
||||
|
||||
if (m_model)
|
||||
delete m_model;
|
||||
|
||||
m_model = new HgrAndMineSearchModel(this);
|
||||
connect(m_model, &HgrAndMineSearchModel::chunksUpdated,
|
||||
this, &HgrAndMineSearchDialog::onChunksUpdated);
|
||||
m_model->initModel(m_session, ppmDtc, ppmFtc, eemForeign, exmDtc, pdmDtc, ppmCbxIfc, aesDtc);
|
||||
|
||||
auto proxy = new HgrAndMineSearchProxyModel(this);
|
||||
proxy->setSourceModel(m_model);
|
||||
m_ui->dvList->setModel(proxy);
|
||||
|
||||
// TODO: does not work properly
|
||||
//m_ui->dvList->resizeColumnsToContent();
|
||||
|
||||
connect(m_ui->dvList, &LtsDataView::LtsDataView::signalSelectionChanged,
|
||||
this, &HgrAndMineSearchDialog::onSelectionChanged);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void HgrAndMineSearchDialog::onChunksUpdated(int chunksReceived, int chunksRequested)
|
||||
{
|
||||
m_ui->pbLoading->setValue(chunksReceived);
|
||||
m_ui->pbLoading->setMaximum(chunksRequested);
|
||||
m_ui->pbLoading->setVisible(chunksReceived != chunksRequested);
|
||||
m_ui->lblLoading->setVisible(chunksReceived != chunksRequested);
|
||||
}
|
||||
|
||||
void HgrAndMineSearchDialog::onPrint()
|
||||
{
|
||||
LtsPrinting::printView(m_session, this, m_ui->dvList->treeView() );
|
||||
}
|
||||
|
||||
void HgrAndMineSearchDialog::onCenterItem()
|
||||
{
|
||||
QPointF position = m_model->position(m_ui->dvList->currentIndex());
|
||||
|
||||
std::shared_ptr<SituationMap::ForeignGuiInterface> ifc;
|
||||
|
||||
if (m_session->getForeignGuiInterface<SituationMap::ForeignGuiInterface>(ifc))
|
||||
ifc->setCenterPoint(position);
|
||||
}
|
||||
|
||||
void HgrAndMineSearchDialog::onSelectionChanged()
|
||||
{
|
||||
if (!m_model)
|
||||
{
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Save)->setDisabled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
QPointF position = m_model->position(m_ui->dvList->currentIndex());
|
||||
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Save)->setDisabled(position == QPointF());
|
||||
}
|
||||
|
||||
void HgrAndMineSearchDialog::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Handgrenade and Mine search"));
|
||||
}
|
||||
|
||||
void HgrAndMineSearchDialog::tableColumnOrganiserSetting()
|
||||
{
|
||||
//LtsColumnOrganiser
|
||||
m_ui->dvList->setColumnsOrganiserEnabled(identifier(), true);
|
||||
}
|
||||
|
||||
}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
|
||||
namespace AreaEffectSimulation
|
||||
{
|
||||
namespace Interface
|
||||
{
|
||||
class Dtc;
|
||||
}
|
||||
}
|
||||
namespace ParticipantManagement
|
||||
{
|
||||
namespace Interface
|
||||
{
|
||||
class Ftc;
|
||||
class Dtc;
|
||||
}
|
||||
}
|
||||
namespace TimeLineManagement
|
||||
{
|
||||
class ForeignDataInterface;
|
||||
}
|
||||
namespace ExerciseManagement
|
||||
{
|
||||
namespace Interface
|
||||
{
|
||||
class Dtc;
|
||||
}
|
||||
}
|
||||
namespace ProjectDataManagement
|
||||
{
|
||||
namespace Interface
|
||||
{
|
||||
class Dtc;
|
||||
}
|
||||
}
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class HgrAndMineSearchDialog;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class HgrAndMineSearchModel;
|
||||
|
||||
class HgrAndMineSearchDialog : public LtsWidgets::LtsDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit HgrAndMineSearchDialog(QWidget *parent = nullptr);
|
||||
~HgrAndMineSearchDialog();
|
||||
|
||||
bool init(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> &ppmCbxIfc,
|
||||
const std::shared_ptr<AreaEffectSimulation::Interface::Dtc> &aesDtc);
|
||||
|
||||
public slots:
|
||||
void onChunksUpdated(int chunksReceived, int chunksRequested);
|
||||
void onPrint();
|
||||
|
||||
private slots:
|
||||
void onCenterItem();
|
||||
void onSelectionChanged();
|
||||
|
||||
private:
|
||||
bool hasValidPosition();
|
||||
void retranslate() override;
|
||||
void tableColumnOrganiserSetting() override;
|
||||
|
||||
LtsSession::LtsSession *m_session;
|
||||
HgrAndMineSearchModel *m_model {nullptr};
|
||||
Ui::HgrAndMineSearchDialog *m_ui;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
};
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>HgrAndMineSearchDialog</class>
|
||||
<widget class="QWidget" name="HgrAndMineSearchDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="lblLoading">
|
||||
<property name="text">
|
||||
<string>Loading:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="LtsDataView::LtsDataView" name="dvList"/>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QProgressBar" name="pbLoading">
|
||||
<property name="value">
|
||||
<number>24</number>
|
||||
</property>
|
||||
<property name="format">
|
||||
<string notr="true">%p%</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LtsDataView::LtsDataView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>LtsDataView/lts_data_view.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search GUI plugin
|
||||
* $Id: smo_hgr_and_mine_search_plugin.cpp 48783 2019-11-06 14:23:43Z ojog_i $
|
||||
* $HeadURL: svn://slssvn/TDS/branches/product/devel/trunk/Lts/Plugins/ServiceMonitor/Gui/HgrAndMineSearch/smo_hgr_and_mine_search_plugin.cpp $
|
||||
* $Author: ojog_i $
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
|
||||
#include "smo_hgr_and_mine_search_gui_plugin.h"
|
||||
#include "smo_hgr_and_mine_search_dialog.h"
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
#include <ServiceMonitor/smo_operator_rights.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
std::shared_ptr<GuiPluginBase::Interface> GuiPlugin::createGuiInterface(LtsSession::LtsSession *session)
|
||||
{
|
||||
return std::make_shared<InterfaceImpl>(session);
|
||||
}
|
||||
|
||||
|
||||
InterfaceImpl::InterfaceImpl(LtsSession::LtsSession *session)
|
||||
: GuiPluginBase::Interface(session, getLogger("AppStarter"))
|
||||
, m_ppmDtc(nullptr)
|
||||
, m_ppmFtc(nullptr)
|
||||
, m_eemForeign(nullptr)
|
||||
, m_exmDtc(nullptr)
|
||||
, m_pdmDtc(nullptr)
|
||||
, m_ppmCbxIfc(nullptr)
|
||||
{}
|
||||
|
||||
bool InterfaceImpl::fetchInterfaces()
|
||||
{
|
||||
//foreign
|
||||
if (!m_session->getDtc<ParticipantManagement::DataInterface>(m_ppmDtc))
|
||||
return false;
|
||||
if (!m_session->getFtc<ParticipantManagement::DataInterface>(m_ppmFtc))
|
||||
return false;
|
||||
if (!m_session->getForeignDataInterface<TimeLineManagement::DataInterface>(m_eemForeign))
|
||||
return false;
|
||||
if (!m_session->getDtc<ExerciseManagement::DataInterface>(m_exmDtc))
|
||||
return false;
|
||||
if (!m_session->getDtc<ProjectDataManagement::DataInterface>(m_pdmDtc))
|
||||
return false;
|
||||
if (!m_session->getForeignGuiInterface<ParticipantManagement::ForeignGuiComboboxInterface>(m_ppmCbxIfc))
|
||||
return false;
|
||||
if (!m_session->getDtc<AreaEffectSimulation::DataInterface>(m_aesDtc))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void InterfaceImpl::clearInterfaces()
|
||||
{
|
||||
m_ppmDtc = nullptr;
|
||||
m_ppmFtc = nullptr;
|
||||
m_eemForeign = nullptr;
|
||||
m_exmDtc = nullptr;
|
||||
m_pdmDtc = nullptr;
|
||||
m_ppmCbxIfc = nullptr;
|
||||
}
|
||||
|
||||
QVector<LtsWidgets::PluginData> InterfaceImpl::getActions()
|
||||
{
|
||||
QVector<LtsWidgets::PluginData> ret;
|
||||
|
||||
LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance();
|
||||
const bool enableHandgrenadeAndMineSearchShow = ps->value(QStringLiteral("smo"),
|
||||
QStringLiteral("enableHandgrenadeAndMineSearchShow")).toBool();
|
||||
|
||||
if (enableHandgrenadeAndMineSearchShow)
|
||||
{
|
||||
LtsWidgets::PluginData plData;
|
||||
plData.layoutArea = LtsWidgets::LayoutArea::eDialogTab;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.menuText = tr("Handgrenade and Mine search");
|
||||
plData.identifier = QLatin1String("smoHgrAndMineSearch");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:hand_grenade_locations.svg"));
|
||||
plData.operatorRight = OperatorRights::HandgrenadeMineSearchShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eAfterAction;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowHgrAndMineSearch(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowHgrAndMineSearch(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new HgrAndMineSearchDialog(parent),
|
||||
m_session, m_ppmDtc, m_ppmFtc, m_eemForeign, m_exmDtc, m_pdmDtc, m_ppmCbxIfc, m_aesDtc);
|
||||
}
|
||||
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search GUI plugin
|
||||
* $Id: smo_hgr_and_mine_search_plugin.h 48783 2019-11-06 14:23:43Z ojog_i $
|
||||
* $HeadURL: svn://slssvn/TDS/branches/product/devel/trunk/Lts/Plugins/ServiceMonitor/Gui/HgrAndMineSearch/smo_hgr_and_mine_search_plugin.h $
|
||||
* $Author: ojog_i $
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Plugins/ServiceMonitor/smo_hgr_and_mine_search_gui_plugin_interface.h>
|
||||
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <Common/ProjectConfig/project_defines.h>
|
||||
|
||||
#include <Plugins/ExerciseManagement/exm_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
#include <Plugins/ProjectDataManagement/Data/pdm_data_plugin.h>
|
||||
#include <Plugins/Timeline/tln_data_plugin_interface.h>
|
||||
#include <Plugins/AreaEffectSimulation/Data/aes_data_plugin.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class GuiPlugin final : public QObject, public GuiPluginBase::Plugin
|
||||
{
|
||||
Q_PLUGIN_METADATA(IID "gui:3:smo.hgrminesearch")
|
||||
Q_INTERFACES(GuiPluginBase::Plugin)
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GuiPlugin() = default;
|
||||
~GuiPlugin() = default;
|
||||
|
||||
QString pluginName() override { return QStringLiteral("ServiceMonitorHgrAndMineSearchGui"); }
|
||||
std::shared_ptr<GuiPluginBase::Interface> createGuiInterface(LtsSession::LtsSession *session) override;
|
||||
bool availableInPartition(IDL::PartitionType partition) const override
|
||||
{
|
||||
return (partition == IDL::PartitionType::Exercise);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class InterfaceImpl final : public QObject, public GuiPluginBase::Interface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit InterfaceImpl(LtsSession::LtsSession *session);
|
||||
|
||||
bool fetchInterfaces() override;
|
||||
void clearInterfaces() override;
|
||||
QVector<LtsWidgets::PluginData> getActions() override;
|
||||
QString menuGroup() const override { return tr("Service Monitors"); }
|
||||
|
||||
private:
|
||||
LtsWidgets::LtsDialog *onShowHgrAndMineSearch(QWidget *parent);
|
||||
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Ftc> m_ppmFtc;
|
||||
std::shared_ptr<TimeLineManagement::ForeignDataInterface>m_eemForeign;
|
||||
std::shared_ptr<ExerciseManagement::Interface::Dtc> m_exmDtc;
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_pdmDtc;
|
||||
std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> m_ppmCbxIfc;
|
||||
std::shared_ptr<AreaEffectSimulation::Interface::Dtc> m_aesDtc;
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
+516
@@ -0,0 +1,516 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search model
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
|
||||
#include "smo_hgr_and_mine_search_model.h"
|
||||
|
||||
#include <LtsCoordTrans/lts_coord_trans.h>
|
||||
#include <ngltools/ngltools_dtg.h>
|
||||
|
||||
#include <ProjectDataManagement/pdm_translation.h>
|
||||
#include <ParticipantManagement/ppm_translation.h>
|
||||
#include <ProjectDataManagement/pdm_to_string.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonValue>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonDocument>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
//###############################################################################
|
||||
|
||||
HgrAndMineSearchModel::HgrAndMineSearchModel(QObject *parent)
|
||||
: LtsWidgets::LtsAbstractTableModel<HgrAndMineSearchEntry>({tr("Type"),
|
||||
tr("Position"),
|
||||
tr("Timestamp"),
|
||||
tr("Source Equipment Number"),
|
||||
tr("Party"),
|
||||
tr("Vulnerability")
|
||||
#ifdef LTS_DEBUG
|
||||
, tr("Properties")
|
||||
, tr("Participant Id")
|
||||
#endif
|
||||
}, parent)
|
||||
, m_ppmDtc(nullptr)
|
||||
, m_ppmFtc(nullptr)
|
||||
, m_eemForeign(nullptr)
|
||||
, m_pdmDtc(nullptr)
|
||||
, m_equipSysEvtFlt()
|
||||
, m_evtFlt()
|
||||
, m_chunksRequested(0)
|
||||
, m_chunksReceived(0)
|
||||
, m_session(nullptr)
|
||||
, m_logger(getLogger("HgrAndMineSearchModel"))
|
||||
{}
|
||||
|
||||
bool HgrAndMineSearchModel::initModel(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> &ppmCbxIfc,
|
||||
const std::shared_ptr<AreaEffectSimulation::Interface::Dtc> &aesDtc)
|
||||
{
|
||||
m_session = session;
|
||||
|
||||
m_ppmDtc = ppmDtc;
|
||||
m_ppmFtc = ppmFtc;
|
||||
m_eemForeign = eemForeign;
|
||||
m_exmDtc = exmDtc;
|
||||
m_pdmDtc = pdmDtc;
|
||||
m_ppmGuiCbxIfc = ppmCbxIfc;
|
||||
m_aesDtc = aesDtc;
|
||||
|
||||
if (!m_ppmDtc->enableEquipmentSystemEventFtcReply())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable EquipmentSystemEventFtcReply Data-Topic in PPM DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_ppmFtc->enableEquipmentSystemEventData())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable EquipmentSystemEventData Function-Topic in PPM FTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_exmDtc->enableExercise())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable Exercise Data-Topic in EXM DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!m_pdmDtc->enableEquipmentSystemEventFilter())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable EquipmentSystemEventFilter Data-Topic in PDM DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_pdmDtc->enableEventFilterHgrMineSearch())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable EventFilterHgrMineSearch Data-Topic in PDM DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_aesDtc->enableMineArea())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable MineArea Data-Topic in AES DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!m_aesDtc->enableDusMineState())
|
||||
{
|
||||
ERROR_LOG(m_logger) << " Could not enable DusMineState Data-Topic in AES DTC!";
|
||||
return false;
|
||||
}
|
||||
|
||||
m_pdmDtc->waitForHistoricalDataEquipmentSystemEventFilter();
|
||||
m_pdmDtc->waitForHistoricalDataEventFilterHgrMineSearch();
|
||||
|
||||
connect(m_eemForeign.get(), &TimeLineManagement::ForeignDataInterface::requestedDataAvailable,
|
||||
this, &HgrAndMineSearchModel::onRequestedDataAvailable);
|
||||
|
||||
// load filter setttings
|
||||
loadFilterSettings();
|
||||
|
||||
// do function request for model data
|
||||
doEquipmentSystemEventRequests();
|
||||
doEventRequests();
|
||||
|
||||
emit chunksUpdated(m_chunksReceived, m_chunksRequested);
|
||||
|
||||
connect(this, &HgrAndMineSearchModel::rowsInserted,
|
||||
this, &HgrAndMineSearchModel::onUpdateComboboxFilterData, Qt::UniqueConnection);
|
||||
connect(this, &HgrAndMineSearchModel::rowsRemoved,
|
||||
this, &HgrAndMineSearchModel::onUpdateComboboxFilterData, Qt::UniqueConnection);
|
||||
connect(this, &HgrAndMineSearchModel::modelReset,
|
||||
this, &HgrAndMineSearchModel::onUpdateComboboxFilterData, Qt::UniqueConnection);
|
||||
|
||||
onUpdateComboboxFilterData();
|
||||
|
||||
doInsertMines();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
QVariant HgrAndMineSearchModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role == LtsWidgets::LtsColumnFilterProxyModel::ComboboxFilterRole &&
|
||||
orientation == Qt::Horizontal)
|
||||
{
|
||||
switch (section)
|
||||
{
|
||||
case EventType:
|
||||
return m_typeCbxFilterContent;
|
||||
case EventParty:
|
||||
return m_cbxFilterParty;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return LtsWidgets::LtsAbstractTableModel<HgrAndMineSearchEntry>::headerData(section, orientation, role);
|
||||
}
|
||||
|
||||
QVariant HgrAndMineSearchModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!indexIsValid(index))
|
||||
return QVariant();
|
||||
|
||||
const HgrAndMineSearchEntry &entry = m_vecData.at(index.row());
|
||||
|
||||
if (role == Qt::DecorationRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case EventParty:
|
||||
return iconFromPartyId(entry.party);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
if (role == Qt::DisplayRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case EventType:
|
||||
return ProjectDataManagement::toString(entry.type);
|
||||
case EventPosition:
|
||||
if (entry.pos.lon() == 0 || entry.pos.lat() == 0 || std::isnan(entry.pos.lon()))
|
||||
return QStringLiteral("---");
|
||||
return LtsCoordTrans::mgrsFromGeographic(entry.pos.lon(), entry.pos.lat());
|
||||
case EventTime:
|
||||
return QDateTime::fromMSecsSinceEpoch(entry.timeStamp);
|
||||
case EventSource:
|
||||
return source(entry);
|
||||
case EventParty:
|
||||
return stringFromPartyId(entry.party);
|
||||
case EventParticipantId:
|
||||
return entry.participantId;
|
||||
case EventProperties:
|
||||
return entry.properties;
|
||||
case EventVBG:
|
||||
{
|
||||
QString vulnerabilityState = tr("All Types");
|
||||
if (entry.vbg>=0)
|
||||
{
|
||||
ParticipantManagement::TypeClass typeClass = m_ppmDtc->type(m_ppmDtc->participant(entry.participantId).typeId()).typeClass();
|
||||
const ProjectDataManagement::VulnerabilityClass vc = typeClass == ParticipantManagement::TypeClass::Human ?
|
||||
ProjectDataManagement::VulnerabilityClass_def::SoldierInjuries :
|
||||
ProjectDataManagement::VulnerabilityClass_def::VehicleDamages;
|
||||
ProjectDataManagement::VulnerabilityState vs = static_cast<ProjectDataManagement::VulnerabilityState_def::type>(entry.vbg);
|
||||
vulnerabilityState = ProjectDataManagement::toString(vs, vc);
|
||||
}
|
||||
return vulnerabilityState;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (role == LtsWidgets::LtsColumnFilterProxyModel::ComboboxFilterRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case EventType:
|
||||
return entry.type.underlying();
|
||||
case EventParty:
|
||||
return entry.party;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QPointF HgrAndMineSearchModel::position(const QModelIndex &index) const
|
||||
{
|
||||
if (!indexIsValid(index))
|
||||
return QPointF();
|
||||
|
||||
const Core::GeoPosition pos = m_vecData.at(index.row()).pos;
|
||||
|
||||
if (pos.lon() == 0 || pos.lat() == 0 || std::isnan(pos.lon()))
|
||||
return QPointF();
|
||||
|
||||
return {pos.lon(), pos.lat()};
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::onEquipmentSystemEventDataReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_chunksReceived++;
|
||||
|
||||
if (!replyObject.error())
|
||||
{
|
||||
auto cb = [this, &replyObject](const ParticipantManagement::EquipmentSystemEventFtcReply &event)
|
||||
{
|
||||
if (event.filterId() != replyObject.id())
|
||||
return;
|
||||
HgrAndMineSearchEntry entry;
|
||||
|
||||
entry.type = ProjectDataManagement::HgrMineSearchFilterType(ProjectDataManagement::HgrMineSearchFilterType_def::Handgrenade);
|
||||
entry.pos = event.position();
|
||||
entry.timeStamp = event.timeStamp();
|
||||
entry.source = event.equipmentNumber();
|
||||
entry.participantId = 0;
|
||||
entry.party = 0;
|
||||
entry.vbg = 0;
|
||||
entry.properties = QString();
|
||||
|
||||
insertRow(entry);
|
||||
};
|
||||
m_ppmDtc->equipmentSystemEventFtcReplys(cb);
|
||||
}
|
||||
|
||||
emit chunksUpdated(m_chunksReceived, m_chunksRequested);
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::onRequestedDataAvailable(TimeLineManagement::TimelineDataProviderInterface *request)
|
||||
{
|
||||
auto it = m_requests.find(request);
|
||||
if (it == m_requests.end())
|
||||
return;
|
||||
m_requests.erase(it);
|
||||
|
||||
m_chunksReceived++;
|
||||
|
||||
const QVector<ExerciseEventManagement::Event> &events = request->eventData();
|
||||
HgrAndMineSearchEntry entry;
|
||||
for (const auto &event : events)
|
||||
{
|
||||
const QJsonObject obj = QJsonDocument::fromJson(QByteArray::fromRawData(event.properties().c_str(),
|
||||
event.properties().size())).object();
|
||||
entry.type = m_evtFlt.value(obj.value(QStringLiteral("OriginatorChargeTypeId")).toInt());
|
||||
|
||||
if (entry.type == ProjectDataManagement::HgrMineSearchFilterType::inner_enum::Mine)
|
||||
continue;
|
||||
|
||||
entry.pos = event.position();
|
||||
entry.timeStamp = event.sampleTime();
|
||||
entry.source = event.equipmentNumber();
|
||||
entry.participantId = event.participantId();
|
||||
entry.party = event.partyId();
|
||||
entry.vbg = obj.value(QStringLiteral("VulnerabilityState")).toInt();
|
||||
entry.properties = QString::fromUtf8(event.properties().c_str());
|
||||
|
||||
insertRow(entry);
|
||||
}
|
||||
|
||||
emit chunksUpdated(m_chunksReceived, m_chunksRequested);
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::doEquipmentSystemEventRequests()
|
||||
{
|
||||
ExerciseManagement::Exercise ex = m_exmDtc->exercise(m_session->exerciseId());
|
||||
int64_t start = ex.beginTime();
|
||||
int64_t end = m_session->partitionTime() < ex.endTime() ? m_session->partitionTime() : ex.endTime(); // already at end of exercise?
|
||||
|
||||
while (start < end)
|
||||
{
|
||||
ParticipantManagement::EquipmentSystemEventDataRequest req;
|
||||
int64_t reqEnd = ((start + 24 * 60 * 60 * 1000) > end ? end : start + 24 * 60 * 60 * 1000);
|
||||
|
||||
req.startTime(start);
|
||||
req.endTime(reqEnd);
|
||||
|
||||
for (const auto &filter : qAsConst(m_equipSysEvtFlt))
|
||||
{
|
||||
req.equipmentFunctionId(filter.equipmentFunctionId());
|
||||
req.subDeviceId(filter.subDeviceId());
|
||||
req.deviceSpecificEventCode(filter.deviceSpecificCode());
|
||||
|
||||
m_ppmFtc->equipmentSystemEventDataRequest(req, this);
|
||||
|
||||
m_chunksRequested++;
|
||||
}
|
||||
|
||||
// set new start
|
||||
start += (24 * 60 * 60 * 1000) + 1;
|
||||
}
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::doEventRequests()
|
||||
{
|
||||
ExerciseManagement::Exercise ex = m_exmDtc->exercise(m_session->partitionId());
|
||||
int64_t startTime = ex.beginTime();
|
||||
const int64_t endTime = ex.stopTime() > 0 ? ex.stopTime() : m_session->partitionTime();
|
||||
while (startTime < endTime)
|
||||
{
|
||||
int64_t reqEnd = ((startTime + 24 * 60 * 60 * 1000) > endTime ? endTime : startTime + 24 * 60 * 60 * 1000);
|
||||
QJsonArray arr;
|
||||
for (auto it = m_evtFlt.cbegin(), end = m_evtFlt.cend(); it != end; ++it)
|
||||
arr += QJsonValue(it.key());
|
||||
const QJsonObject filter({{QStringLiteral("OriginatorChargeTypeId"), arr}});
|
||||
|
||||
m_requests += m_eemForeign->requestData(startTime, reqEnd, {ProjectDataManagement::EventType_def::Hit,
|
||||
ProjectDataManagement::EventType_def::HitEffectSimulation,
|
||||
ProjectDataManagement::EventType_def::HitMine}, filter);
|
||||
|
||||
// set new start
|
||||
startTime += (24 * 60 * 60 * 1000) + 1;
|
||||
}
|
||||
m_chunksRequested += m_requests.size();
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::doInsertMines()
|
||||
{
|
||||
QMap<qint32, AreaEffectSimulation::MineArea> mineAreas;
|
||||
const QMap<qint32, AreaEffectSimulation::DusMineState> dusMineStates = m_aesDtc->dusMineStates();
|
||||
HgrAndMineSearchEntry entry;
|
||||
QJsonObject properties;
|
||||
|
||||
entry.type = ProjectDataManagement::HgrMineSearchFilterType::inner_enum::Mine;
|
||||
entry.timeStamp = QDateTime::currentMSecsSinceEpoch();
|
||||
|
||||
for (auto it = dusMineStates.constBegin(); it != dusMineStates.constEnd(); ++it)
|
||||
{
|
||||
if (!mineAreas.contains(it.key()))
|
||||
mineAreas.insert(it.key(), m_aesDtc->mineArea(it.key()));
|
||||
|
||||
const std::vector<AreaEffectSimulation::DusMine> mines = it.value().mines();
|
||||
entry.party = mineAreas.value(it.key()).partyId().is_set() ? mineAreas.value(it.key()).partyId().get() : 0;
|
||||
|
||||
for (const AreaEffectSimulation::DusMine ¤tMine : mines)
|
||||
{
|
||||
properties.insert(tr("Mine-ID"), currentMine.eqId());
|
||||
|
||||
entry.properties = QString::fromUtf8(QJsonDocument(properties).toJson(QJsonDocument::Compact));
|
||||
entry.pos.lon(currentMine.position().lon());
|
||||
entry.pos.lat(currentMine.position().lat());
|
||||
|
||||
insertRow(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::loadFilterSettings()
|
||||
{
|
||||
// ppm filter
|
||||
m_equipSysEvtFlt = m_pdmDtc->equipmentSystemEventFilters();
|
||||
|
||||
// eem filter
|
||||
auto cb = [this](const ProjectDataManagement::EventFilterHgrMineSearch &filter)
|
||||
{
|
||||
m_evtFlt.insert(filter.chargeTypeId(), filter.hgrMineSearchFilterType());
|
||||
};
|
||||
m_pdmDtc->eventFilterHgrMineSearchs(cb);
|
||||
}
|
||||
|
||||
int HgrAndMineSearchModel::source(const HgrAndMineSearchEntry &entry) const
|
||||
{
|
||||
if (entry.source != -1)
|
||||
return entry.source;
|
||||
|
||||
QJsonDocument properties = QJsonDocument::fromJson(entry.properties.toUtf8());
|
||||
QJsonObject propertiesObj = properties.object();
|
||||
const QString KEY = QLatin1String("Mine-ID");
|
||||
|
||||
return propertiesObj.value(KEY).toInt(-1);
|
||||
}
|
||||
|
||||
//
|
||||
// HgrAndMineSearchProxyModel
|
||||
//
|
||||
void HgrAndMineSearchProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||
{
|
||||
m_sourceModel = qobject_cast<HgrAndMineSearchModel*>(sourceModel);
|
||||
LtsWidgets::LtsColumnFilterProxyModel::setSourceModel(sourceModel);
|
||||
}
|
||||
|
||||
bool HgrAndMineSearchProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||
{
|
||||
if (!m_sourceModel ||
|
||||
source_left.column() != source_right.column() ||
|
||||
!source_left.isValid() ||
|
||||
!source_right.isValid())
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
const auto &dataLeft = m_sourceModel->m_vecData.at(source_left.row());
|
||||
const auto &dataRight = m_sourceModel->m_vecData.at(source_right.row());
|
||||
switch (source_left.column())
|
||||
{
|
||||
case HgrAndMineSearchModel::EventType:
|
||||
case HgrAndMineSearchModel::EventPosition:
|
||||
break;
|
||||
case HgrAndMineSearchModel::EventTime:
|
||||
return dataLeft.timeStamp < dataRight.timeStamp;
|
||||
case HgrAndMineSearchModel::EventSource:
|
||||
return dataLeft.source < dataRight.source;
|
||||
case HgrAndMineSearchModel::EventParty:
|
||||
return dataLeft.party < dataRight.party;
|
||||
case HgrAndMineSearchModel::EventParticipantId:
|
||||
return dataLeft.participantId < dataRight.participantId;
|
||||
case HgrAndMineSearchModel::EventProperties:
|
||||
return dataLeft.properties < dataRight.properties;
|
||||
}
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
}
|
||||
|
||||
QIcon HgrAndMineSearchModel::iconFromPartyId(int partyId) const
|
||||
{
|
||||
if (!m_ppmGuiCbxIfc)
|
||||
return QIcon();
|
||||
auto it = m_partyIcons.find(partyId);
|
||||
if (it != m_partyIcons.end())
|
||||
return it.value();
|
||||
const QRgb col = QRgb(m_ppmDtc->party(partyId).color());
|
||||
const QIcon icon = m_ppmGuiCbxIfc->pixmapFromParty(col);
|
||||
m_partyIcons.insert(partyId, icon);
|
||||
return icon;
|
||||
}
|
||||
|
||||
QVariant HgrAndMineSearchModel::stringFromPartyId(int partyId) const
|
||||
{
|
||||
auto it = m_partyNames.find(partyId);
|
||||
if (it != m_partyNames.end())
|
||||
return it.value();
|
||||
const QString name = ParticipantManagement::trPartyName(m_ppmDtc->party(partyId).name());
|
||||
m_partyNames.insert(partyId, name);
|
||||
return name;
|
||||
}
|
||||
|
||||
void HgrAndMineSearchModel::onUpdateComboboxFilterData()
|
||||
{
|
||||
LtsWidgets::ComboboxFilterContent cfc;
|
||||
LtsWidgets::ComboboxFilterData cfd;
|
||||
const auto types = {ProjectDataManagement::HgrMineSearchFilterType::Handgrenade,
|
||||
ProjectDataManagement::HgrMineSearchFilterType::Mine,
|
||||
ProjectDataManagement::HgrMineSearchFilterType::Claymore,
|
||||
ProjectDataManagement::HgrMineSearchFilterType::Ied};
|
||||
cfc.data.reserve(types.size());
|
||||
for (const auto typeId : types)
|
||||
{
|
||||
cfd.data = typeId;
|
||||
cfd.text = ProjectDataManagement::toString(typeId);
|
||||
cfc.data.push_back(cfd);
|
||||
}
|
||||
cfc.sortItems = true;
|
||||
m_typeCbxFilterContent = cfc.toVariant();
|
||||
|
||||
QSet<int> availablePartyIds;
|
||||
for (const auto &data : qAsConst(m_vecData))
|
||||
availablePartyIds.insert(data.party);
|
||||
|
||||
cfc.data.clear();
|
||||
for (const int i : qAsConst(availablePartyIds))
|
||||
{
|
||||
cfd.data = i;
|
||||
cfd.text = ParticipantManagement::trPartyName(m_ppmDtc->party(i).name());
|
||||
cfd.icon = iconFromPartyId(i);
|
||||
cfc.data.push_back(cfd);
|
||||
}
|
||||
cfc.sortItems = false;
|
||||
m_cbxFilterParty = cfc.toVariant();
|
||||
}
|
||||
|
||||
}
|
||||
+133
@@ -0,0 +1,133 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Handgrande and mine search model
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Plugins/ExerciseManagement/Data/exm_data_plugin.h>
|
||||
#include <Plugins/ParticipantManagement/Data/ppm_data_plugin.h>
|
||||
#include <Plugins/ProjectDataManagement/Data/pdm_data_plugin.h>
|
||||
#include <Plugins/Timeline/tln_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
#include <Plugins/AreaEffectSimulation/Data/aes_data_plugin.h>
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsWidgets/lts_abstract_table_model.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
#include <QSet>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
struct HgrAndMineSearchEntry
|
||||
{
|
||||
ProjectDataManagement::HgrMineSearchFilterType type = ProjectDataManagement::HgrMineSearchFilterType::Unknown;
|
||||
Core::GeoPosition pos;
|
||||
int64_t timeStamp = -1;
|
||||
int32_t source = -1;
|
||||
int32_t party = -1;
|
||||
int32_t participantId = -1;
|
||||
int32_t vbg = -1;
|
||||
QString properties;
|
||||
};
|
||||
|
||||
//###############################################################################
|
||||
|
||||
class HgrAndMineSearchModel final
|
||||
: public LtsWidgets::LtsAbstractTableModel<HgrAndMineSearchEntry>
|
||||
, protected ParticipantManagement::Interface::Ftc::EquipmentSystemEventDataReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum Columns
|
||||
{
|
||||
EventType,
|
||||
EventPosition,
|
||||
EventTime,
|
||||
EventSource,
|
||||
EventParty,
|
||||
EventVBG,
|
||||
EventProperties,
|
||||
EventParticipantId
|
||||
};
|
||||
explicit HgrAndMineSearchModel(QObject *parent = nullptr);
|
||||
|
||||
bool initModel(LtsSession::LtsSession *session,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<TimeLineManagement::ForeignDataInterface> &eemForeign,
|
||||
const std::shared_ptr<ExerciseManagement::Interface::Dtc> &exmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> &ppmCbxIfc,
|
||||
const std::shared_ptr<AreaEffectSimulation::Interface::Dtc> &aesDtc);
|
||||
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
QPointF position(const QModelIndex &index) const;
|
||||
signals:
|
||||
void chunksUpdated(int chunksReceived, int chunksRequested);
|
||||
|
||||
protected:
|
||||
QIcon iconFromPartyId(int partyId) const;
|
||||
QVariant stringFromPartyId(int partyId) const;
|
||||
void onUpdateComboboxFilterData();
|
||||
|
||||
private:
|
||||
void onEquipmentSystemEventDataReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
void onRequestedDataAvailable(TimeLineManagement::TimelineDataProviderInterface *request);
|
||||
|
||||
void doEquipmentSystemEventRequests();
|
||||
void doEventRequests();
|
||||
void doInsertMines();
|
||||
void loadFilterSettings();
|
||||
|
||||
mutable QHash<int, QVariant> m_partyNames;
|
||||
mutable QHash<int, QIcon> m_partyIcons;
|
||||
QVariant m_cbxFilterParty;
|
||||
int source(const HgrAndMineSearchEntry &entry) const;
|
||||
|
||||
std::shared_ptr<AreaEffectSimulation::Interface::Dtc> m_aesDtc;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Ftc> m_ppmFtc;
|
||||
std::shared_ptr<TimeLineManagement::ForeignDataInterface> m_eemForeign;
|
||||
std::shared_ptr<ExerciseManagement::Interface::Dtc> m_exmDtc;
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_pdmDtc;
|
||||
std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> m_ppmGuiCbxIfc;
|
||||
|
||||
// filter for ppm EquipmentSystemEvent request
|
||||
QMap<int32_t, ProjectDataManagement::EquipmentSystemEventFilter> m_equipSysEvtFlt;
|
||||
|
||||
// filter for eem Event request
|
||||
QMap<int32_t, ProjectDataManagement::HgrMineSearchFilterType> m_evtFlt;
|
||||
|
||||
int m_chunksRequested;
|
||||
int m_chunksReceived;
|
||||
QSet<TimeLineManagement::TimelineDataProviderInterface*> m_requests;
|
||||
|
||||
QVariant m_typeCbxFilterContent;
|
||||
|
||||
LtsSession::LtsSession *m_session;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
friend class HgrAndMineSearchProxyModel;
|
||||
};
|
||||
|
||||
class HgrAndMineSearchProxyModel final : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
private:
|
||||
HgrAndMineSearchModel *m_sourceModel = nullptr;
|
||||
};
|
||||
}
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Christian Ehrlicher, SLSE, 2016-02-29
|
||||
#
|
||||
|
||||
SET(smo_monitors_gui_SRCS
|
||||
smo_monitors_gui_plugin.cpp
|
||||
smo_monitors_gui_plugin.h
|
||||
smo_base_equipment_check.cpp
|
||||
smo_base_equipment_check.h
|
||||
smo_base_player_model.cpp
|
||||
smo_base_player_model.h
|
||||
smo_bite_model.h
|
||||
smo_bite_model.cpp
|
||||
smo_ctas_error_model.cpp
|
||||
smo_ctas_error_model.h
|
||||
smo_dialog.cpp
|
||||
smo_dialog.h
|
||||
smo_egcu_model.cpp
|
||||
smo_egcu_model.h
|
||||
smo_egcu_edit.cpp
|
||||
smo_egcu_edit.h
|
||||
smo_fault_message_dialog.cpp
|
||||
smo_fault_message_dialog.h
|
||||
smo_manipulation_model.h
|
||||
smo_manipulation_model.cpp
|
||||
smo_party_equipment_check_dialog.cpp
|
||||
smo_party_equipment_check_dialog.h
|
||||
smo_party_player_model.cpp
|
||||
smo_party_player_model.h
|
||||
smo_single_service_equipment_check_dialog.cpp
|
||||
smo_single_service_equipment_check_dialog.h
|
||||
smo_single_player_model.cpp
|
||||
smo_single_player_model.h
|
||||
smo_structure_element_edit.cpp
|
||||
smo_structure_element_edit.h
|
||||
)
|
||||
|
||||
NGL_WRAP_UI(smo_monitors_gui_SRCS
|
||||
smo_dialog.ui
|
||||
smo_egcu_edit.ui
|
||||
smo_fault_message_dialog.ui
|
||||
smo_party_equipment_check_dialog.ui
|
||||
smo_single_service_equipment_check_dialog.ui
|
||||
smo_structure_element_edit.ui
|
||||
)
|
||||
|
||||
NGL_ADD_LIBRARY(WS SmoMonitorsGuiPlugin MODULE ${smo_monitors_gui_SRCS})
|
||||
NGL_TARGET_LINK_LIBRARIES(SmoMonitorsGuiPlugin
|
||||
Qt5::Widgets
|
||||
AsbDataPluginInterface
|
||||
AsbHelper
|
||||
FlmDataPluginInterface
|
||||
FlmExplorerGuiPluginInterface
|
||||
GuiPluginInterface
|
||||
IsmDataPluginInterface
|
||||
IsmShared
|
||||
LtsCoordTrans
|
||||
LtsDataView
|
||||
LtsPrinting
|
||||
LtsSession
|
||||
LtsSessionData
|
||||
LtsUtilsGuiDds
|
||||
LtsUtilsSettings
|
||||
ngltools
|
||||
nglwidgets
|
||||
PpmCommon
|
||||
PpmDataPluginInterface
|
||||
SmoCheckButtonHandler
|
||||
SmoCommon
|
||||
SmoMonitorsGuiPluginInterface
|
||||
SituationMapGuiPluginInterface
|
||||
svcAsmClient
|
||||
svcBldCommon
|
||||
# svcOssCommon
|
||||
svcOssClient
|
||||
svcSmoDummy
|
||||
TabocDataPluginInterface
|
||||
tabTelegrams
|
||||
svcAesClient
|
||||
)
|
||||
|
||||
NGL_INSTALL_TARGET(SmoMonitorsGuiPlugin)
|
||||
|
||||
## check_button_handler
|
||||
SET(smo_check_button_handler_SRCS
|
||||
smo_check_button_handler.cpp
|
||||
smo_check_button_handler.h
|
||||
)
|
||||
NGL_ADD_LIBRARY2(WS SmoCheckButtonHandler SHARED ${smo_check_button_handler_SRCS})
|
||||
NGL_TARGET_INCLUDE_DIRECTORIES(SmoCheckButtonHandler
|
||||
PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../
|
||||
)
|
||||
|
||||
NGL_TARGET_LINK_LIBRARIES(SmoCheckButtonHandler
|
||||
Qt5::Widgets
|
||||
LtsPrinting
|
||||
LtsSessionData
|
||||
LtsUtilsGuiDds
|
||||
LtsUtilsSettings
|
||||
PpmDataPluginInterface
|
||||
)
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Base Equipment Check
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-07
|
||||
*/
|
||||
|
||||
#include "smo_base_equipment_check.h"
|
||||
|
||||
#include <ProjectDataManagement/pdm_to_string.h>
|
||||
|
||||
#include <QAction>
|
||||
#include <QMenu>
|
||||
#include <QTimer>
|
||||
#include <QTreeView>
|
||||
#include <LtsSession/lts_session_data.h>
|
||||
#include <LtsDataView/lts_data_view.h>
|
||||
#include <LtsPrinting/printing.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
BaseEquipmentCheck::BaseEquipmentCheck(const char *loggerName,
|
||||
LtsSession::LtsSession *session,
|
||||
QWidget *parent)
|
||||
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly)
|
||||
, m_session(session)
|
||||
, m_playerModel(nullptr)
|
||||
, m_ppmFtc(nullptr)
|
||||
, m_requestHelper(new LtsUtils::RequestHelper(this))
|
||||
, m_timeoutVal(65000)
|
||||
, m_actionMenu(new QMenu(this))
|
||||
, m_requestBite(new QAction(tr("Request BITE"), this))
|
||||
, m_requestBiteSelfTest(new QAction(tr("Request BITE (with self test)"), this))
|
||||
, m_checkButtonHandler(nullptr)
|
||||
, m_logger(getLogger(loggerName))
|
||||
{
|
||||
// Edit-Button is used as Check-Button
|
||||
// Added QStringLiteral is workaround for REGG-3773. Author of this dialog should fix this properly.
|
||||
m_buttonBox->setButtonVisible(LtsWidgets::DialogButton::Edit, true);
|
||||
m_buttonBox->setText(LtsWidgets::DialogButton::Edit, tr("Check") + QStringLiteral(" "));
|
||||
m_buttonBox->setIcon(LtsWidgets::DialogButton::Edit, QIcon(QStringLiteral(":/style/dialog-ok.svg")));
|
||||
|
||||
m_actionMenu->addAction(m_requestBite);
|
||||
connect(m_requestBite, &QAction::triggered,
|
||||
this, [this]() { sendBiteRequest(m_selectedParticipants, false);});
|
||||
|
||||
m_actionMenu->addAction(m_requestBiteSelfTest);
|
||||
connect(m_requestBiteSelfTest, &QAction::triggered,
|
||||
this, [this]() { sendBiteRequest(m_selectedParticipants, true);});
|
||||
|
||||
m_buttonBox->setMenu(LtsWidgets::DialogButton::Edit, m_actionMenu);
|
||||
|
||||
m_checkButtonHandler = new CheckButtonHandler(m_buttonBox->getButton(LtsWidgets::DialogButton::Edit));
|
||||
m_checkButtonHandler->addReset();
|
||||
m_checkButtonHandler->addTacticalState();
|
||||
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Print,
|
||||
this,
|
||||
&BaseEquipmentCheck::onPrint);
|
||||
}
|
||||
|
||||
bool BaseEquipmentCheck::init(const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc)
|
||||
{
|
||||
// Ftc
|
||||
if (!ppmFtc || m_ppmFtc)
|
||||
return false;
|
||||
|
||||
m_ppmFtc = ppmFtc;
|
||||
|
||||
// Dtc
|
||||
m_session->getDtc<ParticipantManagement::DataInterface>(m_ppmDtc);
|
||||
if (m_checkButtonHandler && m_ppmDtc)
|
||||
m_checkButtonHandler->setPpm(m_ppmDtc, m_ppmFtc);
|
||||
|
||||
view()->treeView()->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(view()->treeView(), &QTreeView::customContextMenuRequested,
|
||||
this, &BaseEquipmentCheck::onCustomContextMenuRequested);
|
||||
connect(view(), &LtsDataView::LtsDataView::selectionChanged,
|
||||
this, &BaseEquipmentCheck::onSelectionChanged);
|
||||
|
||||
onSelectionChanged();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void BaseEquipmentCheck::sendBiteRequest(const std::vector<int> &selectedIds,
|
||||
bool bWithSelfTest)
|
||||
{
|
||||
if (selectedIds.size() == 0)
|
||||
return;
|
||||
|
||||
ParticipantManagement::CallBiteRequest req;
|
||||
req.participantIds(selectedIds);
|
||||
req.withSelfTest(bWithSelfTest);
|
||||
m_requestHelper->startSingleRequest([req, this]() { return m_ppmFtc->callBiteRequest(req, this); });
|
||||
|
||||
for (int id : selectedIds)
|
||||
{
|
||||
m_playerModel->updateBitResult(id, tr("Test running"));
|
||||
|
||||
// set timer for timeout for the participant
|
||||
QTimer *t = new QTimer(this);
|
||||
connect(t, &QTimer::timeout, this, [this, id, t]() { onMappedEquipTimeout(id, t); });
|
||||
t->start(m_timeoutVal);
|
||||
}
|
||||
}
|
||||
|
||||
void BaseEquipmentCheck::sendInitRequest(const std::vector<int> &selectedIds,
|
||||
bool resetManipulation,
|
||||
bool restockCharges,
|
||||
bool resetVulnerabilityState,
|
||||
bool restockSanMat)
|
||||
{
|
||||
if (!resetManipulation && !restockCharges && !resetVulnerabilityState)
|
||||
return;
|
||||
ParticipantManagement::InitParticipantRequest req;
|
||||
req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId());
|
||||
req.participantIds(selectedIds);
|
||||
req.resetManipulation(resetManipulation);
|
||||
req.restockCharges(restockCharges);
|
||||
req.resetVulnerabilityState(resetVulnerabilityState);
|
||||
req.restockSanitationMaterial(restockSanMat);
|
||||
m_requestHelper->startSingleRequest([req, this]() { return m_ppmFtc->initParticipantRequest(req, this); });
|
||||
}
|
||||
|
||||
void BaseEquipmentCheck::sendModifyState(const std::vector<int> &selectedIds,
|
||||
ProjectDataManagement::VulnerabilityState vs)
|
||||
{
|
||||
ParticipantManagement::ModifyStateRequest req;
|
||||
req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId());
|
||||
req.participantIds(selectedIds);
|
||||
req.vulnerabilityState(vs);
|
||||
m_requestHelper->startSingleRequest([req, this]() { return m_ppmFtc->modifyStateRequest(req, this); });
|
||||
}
|
||||
|
||||
|
||||
void BaseEquipmentCheck::onMappedEquipTimeout(int participantId, QTimer *timer)
|
||||
{
|
||||
timer->deleteLater();
|
||||
const QString bitResult = m_playerModel->getBitResult(participantId);
|
||||
|
||||
if (bitResult == tr("Test running"))
|
||||
{
|
||||
// update tableView
|
||||
m_playerModel->updateBitResult(participantId,
|
||||
tr("Timeout ..."));
|
||||
}
|
||||
}
|
||||
|
||||
void BaseEquipmentCheck::onSelectionChanged()
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "onSelectionChanged";
|
||||
|
||||
bool enable = false;
|
||||
const auto selectedIndexes = view()->selectedRows();
|
||||
|
||||
if (m_checkButtonHandler)
|
||||
{
|
||||
std::vector<int> selectedParticipantCandidates;
|
||||
for (const auto &idx : selectedIndexes)
|
||||
{
|
||||
const auto &part = m_playerModel->getRowData(idx.row());
|
||||
if (part.participantId <= 0)
|
||||
continue;
|
||||
selectedParticipantCandidates.push_back(part.participantId);
|
||||
}
|
||||
//
|
||||
// check candidates:
|
||||
//
|
||||
// setSelectedParticipantIds will check for TypeClass etc and set visi of actions accordingly.
|
||||
// additional, unknown/invalid entries will be removed:
|
||||
m_selectedParticipants = m_checkButtonHandler->setSelectedParticipantIds(selectedParticipantCandidates);
|
||||
enable = m_selectedParticipants.size() > 0;
|
||||
}
|
||||
|
||||
// set visi according number of valid participants:
|
||||
m_requestBite->setVisible(enable);
|
||||
m_requestBiteSelfTest->setVisible(enable);
|
||||
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Remove, !selectedIndexes.isEmpty());
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Show, enable);
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Edit, enable);
|
||||
}
|
||||
|
||||
void BaseEquipmentCheck::onCustomContextMenuRequested(const QPoint &pos)
|
||||
{
|
||||
if (m_selectedParticipants.size() == 0)
|
||||
return;
|
||||
|
||||
m_actionMenu->exec(view()->treeView()->mapToGlobal(pos));
|
||||
}
|
||||
|
||||
void BaseEquipmentCheck::onPrint()
|
||||
{
|
||||
LtsPrinting::printView(m_session, this, view()->treeView());
|
||||
}
|
||||
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Base Equipment Check
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-07
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <ParticipantManagement/ppm_ftc.h>
|
||||
#include <ParticipantManagement/ppm_dtc.h>
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsUtilsGuiDds/request_helper.h>
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
#include <Common/logger.h>
|
||||
#include "smo_base_player_model.h"
|
||||
|
||||
#include "smo_check_button_handler.h"
|
||||
|
||||
class QTimer;
|
||||
|
||||
namespace LtsDataView
|
||||
{
|
||||
class LtsDataView;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class BaseEquipmentCheck : public LtsWidgets::LtsDialog
|
||||
, protected ParticipantManagement::Interface::Ftc::CallBiteReplyHandler
|
||||
, protected ParticipantManagement::Interface::Ftc::InitParticipantReplyHandler
|
||||
, protected ParticipantManagement::Interface::Ftc::ModifyStateReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
explicit BaseEquipmentCheck(const char *loggerName,
|
||||
LtsSession::LtsSession *session,
|
||||
QWidget *parent = nullptr);
|
||||
|
||||
bool init(const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc);
|
||||
|
||||
void onCallBiteReply(const Core::FunctionReplyObject &replyObject) override final
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
void onInitParticipantReply(const Core::FunctionReplyObject &replyObject) override final
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
void onModifyStateReply(const Core::FunctionReplyObject &replyObject) override final
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
void sendBiteRequest(const std::vector<int> &selectedIds, bool bWithSelfTest);
|
||||
void sendInitRequest(const std::vector<int> &selectedIds,
|
||||
bool resetManipulation,
|
||||
bool restockCharges,
|
||||
bool resetVulnerabilityState,
|
||||
bool restockSanMat);
|
||||
void sendModifyState(const std::vector<int> &selectedIds,
|
||||
ProjectDataManagement::VulnerabilityState vs);
|
||||
|
||||
protected slots:
|
||||
void onMappedEquipTimeout(int participantId, QTimer *timer);
|
||||
void onSelectionChanged();
|
||||
void onCustomContextMenuRequested(const QPoint &pos);
|
||||
void onPrint();
|
||||
|
||||
protected:
|
||||
virtual LtsDataView::LtsDataView *view() = 0;
|
||||
virtual const LtsDataView::LtsDataView *view() const = 0;
|
||||
protected:
|
||||
LtsSession::LtsSession *m_session;
|
||||
BasePlayerModel *m_playerModel;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Ftc> m_ppmFtc;
|
||||
LtsUtils::RequestHelper *m_requestHelper;
|
||||
int m_timeoutVal;
|
||||
|
||||
QMenu *m_actionMenu;
|
||||
QAction *m_requestBite;
|
||||
QAction *m_requestBiteSelfTest;
|
||||
std::vector<int> m_selectedParticipants;
|
||||
CheckButtonHandler *m_checkButtonHandler;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,918 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Base Model for Equipment Check
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-07
|
||||
*/
|
||||
|
||||
#include "smo_base_player_model.h"
|
||||
#include "smo_bite_model.h"
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsCoordTrans/lts_coord_trans.h>
|
||||
#include <LtsUtilsCore/outdated_position.h>
|
||||
#include <ProjectDataManagement/pdm_to_string.h>
|
||||
#include <ProjectDataManagement/pdm_translation.h>
|
||||
#include <ParticipantManagement/ppm_translation.h>
|
||||
#include <Plugins/AdvancedSymbology/asb_data_plugin_interface.h>
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <ngltools/ngltools_dtg.h>
|
||||
#include <QApplication>
|
||||
#include <QDateTime>
|
||||
#include <QTimer>
|
||||
#include <Common/logger.h>
|
||||
#include <Symbology/symbol_data_to_render_role.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
BasePlayerModel::BasePlayerModel(QObject *parent)
|
||||
: LtsWidgets::LtsAbstractTableModel<PlayerData>(
|
||||
{
|
||||
tr("Id"),
|
||||
tr("Equip. No."),
|
||||
tr("Party"),
|
||||
tr("Hierarchy"),
|
||||
tr("Designator"),
|
||||
tr("Tact. Identifier"),
|
||||
tr("Sign"),
|
||||
tr("Type"),
|
||||
tr("Tact. Status"),
|
||||
tr("Pos."),
|
||||
tr("Age"),
|
||||
tr("BITE"),
|
||||
tr("Warnings")
|
||||
},
|
||||
parent)
|
||||
, AdvancedSymbology::TableModelSymbolRenderer<BasePlayerModel>(ColEquipmentNummer)
|
||||
, m_ppmDtc(nullptr)
|
||||
, m_ppmGuiCbxIfc(nullptr)
|
||||
, m_biteModel(new BiteModel(this))
|
||||
, m_tactStatusGreen(QLatin1String("icon:green_light.svg"))
|
||||
, m_tactStatusYellow(QLatin1String("icon:yellow_light.svg"))
|
||||
, m_tactStatusOrange(QLatin1String("icon:orange_light.svg"))
|
||||
, m_tactStatusRed(QLatin1String("icon:red_light.svg"))
|
||||
, m_partitionTime(0)
|
||||
, m_timeoutCheckTimer(new QTimer(this))
|
||||
, m_positionAgeTimer(new QTimer(this))
|
||||
, m_session(nullptr)
|
||||
, m_logger(getLogger("BasePlayerModel"))
|
||||
{
|
||||
m_timeoutCheckTimer->setSingleShot(false);
|
||||
connect(m_timeoutCheckTimer, &QTimer::timeout,
|
||||
this, &BasePlayerModel::onTimeoutCheck);
|
||||
m_positionAgeTimer->setSingleShot(false);
|
||||
connect(m_positionAgeTimer, &QTimer::timeout,
|
||||
this, &BasePlayerModel::onUpdatePositionAge);
|
||||
}
|
||||
|
||||
bool BasePlayerModel::initModel(LtsSession::LtsSessionDataDds *session)
|
||||
{
|
||||
if (!session)
|
||||
return false;
|
||||
|
||||
DEBUG_LOG(m_logger) << "**** initModel";
|
||||
m_session = session;
|
||||
m_partitionTime = m_session->partitionTime();
|
||||
|
||||
if (!session->getDtc<ParticipantManagement::DataInterface>(m_ppmDtc))
|
||||
return false;
|
||||
|
||||
session->getForeignGuiInterface<ParticipantManagement::ForeignGuiComboboxInterface>(m_ppmGuiCbxIfc);
|
||||
|
||||
// optional
|
||||
std::shared_ptr<AdvancedSymbology::ForeignDataInterface> asb;
|
||||
session->getForeignDataInterface<AdvancedSymbology::DataInterface>(asb);
|
||||
AdvancedSymbology::TableModelSymbolRenderer<BasePlayerModel>::init(asb, this);
|
||||
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> pdmDtc;
|
||||
session->getDtc<ProjectDataManagement::DataInterface>(pdmDtc);
|
||||
m_biteModel->initModel(m_ppmDtc, pdmDtc);
|
||||
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::dynamicParticipantDataChanged,
|
||||
this, &BasePlayerModel::onDynamicParticipantChanged);
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::participantChanged,
|
||||
this, &BasePlayerModel::onParticipantChanged);
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::biteChanged,
|
||||
this, &BasePlayerModel::onBiteChanged);
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::partyChanged,
|
||||
this, &BasePlayerModel::onPartyChanged);
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::participantPositionChanged,
|
||||
this, &BasePlayerModel::onPositionChanged);
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::typeChanged,
|
||||
this, &BasePlayerModel::onTypeChanged);
|
||||
|
||||
auto cbParticipant = [this](const ParticipantManagement::Participant &participant)
|
||||
{
|
||||
onParticipantChanged(participant, DataModification::eAdded);
|
||||
};
|
||||
m_ppmDtc->participants(cbParticipant);
|
||||
|
||||
auto cbBite = [this](const ParticipantManagement::Bite &bite)
|
||||
{
|
||||
onBiteChanged(bite, DataModification::eAdded);
|
||||
};
|
||||
m_ppmDtc->bites(cbBite);
|
||||
|
||||
auto cbParty = [this](const ParticipantManagement::Party &party)
|
||||
{
|
||||
onPartyChanged(party, DataModification::eAdded);
|
||||
};
|
||||
m_ppmDtc->partys(cbParty);
|
||||
|
||||
auto cbPosition = [this](const ParticipantManagement::ParticipantPosition &position)
|
||||
{
|
||||
onPositionChanged(position, DataModification::eAdded);
|
||||
};
|
||||
m_ppmDtc->participantPositions(cbPosition);
|
||||
|
||||
auto cbTypes = [this](const ParticipantManagement::Type &type)
|
||||
{
|
||||
onTypeChanged(type, DataModification::eAdded);
|
||||
};
|
||||
m_ppmDtc->types(cbTypes);
|
||||
|
||||
connect(session, &LtsSession::LtsSession::partitionTimeChanged,
|
||||
this, &BasePlayerModel::onPartitionTimeChanged);
|
||||
m_timeoutCheckTimer->start(2000);
|
||||
m_positionAgeTimer->start(10000);
|
||||
|
||||
|
||||
connect(this, &BasePlayerModel::rowsInserted, this, &BasePlayerModel::updateUsedPartyIds);
|
||||
connect(this, &BasePlayerModel::rowsRemoved, this, &BasePlayerModel::updateUsedPartyIds);
|
||||
connect(this, &BasePlayerModel::modelReset, this, &BasePlayerModel::updateUsedPartyIds);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
QVariant BasePlayerModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role == LtsWidgets::LtsColumnFilterProxyModel::ComboboxFilterRole &&
|
||||
orientation == Qt::Horizontal)
|
||||
{
|
||||
if (section == ColParty)
|
||||
{
|
||||
LtsWidgets::ComboboxFilterContent cfc;
|
||||
cfc.data.reserve(m_usedPartyIds.size());
|
||||
LtsWidgets::ComboboxFilterData cfd;
|
||||
for (const int partyId : m_usedPartyIds)
|
||||
{
|
||||
const auto party = m_parties.value(partyId);
|
||||
cfd.data = partyId;
|
||||
cfd.text = party.name;
|
||||
cfd.icon = party.icon;
|
||||
cfc.data.push_back(cfd);
|
||||
}
|
||||
return cfc.toVariant();
|
||||
}
|
||||
if (section == ColTacticalStatus)
|
||||
{
|
||||
LtsWidgets::ComboboxFilterContent cfc;
|
||||
cfc.data.reserve(4);
|
||||
auto fill = [&cfc, this](ProjectDataManagement::VulnerabilityState state, const QIcon &icon)
|
||||
{
|
||||
LtsWidgets::ComboboxFilterData cfd;
|
||||
cfd.data = state.underlying();
|
||||
cfd.text = vulnerabilityStateString(ParticipantManagement::TypeClass::Human, state);
|
||||
cfd.icon = icon;
|
||||
cfc.data.push_back(std::move(cfd));
|
||||
};
|
||||
|
||||
fill(ProjectDataManagement::VulnerabilityState_def::CombatReady, m_tactStatusGreen);
|
||||
{
|
||||
LtsWidgets::ComboboxFilterData cfd;
|
||||
cfd.data = ProjectDataManagement::VulnerabilityState_def::LightDamage;
|
||||
cfd.text = tr("Wounded / Damaged");
|
||||
cfd.icon = m_tactStatusYellow;
|
||||
cfc.data.push_back(std::move(cfd));
|
||||
}
|
||||
fill(ProjectDataManagement::VulnerabilityState_def::CatastrophicKill, m_tactStatusRed);
|
||||
fill(ProjectDataManagement::VulnerabilityState_def::NotReady, m_tactStatusOrange);
|
||||
|
||||
return cfc.toVariant();
|
||||
}
|
||||
|
||||
if (section == ColPosition)
|
||||
{
|
||||
LtsWidgets::ComboboxFilterContent cfc;
|
||||
cfc.data.reserve(2);
|
||||
LtsWidgets::ComboboxFilterData cfd;
|
||||
cfd.data = QVariant(false);
|
||||
cfd.text = tr("Valid positions");
|
||||
cfc.data.push_back(cfd);
|
||||
|
||||
cfd.data = QVariant(true);
|
||||
cfd.text = tr("Outdated positions");
|
||||
cfc.data.push_back(cfd);
|
||||
|
||||
return cfc.toVariant();
|
||||
}
|
||||
|
||||
if (section == ColType)
|
||||
{
|
||||
LtsWidgets::ComboboxFilterContent cfc;
|
||||
cfc.data.reserve(m_usedTypeIds.size());
|
||||
LtsWidgets::ComboboxFilterData cfd;
|
||||
for (const int typeId : m_usedTypeIds)
|
||||
{
|
||||
cfd.data = typeId;
|
||||
cfd.text = ParticipantManagement::trTypeName(m_types.value(typeId).name());
|
||||
cfc.data.push_back(cfd);
|
||||
}
|
||||
cfc.sortItems = true;
|
||||
return cfc.toVariant();
|
||||
}
|
||||
}
|
||||
return LtsWidgets::LtsAbstractTableModel<PlayerData>::headerData(section, orientation, role);
|
||||
}
|
||||
|
||||
QVariant BasePlayerModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!indexIsValid(index))
|
||||
return QVariant();
|
||||
if (role != Qt::DisplayRole &&
|
||||
role != Qt::DecorationRole &&
|
||||
role != Qt::BackgroundRole &&
|
||||
role != Qt::ToolTipRole &&
|
||||
role != LtsWidgets::LtsColumnFilterProxyModel::ComboboxFilterRole)
|
||||
return QVariant();
|
||||
|
||||
const PlayerData &data = m_vecData.at(index.row());
|
||||
if (role == Qt::DecorationRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case ColParty:
|
||||
return m_parties.value(data.partyId).icon;
|
||||
case ColEquipmentNummer:
|
||||
return decorationData(index, data.participantId);
|
||||
case ColTacticalStatus:
|
||||
{
|
||||
switch (data.vulnerabilityState.underlying())
|
||||
{
|
||||
case ProjectDataManagement::VulnerabilityState::NotReady:
|
||||
return m_tactStatusOrange;
|
||||
case ProjectDataManagement::VulnerabilityState::CombatReady:
|
||||
return m_tactStatusGreen;
|
||||
case ProjectDataManagement::VulnerabilityState::CatastrophicKill:
|
||||
return m_tactStatusRed;
|
||||
default:
|
||||
return m_tactStatusYellow;
|
||||
}
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (role == Qt::ToolTipRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case ColTacticalStatus:
|
||||
return data.vulnerabilityStateStr;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (role == Qt::BackgroundRole)
|
||||
{
|
||||
if (data.typeId <= 0)
|
||||
return QVariant();
|
||||
switch (index.column())
|
||||
{
|
||||
case ColEquipmentNummer:
|
||||
if (data.isManipulated)
|
||||
return QColor(Qt::red);
|
||||
break;
|
||||
case ColPosition:
|
||||
if (data.isOutdated)
|
||||
return QColor(Qt::red);
|
||||
break;
|
||||
case ColBitResult:
|
||||
if (data.biteSampleTime > 0 &&
|
||||
data.biteSampleTime < (m_session->partitionTime() - (2 * 60 *1000)) ) //<- so 2 minutes
|
||||
return (QColor(Qt::gray));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
if (role == Qt::DisplayRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case ColEquipmentNummer:
|
||||
if (data.equipmentNumber)
|
||||
return data.equipmentNumber;
|
||||
return QVariant();
|
||||
case ColParticipantId:
|
||||
return data.participantId;
|
||||
case ColParty:
|
||||
return data.partyStr;
|
||||
case ColHierachy:
|
||||
return data.hierarchy;
|
||||
case ColDesignator:
|
||||
return data.designator;
|
||||
case ColTacticalIdentifier:
|
||||
return data.tacticalIdentifier;
|
||||
case ColSign:
|
||||
return data.identification;
|
||||
case ColType:
|
||||
return data.typeName;
|
||||
case ColTacticalStatus:
|
||||
return QVariant(); // only per tooltip and decoration role
|
||||
case ColPosition:
|
||||
return data.positionStr;
|
||||
case ColPositionAge:
|
||||
if (data.participantId < 0 || data.positionSampleTime < 0)
|
||||
return QStringLiteral("-");
|
||||
return QStringLiteral("%1s").arg(calculatePositionAge(data.positionSampleTime));
|
||||
case ColBitResult:
|
||||
return data.biteResultStr;
|
||||
case ColWarnings:
|
||||
return data.biteWarningsStr;
|
||||
}
|
||||
}
|
||||
|
||||
if (role == LtsWidgets::LtsColumnFilterProxyModel::ComboboxFilterRole)
|
||||
{
|
||||
switch (index.column())
|
||||
{
|
||||
case ColParty:
|
||||
return data.partyId;
|
||||
case ColTacticalStatus:
|
||||
{
|
||||
switch (data.vulnerabilityState.underlying())
|
||||
{
|
||||
case ProjectDataManagement::VulnerabilityState::NotReady:
|
||||
case ProjectDataManagement::VulnerabilityState::CombatReady:
|
||||
case ProjectDataManagement::VulnerabilityState::CatastrophicKill:
|
||||
return data.vulnerabilityState.underlying();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ProjectDataManagement::VulnerabilityState_def::LightDamage;
|
||||
}
|
||||
case ColPosition:
|
||||
return data.isOutdated;
|
||||
case ColType:
|
||||
return data.typeId;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QString BasePlayerModel::getBitResult(const ParticipantManagement::Bite &bite, int equipmnetNumber) const
|
||||
{
|
||||
if (bite.equipmentNumber() != equipmnetNumber)
|
||||
return QString();
|
||||
const QString bitErrors = m_biteModel->getBitErrors(bite);
|
||||
return (bitErrors.isEmpty() ? tr("Ok") : bitErrors);
|
||||
}
|
||||
|
||||
QString BasePlayerModel::getBiteWarnings(const ParticipantManagement::Bite &bite, int equipmnetNumber) const
|
||||
{
|
||||
if (bite.equipmentNumber() != equipmnetNumber)
|
||||
return QString();
|
||||
const QString s1(m_biteModel->getLowBattery(bite.batteryState()));
|
||||
const QString s2(m_biteModel->getComponents(bite));
|
||||
|
||||
QStringList ret;
|
||||
if (!s1.isEmpty())
|
||||
ret << s1;
|
||||
if (!s2.isEmpty())
|
||||
ret << s2;
|
||||
if (bite.configError())
|
||||
ret << tr("Config Error");
|
||||
return ret.isEmpty() ? QStringLiteral("-") : ret.join(QStringLiteral(", "));
|
||||
}
|
||||
|
||||
QString BasePlayerModel::getPositionString(const ParticipantManagement::ParticipantPosition &position,
|
||||
int participantId) const
|
||||
{
|
||||
if (position.participantId() != participantId)
|
||||
return QStringLiteral("-");
|
||||
QString mgrs = LtsCoordTrans::mgrsFromGeographic(position.pos().lon(),
|
||||
position.pos().lat());
|
||||
if (!qFuzzyIsNull(position.pos().z()))
|
||||
mgrs.append(QStringLiteral(" ") + QString::number(position.pos().z(), 'f', 2));
|
||||
return mgrs;
|
||||
}
|
||||
|
||||
void BasePlayerModel::updateBitResult(int participantId, const QString &result)
|
||||
{
|
||||
setBiteResult(findRowForId(participantId),
|
||||
QDateTime::currentMSecsSinceEpoch(),
|
||||
result,
|
||||
QString());
|
||||
}
|
||||
|
||||
QString BasePlayerModel::getBitResult(int participantId) const
|
||||
{
|
||||
const int row = findRowForId(participantId);
|
||||
if (row < 0)
|
||||
return QString();
|
||||
return m_vecData.at(row).biteResultStr;
|
||||
}
|
||||
|
||||
void BasePlayerModel::removeItems(const QModelIndexList &indexes)
|
||||
{
|
||||
if (indexes.count() == rowCount())
|
||||
{
|
||||
clear();
|
||||
return;
|
||||
}
|
||||
|
||||
QVector<int> idsToRemove;
|
||||
idsToRemove.reserve(indexes.size());
|
||||
// not in one loop since removeRow invalidates the indexes
|
||||
for (const QModelIndex &idx : indexes)
|
||||
{
|
||||
const int id = m_vecData.at(idx.row()).participantId;
|
||||
idsToRemove.append(id);
|
||||
}
|
||||
|
||||
for (int id : idsToRemove)
|
||||
removeRow(findRowForId(id));
|
||||
}
|
||||
|
||||
void BasePlayerModel::updateUsedPartyIds()
|
||||
{
|
||||
m_usedPartyIds.clear();
|
||||
m_usedTypeIds.clear();
|
||||
for (const PlayerData &p : qAsConst(m_vecData))
|
||||
{
|
||||
m_usedPartyIds[p.partyId] = p.partyId;
|
||||
m_usedTypeIds += p.typeId;
|
||||
}
|
||||
}
|
||||
|
||||
void BasePlayerModel::setBiteResult(int row, qint64 sampleTime, const QString &biteResult, const QString &warnings)
|
||||
{
|
||||
if (row < 0 || row >= m_vecData.size())
|
||||
return;
|
||||
|
||||
auto &playerData = m_vecData[row];
|
||||
playerData.biteSampleTime = sampleTime;
|
||||
playerData.biteResultStr = biteResult;
|
||||
playerData.biteWarningsStr = warnings;
|
||||
const auto idxBiteResult(index(row, ColBitResult));
|
||||
const auto idxBiteWarnings(index(row, ColWarnings));
|
||||
emit dataChanged(idxBiteResult, idxBiteResult, {Qt::DisplayRole, Qt::BackgroundRole});
|
||||
emit dataChanged(idxBiteWarnings, idxBiteWarnings, {Qt::DisplayRole});
|
||||
}
|
||||
|
||||
int BasePlayerModel::getParticipantId(const QModelIndex &idx) const
|
||||
{
|
||||
if (!indexIsValid(idx))
|
||||
return 0;
|
||||
return m_vecData.at(idx.row()).participantId;
|
||||
}
|
||||
|
||||
|
||||
int BasePlayerModel::findRowForEquipmentNumber(int equipNo) const
|
||||
{
|
||||
for (int i = 0; i < m_vecData.size(); ++i)
|
||||
{
|
||||
const auto &data = m_vecData.at(i);
|
||||
if (!data.equipmentNumber)
|
||||
continue;
|
||||
|
||||
if (data.equipmentNumber == equipNo)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "** findRowForEquipmentNumber: "
|
||||
<< equipNo << "--> " << i;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void BasePlayerModel::onDynamicParticipantChanged(const ParticipantManagement::DynamicParticipantData &data,
|
||||
DataModification modType)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** onDynamicParticipantChanged: " << data;
|
||||
|
||||
int row = findRowForId(data.participantId());
|
||||
if (row < 0)
|
||||
{
|
||||
row = findRowForId(-data.participantId());
|
||||
if (row < 0)
|
||||
return;
|
||||
if (modType == DataModification::eAdded)
|
||||
modType = DataModification::eModified;
|
||||
}
|
||||
|
||||
switch (modType)
|
||||
{
|
||||
case DataModification::eAdded:
|
||||
case DataModification::eModified:
|
||||
{
|
||||
PlayerData playerData = getRowData(row);
|
||||
const auto oldSymbol = playerData.symbolStr;
|
||||
playerData.isManipulated = data.manipulation().size();
|
||||
const auto tactStatus = getTacticalStatus(data);
|
||||
playerData.vulnerabilityState = tactStatus.vulnerabilityState();
|
||||
playerData.vulnerabilityStateStr = vulnerabilityStateString(playerData.typeClass,
|
||||
playerData.vulnerabilityState);
|
||||
|
||||
setRowData(row, playerData);
|
||||
if (oldSymbol != playerData.symbolStr)
|
||||
{
|
||||
tryRenderSymbol(playerData.symbolStr,
|
||||
playerData.participantId,
|
||||
playerData.partyColor,
|
||||
playerData.partyRole);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DataModification::eRemoved:
|
||||
removeRow(row);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BasePlayerModel::onParticipantChanged(const ParticipantManagement::Participant &participant,
|
||||
DataModification modType)
|
||||
{
|
||||
if (modType == DataModification::eRemoved)
|
||||
return;
|
||||
int row = -1;
|
||||
auto it = m_participants.find(participant.id());
|
||||
if (it == m_participants.end())
|
||||
{
|
||||
if (participant.equipmentNumber().is_set())
|
||||
row = findRowForId(-participant.equipmentNumber().get());
|
||||
if (row < 0)
|
||||
{
|
||||
// unknown player, add for maybe later usage
|
||||
m_participants.insert(participant.id(), participant);
|
||||
return;
|
||||
}
|
||||
it = m_participants.insert(participant.id(), ParticipantManagement::Participant());
|
||||
}
|
||||
|
||||
const auto old = it.value();
|
||||
it.value() = participant;
|
||||
|
||||
if (row < 0)
|
||||
row = findRowForId(participant.id());
|
||||
if (row < 0 && participant.equipmentNumber().is_set())
|
||||
row = findRowForId(-participant.equipmentNumber().get());
|
||||
if (row < 0)
|
||||
return;
|
||||
|
||||
if (old.equipmentNumber() != participant.equipmentNumber() ||
|
||||
old.partyId() != participant.partyId() ||
|
||||
old.superiorId() != participant.superiorId() ||
|
||||
old.designator() != participant.designator() ||
|
||||
old.tacticalIdentifier() != participant.tacticalIdentifier() ||
|
||||
old.info() != participant.info() ||
|
||||
old.symbol() != participant.symbol() ||
|
||||
old.identification() != participant.identification())
|
||||
{
|
||||
const auto party = m_parties.value(participant.partyId());
|
||||
const auto type = m_types.value(participant.typeId());
|
||||
PlayerData &data = m_vecData[row];
|
||||
|
||||
// color
|
||||
data.partyColor = party.color;
|
||||
// int
|
||||
data.equipmentNumber = participant.equipmentNumber().is_set() ? participant.equipmentNumber().get() : 0;
|
||||
data.participantId = participant.id();
|
||||
data.partyId = participant.partyId();
|
||||
data.typeId = participant.typeId();
|
||||
// str
|
||||
data.designator = QString::fromStdString(participant.designator());
|
||||
data.hierarchy = m_ppmDtc->hierarchyFromParticipant(data.participantId, m_participants);
|
||||
data.info = QString::fromStdString(participant.info());
|
||||
data.partyStr = party.name;
|
||||
data.symbolStr = QString::fromStdString(participant.symbol());
|
||||
data.tacticalIdentifier = QString::fromStdString(participant.tacticalIdentifier());
|
||||
data.typeName = type.id() > 0 ? ParticipantManagement::trTypeName(type.name()) : tr("Unknown (%1)").arg(participant.typeId());
|
||||
data.identification = QString::fromStdString(participant.identification());
|
||||
|
||||
tryRenderSymbol(data.symbolStr,
|
||||
data.participantId,
|
||||
data.partyColor,
|
||||
data.partyRole);
|
||||
|
||||
emit dataChanged(createIndex(row, 0), createIndex(row, ColWarnings));
|
||||
}
|
||||
}
|
||||
|
||||
PlayerData BasePlayerModel::setPlayerData(int participantId,
|
||||
const ParticipantManagement::DynamicParticipantData &dp)
|
||||
{
|
||||
return setPlayerData(m_participants.value(participantId), dp);
|
||||
}
|
||||
|
||||
PlayerData BasePlayerModel::setPlayerData(const ParticipantManagement::Participant &participant,
|
||||
const ParticipantManagement::DynamicParticipantData &dp)
|
||||
{
|
||||
const auto bite = participant.equipmentNumber().is_set()
|
||||
? m_bites.value(participant.equipmentNumber().get())
|
||||
: ParticipantManagement::Bite();
|
||||
const auto party = m_parties.value(participant.partyId());
|
||||
const auto pos = m_positions.value(participant.id());
|
||||
const auto type = m_types.value(participant.typeId());
|
||||
const auto tactStatus = getTacticalStatus(dp);
|
||||
|
||||
PlayerData data;
|
||||
// int64
|
||||
data.biteSampleTime = bite.sampleTime();
|
||||
data.positionSampleTime = pos.sampleTime();
|
||||
// color
|
||||
data.partyColor = party.color;
|
||||
// enum
|
||||
data.vulnerabilityState = tactStatus.vulnerabilityState();
|
||||
data.typeClass = type.typeClass();
|
||||
data.partyRole = party.role;
|
||||
// int
|
||||
data.equipmentNumber = participant.equipmentNumber().is_set() ? participant.equipmentNumber().get() : 0;
|
||||
data.participantId = participant.id();
|
||||
data.partyId = participant.partyId();
|
||||
data.typeId = participant.typeId();
|
||||
// bool
|
||||
data.isManipulated = dp.manipulation().size();
|
||||
data.isOutdated = LtsUtils::isPositionTimeOutdated(m_partitionTime, data.positionSampleTime);
|
||||
|
||||
// str
|
||||
data.biteResultStr = getBitResult(bite, data.equipmentNumber);
|
||||
data.biteWarningsStr = getBiteWarnings(bite, data.equipmentNumber);
|
||||
data.designator = QString::fromStdString(participant.designator());
|
||||
data.hierarchy = m_ppmDtc->hierarchyFromParticipant(data.participantId, m_participants);
|
||||
data.info = QString::fromStdString(participant.info());
|
||||
data.partyStr = party.name;
|
||||
data.positionStr = getPositionString(pos, data.participantId);
|
||||
data.symbolStr = QString::fromStdString(participant.symbol());
|
||||
data.tacticalIdentifier = QString::fromStdString(participant.tacticalIdentifier());
|
||||
data.typeName = type.id() > 0 ? ParticipantManagement::trTypeName(type.name()) : tr("Unknown (%1)").arg(participant.typeId());
|
||||
data.vulnerabilityStateStr = vulnerabilityStateString(type.typeClass(),
|
||||
tactStatus.vulnerabilityState());
|
||||
data.identification = QString::fromStdString(participant.identification());
|
||||
|
||||
tryRenderSymbol(data.symbolStr,
|
||||
data.participantId,
|
||||
data.partyColor,
|
||||
data.partyRole);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief BasePlayerModel::getPositionAge
|
||||
* get the position age of a player in given row
|
||||
* @param row of a specific player
|
||||
* @return position age of specific player
|
||||
* @see calculatePositionAge(const long long sampleTime)
|
||||
*/
|
||||
qint64 BasePlayerModel::getPositionAge(const int row) const
|
||||
{
|
||||
const PlayerData &data = m_vecData.at(row);
|
||||
return calculatePositionAge(data.positionSampleTime);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief BasePlayerModel::calculatePositionAge
|
||||
* calculates the position age
|
||||
* @param sampleTime of a specific player
|
||||
* @return position age
|
||||
* @see getPositionAge(const int row)
|
||||
*/
|
||||
qint64 BasePlayerModel::calculatePositionAge(qint64 sampleTime) const
|
||||
{
|
||||
return (m_partitionTime - sampleTime) / 1000;
|
||||
}
|
||||
|
||||
ParticipantManagement::StateInformation BasePlayerModel::getTacticalStatus(const ParticipantManagement::DynamicParticipantData &data) const
|
||||
{
|
||||
return m_ppmDtc->youngestStateInformation(data.stateHistory());
|
||||
}
|
||||
|
||||
void BasePlayerModel::onPositionChanged(const ParticipantManagement::ParticipantPosition &position,
|
||||
DataModification modType)
|
||||
{
|
||||
if (modType == DataModification::eRemoved)
|
||||
return;
|
||||
DEBUG_LOG(m_logger) << "**** onPositionChanged: " << position;
|
||||
|
||||
m_positions[position.participantId()] = position;
|
||||
|
||||
int row = findRowForId(position.participantId());
|
||||
if (row < 0)
|
||||
{
|
||||
row = findRowForId(-position.participantId());
|
||||
if (row < 0)
|
||||
return;
|
||||
}
|
||||
|
||||
if ((modType == DataModification::eAdded) ||
|
||||
(modType == DataModification::eModified))
|
||||
{
|
||||
auto &playerData = m_vecData[row];
|
||||
playerData.positionSampleTime = position.sampleTime();
|
||||
playerData.positionStr = getPositionString(position, position.participantId());
|
||||
playerData.isOutdated = false;
|
||||
const auto idxPosition(index(row, ColPosition));
|
||||
const auto idxPositionAge(index(row, ColPositionAge));
|
||||
emit dataChanged(idxPosition, idxPosition, {Qt::DisplayRole, Qt::BackgroundRole});
|
||||
emit dataChanged(idxPositionAge, idxPositionAge, {Qt::DisplayRole});
|
||||
}
|
||||
}
|
||||
|
||||
void BasePlayerModel::onBiteChanged(const ParticipantManagement::Bite &bite,
|
||||
DataModification modType)
|
||||
{
|
||||
if (modType == DataModification::eRemoved)
|
||||
return;
|
||||
DEBUG_LOG(m_logger) << "**** onBiteChanged: " << bite;
|
||||
|
||||
m_bites[bite.equipmentNumber()] = bite;
|
||||
|
||||
int row = findRowForEquipmentNumber(bite.equipmentNumber());
|
||||
if (row < 0)
|
||||
return;
|
||||
|
||||
if ((modType == DataModification::eAdded) ||
|
||||
(modType == DataModification::eModified))
|
||||
{
|
||||
setBiteResult(row,
|
||||
bite.sampleTime(),
|
||||
getBitResult(bite, bite.equipmentNumber()),
|
||||
getBiteWarnings(bite, bite.equipmentNumber()));
|
||||
}
|
||||
}
|
||||
|
||||
void BasePlayerModel::onPartyChanged(const ParticipantManagement::Party &party,
|
||||
DataModification modType)
|
||||
{
|
||||
if (modType == DataModification::eRemoved)
|
||||
return;
|
||||
SmoParty smoParty;
|
||||
smoParty.id = party.id();
|
||||
smoParty.name = ParticipantManagement::trPartyName(party.name());
|
||||
smoParty.color = QColor::fromRgb(QRgb(party.color()));
|
||||
smoParty.role = AdvancedSymbology::roleToRole(party.role());
|
||||
|
||||
if (m_ppmGuiCbxIfc)
|
||||
smoParty.icon = m_ppmGuiCbxIfc->pixmapFromParty(smoParty.color);
|
||||
m_parties[smoParty.id] = smoParty;
|
||||
}
|
||||
|
||||
void BasePlayerModel::onPartitionTimeChanged(qint64 newPartitionTime)
|
||||
{
|
||||
m_partitionTime = newPartitionTime;
|
||||
}
|
||||
|
||||
void BasePlayerModel::onTimeoutCheck()
|
||||
{
|
||||
for (int i = 0; i < m_vecData.size(); ++i)
|
||||
{
|
||||
const auto &data = m_vecData.at(i);
|
||||
if (data.isOutdated)
|
||||
continue;
|
||||
if (LtsUtils::isPositionTimeOutdated(m_partitionTime, data.positionSampleTime))
|
||||
{
|
||||
m_vecData[i].isOutdated = true;
|
||||
const QModelIndex idx(index(i, ColPosition, QModelIndex()));
|
||||
emit dataChanged(idx, idx, {Qt::BackgroundRole});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BasePlayerModel::onUpdatePositionAge()
|
||||
{
|
||||
for (int i = 0; i < m_vecData.size(); ++i)
|
||||
{
|
||||
const QModelIndex idx(index(i, ColPositionAge, QModelIndex()));
|
||||
emit dataChanged(idx, idx, {Qt::DisplayRole});
|
||||
}
|
||||
}
|
||||
|
||||
QString BasePlayerModel::vulnerabilityStateString(ParticipantManagement::TypeClass typeClass,
|
||||
ProjectDataManagement::VulnerabilityState vulState) const
|
||||
{
|
||||
const ProjectDataManagement::VulnerabilityClass vc = typeClass == ParticipantManagement::TypeClass::Human ?
|
||||
ProjectDataManagement::VulnerabilityClass_def::SoldierInjuries :
|
||||
ProjectDataManagement::VulnerabilityClass_def::VehicleDamages;
|
||||
|
||||
return ProjectDataManagement::toString(vulState, vc);
|
||||
}
|
||||
|
||||
void BasePlayerModel::onTypeChanged(const ParticipantManagement::Type &type,
|
||||
DataModification modType)
|
||||
{
|
||||
switch (modType)
|
||||
{
|
||||
case DataModification::eAdded:
|
||||
case DataModification::eModified:
|
||||
{
|
||||
m_types[type.id()] = type;
|
||||
bool bNeedUpdate = false;
|
||||
for (auto &data : m_vecData)
|
||||
{
|
||||
if (data.typeId != type.id())
|
||||
continue;
|
||||
data.typeClass = type.typeClass();
|
||||
data.typeName = ParticipantManagement::trTypeName(type.name());
|
||||
bNeedUpdate = true;
|
||||
}
|
||||
if (bNeedUpdate)
|
||||
emit dataChanged(index(0, ColType), index(rowCount() - 1, ColType), {Qt::DisplayRole});
|
||||
break;
|
||||
}
|
||||
case DataModification::eRemoved:
|
||||
m_types.remove(type.id());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool BasePlayerModel::isPartyId(int row, int partyId) const
|
||||
{
|
||||
if (row < 0 || row >= m_vecData.size())
|
||||
return false;
|
||||
const auto &data = m_vecData.at(row);
|
||||
return data.partyId == partyId;
|
||||
}
|
||||
|
||||
bool BasePlayerModel::isTypeClass(int row, const ParticipantManagement::TypeClass &tc) const
|
||||
{
|
||||
if (row < 0 || row >= m_vecData.size())
|
||||
return false;
|
||||
const auto &data = m_vecData.at(row);
|
||||
return data.typeClass == tc;
|
||||
}
|
||||
|
||||
//
|
||||
// BasePlayerProxyModel
|
||||
//
|
||||
void BasePlayerProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||
{
|
||||
m_sourceModel = qobject_cast<BasePlayerModel*>(sourceModel);
|
||||
LtsColumnFilterProxyModel::setSourceModel(sourceModel);
|
||||
}
|
||||
|
||||
bool BasePlayerProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||
{
|
||||
if (!m_sourceModel ||
|
||||
source_left.column() != source_right.column() ||
|
||||
source_left.row() < 0 || source_left.row() >= m_sourceModel->m_vecData.size() ||
|
||||
source_right.row() < 0 || source_right.row() >= m_sourceModel->m_vecData.size()
|
||||
)
|
||||
return LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
|
||||
const PlayerData &left = m_sourceModel->m_vecData.at(source_left.row());
|
||||
const PlayerData &right = m_sourceModel->m_vecData.at(source_right.row());
|
||||
switch (source_left.column())
|
||||
{
|
||||
case BasePlayerModel::ColParticipantId:
|
||||
return left.participantId < right.participantId;
|
||||
case BasePlayerModel::ColEquipmentNummer:
|
||||
if (!left.equipmentNumber && !right.equipmentNumber)
|
||||
return left.participantId < right.participantId;
|
||||
if (!left.equipmentNumber)
|
||||
return true;
|
||||
if (!right.equipmentNumber)
|
||||
return false;
|
||||
return left.equipmentNumber < right.equipmentNumber;
|
||||
case BasePlayerModel::ColParty:
|
||||
return left.partyId < right.partyId;
|
||||
case BasePlayerModel::ColDesignator:
|
||||
{
|
||||
const int iRet = left.designator.compare(right.designator);
|
||||
if (left.designator == right.designator)
|
||||
return left.participantId < right.participantId;
|
||||
return iRet < 0;
|
||||
}
|
||||
case BasePlayerModel::ColSign:
|
||||
{
|
||||
const int iRet = left.info.compare(right.info);
|
||||
if (iRet == 0)
|
||||
return left.participantId < right.participantId;
|
||||
return iRet < 0;
|
||||
}
|
||||
case BasePlayerModel::ColType:
|
||||
return left.typeId < right.typeId;
|
||||
case BasePlayerModel::ColTacticalStatus:
|
||||
return left.vulnerabilityState < right.vulnerabilityState;
|
||||
case BasePlayerModel::ColPositionAge:
|
||||
return m_sourceModel->getPositionAge(source_left.row()) < m_sourceModel->getPositionAge(source_right.row());
|
||||
case BasePlayerModel::ColHierachy:
|
||||
case BasePlayerModel::ColPosition:
|
||||
case BasePlayerModel::ColBitResult:
|
||||
case BasePlayerModel::ColWarnings:
|
||||
// QString compare
|
||||
return source_left.data() < source_right.data();
|
||||
};
|
||||
return LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
}
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,194 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Base Model for Equipment Check
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-07
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_abstract_table_model.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
|
||||
#include <LtsSession/lts_session_data_dds.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
#include <Plugins/ProjectDataManagement/pdm_data_plugin_interface.h>
|
||||
#include <Plugins/AdvancedSymbology/Helper/table_model_symbol_renderer.h>
|
||||
#include <QSet>
|
||||
|
||||
class QTimer;
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
struct PlayerData
|
||||
{
|
||||
QString biteResultStr;
|
||||
QString biteWarningsStr;
|
||||
QString designator;
|
||||
QString hierarchy;
|
||||
QString info;
|
||||
QString partyStr;
|
||||
QString positionStr;
|
||||
QString symbolStr;
|
||||
QString tacticalIdentifier;
|
||||
QString typeName;
|
||||
QString vulnerabilityStateStr;
|
||||
QString identification;
|
||||
qint64 biteSampleTime = 0;
|
||||
qint64 positionSampleTime = 0;
|
||||
QColor partyColor;
|
||||
ProjectDataManagement::VulnerabilityState vulnerabilityState;
|
||||
ParticipantManagement::TypeClass typeClass;
|
||||
AdvancedSymbology::Role partyRole;
|
||||
int equipmentNumber = 0;
|
||||
int participantId = 0;
|
||||
int partyId = 0;
|
||||
int typeId = 0;
|
||||
bool isManipulated = false;
|
||||
bool isOutdated = false;
|
||||
|
||||
int id() const { return participantId; }
|
||||
};
|
||||
|
||||
class BiteModel;
|
||||
|
||||
// --------------------------------------------------------
|
||||
// BasePlayerModel
|
||||
// --------------------------------------------------------
|
||||
class BasePlayerModel : public LtsWidgets::LtsAbstractTableModel<PlayerData>
|
||||
, public AdvancedSymbology::TableModelSymbolRenderer<BasePlayerModel>
|
||||
{
|
||||
Q_OBJECT
|
||||
friend class AdvancedSymbology::TableModelSymbolRenderer<BasePlayerModel>;
|
||||
|
||||
struct SmoParty
|
||||
{
|
||||
QString name;
|
||||
QColor color;
|
||||
QIcon icon;
|
||||
AdvancedSymbology::Role role = AdvancedSymbology::Role(0);
|
||||
int id = 0;
|
||||
};
|
||||
|
||||
public:
|
||||
enum Columns
|
||||
{
|
||||
ColParticipantId,
|
||||
ColEquipmentNummer,
|
||||
ColParty,
|
||||
ColHierachy,
|
||||
ColDesignator,
|
||||
ColTacticalIdentifier,
|
||||
ColSign,
|
||||
ColType,
|
||||
ColTacticalStatus,
|
||||
ColPosition,
|
||||
ColPositionAge,
|
||||
ColBitResult,
|
||||
ColWarnings
|
||||
};
|
||||
|
||||
|
||||
explicit BasePlayerModel(QObject *parent = nullptr);
|
||||
|
||||
virtual bool initModel(LtsSession::LtsSessionDataDds *session);
|
||||
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
void updateBitResult(int participantId, const QString &result);
|
||||
QString getBitResult(int participantId) const;
|
||||
|
||||
void removeItems(const QModelIndexList &indexes);
|
||||
virtual QStringList getAllParticipantIds() const { return QStringList(); }
|
||||
int getParticipantId(const QModelIndex &idx) const;
|
||||
|
||||
bool isPartyId(int row, int partyId) const;
|
||||
bool isTypeClass(int row, const ParticipantManagement::TypeClass &tc) const;
|
||||
qint64 getPositionAge(const int row) const;
|
||||
|
||||
public Q_SLOTS:
|
||||
// return added participantIds
|
||||
virtual QVector<int> updateDataView(const QVector<int> &equipNoList) = 0;
|
||||
virtual void loadData(const QVector<int> &idList) = 0;
|
||||
|
||||
protected slots:
|
||||
void onDynamicParticipantChanged(const ParticipantManagement::DynamicParticipantData &data,
|
||||
DataModification modType);
|
||||
void onParticipantChanged(const ParticipantManagement::Participant &data,
|
||||
DataModification modType);
|
||||
void onPositionChanged(const ParticipantManagement::ParticipantPosition &position,
|
||||
DataModification modType);
|
||||
void onBiteChanged(const ParticipantManagement::Bite &bite,
|
||||
DataModification modType);
|
||||
void onPartyChanged(const ParticipantManagement::Party &party,
|
||||
DataModification modType);
|
||||
void onTypeChanged(const ParticipantManagement::Type &type,
|
||||
DataModification modType);
|
||||
void onPartitionTimeChanged(qint64 newPartitionTime);
|
||||
void onTimeoutCheck();
|
||||
void onUpdatePositionAge();
|
||||
|
||||
protected:
|
||||
void updateUsedPartyIds();
|
||||
void setBiteResult(int row, qint64 sampleTime, const QString &biteResult, const QString &warnings);
|
||||
QString getBitResult(const ParticipantManagement::Bite &bite, int equipmnetNumber) const;
|
||||
QString getBiteWarnings(const ParticipantManagement::Bite &bite, int equipmnetNumber) const;
|
||||
QString getPositionString(const ParticipantManagement::ParticipantPosition &position,
|
||||
int participantId) const;
|
||||
PlayerData setPlayerData(const int participantId,
|
||||
const ParticipantManagement::DynamicParticipantData &dp);
|
||||
PlayerData setPlayerData(const ParticipantManagement::Participant &participant,
|
||||
const ParticipantManagement::DynamicParticipantData &dp);
|
||||
qint64 calculatePositionAge(qint64 sampleTime) const;
|
||||
ParticipantManagement::StateInformation getTacticalStatus(
|
||||
const ParticipantManagement::DynamicParticipantData &data) const;
|
||||
int findRowForEquipmentNumber(int equipNo) const;
|
||||
QString vulnerabilityStateString(ParticipantManagement::TypeClass typeClass,
|
||||
ProjectDataManagement::VulnerabilityState vulState) const;
|
||||
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> m_ppmGuiCbxIfc;
|
||||
BiteModel *m_biteModel;
|
||||
|
||||
QHash<int, ParticipantManagement::Type> m_types;
|
||||
QHash<int, SmoParty> m_parties;
|
||||
QHash<int, ParticipantManagement::Bite> m_bites;
|
||||
QMap<int, ParticipantManagement::Participant> m_participants;
|
||||
QHash<int, ParticipantManagement::ParticipantPosition> m_positions;
|
||||
QMap<int, int> m_usedPartyIds; // keep sorted
|
||||
QSet<int> m_usedTypeIds;
|
||||
|
||||
QIcon m_tactStatusGreen;
|
||||
QIcon m_tactStatusYellow;
|
||||
QIcon m_tactStatusOrange;
|
||||
QIcon m_tactStatusRed;
|
||||
|
||||
qint64 m_partitionTime;
|
||||
QTimer *m_timeoutCheckTimer;
|
||||
QTimer *m_positionAgeTimer;
|
||||
LtsSession::LtsSessionDataDds *m_session;
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
|
||||
friend class BasePlayerProxyModel;
|
||||
};
|
||||
|
||||
class BasePlayerProxyModel : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
|
||||
protected:
|
||||
BasePlayerModel *m_sourceModel = nullptr;
|
||||
};
|
||||
|
||||
} //namespace ServiceMonitor
|
||||
+314
@@ -0,0 +1,314 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Bite Message
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#include "smo_bite_model.h"
|
||||
#include <LtsSession/lts_session_data.h>
|
||||
#include <Common/logger.h>
|
||||
#include <ngltools/ngltools_dtg.h>
|
||||
|
||||
#include <ProjectDataManagement/pdm_dtc.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
BiteModel::BiteModel(QObject *parent)
|
||||
: LtsWidgets::LtsAbstractTableModel<ParticipantManagement::Bite>({tr("Time of Receipt"),
|
||||
tr("Equip. No."),
|
||||
tr("BIT Error"),
|
||||
tr("Low Battery"),
|
||||
tr("Component")},
|
||||
parent)
|
||||
, m_logger(getLogger("BiteModel"))
|
||||
{}
|
||||
|
||||
bool BiteModel::initModel(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "initModel";
|
||||
|
||||
m_ppmDtc = ppmDtc;
|
||||
if (!m_ppmDtc)
|
||||
return false;
|
||||
m_pdmDtc = pdmDtc;
|
||||
if (!m_pdmDtc)
|
||||
return false;
|
||||
|
||||
m_ccsMap = pdmDtc->canComponentStrings();
|
||||
m_bctMap = pdmDtc->biteComponentTexts();
|
||||
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::biteChanged,
|
||||
this, &BiteModel::biteDataChanged);
|
||||
m_ppmDtc->bites([this](const ParticipantManagement::Bite &bite) { insertRow(bite); } );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
QVariant BiteModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole || !indexIsValid(index))
|
||||
return QVariant();
|
||||
|
||||
const ParticipantManagement::Bite &biteMsg = m_vecData.at(index.row());
|
||||
switch (index.column())
|
||||
{
|
||||
case ReceiveTime:
|
||||
return QDateTime::fromMSecsSinceEpoch(biteMsg.sampleTime());
|
||||
case EquipmentNummer:
|
||||
return biteMsg.equipmentNumber();
|
||||
case BitError:
|
||||
return getBitErrors(biteMsg);
|
||||
case LowBattery:
|
||||
return getLowBattery(biteMsg.batteryState());
|
||||
case Component:
|
||||
return getComponents(biteMsg);
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
bool BiteModel::isFiltered(const ParticipantManagement::Bite &data, DataModification modType) const
|
||||
{
|
||||
Q_UNUSED(modType);
|
||||
|
||||
return data.biteState() == data.configState() &&
|
||||
!data.configError() &&
|
||||
data.batteryState() == 0 &&
|
||||
data.biteErrors().size() == 0;
|
||||
}
|
||||
|
||||
QString BiteModel::getBitErrors(const ParticipantManagement::Bite &bite) const
|
||||
{
|
||||
QStringList errorString;
|
||||
errorString.reserve(8);
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
quint32 bitValue = 1U << i;
|
||||
QString val = checkBit(bite, bitValue);
|
||||
if (!val.isEmpty())
|
||||
errorString += val;
|
||||
}
|
||||
|
||||
return errorString.join(QLatin1Char(','));
|
||||
}
|
||||
|
||||
QString BiteModel::checkBit(const ParticipantManagement::Bite &bite, quint32 bitValue) const
|
||||
{
|
||||
bool available = (bite.biteState() & bitValue) == bitValue;
|
||||
bool statusOk = (bite.configState() & bitValue) == bitValue;
|
||||
|
||||
QString name;
|
||||
for (const ProjectDataManagement::CanComponentString &ccs : m_ccsMap)
|
||||
{
|
||||
if (ccs.bitMask() == bitValue)
|
||||
{
|
||||
name = m_pdmDtc->trCanComponentStringName(ccs.id());
|
||||
break;
|
||||
}
|
||||
}
|
||||
DEBUG_LOG(m_logger) << "** name: " << name;
|
||||
|
||||
QString ret;
|
||||
if (available)
|
||||
{
|
||||
if (!statusOk)
|
||||
ret = name;
|
||||
}
|
||||
else if (statusOk)
|
||||
ret = name + tr("(COM)");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
QString BiteModel::getLowBattery(int batteryState) const
|
||||
{
|
||||
// Check the battery state to battery warnings (bit 0 to 7)
|
||||
QStringList errorString;
|
||||
errorString.reserve(2);
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
quint32 bitValue = 1U << i;
|
||||
const QString val = checkBatteryBit(batteryState, bitValue);
|
||||
if (!val.isEmpty())
|
||||
errorString += val;
|
||||
}
|
||||
|
||||
return errorString.join(QLatin1Char(';'));
|
||||
}
|
||||
|
||||
QString BiteModel::checkBatteryBit(int state, qint64 bitValue) const
|
||||
{
|
||||
QString name;
|
||||
|
||||
for (const ProjectDataManagement::CanComponentString &ccs : m_ccsMap)
|
||||
{
|
||||
// The devices to locate the battery warning are coded in the table as
|
||||
// bit 32 to 39
|
||||
qint64 compareValue = (bitValue << 32);
|
||||
if (ccs.bitMask() == compareValue)
|
||||
{
|
||||
name = m_pdmDtc->trCanComponentStringName(ccs.id());
|
||||
break;
|
||||
}
|
||||
}
|
||||
DEBUG_LOG(m_logger) << "** name: " << name;
|
||||
|
||||
if ((state & bitValue) == bitValue)
|
||||
return name;
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString BiteModel::getComponents(const ParticipantManagement::Bite &bite) const
|
||||
{
|
||||
QStringList errorString;
|
||||
for (const auto &bitError : bite.biteErrors())
|
||||
{
|
||||
if (bitError.errorNumber() == 0)
|
||||
continue;
|
||||
errorString += getErrorString(bitError);
|
||||
}
|
||||
return errorString.join(QLatin1Char(';'));
|
||||
}
|
||||
|
||||
QString BiteModel::getCanDeviceName(int id) const
|
||||
{
|
||||
for (const ProjectDataManagement::CanComponentString &ccs : m_ccsMap)
|
||||
{
|
||||
if (ccs.canDeviceId() == id)
|
||||
return m_pdmDtc->trCanComponentStringName(ccs.id());
|
||||
}
|
||||
return tr("Unknown Can device (%1)").arg(id);
|
||||
}
|
||||
|
||||
QString BiteModel::getSubDeviceName(int id) const
|
||||
{
|
||||
for (const ProjectDataManagement::CanComponentString &ccs : m_ccsMap)
|
||||
{
|
||||
if (ccs.subDeviceId() == id)
|
||||
return m_pdmDtc->trCanComponentStringName(ccs.id());
|
||||
}
|
||||
return tr("Unknown subdevice (%1)").arg(id);
|
||||
}
|
||||
|
||||
QString BiteModel::getErrorString(const ParticipantManagement::BiteError &error) const
|
||||
{
|
||||
QString errString;
|
||||
const bool subDevice = (error.subdeviceNumber() != 0);
|
||||
|
||||
for (const ProjectDataManagement::BiteComponentText &bct : m_bctMap)
|
||||
{
|
||||
if (((subDevice && bct.subDeviceId() == error.subdeviceNumber()) ||
|
||||
(bct.canDeviceId() == error.canDeviceNumber())) &&
|
||||
(bct.errorNumber() == error.errorNumber()))
|
||||
{
|
||||
errString = m_pdmDtc->trBiteComponentTextName(bct.id());
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (errString.isEmpty())
|
||||
errString = tr("Unknown error (%1)").arg(error.errorNumber());
|
||||
|
||||
QString subErrString;
|
||||
if (subDevice)
|
||||
subErrString = QLatin1Char('-') +
|
||||
getSubDeviceName(error.subdeviceNumber()) +
|
||||
QLatin1Char('-') +
|
||||
QString::number( error.uniqueId(), 16 ).toUpper();
|
||||
//QString::number(error.uniqueId());
|
||||
|
||||
return tr("Error: %1 - Device: %2 %3").arg(errString, getCanDeviceName(error.canDeviceNumber()), subErrString);
|
||||
}
|
||||
|
||||
int BiteModel::findRowForEquipmentNumber(int equipNo) const
|
||||
{
|
||||
for (int i = 0; i < m_vecData.size(); ++i)
|
||||
{
|
||||
if (m_vecData.at(i).equipmentNumber() == equipNo)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "findRowForEquipmentNumber: "
|
||||
<< equipNo << "-->" << i;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void BiteModel::biteDataChanged(const ParticipantManagement::Bite &data,
|
||||
DataModification modType)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "biteDataChanged";
|
||||
|
||||
const int equipNo = data.equipmentNumber();
|
||||
const int row = findRowForEquipmentNumber(equipNo);
|
||||
|
||||
switch (modType)
|
||||
{
|
||||
case DataModification::eAdded:
|
||||
case DataModification::eModified:
|
||||
{
|
||||
DEBUG_LOG(m_logger) << " Modified bite msg";
|
||||
|
||||
if (row < 0)
|
||||
{
|
||||
insertRow(data);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isFiltered(data, modType))
|
||||
{
|
||||
if (row >= m_vecData.size())
|
||||
return;
|
||||
removeRow(row);
|
||||
return;
|
||||
}
|
||||
|
||||
setRowData(row, data);
|
||||
break;
|
||||
}
|
||||
case DataModification::eRemoved:
|
||||
{
|
||||
DEBUG_LOG(m_logger) << " Remove bite msg";
|
||||
removeRow(row);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// BiteProxyModel
|
||||
//
|
||||
void BiteProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||
{
|
||||
m_sourceModel = qobject_cast<BiteModel*>(sourceModel);
|
||||
LtsWidgets::LtsColumnFilterProxyModel::setSourceModel(sourceModel);
|
||||
}
|
||||
|
||||
bool BiteProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||
{
|
||||
if (!m_sourceModel ||
|
||||
source_left.column() != source_right.column() ||
|
||||
!source_left.isValid() ||
|
||||
!source_right.isValid())
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
const auto &dataLeft = m_sourceModel->m_vecData.at(source_left.row());
|
||||
const auto dataRight = m_sourceModel->m_vecData.at(source_right.row());
|
||||
switch (source_left.column())
|
||||
{
|
||||
case BiteModel::ReceiveTime:
|
||||
return dataLeft.sampleTime() < dataRight.sampleTime();
|
||||
case BiteModel::EquipmentNummer:
|
||||
return dataLeft.equipmentNumber() < dataRight.equipmentNumber();
|
||||
case BiteModel::BitError:
|
||||
case BiteModel::LowBattery:
|
||||
case BiteModel::Component:
|
||||
break;
|
||||
}
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Bite Message
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_abstract_table_model.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
|
||||
#include <ParticipantManagement/ppm_dtc.h>
|
||||
|
||||
namespace ProjectDataManagement {
|
||||
namespace Interface {
|
||||
class Dtc;
|
||||
}
|
||||
}
|
||||
|
||||
#include <Common/logger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
// --------------------------------------------------------
|
||||
// BiteModel
|
||||
// --------------------------------------------------------
|
||||
class BiteModel final : public LtsWidgets::LtsAbstractTableModel<ParticipantManagement::Bite>
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
enum Columns
|
||||
{
|
||||
ReceiveTime,
|
||||
EquipmentNummer,
|
||||
BitError,
|
||||
LowBattery,
|
||||
Component,
|
||||
};
|
||||
|
||||
explicit BiteModel(QObject *parent = nullptr);
|
||||
|
||||
bool initModel(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc);
|
||||
QString getBitErrors(const ParticipantManagement::Bite &bite) const;
|
||||
QString getLowBattery(int batteryState) const;
|
||||
QString getComponents(const ParticipantManagement::Bite &bite) const;
|
||||
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
bool isFiltered(const ParticipantManagement::Bite &data, DataModification modType) const override final;
|
||||
|
||||
private slots:
|
||||
void biteDataChanged(const ParticipantManagement::Bite &data,
|
||||
DataModification modType);
|
||||
|
||||
private:
|
||||
|
||||
QString checkBit(const ParticipantManagement::Bite &bite,
|
||||
quint32 bitValue) const;
|
||||
|
||||
QString checkBatteryBit(int state, qint64 bitValue) const;
|
||||
|
||||
int findRowForEquipmentNumber(int equipNo) const;
|
||||
QString getCanDeviceName(int id) const;
|
||||
QString getSubDeviceName(int id) const;
|
||||
QString getErrorString(const ParticipantManagement::BiteError &error) const;
|
||||
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_pdmDtc;
|
||||
QMap<qint32, ProjectDataManagement::CanComponentString> m_ccsMap;
|
||||
QMap<qint32, ProjectDataManagement::BiteComponentText> m_bctMap;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
friend class BiteProxyModel;
|
||||
};
|
||||
|
||||
class BiteProxyModel final : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
private:
|
||||
BiteModel *m_sourceModel = nullptr;
|
||||
};
|
||||
} //namespace ServiceMonitor
|
||||
@@ -0,0 +1,322 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Check Button Handler (for Equipment Check)
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Norbert Thoden, NLE, 2019-02-06
|
||||
*/
|
||||
|
||||
#include "smo_check_button_handler.h"
|
||||
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
|
||||
#include <ProjectDataManagement/pdm_to_string.h>
|
||||
#include <LtsSession/lts_session_data.h>
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
|
||||
namespace LtsDataView
|
||||
{
|
||||
class LtsDataView;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
CheckButtonHandler::CheckButtonHandler(QPushButton *checkBtn)
|
||||
: QObject(checkBtn)
|
||||
, m_checkBtn(checkBtn)
|
||||
, m_requestHelper(new LtsUtils::RequestHelper(this))
|
||||
, m_resetManipulation(new QAction(tr("Manipulation"), this))
|
||||
, m_rearmWeapons(new QAction(tr("Gear Charge"), this))
|
||||
, m_resetSanMat(new QAction(tr("Reset Medical Supplies"), this))
|
||||
, m_resetAndRearm(new QAction(tr("Both"), this))
|
||||
, m_resetAndRearmAndSanMat(new QAction(tr("All"), this))
|
||||
, m_actionMenu(nullptr)
|
||||
, m_menuReset(nullptr)
|
||||
, m_menuTacticalState(nullptr)
|
||||
, m_menuVitality(nullptr)
|
||||
{
|
||||
if (m_checkBtn)
|
||||
{
|
||||
m_actionMenu = m_checkBtn->menu();
|
||||
if (!m_actionMenu)
|
||||
{
|
||||
m_actionMenu = new QMenu(m_checkBtn);
|
||||
m_checkBtn->setMenu(m_actionMenu);
|
||||
}
|
||||
}
|
||||
|
||||
m_pvSan = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantInformation"),
|
||||
QStringLiteral("HasPvSan"));
|
||||
}
|
||||
|
||||
void CheckButtonHandler::setPpm(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc)
|
||||
{
|
||||
m_ppmDtc = ppmDtc;
|
||||
m_ppmFtc = ppmFtc;
|
||||
}
|
||||
|
||||
void CheckButtonHandler::addReset()
|
||||
{
|
||||
if (!m_actionMenu || m_menuReset)
|
||||
return;
|
||||
m_menuReset = m_actionMenu->addMenu(tr("Reset"));
|
||||
m_menuReset->addAction(m_resetManipulation);
|
||||
m_menuReset->addAction(m_rearmWeapons);
|
||||
m_menuReset->addAction(m_resetAndRearm);
|
||||
if (m_pvSan)
|
||||
{
|
||||
m_menuReset->addAction(m_resetSanMat);
|
||||
m_menuReset->addAction(m_resetAndRearmAndSanMat);
|
||||
}
|
||||
connect(m_resetManipulation, &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, true, false, false, false);});
|
||||
connect(m_rearmWeapons, &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, false, true, false, false);});
|
||||
connect(m_resetSanMat, &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, false, false, false, true);});
|
||||
connect(m_resetAndRearm, &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, true, true, false, false);});
|
||||
connect(m_resetAndRearmAndSanMat, &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, true, true, false, true);});
|
||||
}
|
||||
|
||||
void CheckButtonHandler::addTacticalState()
|
||||
{
|
||||
if (!m_actionMenu || m_menuTacticalState || m_menuVitality)
|
||||
return;
|
||||
m_menuTacticalState = m_actionMenu->addMenu(tr("Tactical State"));
|
||||
m_vbgs.reserve(13);
|
||||
|
||||
// CombatReady without contamination
|
||||
ProjectDataManagement::VulnerabilityState vs = ProjectDataManagement::VulnerabilityState_def::CombatReady;
|
||||
QAction *a1 = new QAction(ProjectDataManagement::toString(vs) + tr(" (Bldg: without cont. reset)"), m_menuTacticalState);
|
||||
m_vbgs += a1;
|
||||
m_menuTacticalState->addAction(a1);
|
||||
connect(m_vbgs.last(), &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, false, false, true, false);});
|
||||
// signal signal connection for MapObjectSelectionWidget to reset building also:
|
||||
connect(m_vbgs.last(), &QAction::triggered, this, &CheckButtonHandler::combatReadyRequested);
|
||||
|
||||
// CombatReady with contamination reset
|
||||
vs = ProjectDataManagement::VulnerabilityState_def::CombatReady;
|
||||
QAction *a2 = new QAction(ProjectDataManagement::toString(vs) + tr(" (Bldg: with cont. reset)"), m_menuTacticalState);
|
||||
m_vbgs += a2;
|
||||
m_menuTacticalState->addAction(a2);
|
||||
connect(m_vbgs.last(), &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, false, false, true, false);});
|
||||
// signal signal connection for MapObjectSelectionWidget to reset building also:
|
||||
connect(m_vbgs.last(), &QAction::triggered, this, &CheckButtonHandler::combatReadyResetContamintationRequested);
|
||||
|
||||
// No VulnerabilityChange, only contamination reset
|
||||
vs = ProjectDataManagement::VulnerabilityState_def::NoChange;
|
||||
QAction *a3 = new QAction( tr("Contamination reset only"), m_menuTacticalState);
|
||||
m_vbgs += a3;
|
||||
m_menuTacticalState->addAction(a3);
|
||||
// signal signal connection for MapObjectSelectionWidget to reset building also:
|
||||
connect(m_vbgs.last(), &QAction::triggered, this, &CheckButtonHandler::resetContaminationRequested);
|
||||
|
||||
for (int i = 1; i <= 9; ++i) // 9 == VulnerabilityState_def::TemporarySeverance
|
||||
{
|
||||
ProjectDataManagement::VulnerabilityState vs(static_cast<ProjectDataManagement::VulnerabilityState_def::type>(i));
|
||||
QAction *ac = new QAction(ProjectDataManagement::toString(vs), m_menuTacticalState);
|
||||
m_vbgs += ac;
|
||||
m_menuTacticalState->addAction(ac);
|
||||
if (i == static_cast<int>(ProjectDataManagement::VulnerabilityState_def::CombatReady)) // CombatReady = 0
|
||||
{
|
||||
connect(m_vbgs.last(), &QAction::triggered,
|
||||
this, [this]() { sendInitRequest(m_selectedParticipants, false, false, true, false);});
|
||||
// signal signal connection for MapObjectSelectionWidget to reset building also:
|
||||
connect(m_vbgs.last(), &QAction::triggered, this, &CheckButtonHandler::combatReadyRequested);
|
||||
} else {
|
||||
connect(m_vbgs.last(), &QAction::triggered,
|
||||
this, [this, vs]() { sendModifyState(m_selectedParticipants, vs);});
|
||||
}
|
||||
}
|
||||
|
||||
if (m_pvSan)
|
||||
{
|
||||
m_menuVitality = m_menuTacticalState->addMenu(tr("Vitality"));
|
||||
for (int i = 9; i > 1; i--)
|
||||
{
|
||||
QAction *a = new QAction(QString::number(i * 10));
|
||||
a->setData(i * 10);
|
||||
connect(a, &QAction::triggered,
|
||||
this, [this, i]() { sendModifyVitality(m_selectedParticipants, i * 10);});
|
||||
m_menuVitality->addAction(a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CheckButtonHandler::onCallBiteReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
void CheckButtonHandler::onInitParticipantReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
void CheckButtonHandler::onModifyStateReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
|
||||
|
||||
void CheckButtonHandler::sendInitRequest(const std::vector<int> &selectedIds,
|
||||
bool resetManipulation,
|
||||
bool restockCharges,
|
||||
bool resetVulnerabilityState,
|
||||
bool restockSanMat)
|
||||
{
|
||||
// keep enableForBuildingReset in mind!
|
||||
if (selectedIds.size() == 0)
|
||||
return;
|
||||
|
||||
// qCritical() << " sendInitRequest " << selectedIds.size();
|
||||
if (!resetManipulation && !restockCharges && !resetVulnerabilityState && !restockSanMat)
|
||||
return;
|
||||
ParticipantManagement::InitParticipantRequest req;
|
||||
req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId());
|
||||
req.participantIds(selectedIds);
|
||||
req.resetManipulation(resetManipulation);
|
||||
req.restockCharges(restockCharges);
|
||||
req.resetVulnerabilityState(resetVulnerabilityState);
|
||||
req.restockSanitationMaterial(restockSanMat);
|
||||
m_requestHelper->startSingleRequest([req, this]() { return m_ppmFtc->initParticipantRequest(req, this); });
|
||||
}
|
||||
void CheckButtonHandler::sendModifyState(const std::vector<int> &selectedIds,
|
||||
ProjectDataManagement::VulnerabilityState vs)
|
||||
{
|
||||
// keep enableForBuildingReset in mind!
|
||||
if (selectedIds.size() == 0)
|
||||
return;
|
||||
|
||||
ParticipantManagement::ModifyStateRequest req;
|
||||
req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId());
|
||||
req.participantIds(selectedIds);
|
||||
req.vulnerabilityState(vs);
|
||||
m_requestHelper->startSingleRequest([req, this]() { return m_ppmFtc->modifyStateRequest(req, this); });
|
||||
}
|
||||
|
||||
void CheckButtonHandler::sendModifyVitality(const std::vector<int> &selectedIds, int vitality)
|
||||
{
|
||||
// keep enableForBuildingReset in mind!
|
||||
if (selectedIds.size() == 0)
|
||||
return;
|
||||
|
||||
ParticipantManagement::ModifyStateRequest req;
|
||||
req.workstationId(LtsSessionData::LtsSessionData::getInstance()->getWorkstationId());
|
||||
req.participantIds(selectedIds);
|
||||
req.vitality(vitality);
|
||||
m_requestHelper->startSingleRequest([req, this]() { return m_ppmFtc->modifyStateRequest(req, this); });
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::vector<int> CheckButtonHandler::setSelectedParticipantIds(const std::vector<int> &selectedParticipantsIds)
|
||||
{
|
||||
m_selectedParticipants.clear();
|
||||
|
||||
if (!m_ppmDtc)
|
||||
return {};
|
||||
|
||||
const QMap<qint32, ParticipantManagement::Participant> &participants = m_ppmDtc->participants();
|
||||
const QMap<qint32, ParticipantManagement::Type> &types = m_ppmDtc->types();
|
||||
|
||||
bool hasOC = false;
|
||||
bool hasSoldier = false;
|
||||
bool hasVehicles = false;
|
||||
|
||||
for (const auto &participantId : selectedParticipantsIds)
|
||||
{
|
||||
auto partIter = participants.constFind(participantId);
|
||||
if (partIter == participants.constEnd())
|
||||
continue;
|
||||
const ParticipantManagement::Participant &part = partIter.value();
|
||||
|
||||
// check equipmentNumber:
|
||||
if (!part.equipmentNumber().is_set() || part.equipmentNumber().get() < 0)
|
||||
continue;
|
||||
|
||||
// check type:
|
||||
int typeId = part.typeId();
|
||||
auto typeIter = types.constFind(typeId);
|
||||
if (typeIter == types.constEnd())
|
||||
continue;
|
||||
const ParticipantManagement::TypeClass &tc = typeIter.value().typeClass();
|
||||
|
||||
m_selectedParticipants.push_back(partIter.key());
|
||||
|
||||
if (!hasSoldier)
|
||||
hasSoldier = (tc == ParticipantManagement::TypeClass_def::Human);
|
||||
if (!hasVehicles)
|
||||
hasVehicles = (tc != ParticipantManagement::TypeClass_def::Human &&
|
||||
tc != ParticipantManagement::TypeClass_def::SupportEntity);
|
||||
if (!hasOC)
|
||||
hasOC = (tc == ParticipantManagement::TypeClass_def::SupportEntity);
|
||||
}
|
||||
|
||||
const bool enable = m_selectedParticipants.size() != 0;
|
||||
|
||||
setMenueResetVisible(enable && !hasOC);
|
||||
setMenueTactStateVisible(enable && !hasOC, hasSoldier, hasVehicles);
|
||||
|
||||
m_checkBtn->setToolTip(tr("%1 relevant objects").arg(m_selectedParticipants.size()));
|
||||
|
||||
return m_selectedParticipants;
|
||||
}
|
||||
|
||||
void CheckButtonHandler::enableForBuildingReset_OfMapObjectSelectionWidget()
|
||||
{
|
||||
// [NLDEVCTRL-1357] MASIE-60: Zurücksetzen Gebäude über VorauswahlDialog - auch wenn nur Bldgs selektiert sind.
|
||||
|
||||
// following setEnabled/setVisible should be overwritten next time (setSelectedParticipantIds)
|
||||
if (m_menuTacticalState)
|
||||
m_menuTacticalState->setEnabled(true);
|
||||
|
||||
if (!m_vbgs.isEmpty())
|
||||
{
|
||||
m_vbgs.at(0)->setVisible(true);
|
||||
m_vbgs.at(1)->setVisible(true);
|
||||
m_vbgs.at(2)->setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
void CheckButtonHandler::setMenueResetVisible(bool visi)
|
||||
{
|
||||
if (m_menuReset)
|
||||
m_menuReset->setEnabled(visi);
|
||||
m_resetManipulation->setVisible(visi);
|
||||
m_rearmWeapons->setVisible(visi);
|
||||
|
||||
m_resetSanMat->setVisible(visi && m_pvSan);
|
||||
m_resetAndRearmAndSanMat->setVisible(visi && m_pvSan);
|
||||
m_resetAndRearm->setVisible(visi);
|
||||
}
|
||||
void CheckButtonHandler::setMenueTactStateVisible(bool visi, bool hasSoldier, bool hasVehicles)
|
||||
{
|
||||
if (m_menuTacticalState)
|
||||
m_menuTacticalState->setEnabled(visi);
|
||||
m_resetManipulation->setVisible(visi);
|
||||
m_rearmWeapons->setVisible(visi);
|
||||
m_resetAndRearm->setVisible(visi);
|
||||
|
||||
for (auto *a : qAsConst(m_vbgs))
|
||||
a->setVisible(visi);
|
||||
|
||||
if (visi && hasSoldier)
|
||||
{
|
||||
m_vbgs.at(1)->setVisible(false);
|
||||
m_vbgs.at(2)->setVisible(false);
|
||||
m_vbgs.at(6)->setVisible(false);
|
||||
m_vbgs.at(7)->setVisible(false);
|
||||
}
|
||||
|
||||
if (m_menuTacticalState && m_pvSan)
|
||||
m_menuVitality->setEnabled(hasSoldier && !hasVehicles);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Check Button Handler (for Equipment Check)
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Norbert Thoden, NLE, 2019-02-06
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Plugins/ServiceMonitor/Gui/Monitors/smocheckbuttonhandler_export.h>
|
||||
|
||||
#include <ParticipantManagement/ppm_dtc.h>
|
||||
#include <ParticipantManagement/ppm_ftc.h>
|
||||
|
||||
#include <LtsUtilsGuiDds/request_helper.h>
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
|
||||
|
||||
namespace LtsDataView
|
||||
{
|
||||
class LtsDataView;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class SMOCHECKBUTTONHANDLER_EXPORT CheckButtonHandler : public QObject
|
||||
, protected ParticipantManagement::Interface::Ftc::CallBiteReplyHandler
|
||||
, protected ParticipantManagement::Interface::Ftc::InitParticipantReplyHandler
|
||||
, protected ParticipantManagement::Interface::Ftc::ModifyStateReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CheckButtonHandler(QPushButton *checkBtn);
|
||||
void setPpm(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc);
|
||||
|
||||
void addReset();
|
||||
|
||||
void addTacticalState();
|
||||
|
||||
void onCallBiteReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
void onInitParticipantReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
void onModifyStateReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
|
||||
void sendInitRequest(const std::vector<int> &selectedIds,
|
||||
bool resetManipulation,
|
||||
bool restockCharges,
|
||||
bool resetVulnerabilityState,
|
||||
bool restockSanMat);
|
||||
|
||||
void sendModifyState(const std::vector<int> &selectedIds,
|
||||
ProjectDataManagement::VulnerabilityState vs);
|
||||
void sendModifyVitality(const std::vector<int> &selectedIds,
|
||||
int vitality);
|
||||
std::vector<int> setSelectedParticipantIds(const std::vector<int> &selectedParticipantsIds);
|
||||
|
||||
void enableForBuildingReset_OfMapObjectSelectionWidget();
|
||||
|
||||
Q_SIGNALS:
|
||||
void combatReadyRequested();
|
||||
void combatReadyResetContamintationRequested();
|
||||
void resetContaminationRequested();
|
||||
|
||||
private:
|
||||
void setMenueResetVisible(bool visi);
|
||||
void setMenueTactStateVisible(bool visi, bool hasSoldier, bool hasVehicles);
|
||||
|
||||
|
||||
private:
|
||||
QPushButton *m_checkBtn;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Ftc> m_ppmFtc;
|
||||
LtsUtils::RequestHelper *m_requestHelper;
|
||||
|
||||
std::vector<int> m_selectedParticipants;
|
||||
bool m_pvSan;
|
||||
QAction *m_resetManipulation;
|
||||
QAction *m_rearmWeapons;
|
||||
QAction *m_resetSanMat;
|
||||
QAction *m_resetAndRearm;
|
||||
QAction *m_resetAndRearmAndSanMat;
|
||||
QVector<QAction *> m_vbgs;
|
||||
QMenu *m_actionMenu;
|
||||
QMenu *m_menuReset;
|
||||
QMenu *m_menuTacticalState;
|
||||
QMenu *m_menuVitality;
|
||||
};
|
||||
// class CheckButtonHandler
|
||||
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,305 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Fehlermeldung GFD Message
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-29
|
||||
*/
|
||||
|
||||
#include "smo_ctas_error_model.h"
|
||||
#include <LtsSession/lts_session_data.h>
|
||||
#include <ngltools/ngltools_dtg.h>
|
||||
#include <Common/logger.h>
|
||||
#include <ProjectDataManagement/pdm_translation.h>
|
||||
#include <TrainingAreaBase/training_area_telegrams.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
CtasErrorModel:: CtasErrorModel(QObject *parent)
|
||||
: LtsWidgets::LtsAbstractTableModel<ParticipantManagement::CtaError>(
|
||||
{
|
||||
tr("Time of Receipt"),
|
||||
tr("Equip. No."),
|
||||
tr("Time (PU)"),
|
||||
tr("Origin"),
|
||||
tr("Telegram Identification")
|
||||
},
|
||||
parent)
|
||||
, m_ppmDtc(nullptr)
|
||||
, m_logger(getLogger("CtasErrorModel"))
|
||||
{}
|
||||
|
||||
bool CtasErrorModel::initModel(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "initModel";
|
||||
|
||||
if (!ppmDtc)
|
||||
return false;
|
||||
m_ppmDtc = ppmDtc;
|
||||
m_ppmDtc->ctaErrors([this](const ParticipantManagement::CtaError &error) {insertRow(error);});
|
||||
|
||||
connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::ctaErrorChanged,
|
||||
this, &CtasErrorModel::ctasErrorChanged);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
QVariant CtasErrorModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole || !indexIsValid(index))
|
||||
return QVariant();
|
||||
|
||||
const ParticipantManagement::CtaError &error = m_vecData.at(index.row());
|
||||
|
||||
switch (index.column())
|
||||
{
|
||||
case ReceiveTime:
|
||||
return QDateTime::fromMSecsSinceEpoch(error.timeReceipt());
|
||||
case EquipmentNummer:
|
||||
return error.equipmentNumber();
|
||||
case TimePlayerUnit:
|
||||
return QDateTime::fromMSecsSinceEpoch(error.timePlayerUnit());
|
||||
case ErrorReason:
|
||||
return ProjectDataManagement::toString(error.errorReason());
|
||||
case TelegramId:
|
||||
return telegramId2Text(error.telegramId());
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
// Telegram list see zsksxdgt.x telegramm_id_et
|
||||
QString CtasErrorModel::telegramId2Text(int id) const
|
||||
{
|
||||
using namespace TrainingAreaBase::TetraIcd;
|
||||
enum TelegramId telId = static_cast<enum TelegramId>(id);
|
||||
switch (telId)
|
||||
{
|
||||
case UNKNOWN:
|
||||
return tr("UNKNOWN");
|
||||
case BESTAETIGUNG:
|
||||
return tr("BESTAETIGUNG");
|
||||
case INIT:
|
||||
return tr("INIT");
|
||||
case MANIPULATIONSMELDUNG:
|
||||
return tr("MANIPULATIONSMELDUNG");
|
||||
case UMGEBUNGS_MELDUNG2:
|
||||
return tr("UMGEBUNGS_MELDUNG2");
|
||||
case AUFFORDERUNG_BITE_MELDUNG:
|
||||
return tr("AUFFORDERUNG_BITE_MELDUNG");
|
||||
case BITE_MELDUNG2:
|
||||
return tr("BITE_MELDUNG2");
|
||||
case BETRIEBSZUSTAND_AUSSTATTUNG:
|
||||
return tr("BETRIEBSZUSTAND_AUSSTATTUNG");
|
||||
case KONFIGURATION_WIRKMODELL:
|
||||
return tr("KONFIGURATION_WIRKMODELL");
|
||||
case ANFORDERUNG_KONFIGURATIONSDATEN:
|
||||
return tr("ANFORDERUNG_KONFIGURATIONSDATEN");
|
||||
case KONFIGURATIONSMELDUNG:
|
||||
return tr("KONFIGURATIONSMELDUNG");
|
||||
case FEHLERMELDUNG_GFD:
|
||||
return tr("FEHLERMELDUNG_GFD");
|
||||
case WIEDERHERSTELLUNG_FUNKBEREITSCHAFT:
|
||||
return tr("WIEDERHERSTELLUNG_FUNKBEREITSCHAFT");
|
||||
case POSITIONS_MELDUNG:
|
||||
return tr("POSITIONS_MELDUNG");
|
||||
case POSITIONS_MELDUNG_MIT_TEILNEHMER:
|
||||
return tr("POSITIONS_MELDUNG_MIT_TEILNEHMER");
|
||||
case POSITIONS_MELDUNG_LFZ:
|
||||
return tr("POSITIONS_MELDUNG_LFZ");
|
||||
case IPS_POSITIONSDATEN:
|
||||
return tr("IPS_POSITIONSDATEN");
|
||||
case WIRKFELD_EINZELGESCHOSS:
|
||||
return tr("WIRKFELD_EINZELGESCHOSS");
|
||||
case WIRKFELD_FLAECHENDECKENDES_FEUER:
|
||||
return tr("WIRKFELD_FLAECHENDECKENDES_FEUER");
|
||||
case WIRKFELD_FLAECHENDECKENDES_FEUER_STOP:
|
||||
return tr("WIRKFELD_FLAECHENDECKENDES_FEUER_STOP");
|
||||
case WIRKFELD_FLAECHENDECKENDES_FEUER_FORTSETZEN:
|
||||
return tr("WIRKFELD_FLAECHENDECKENDES_FEUER_FORTSETZEN");
|
||||
case WIRKFELD_MINENSPERRE:
|
||||
return tr("WIRKFELD_MINENSPERRE");
|
||||
case WIRKFELD_STATUS_MINENSPERRE:
|
||||
return tr("WIRKFELD_STATUS_MINENSPERRE");
|
||||
case WIRKFELD_A_KAMPFMITTEL:
|
||||
return tr("WIRKFELD_A_KAMPFMITTEL");
|
||||
case WIRKFELD_C_KAMPFMITTEL:
|
||||
return tr("WIRKFELD_C_KAMPFMITTEL");
|
||||
case DEAKTIVIERUNG_WIRKFELD:
|
||||
return tr("DEAKTIVIERUNG_WIRKFELD");
|
||||
case WIRKFELD_AENDERUNG_BEZEICHNER:
|
||||
return tr("WIRKFELD_AENDERUNG_BEZEICHNER");
|
||||
case DEAKTIVIERUNG_EINZELMINE:
|
||||
return tr("DEAKTIVIERUNG_EINZELMINE");
|
||||
case REAKTIVIERUNG_DUS_MINE:
|
||||
return tr("REAKTIVIERUNG_DUS_MINE");
|
||||
case DEFINITION_IED:
|
||||
return tr("DEFINITION_IED");
|
||||
case ZUSTAND_IED:
|
||||
return tr("ZUSTAND_IED");
|
||||
case STATUS_EINZELMINENSIMULATOR:
|
||||
return tr("STATUS_EINZELMINENSIMULATOR");
|
||||
case WIRKFELD_EINZELMINENSIMULATOR:
|
||||
return tr("WIRKFELD_EINZELMINENSIMULATOR");
|
||||
case TREFFER_EREIGNIS_DUS:
|
||||
return tr("TREFFER_EREIGNIS_DUS");
|
||||
case TREFFER_EREIGNIS_WIRKSIMULATION:
|
||||
return tr("TREFFER_EREIGNIS_WIRKSIMULATION");
|
||||
case TREFFER_AUSLOESUNG:
|
||||
return tr("TREFFER_AUSLOESUNG");
|
||||
case SCHIEDSRICHTEREINGRIFF:
|
||||
return tr("SCHIEDSRICHTEREINGRIFF");
|
||||
case SELEKTIVE_AUFMUNITIONIERUNG:
|
||||
return tr("SELEKTIVE_AUFMUNITIONIERUNG");
|
||||
case TREFFER_EREIGNIS_SEKUNDAERWIRKUNG:
|
||||
return tr("TREFFER_EREIGNIS_SEKUNDAERWIRKUNG");
|
||||
case TREFFER_EREIGNIS_DUS_IPS:
|
||||
return tr("TREFFER_EREIGNIS_DUS_IPS");
|
||||
case TREFFER_EREIGNIS_WIRKSIMULATION_IPS:
|
||||
return tr("TREFFER_EREIGNIS_WIRKSIMULATION_IPS");
|
||||
case TAKTISCHER_STATUS:
|
||||
return tr("TAKTISCHER_STATUS");
|
||||
case FUNKTIONSRAUM:
|
||||
return tr("FUNKTIONSRAUM");
|
||||
case EINTRETEN_FUNKTIONSRAUM:
|
||||
return tr("EINTRETEN_FUNKTIONSRAUM");
|
||||
case DEAKTIVIEREN_FUNKTIONSRAUM:
|
||||
return tr("DEAKTIVIEREN_FUNKTIONSRAUM");
|
||||
case DATENVERKEHR_SRT_TDS:
|
||||
return tr("DATENVERKEHR_SRT_TDS");
|
||||
case DATENVERKEHR_TDS_SRT:
|
||||
return tr("DATENVERKEHR_TDS_SRT");
|
||||
case DATENVERKEHR_DMF_TDS:
|
||||
return tr("DATENVERKEHR_DMF_TDS");
|
||||
case DATENVERKEHR_TDS_DMF:
|
||||
return tr("DATENVERKEHR_TDS_DMF");
|
||||
case NACHFORDERUNG_BROADCAST_TELEGRAMME:
|
||||
return tr("NACHFORDERUNG_BROADCAST_TELEGRAMME");
|
||||
case SONDERSENSORIK_FAHRSPUR:
|
||||
return tr("SONDERSENSORIK_FAHRSPUR");
|
||||
case SONDERSENSORIK_MIVANH_VERLEGEDATEN:
|
||||
return tr("SONDERSENSORIK_MIVANH_VERLEGEDATEN");
|
||||
case SONDERSENSORIK_WMIV_VERLEGEDATEN:
|
||||
return tr("SONDERSENSORIK_WMIV_VERLEGEDATEN");
|
||||
case SONDERSENSORIK_MIVANH_VERLEGEPOSITION:
|
||||
return tr("SONDERSENSORIK_MIVANH_VERLEGEPOSITION");
|
||||
case SPRACHAUSWAHL:
|
||||
return tr("SPRACHAUSWAHL");
|
||||
case ALLGEMEINE_NACHRICHT:
|
||||
return tr("ALLGEMEINE_NACHRICHT");
|
||||
case GERAETEEREIGNIS:
|
||||
return tr("GERAETEEREIGNIS");
|
||||
case WAFFENZUORDNUNG:
|
||||
return tr("WAFFENZUORDNUNG");
|
||||
case MUNITIONSVORRAT_EINER_ZUGEORDNETEN_WAFFE:
|
||||
return tr("MUNITIONSVORRAT_EINER_ZUGEORDNETEN_WAFFE");
|
||||
case FEUEREREIGNIS_MIT_WAFFENZUORDNUNG:
|
||||
return tr("FEUEREREIGNIS_MIT_WAFFENZUORDNUNG");
|
||||
case AUSLOESUNG_DUS_TREFFER:
|
||||
return tr("AUSLOESUNG_DUS_TREFFER");
|
||||
case ANFORDERUNG_SW_VERSION:
|
||||
return tr("ANFORDERUNG_SW_VERSION");
|
||||
case SW_VERSIONSMELDUNG:
|
||||
return tr("SW_VERSIONSMELDUNG");
|
||||
case TECHNIK_FUNKTIONSRAUM:
|
||||
return tr("TECHNIK_FUNKTIONSRAUM");
|
||||
case TEILNEHMERMODE_SETZEN:
|
||||
return tr("TEILNEHMERMODE_SETZEN");
|
||||
case TEILNEHMERMODE_MELDUNG:
|
||||
return tr("TEILNEHMERMODE_MELDUNG");
|
||||
case TEILNEHMERMODE_ANFORDERN:
|
||||
return tr("TEILNEHMERMODE_ANFORDERN");
|
||||
case TEILNEHMER_KONFIG_ANTWORT:
|
||||
return tr("TEILNEHMER_KONFIG_ANTWORT");
|
||||
case TEILNEHMER_KONFIG_SETZEN:
|
||||
return tr("TEILNEHMER_KONFIG_SETZEN");
|
||||
case TEILNEHMER_KONFIG_ANFORDERN:
|
||||
return tr("TEILNEHMER_KONFIG_ANFORDERN");
|
||||
case NOTRUF:
|
||||
return tr("NOTRUF");
|
||||
|
||||
case BETRIEBSZUSTANDSMELDUNG:
|
||||
return tr("BETRIEBSZUSTANDSMELDUNG");
|
||||
|
||||
case ANFORDERUNG_STATISTIK_BROADCAST_NACHFORDERUNGEN:
|
||||
return tr("ANFORDERUNG_STATISTIK_BROADCAST_NACHFORDERUNGEN");
|
||||
case STATISTIK_BROADCAST_NACHFORDERUNGEN:
|
||||
return tr("STATISTIK_BROADCAST_NACHFORDERUNGEN");
|
||||
case EXERCISE_EQUIPMENT_ASSIGNMENT_COMPLETE:
|
||||
return tr("EXERCISE_EQUIPMENT_ASSIGNMENT_COMPLETE");
|
||||
|
||||
case SANITAETSDIENST_INSTANDSETZUNG:
|
||||
return tr("SANITATION");
|
||||
case SANITAETSDIENST_INSTANDSETZUNG_PVSAN:
|
||||
return tr("SANITATION_PVSAN");
|
||||
case BESTANDSMELDUNG_SANITAETSMATERIAL:
|
||||
return tr("SANITATION_MATERIAL_STOCK");
|
||||
|
||||
case PROXY_CONNECTION_STATE:
|
||||
return tr("PROXY_CONNECTION_STATE");
|
||||
case PARTICIPANT_LICENSE_CHANGE:
|
||||
return tr("PARTICIPANT_LICENSE_CHANGE");
|
||||
case WLS_PARTICIPANTS_STATE_REQUEST:
|
||||
return tr("WLS_PARTICIPANTS_STATE_REQUEST");
|
||||
case WLS_PARTICIPANTS_STATE_REPORT:
|
||||
return tr("WLS_PARTICIPANTS_STATE_REPORT");
|
||||
case WLS_BINARY_SFM_DATA:
|
||||
return tr("WLS_BINARY_SFM_DATA");
|
||||
case WLS_PARTICIPANT_CONNECTION_STATE:
|
||||
return tr("WLS_PARTICIPANT_CONNECTION_STATE");
|
||||
|
||||
case SR_DMF_NACHRICHT:
|
||||
return tr("SR_DMF_NACHRICHT");
|
||||
}
|
||||
|
||||
return tr("Unknown telegram id: %1").arg(id);
|
||||
}
|
||||
|
||||
void CtasErrorModel::ctasErrorChanged(const ParticipantManagement::CtaError &data,
|
||||
DataModification modType)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "ctasErrorChanged";
|
||||
|
||||
if (modType == DataModification::eAdded || modType == DataModification::eModified)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << " Added Fehlermeldung GFD";
|
||||
insertRow(data);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// CtasErrorProxyModel
|
||||
//
|
||||
void CtasErrorProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||
{
|
||||
m_sourceModel = qobject_cast<CtasErrorModel*>(sourceModel);
|
||||
LtsWidgets::LtsColumnFilterProxyModel::setSourceModel(sourceModel);
|
||||
}
|
||||
|
||||
bool CtasErrorProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||
{
|
||||
if (!m_sourceModel ||
|
||||
source_left.column() != source_right.column() ||
|
||||
!source_left.isValid() ||
|
||||
!source_right.isValid())
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
const auto &dataLeft = m_sourceModel->m_vecData.at(source_left.row());
|
||||
const auto dataRight = m_sourceModel->m_vecData.at(source_right.row());
|
||||
switch (source_left.column())
|
||||
{
|
||||
case CtasErrorModel::ReceiveTime:
|
||||
return dataLeft.timeReceipt() < dataRight.timeReceipt();
|
||||
case CtasErrorModel::EquipmentNummer:
|
||||
return dataLeft.equipmentNumber() < dataRight.equipmentNumber();
|
||||
case CtasErrorModel::TimePlayerUnit:
|
||||
return dataLeft.timePlayerUnit() < dataRight.timePlayerUnit();
|
||||
case CtasErrorModel::ErrorReason:
|
||||
case CtasErrorModel::TelegramId:
|
||||
break;
|
||||
}
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Fehlermeldung GFD Message
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-29
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_abstract_table_model.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
#include <ParticipantManagement/ppm_dtc.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
// --------------------------------------------------------
|
||||
// ServiceMonitorCtasErrorModel
|
||||
// --------------------------------------------------------
|
||||
class CtasErrorModel final : public LtsWidgets::LtsAbstractTableModel<ParticipantManagement::CtaError>
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
enum Columns
|
||||
{
|
||||
ReceiveTime,
|
||||
EquipmentNummer,
|
||||
TimePlayerUnit,
|
||||
ErrorReason,
|
||||
TelegramId,
|
||||
};
|
||||
|
||||
explicit CtasErrorModel(QObject *parent = nullptr);
|
||||
|
||||
bool initModel(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc);
|
||||
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
private slots:
|
||||
void ctasErrorChanged(const ParticipantManagement::CtaError &data,
|
||||
DataModification modType);
|
||||
|
||||
private:
|
||||
QString telegramId2Text(int id) const;
|
||||
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
friend class CtasErrorProxyModel;
|
||||
};
|
||||
|
||||
class CtasErrorProxyModel final : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
private:
|
||||
CtasErrorModel *m_sourceModel = nullptr;
|
||||
};
|
||||
} //namespace ServiceMonitor
|
||||
+419
@@ -0,0 +1,419 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* ServiceMonitor Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#include "smo_dialog.h"
|
||||
#include "ui_smo_dialog.h"
|
||||
#include <Common/logger.h>
|
||||
|
||||
#include "smo_egcu_model.h"
|
||||
#include "smo_egcu_edit.h"
|
||||
#include "smo_structure_element_edit.h"
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsPrinting/printing.h>
|
||||
#include <QTreeView>
|
||||
#include <QMenu>
|
||||
#include <QWidgetAction>
|
||||
#include <QLabel>
|
||||
|
||||
#include <Common/PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <Plugins/Buildings/bld_data_plugin_interface.h>
|
||||
#include <Plugins/SituationMapPlugin/situation_map_gui_plugin_interface.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
ServiceMonitorDialog::ServiceMonitorDialog(Monitor monitor,
|
||||
LtsSession::LtsSession *session,
|
||||
QWidget *parent)
|
||||
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly)
|
||||
, m_session(session)
|
||||
, m_ui(new Ui::ServiceMonitorDialog)
|
||||
, m_monitor(monitor)
|
||||
, m_proxyModel(nullptr)
|
||||
, m_ppmDtc(nullptr)
|
||||
, m_pdmDtc(nullptr)
|
||||
, m_logger(getLogger("ServiceMonitorDialog"))
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Print, this, &ServiceMonitorDialog::onPrint);
|
||||
|
||||
if (m_monitor == Monitor::Bite)
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-BITE_Monitor"));
|
||||
else if (m_monitor == Monitor::Manipulation)
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Manipulation_Monitor"));
|
||||
else if (m_monitor == Monitor::CtasError)
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-GFS_Telegram_Monitor"));
|
||||
else if (m_monitor == Monitor::Egcu)
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Effect_representation"));
|
||||
}
|
||||
|
||||
|
||||
ServiceMonitorDialog::~ServiceMonitorDialog()
|
||||
{
|
||||
onParticipantClicked(-1);
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::retranslate()
|
||||
{
|
||||
QString text;
|
||||
switch (m_monitor)
|
||||
{
|
||||
case Bite:
|
||||
{
|
||||
text = tr("BITE Monitor");
|
||||
break;
|
||||
}
|
||||
case Manipulation:
|
||||
{
|
||||
text = tr("Manipulation Monitor");
|
||||
break;
|
||||
}
|
||||
case CtasError:
|
||||
{
|
||||
text = tr("CTAS Error Monitor");
|
||||
break;
|
||||
}
|
||||
case Egcu:
|
||||
{
|
||||
text = tr("Egcu Monitor");
|
||||
break;
|
||||
}
|
||||
case Unset:
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
translate(m_ui, text);
|
||||
}
|
||||
|
||||
bool ServiceMonitorDialog::init()
|
||||
{
|
||||
if (!m_session->getDtc<ParticipantManagement::DataInterface>(m_ppmDtc))
|
||||
return false;
|
||||
if (!m_session->getDtc<ProjectDataManagement::DataInterface>(m_pdmDtc))
|
||||
return false;
|
||||
if (!m_session->getDtc<InfrastructureManagement::DataInterface>(m_ismDtc))
|
||||
return false;
|
||||
|
||||
delete m_proxyModel;
|
||||
m_proxyModel = nullptr;
|
||||
|
||||
switch (m_monitor)
|
||||
{
|
||||
case Bite:
|
||||
{
|
||||
BiteModel *biteModel = new BiteModel(this);
|
||||
biteModel->initModel(m_ppmDtc, m_pdmDtc);
|
||||
m_proxyModel = new BiteProxyModel(this);
|
||||
m_proxyModel->setSourceModel(biteModel);
|
||||
break;
|
||||
}
|
||||
case Manipulation:
|
||||
{
|
||||
ManipulationModel *maniModel = new ManipulationModel(this);
|
||||
maniModel->initModel(m_ppmDtc, m_pdmDtc);
|
||||
m_proxyModel = new ManipulationProxyModel(this);
|
||||
m_proxyModel->setSourceModel(maniModel);
|
||||
break;
|
||||
}
|
||||
case CtasError:
|
||||
{
|
||||
CtasErrorModel *ctasErrorModel = new CtasErrorModel(this);
|
||||
ctasErrorModel->initModel(m_ppmDtc);
|
||||
m_proxyModel = new CtasErrorProxyModel(this);
|
||||
m_proxyModel->setSourceModel(ctasErrorModel);
|
||||
break;
|
||||
}
|
||||
case Egcu:
|
||||
{
|
||||
EgcuModel *egcuModel = new EgcuModel(this);
|
||||
egcuModel->initModel(m_session);
|
||||
m_proxyModel = new EgcuProxyModel(this);
|
||||
m_proxyModel->setSourceModel(egcuModel);
|
||||
m_ui->ltsDataView->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
connect(egcuModel, &EgcuModel::invalidateFilter, this, [this](const QModelIndex &mi)
|
||||
{
|
||||
Q_UNUSED(mi)
|
||||
m_proxyModel->invalidate();
|
||||
// This somehow does not work:
|
||||
// m_ui->ltsDataView->treeView()->expand(mi);
|
||||
m_ui->ltsDataView->treeView()->expandAll();
|
||||
});
|
||||
EgcuDelegate *treeDelegate = new EgcuDelegate(m_proxyModel);
|
||||
m_ui->ltsDataView->treeView()->setItemDelegateForColumn(EgcuModel::Columns::Status, treeDelegate);
|
||||
|
||||
break;
|
||||
}
|
||||
case Unset:
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!m_proxyModel)
|
||||
return false;
|
||||
m_ui->ltsDataView->setModel(m_proxyModel);
|
||||
|
||||
if (m_monitor == Egcu)
|
||||
{
|
||||
m_ui->ltsDataView->treeView()->expandAll();
|
||||
m_ui->ltsDataView->hideColumn(EgcuModel::Barcode);
|
||||
#ifndef LTS_DEBUG
|
||||
m_ui->ltsDataView->hideColumn(EgcuModel::Id);
|
||||
m_ui->ltsDataView->hideColumn(EgcuModel::Properties);
|
||||
m_ui->ltsDataView->hideColumn(EgcuModel::Hostname);
|
||||
#endif
|
||||
m_ui->ltsDataView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(m_ui->ltsDataView, &LtsDataView::LtsDataView::customContextMenuRequested, this, &ServiceMonitorDialog::onShowContextMenu);
|
||||
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Edit, this, &ServiceMonitorDialog::onEditItem);
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::No, this, &ServiceMonitorDialog::onAllOff);
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::No)->setText(tr("All Off"));
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Yes, this, &ServiceMonitorDialog::onAllAuto);
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Yes)->setText(tr("All Auto"));
|
||||
onTableViewSelectionChanged({});
|
||||
}
|
||||
|
||||
// connect signals of TableView:
|
||||
connect(m_ui->ltsDataView, &LtsDataView::LtsDataView::doubleClicked, this, &ServiceMonitorDialog::onTableViewClicked);
|
||||
connect(m_ui->ltsDataView, &LtsDataView::LtsDataView::selectionChanged, this, &ServiceMonitorDialog::onTableViewSelectionChanged);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Not yet implemented:
|
||||
void ServiceMonitorDialog::setSelectedStructureElements(const QVector<int> &structureElementIds, bool replace)
|
||||
{
|
||||
if (m_monitor != Monitor::Egcu)
|
||||
return;
|
||||
|
||||
EgcuModel *em = qobject_cast<EgcuModel*>(m_ui->ltsDataView->sourceModel());
|
||||
if (!em)
|
||||
return;
|
||||
|
||||
QMap<int,QModelIndex> map = em->setSelectedStructureElements(structureElementIds);
|
||||
if (map.isEmpty())
|
||||
return;
|
||||
|
||||
m_ui->ltsDataView->setUpdatesEnabled(false);
|
||||
if (replace)
|
||||
m_ui->ltsDataView->clearSelection();
|
||||
for (const auto index : map)
|
||||
{
|
||||
auto mappedIdx = m_proxyModel->mapFromSource(index);
|
||||
m_ui->ltsDataView->selectRow(mappedIdx);
|
||||
}
|
||||
m_ui->ltsDataView->scrollTo(m_proxyModel->mapFromSource(map.first()));
|
||||
m_ui->ltsDataView->setUpdatesEnabled(true);
|
||||
}
|
||||
|
||||
|
||||
void ServiceMonitorDialog::onShowContextMenu(const QPoint &position)
|
||||
{
|
||||
LtsDataView::LtsDataView *tv = qobject_cast<LtsDataView::LtsDataView *>(sender());
|
||||
if (!tv)
|
||||
return;
|
||||
const QModelIndexList indexes = tv->selectedRows();
|
||||
if (indexes.isEmpty())
|
||||
return;
|
||||
|
||||
EgcuModel *em = qobject_cast<EgcuModel*>(m_ui->ltsDataView->sourceModel());
|
||||
if (!em)
|
||||
return;
|
||||
|
||||
|
||||
QMenu menu;
|
||||
em->getContextMenu(indexes, menu);
|
||||
menu.exec(tv->mapToGlobal(position));
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onTableViewClicked(const QModelIndex &index)
|
||||
{
|
||||
if (m_monitor == Egcu)
|
||||
{
|
||||
EgcuModel *em = qobject_cast<EgcuModel*>(m_ui->ltsDataView->sourceModel());
|
||||
if (!em)
|
||||
return;
|
||||
|
||||
NGLTreeItem *item = em->privateData(index);
|
||||
if (!item)
|
||||
return;
|
||||
|
||||
if (item->data().canConvert<EgcuData>())
|
||||
{
|
||||
EgcuData ed = item->data().value<EgcuData>();
|
||||
EgcuEdit *dlg = new EgcuEdit(menuGroup(), this);
|
||||
if (dlg->init(ed, m_session))
|
||||
addDialog(dlg, menuGroup(), dlg->dialogIdentifier(), LtsWidgets::LayoutArea::eDialogTab);
|
||||
else
|
||||
delete dlg;
|
||||
}
|
||||
else if (item->data().canConvert<InfrastructureManagement::StructureElement>())
|
||||
{
|
||||
InfrastructureManagement::StructureElement se = item->data().value<InfrastructureManagement::StructureElement>();
|
||||
StructureElementEdit *dlg = new StructureElementEdit(menuGroup(), this);
|
||||
if (dlg->init(se, m_session))
|
||||
addDialog(dlg, menuGroup(), dlg->dialogIdentifier(), LtsWidgets::LayoutArea::eDialogTab);
|
||||
else
|
||||
delete dlg;
|
||||
}
|
||||
}
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " START, index=" << index.row() << " - " << index.column();
|
||||
if (!m_ui->ltsDataView->sourceModel())
|
||||
return;
|
||||
onParticipantClicked(participantId(index));
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " END, index=" << index.row() << " - " << index.column();
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onEditItem()
|
||||
{
|
||||
if (m_ui->ltsDataView->selectedRows().count() != 1)
|
||||
return;
|
||||
|
||||
auto index = m_ui->ltsDataView->selectedRows().first();
|
||||
|
||||
onTableViewClicked(index);
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::setAllOverrides(InfrastructureManagement::EffectOverride eo)
|
||||
{
|
||||
const QModelIndexList indexes = m_ui->ltsDataView->selectedRows();
|
||||
if (indexes.isEmpty())
|
||||
return;
|
||||
|
||||
EgcuModel *em = qobject_cast<EgcuModel*>(m_ui->ltsDataView->sourceModel());
|
||||
if (!em)
|
||||
return;
|
||||
em->setAllOverrides(eo, indexes);
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onAllOff()
|
||||
{
|
||||
setAllOverrides(InfrastructureManagement::EffectOverride_def::PermanentOff);
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onAllAuto()
|
||||
{
|
||||
setAllOverrides(InfrastructureManagement::EffectOverride_def::Automatic);
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onTableViewSelectionChanged(const QItemSelection &selected)
|
||||
{
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
|
||||
if (m_monitor == Monitor::Egcu)
|
||||
{
|
||||
// Only ONE selected row enables the EDIT Button. This row MUST be a Building or a MountingPoint (==EGCU)
|
||||
bool ena = (m_ui->ltsDataView->selectedRows().count() == 1);
|
||||
if (ena)
|
||||
{
|
||||
// Model Pointer will be valid. Where else does the SelectionChange come from?
|
||||
EgcuModel *em = qobject_cast<EgcuModel*>(m_ui->ltsDataView->sourceModel());
|
||||
auto type = em->getStructureElementType(m_ui->ltsDataView->selectedRows().first());
|
||||
if (type != InfrastructureManagement::StructureElementType_def::Building &&
|
||||
type != InfrastructureManagement::StructureElementType_def::MountingPoint)
|
||||
ena = false;
|
||||
}
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Edit)->setEnabled(ena);
|
||||
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::Yes)->setEnabled(m_ui->ltsDataView->selectedRows().count());
|
||||
m_buttonBox->getButton(LtsWidgets::DialogButton::No)->setEnabled(m_ui->ltsDataView->selectedRows().count());
|
||||
}
|
||||
QModelIndexList mil = selected.indexes();
|
||||
if (mil.isEmpty())
|
||||
onParticipantClicked(-1); // -1 -> removeObjectIndicator
|
||||
else
|
||||
{
|
||||
onParticipantClicked(participantId(mil.first()));
|
||||
}
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onParticipantClicked(int participantId)
|
||||
{
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " START, participantId=" << participantId;
|
||||
if (!m_session)
|
||||
return;
|
||||
|
||||
std::shared_ptr<SituationMap::ForeignGuiInterface> sitMapGuiIfc;
|
||||
m_session->getForeignGuiInterface<SituationMap::ForeignGuiInterface>(sitMapGuiIfc);
|
||||
if (!sitMapGuiIfc)
|
||||
return;
|
||||
|
||||
if (participantId < 0)
|
||||
sitMapGuiIfc->removeObjectIndicator();
|
||||
else
|
||||
if (!sitMapGuiIfc->objectIndicatorToParticipant(participantId))
|
||||
ERROR_LOG(m_logger) << LOGFUNCTION << " objectIndicatorToParticipant failed for participantId = " << participantId;
|
||||
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " END, participantId=" << participantId;
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::leaveEvent(QEvent *e)
|
||||
{
|
||||
BaseClass::leaveEvent(e);
|
||||
|
||||
std::shared_ptr<SituationMap::ForeignGuiInterface> sitMapGuiIfc;
|
||||
m_session->getForeignGuiInterface<SituationMap::ForeignGuiInterface>(sitMapGuiIfc);
|
||||
if (!sitMapGuiIfc)
|
||||
return;
|
||||
sitMapGuiIfc->removeObjectIndicator();
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::onPrint()
|
||||
{
|
||||
LtsPrinting::printView(m_session, this, m_ui->ltsDataView->treeView() );
|
||||
}
|
||||
|
||||
int ServiceMonitorDialog::participantId(const QModelIndex &index) const
|
||||
{
|
||||
TRACE_LOG(m_logger) << LOGFUNCTION << " START, index=" << index.row() << " - " << index.column();
|
||||
if (!m_ui->ltsDataView->sourceModel())
|
||||
return -1;
|
||||
|
||||
switch (m_monitor)
|
||||
{
|
||||
case Bite:
|
||||
{
|
||||
BiteModel *bm = qobject_cast<BiteModel*>(m_ui->ltsDataView->sourceModel());
|
||||
if (bm)
|
||||
{
|
||||
const ParticipantManagement::Bite &bite = bm->getRowData(index.row());
|
||||
return bite.participantId();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Manipulation:
|
||||
{
|
||||
ManipulationModel *mm = qobject_cast<ManipulationModel*>(m_ui->ltsDataView->sourceModel());
|
||||
if (mm)
|
||||
{
|
||||
const ManipulationData &md = mm->getRowData(index.row());
|
||||
return md.participantId;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Egcu:
|
||||
case CtasError:
|
||||
case Unset:
|
||||
// currently not supported
|
||||
break;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ServiceMonitorDialog::tableColumnOrganiserSetting()
|
||||
{
|
||||
//LtsColumnOrganiser
|
||||
m_ui->ltsDataView->setColumnsOrganiserEnabled(identifier(), true);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* ServiceMonitor Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_bite_model.h"
|
||||
#include "smo_manipulation_model.h"
|
||||
#include "smo_ctas_error_model.h"
|
||||
|
||||
#include <InfrastructureManagement/ism_data_plugin_interface.h>
|
||||
#include <ProjectDataManagement/pdm_data_plugin_interface.h>
|
||||
#include <ParticipantManagement/ppm_data_plugin_interface.h>
|
||||
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
#include <Buildings/bld.hpp>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class ServiceMonitorDialog;
|
||||
}
|
||||
|
||||
namespace LtsSession
|
||||
{
|
||||
class LtsSession;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class EgcuModel;
|
||||
|
||||
class ServiceMonitorDialog : public LtsWidgets::LtsDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
using BaseClass = LtsWidgets::LtsDialog;
|
||||
|
||||
public:
|
||||
enum Monitor
|
||||
{
|
||||
Bite,
|
||||
Manipulation,
|
||||
CtasError, // Fehlermeldung GFD
|
||||
Egcu,
|
||||
Unset,
|
||||
};
|
||||
|
||||
explicit ServiceMonitorDialog(Monitor monitor,
|
||||
LtsSession::LtsSession *session,
|
||||
QWidget *parent = nullptr);
|
||||
~ServiceMonitorDialog();
|
||||
|
||||
bool init();
|
||||
|
||||
// Not yet implemented:
|
||||
void setSelectedStructureElements(const QVector<int> &structureElementIds, bool replace);
|
||||
|
||||
protected Q_SLOTS:
|
||||
// TableView
|
||||
void onTableViewClicked(const QModelIndex &index);
|
||||
void onEditItem();
|
||||
void onTableViewSelectionChanged(const QItemSelection &selected);
|
||||
|
||||
void onParticipantClicked(int participantId);
|
||||
|
||||
void leaveEvent(QEvent *e) override;
|
||||
|
||||
private slots:
|
||||
void onAllOff();
|
||||
void onAllAuto();
|
||||
void onShowContextMenu(const QPoint &position);
|
||||
|
||||
private:
|
||||
void setAllOverrides(InfrastructureManagement::EffectOverride eo);
|
||||
void retranslate() override;
|
||||
void onPrint();
|
||||
int participantId(const QModelIndex &index) const;
|
||||
void tableColumnOrganiserSetting() override;
|
||||
|
||||
LtsSession::LtsSession *m_session = nullptr;
|
||||
Ui::ServiceMonitorDialog *m_ui = nullptr;
|
||||
Monitor m_monitor = Monitor::Unset;
|
||||
QSortFilterProxyModel *m_proxyModel;
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_pdmDtc;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Dtc> m_ismDtc;
|
||||
NGL::INGLLogger &m_logger;
|
||||
};
|
||||
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ServiceMonitorDialog</class>
|
||||
<widget class="QWidget" name="ServiceMonitorDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>570</width>
|
||||
<height>664</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">Bite Monitor</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="LtsDataView::LtsDataView" name="ltsDataView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LtsDataView::LtsDataView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>LtsDataView/lts_data_view.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+351
@@ -0,0 +1,351 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Edit the defaults for an EGCU
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Malte Diers, SLTE, 2021-05-10
|
||||
*/
|
||||
|
||||
#include "smo_egcu_edit.h"
|
||||
#include "ui_smo_egcu_edit.h"
|
||||
|
||||
#include <Common/logger.h>
|
||||
#include <ServiceMonitor/smo_operator_rights.h>
|
||||
|
||||
// Lts
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsSession/lts_session_data.h>
|
||||
#include <LtsUtilsGuiDds/request_helper.h>
|
||||
|
||||
// DDS
|
||||
#include <AssetManagement/asm_data_plugin_interface.h>
|
||||
#include <InfrastructureManagement/ism_data_plugin_interface.h>
|
||||
|
||||
// Qt
|
||||
#include <QComboBox>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonArray>
|
||||
#include <QSpacerItem>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
EgcuEdit::EgcuEdit(const QString &menuGroup, QWidget *parent, LtsWidgets::ButtonCombination buttonCombination)
|
||||
: LtsWidgets::LtsDialog(parent, buttonCombination)
|
||||
, m_menuGroup(menuGroup)
|
||||
, m_requestHelper(new LtsUtils::RequestHelper(this))
|
||||
, m_logger(getLogger(QLatin1String("EgcuEdit")))
|
||||
, m_ui(new Ui::EgcuEdit)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Effect_representation"));
|
||||
}
|
||||
|
||||
bool EgcuEdit::init(const EgcuData &data, LtsSession::LtsSession *session)
|
||||
{
|
||||
m_egcuData = data;
|
||||
std::shared_ptr<AssetManagement::Interface::Dtc> asmDtc;
|
||||
if (!session->getDtc<AssetManagement::DataInterface>(asmDtc))
|
||||
return false;
|
||||
asmDtc->enableRelayInfo();
|
||||
|
||||
if (!session->getDtc<InfrastructureManagement::DataInterface>(m_ismDtc))
|
||||
return false;
|
||||
if (!session->getFtc<InfrastructureManagement::DataInterface>(m_ismFtc))
|
||||
return false;
|
||||
|
||||
connect(m_ismDtc.get(), &InfrastructureManagement::Interface::Dtc::mountingPointAssetChanged,
|
||||
this, &EgcuEdit::onMountinPointAssetChanged);
|
||||
|
||||
QGridLayout *l = new QGridLayout(m_ui->relays);
|
||||
m_ui->relays->setLayout(l);
|
||||
|
||||
auto cbRelayInfos = [this, l](const AssetManagement::RelayInfo &relayInfo)
|
||||
{
|
||||
QLabel *name = new QLabel(QString::fromStdString(relayInfo.name()), this);
|
||||
|
||||
QComboBox *cb = new QComboBox(this);
|
||||
if (EgcuModel::readAllowance(InfrastructureManagement::EffectOverride_def::PermanentOn, relayInfo.property()))
|
||||
cb->addItem(tr("On"), InfrastructureManagement::EffectOverride_def::PermanentOn);
|
||||
if (EgcuModel::readAllowance(InfrastructureManagement::EffectOverride_def::PermanentOff, relayInfo.property()))
|
||||
cb->addItem(tr("Off"), InfrastructureManagement::EffectOverride_def::PermanentOff);
|
||||
cb->addItem(tr("Auto"), InfrastructureManagement::EffectOverride_def::Automatic);
|
||||
|
||||
l->addWidget(name, l->rowCount(), 0);
|
||||
l->addWidget(cb, l->rowCount()-1, 1);
|
||||
|
||||
cb->setCurrentIndex(cb->findData(InfrastructureManagement::EffectOverride_def::Automatic));
|
||||
m_relayCbs.insert(relayInfo.id(), cb);
|
||||
};
|
||||
|
||||
asmDtc->waitForHistoricalDataRelayInfo();
|
||||
asmDtc->relayInfos(cbRelayInfos);
|
||||
l->addItem(new QSpacerItem(20, 210, QSizePolicy::Minimum, QSizePolicy::Expanding), l->rowCount(), 0);
|
||||
|
||||
m_ui->lblHostname->setText(QString::fromStdString(data.instrumentationAsset.hostname()));
|
||||
m_ui->leSegmentName->setText(QString::fromStdString(data.mountingPointAsset.name().empty() ? data.instrumentationAsset.hostname() : data.mountingPointAsset.name()));
|
||||
|
||||
// Get Building MSE
|
||||
// List all Floors/Rooms in TreeWidget
|
||||
// Check Rooms in data.rooms
|
||||
|
||||
QMap<qint32, QTreeWidgetItem*> treemap;
|
||||
|
||||
const std::vector<InfrastructureManagement::StructureElement> &vecElements = data.mainStructureElement.elements();
|
||||
for (const auto &se : vecElements)
|
||||
{
|
||||
if (se.structureElementTypeId() != InfrastructureManagement::StructureElementType_def::Floor)
|
||||
continue;
|
||||
QTreeWidgetItem *twi = new QTreeWidgetItem(m_ui->twRooms, {QString::fromStdString(se.displayName())});
|
||||
twi->setFlags(twi->flags() | Qt::ItemIsAutoTristate | Qt::ItemIsUserCheckable);
|
||||
twi->setCheckState(0, Qt::Unchecked);
|
||||
treemap[se.id()] = twi;
|
||||
}
|
||||
|
||||
// Identify building rooms and assign them to the correct floors by using map
|
||||
for (const auto &se : vecElements)
|
||||
{
|
||||
if (se.structureElementTypeId() != InfrastructureManagement::StructureElementType_def::Room)
|
||||
continue;
|
||||
|
||||
if (se.path().size() < 2) // Just for safety...
|
||||
continue;
|
||||
|
||||
// ...as for rooms: path(): 0 = self, 1 = floor, 2 = building
|
||||
|
||||
const int floorId = se.path()[1];
|
||||
if (!treemap.contains(floorId))
|
||||
continue;
|
||||
|
||||
QTreeWidgetItem *floorItem = treemap[floorId];
|
||||
|
||||
QTreeWidgetItem *mountingPoint = new QTreeWidgetItem(floorItem, {QString::fromStdString(se.displayName())});
|
||||
|
||||
treemap.insert(se.id(), mountingPoint);
|
||||
bool selected = data.rooms.contains(se.mountingPointId());
|
||||
mountingPoint->setCheckState(0, selected ? Qt::Checked : Qt::Unchecked);
|
||||
mountingPoint->setData(0, Qt::UserRole, se.mountingPointId());
|
||||
if (selected)
|
||||
floorItem->setExpanded(true);
|
||||
}
|
||||
connect(m_ui->twRooms, &QTreeWidget::itemChanged, this, &EgcuEdit::slotChangesMade);
|
||||
m_ui->twRooms->header()->hide();
|
||||
updateRelays();
|
||||
bool editable = true; //LtsSessionData::LtsSessionData::getInstance()->hasOperatorRight(OperatorRights::EgcuRoomsEdit);
|
||||
if (!editable)
|
||||
m_ui->twRooms->hide();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
EgcuEdit::~EgcuEdit()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void EgcuEdit::updateRelays()
|
||||
{
|
||||
//QGridLayout *l = dynamic_cast<QGridLayout*>(m_ui->relays->layout());
|
||||
InfrastructureManagement::StructureElement structureElement;
|
||||
for (const auto &se : m_egcuData.mainStructureElement.elements())
|
||||
{
|
||||
if (se.id() == m_egcuData.mountingPoint.id())
|
||||
{
|
||||
structureElement = se;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QJsonParseError parserError;
|
||||
QByteArray content = QByteArray::fromStdString(structureElement.properties());
|
||||
const QJsonDocument doc(QJsonDocument::fromJson(content, &parserError));
|
||||
|
||||
if (parserError.error != QJsonParseError::NoError)
|
||||
return;
|
||||
|
||||
QJsonObject docObj = QJsonObject(doc.object());
|
||||
|
||||
if ( !docObj.contains(QStringLiteral("Overrides")))
|
||||
return;
|
||||
QJsonObject overridesObj = docObj.value(QStringLiteral("Overrides")).toObject();
|
||||
QJsonArray arrRelays = overridesObj.value(QStringLiteral("relays")).toArray();
|
||||
for (int i=0; i<arrRelays.size(); ++i)
|
||||
{
|
||||
QJsonObject objState = arrRelays[i].toObject();
|
||||
QStringList relayIds = objState.keys();
|
||||
QString relayIdString = relayIds.at(0);
|
||||
int value = objState.value(relayIdString).toInt();
|
||||
|
||||
if (m_relayCbs.contains(relayIdString.toInt()))
|
||||
m_relayCbs[relayIdString.toInt()]->setCurrentIndex(m_relayCbs[relayIdString.toInt()]->findData(value));
|
||||
}
|
||||
}
|
||||
|
||||
void EgcuEdit::onMountinPointAssetChanged(const InfrastructureManagement::MountingPointAsset &mpa, DataModification mod)
|
||||
{
|
||||
if (m_egcuData.mountingPointAsset.id() != mpa.id())
|
||||
return;
|
||||
|
||||
if (mod == DataModification::eRemoved)
|
||||
deleteLater();
|
||||
}
|
||||
|
||||
QString EgcuEdit::dialogIdentifier() const
|
||||
{
|
||||
return QLatin1String("EgcuEdit") + QString::number(m_egcuData.instrumentationAsset.id());
|
||||
}
|
||||
|
||||
void EgcuEdit::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Edit Segment: %1").arg(m_egcuData.segmentName()));
|
||||
}
|
||||
|
||||
void EgcuEdit::getRoomIds(QTreeWidgetItem *twi, QVariantList &vl)
|
||||
{
|
||||
if (twi->checkState(0) == Qt::Checked)
|
||||
vl << twi->data(0, Qt::UserRole);
|
||||
|
||||
for (int i=0; i<twi->childCount(); ++i)
|
||||
getRoomIds(twi->child(i), vl);
|
||||
}
|
||||
|
||||
|
||||
void EgcuEdit::onMainStructureElementModifyReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
|
||||
void EgcuEdit::onStructureElementModifyReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
|
||||
void EgcuEdit::onMountingPointAssetModifyReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
|
||||
|
||||
bool EgcuEdit::apply()
|
||||
{
|
||||
InfrastructureManagement::StructureElement structureElement;
|
||||
std::string properties;
|
||||
|
||||
if (true) // LtsSessionData::LtsSessionData::getInstance()->hasOperatorRight(OperatorRights::EgcuRoomsEdit))
|
||||
{
|
||||
if (!saveEgcuToRooms())
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const auto &se : m_egcuData.mainStructureElement.elements())
|
||||
{
|
||||
if (se.id() == m_egcuData.mountingPoint.id())
|
||||
{
|
||||
structureElement = se;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_ui->leSegmentName->text() != QString::fromStdString(m_egcuData.mountingPointAsset.name()))
|
||||
{
|
||||
InfrastructureManagement::MountingPointAssetModifyRequest req;
|
||||
InfrastructureManagement::MountingPointAsset &mpa = req;
|
||||
mpa = m_egcuData.mountingPointAsset;
|
||||
mpa.name(m_ui->leSegmentName->text().toStdString());
|
||||
m_requestHelper->addRequest([this, req]() {return m_ismFtc->mountingPointAssetModifyRequest(req, this);});
|
||||
}
|
||||
|
||||
properties= structureElement.properties();
|
||||
DEBUG_LOG(m_logger) << "structureElementId=" << m_egcuData.mountingPoint.id()
|
||||
<< " properties=" << properties;
|
||||
|
||||
QJsonArray arrRelays;
|
||||
|
||||
for (auto it = m_relayCbs.cbegin(); it != m_relayCbs.cend(); ++it)
|
||||
{
|
||||
QJsonObject objRelay;
|
||||
if (it.value()->currentData().toInt() == InfrastructureManagement::EffectOverride_def::Automatic)
|
||||
continue;
|
||||
objRelay[QString::number(it.key())] = it.value()->currentData().toInt();
|
||||
arrRelays.append(objRelay);
|
||||
}
|
||||
|
||||
QJsonObject resultObj;
|
||||
QJsonObject overrideObj;
|
||||
if (arrRelays.size())
|
||||
overrideObj.insert(QStringLiteral("relays"),arrRelays);
|
||||
resultObj.insert (QStringLiteral("Overrides"), overrideObj);
|
||||
QByteArray content_neu = QJsonDocument(resultObj).toJson(QJsonDocument::Compact);
|
||||
structureElement.properties(content_neu.toStdString());
|
||||
|
||||
InfrastructureManagement::StructureElementModifyRequest request;
|
||||
request.mainStructureElementId(m_egcuData.mainStructureElement.id());
|
||||
request.elements().resize(1);
|
||||
request.elements().at(0) = structureElement;
|
||||
|
||||
m_requestHelper->addRequest([this, request]() {return m_ismFtc->structureElementModifyRequest(request, this);});
|
||||
m_requestHelper->startRequests();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool EgcuEdit::saveEgcuToRooms()
|
||||
{
|
||||
QJsonParseError parserError;
|
||||
QByteArray content = QByteArray::fromStdString(m_egcuData.mainStructureElement.properties());
|
||||
const QJsonDocument doc(QJsonDocument::fromJson(content, &parserError));
|
||||
|
||||
if (parserError.error != QJsonParseError::NoError)
|
||||
return false;
|
||||
|
||||
QJsonObject docObj = QJsonObject(doc.object());
|
||||
QJsonArray arrEgcus = docObj.value(QStringLiteral("egcusToRooms")).toArray();
|
||||
bool found = false;
|
||||
for (int i=0; i<arrEgcus.size(); ++i)
|
||||
{
|
||||
QJsonObject objRooms = arrEgcus[i].toObject();
|
||||
if (m_egcuData.mountingPoint.data().mountingPointId() != objRooms.value(QStringLiteral("mountpointEgcu")).toInt())
|
||||
continue;
|
||||
|
||||
// This is only done once, if it is found, so don't worry about for-loop
|
||||
found = true;
|
||||
QVariantList roomIds;
|
||||
getRoomIds(m_ui->twRooms->invisibleRootItem(), roomIds);
|
||||
|
||||
|
||||
QJsonArray roomIdsArray = QJsonArray::fromVariantList(roomIds);
|
||||
for ( int j = roomIdsArray.size() - 1 ; j >= 0 ; j-- )
|
||||
{
|
||||
QJsonValue val = roomIdsArray.at(j);
|
||||
if ( val.toInt() == 0)
|
||||
roomIdsArray.removeAt(j);
|
||||
}
|
||||
|
||||
objRooms.insert(QLatin1String("rooms"), roomIdsArray);
|
||||
arrEgcus.removeAt(i);
|
||||
arrEgcus.insert(i, objRooms);
|
||||
break;
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
QJsonObject objRooms;
|
||||
QVariantList roomIds;
|
||||
getRoomIds(m_ui->twRooms->invisibleRootItem(), roomIds);
|
||||
objRooms.insert(QLatin1String("rooms"), QJsonArray::fromVariantList(roomIds));
|
||||
objRooms.insert(QLatin1String("mountpointEgcu"), m_egcuData.mountingPoint.data().mountingPointId());
|
||||
arrEgcus.append(objRooms);
|
||||
}
|
||||
|
||||
docObj.insert(QStringLiteral("egcusToRooms"), arrEgcus);
|
||||
content = QJsonDocument(docObj).toJson(QJsonDocument::Compact);
|
||||
m_egcuData.mainStructureElement.properties(content.toStdString());
|
||||
|
||||
InfrastructureManagement::MainStructureElementModifyRequest request;
|
||||
InfrastructureManagement::MainStructureElement &mse = request;
|
||||
mse = m_egcuData.mainStructureElement;
|
||||
m_requestHelper->addRequest([this, request]() {return m_ismFtc->mainStructureElementModifyRequest(request, this);});
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Edit the defaults for an EGCU
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Malte Diers, SLTE, 2021-05-10
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_egcu_model.h"
|
||||
|
||||
#include <InfrastructureManagement/ism_ftc.h>
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class EgcuEdit;
|
||||
}
|
||||
namespace LtsSession {
|
||||
class LtsSession;
|
||||
}
|
||||
namespace LtsUtils {
|
||||
class RequestHelper;
|
||||
}
|
||||
class QTreeWidgetItem;
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class EgcuEdit
|
||||
: public LtsWidgets::LtsDialog
|
||||
, protected InfrastructureManagement::Interface::Ftc::MainStructureElementModifyReplyHandler
|
||||
, protected InfrastructureManagement::Interface::Ftc::StructureElementModifyReplyHandler
|
||||
, protected InfrastructureManagement::Interface::Ftc::MountingPointAssetModifyReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit EgcuEdit(const QString &menuGroup,
|
||||
QWidget *parent = nullptr,
|
||||
LtsWidgets::ButtonCombination buttonCombination = LtsWidgets::ButtonCombination::OkApplyCancel);
|
||||
~EgcuEdit();
|
||||
QString menuGroup() const { return m_menuGroup; }
|
||||
QString dialogIdentifier() const;
|
||||
|
||||
bool init(const EgcuData &data, LtsSession::LtsSession *session);
|
||||
|
||||
void onMainStructureElementModifyReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
void onStructureElementModifyReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
void onMountingPointAssetModifyReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
|
||||
bool apply() override;
|
||||
private:
|
||||
void retranslate() override;
|
||||
static void getRoomIds(QTreeWidgetItem *twi, QVariantList &vl);
|
||||
void updateRelays();
|
||||
|
||||
private slots:
|
||||
void onMountinPointAssetChanged(const InfrastructureManagement::MountingPointAsset &mpa, DataModification mod);
|
||||
|
||||
private:
|
||||
|
||||
EgcuData m_egcuData;
|
||||
QString m_menuGroup;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Dtc> m_ismDtc;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Ftc> m_ismFtc;
|
||||
LtsUtils::RequestHelper *m_requestHelper;
|
||||
QMap<int, QComboBox*> m_relayCbs;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
Ui::EgcuEdit *m_ui;
|
||||
bool saveEgcuToRooms();
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,77 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>EgcuEdit</class>
|
||||
<widget class="QWidget" name="EgcuEdit">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>781</width>
|
||||
<height>473</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="lbxSegmentName">
|
||||
<property name="text">
|
||||
<string>Segment:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="lbxHostname">
|
||||
<property name="text">
|
||||
<string>Hostname:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="leSegmentName"/>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="lblHostname">
|
||||
<property name="text">
|
||||
<string notr="true"><EGCUNAME></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QLabel" name="lbxRooms">
|
||||
<property name="text">
|
||||
<string>Rooms:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3" rowspan="4">
|
||||
<widget class="QTreeWidget" name="twRooms">
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QGroupBox" name="relays">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Overrides</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+1398
File diff suppressed because it is too large.
Load diff
+265
@@ -0,0 +1,265 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* The EgcuModel provices data for MountingPointListDialog
|
||||
* Modified version using the checkStateProxyModel to allow setting via the checkboxes of the tree structure hjl 5/19
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Hannes Baeuerle, SLSE, 2016-11-03
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AssetManagement/asm_dtc.h>
|
||||
#include <InfrastructureManagement/ism_dtc.h>
|
||||
#include <InfrastructureManagement/Shared/ism_mounting_point.h>
|
||||
#include <Plugins/Buildings/bld_data_plugin_interface.h>
|
||||
#include <Plugins/SituationMapPlugin/situation_map_gui_plugin_interface.h>
|
||||
|
||||
#include <QSet>
|
||||
#include <QMenu>
|
||||
#include <QStyledItemDelegate>
|
||||
|
||||
#include <nglwidgets/ngltreemodel.h>
|
||||
#include <nglwidgets/ngltreeitem.h>
|
||||
|
||||
#include <Plugins/InfrastructureManagement/ism_data_plugin_interface.h>
|
||||
#include <Plugins/AssetManagement/asm_data_plugin_interface.h>
|
||||
|
||||
//Lts
|
||||
#include <LtsUtilsGuiDds/request_helper.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
|
||||
class QAction;
|
||||
namespace LtsSession
|
||||
{
|
||||
class LtsSession;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
// EGCU Data combines data from:
|
||||
// - Instrumentation Asset (The EGCU itself)
|
||||
// - MountingPoint (Where is it mounted?)
|
||||
// - MainStructureElement (In which Building? Which rooms belong to this EGCU?)
|
||||
// - MountingPointAsset (The Asset is mounted on which point?)
|
||||
|
||||
class EgcuData
|
||||
{
|
||||
public:
|
||||
InfrastructureManagement::InstrumentationAsset instrumentationAsset;
|
||||
InfrastructureManagement::MountingPoint mountingPoint;
|
||||
InfrastructureManagement::MainStructureElement mainStructureElement;
|
||||
Buildings::RelayState relayState;
|
||||
InfrastructureManagement::MountingPointAsset mountingPointAsset;
|
||||
QMap<int, InfrastructureManagement::EffectOverride> effectOverrides; // key = relayId
|
||||
|
||||
QVector<int> rooms;
|
||||
QString segmentName() const { return (mountingPointAsset.name().empty() ? QString::fromStdString(instrumentationAsset.name()) : QString::fromStdString(mountingPointAsset.name())); }
|
||||
|
||||
explicit EgcuData() = default;
|
||||
|
||||
EgcuData(const InfrastructureManagement::InstrumentationAsset &ia,
|
||||
const InfrastructureManagement::MountingPoint &mp,
|
||||
const InfrastructureManagement::MainStructureElement &mse,
|
||||
const Buildings::RelayState &rs,
|
||||
const InfrastructureManagement::MountingPointAsset &mpa,
|
||||
const QSet<int> &relayIds);
|
||||
|
||||
bool isNull() const { return (instrumentationAsset.id() == 0 || mountingPoint.id() == 0 || mainStructureElement.id() == 0); }
|
||||
|
||||
// Todo: Check what updates are feasible
|
||||
void update(const InfrastructureManagement::MainStructureElement &mse);
|
||||
|
||||
void update(const InfrastructureManagement::MountingPoint &mp, bool overrideId); // fails if instrumentationAssetId Changed!
|
||||
void update(const InfrastructureManagement::InstrumentationAsset &instrumentationAsset, bool overrideId);
|
||||
void update(const InfrastructureManagement::StructureElement &mse, bool overrideId);
|
||||
void update(const Buildings::RelayState &data);
|
||||
int update(const InfrastructureManagement::MountingPointAsset &mpa); // 1= asset needs change, 2= mountingPoint needs change
|
||||
};
|
||||
|
||||
|
||||
class EgcuDelegate
|
||||
: public QStyledItemDelegate
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
EgcuDelegate(QObject *parent = nullptr);
|
||||
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
|
||||
QSize sizeHint( const QStyleOptionViewItem & option, const QModelIndex & index ) const override;
|
||||
|
||||
}; // EgcuDelegate
|
||||
|
||||
|
||||
class EgcuModel final : public NGLTreeModel
|
||||
, protected InfrastructureManagement::Interface::Ftc::StructureElementModifyReplyHandler
|
||||
, protected Buildings::Interface::Ftc::SwitchRelayReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum Columns
|
||||
{
|
||||
Name,
|
||||
Id,
|
||||
MountingPointType,
|
||||
Barcode,
|
||||
Hostname,
|
||||
Properties,
|
||||
Rooms,
|
||||
Overrides,
|
||||
Status,
|
||||
};
|
||||
|
||||
explicit EgcuModel(QObject *parent = nullptr);
|
||||
|
||||
/**
|
||||
* Handles the representation of data.
|
||||
* In case of CheckStateRole only leafs will be handled.
|
||||
* Nodes are handled in the upstream CheckStateProxyModel class.
|
||||
* @param[in] index item index to be handled
|
||||
* @param[in] role role to which the data relates
|
||||
*
|
||||
*/
|
||||
QVariant data(const QModelIndex &index, int role) const override final;
|
||||
|
||||
bool initModel(LtsSession::LtsSession *session);
|
||||
|
||||
QModelIndex getIndexOfVisableRootItem() const;
|
||||
|
||||
/**
|
||||
* Sets only the leafs of the tree view to Qt::ItemIsUserCheckable.
|
||||
* Nodes are handled in the upstream CheckStateProxyModel class.
|
||||
* @param[in] index item index to be handled
|
||||
*
|
||||
*/
|
||||
Qt::ItemFlags flags(const QModelIndex &index) const override final;
|
||||
|
||||
/**
|
||||
* Sets the check state data according to their check box in the internal model.
|
||||
* CheckState data can be set for leafs only.
|
||||
* Nodes are handled in the upstream CheckStateProxyModel class.
|
||||
* @param[in] index item index to be handled
|
||||
* @param[in] value value to be set
|
||||
* @param[in] role role to which the data relates (here especially Qt::CheckStateRole)
|
||||
*
|
||||
*/
|
||||
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||
|
||||
InfrastructureManagement::StructureElementType getStructureElementType(const QModelIndex &mi) const;
|
||||
|
||||
QAction *addContextMenuHeaderItem(const QString &name);
|
||||
void getContextMenu(const QModelIndexList &indexes, QMenu &menu);
|
||||
void onSwitchRelayReply(const Core::FunctionReplyObject &replyObject) override final { m_requestHelper->requestReply(replyObject); }
|
||||
void onStructureElementModifyReply(const Core::FunctionReplyObject &replyObject) override final { m_requestHelper->requestReply(replyObject); }
|
||||
|
||||
static QVector<int> getRoomsForEgcu(const std::string &mseProperties, int mountingPointId);
|
||||
static bool readAllowance(InfrastructureManagement::EffectOverride eo, const std::string &properties);
|
||||
// Not yet implemented:
|
||||
QMap<int,QModelIndex> setSelectedStructureElements(const QVector<int> &structureElementIds);
|
||||
QPair<QMap<int, InfrastructureManagement::StructureElement>, QMap<int, InfrastructureManagement::StructureElement> > findEgcusAndBuildings(const QModelIndexList &indexes);
|
||||
|
||||
public Q_SLOTS:
|
||||
void onMountingPointChanged(const InfrastructureManagement::MountingPoint &mountingPoint, DataModification modType);
|
||||
void onInstrumentationAssetChanged(const InfrastructureManagement::InstrumentationAsset &instrumentationAsset, DataModification modType);
|
||||
void onMainStructureElementChanged(const InfrastructureManagement::MainStructureElement &mainStructureElement, DataModification modType);
|
||||
void onRelayStateChanged(const Buildings::RelayState &data, DataModification modType);
|
||||
void onRelayInfoChanged(const AssetManagement::RelayInfo &data, DataModification modType);
|
||||
void onMountingPointAssetChanged(const InfrastructureManagement::MountingPointAsset &mpa, DataModification modType);
|
||||
|
||||
void setAllOverrides(InfrastructureManagement::EffectOverride eo, const QModelIndexList &indexes);
|
||||
signals:
|
||||
void invalidateFilter(const QModelIndex &mi = QModelIndex());
|
||||
|
||||
private:
|
||||
void initData();
|
||||
void removeUnused(NGLTreeItem *item);
|
||||
bool isMountpointEgcu(const QByteArray &properties);
|
||||
void udpatePropertiesForRelayOverride(const int relay,
|
||||
const InfrastructureManagement::EffectOverride state,
|
||||
InfrastructureManagement::StructureElement &se);
|
||||
void udpatePropertiesForOverride(const QString &tagName,
|
||||
const InfrastructureManagement::EffectOverride state,
|
||||
InfrastructureManagement::StructureElement &se);
|
||||
|
||||
friend class EgcuProxyModel;
|
||||
|
||||
NGLTreeItem *m_visRoot;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Dtc> m_dtc;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Ftc> m_ftc;
|
||||
std::shared_ptr<Buildings::Interface::Dtc> m_bldDtc;
|
||||
std::shared_ptr<Buildings::Interface::Ftc> m_bldFtc;
|
||||
std::shared_ptr<AssetManagement::Interface::Dtc> m_asmDtc;
|
||||
std::shared_ptr<InfrastructureManagement::ForeignDataInterface> m_dataInterface;
|
||||
std::shared_ptr<SituationMap::ForeignGuiInterface> m_sitMapGuiIfc;
|
||||
|
||||
QMap<int, AssetManagement::RelayInfo> m_relayInfos;
|
||||
|
||||
LtsSession::LtsSession *m_session = nullptr;
|
||||
LtsUtils::RequestHelper *m_requestHelper = nullptr;
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
NGLTreeItem* findItemByMountingPointId(int mpId, NGLTreeItem *parent) const;
|
||||
NGLTreeItem* findItemByAssetId(int assetId, NGLTreeItem *parent) const;
|
||||
NGLTreeItem* findItemByMseId(int mseId, NGLTreeItem *parent) const;
|
||||
NGLTreeItem* findItemByStructureElementId(int seId, NGLTreeItem *parent) const;
|
||||
NGLTreeItem* createItemFromMountingPoint(const InfrastructureManagement::StructureElement ¤tElement);
|
||||
NGLTreeItem* createItemFromStructureElement(const InfrastructureManagement::StructureElement ¤tElement);
|
||||
Buildings::SwitchRelayRequest createSwitchRelayRequest(int buildingId, int assetId, int relayId, Buildings::StateSetRelay state, int pulse = 0, int count = 0, int pause = 0);
|
||||
|
||||
static bool jsonBoolSearch(const std::string &propoerties, const QString &tagName, bool defaultVal);
|
||||
QAction* getGenericAction(const InfrastructureManagement::EffectOverride eo, const QString &actionName, const QString &tagName, const QMap<int, InfrastructureManagement::StructureElement> &buildings);
|
||||
QAction* getRelayAction(const InfrastructureManagement::EffectOverride eo, const QMap<int, InfrastructureManagement::StructureElement> &egcus, const AssetManagement::RelayInfo &relayInfo);
|
||||
QAction* getCenterAction(const int mseId);
|
||||
|
||||
void findEgcuChildren(NGLTreeItem *parent, QMap<int, InfrastructureManagement::StructureElement> &resVec);
|
||||
void findEgcuChildren(NGLTreeItem *parent, QSet<NGLTreeItem *> &set);
|
||||
void findBuildings(NGLTreeItem *parent, QMap<int, InfrastructureManagement::StructureElement> &buildings);
|
||||
void findStructureElementChildren(NGLTreeItem *parent, QSet<NGLTreeItem *> &set);
|
||||
void findStructureElementChildrenByIds(NGLTreeItem *parent, const QVector<int> &structureElementIds, QMap<int, QModelIndex> &map);
|
||||
QString getOverridesString(const EgcuData &data) const;
|
||||
QString getRelaisStates(const EgcuData &data) const;
|
||||
static QString getOverridesFlash(const QByteArray &properties);
|
||||
static QString getRoomsString(const EgcuData &data);
|
||||
static QString getIconFromState(const std::string &properties, bool state);
|
||||
QMap<qint32, InfrastructureManagement::MountingPointAsset> m_mountingPointAssets;
|
||||
bool mseHasMountedAsset(const InfrastructureManagement::MainStructureElement &mse, InfrastructureManagement::MountingPointType mpType);
|
||||
bool isMounted(int mountingPointId);
|
||||
}; // class EgcuModel
|
||||
|
||||
|
||||
|
||||
//=== EgcuProxyModel ===================================================================
|
||||
|
||||
class EgcuProxyModel final : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
using BaseClass = LtsWidgets::LtsColumnFilterProxyModel;
|
||||
|
||||
Q_OBJECT
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
|
||||
void showIncluded(const bool bShow);
|
||||
void showNotIncluded(const bool bShow);
|
||||
void setTypeFilter(const QSet<InfrastructureManagement::MountingPointType> &visibleTypes);
|
||||
void addToTypeFilter(const InfrastructureManagement::MountingPointType mpt, const bool bAdd);
|
||||
|
||||
bool filterAcceptsRow(const int source_row, const QModelIndex &source_parent) const override;
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::invalidateFilter;
|
||||
|
||||
private:
|
||||
EgcuModel *m_sourceModel = nullptr;
|
||||
QSet<InfrastructureManagement::MountingPointType> m_visibleTypes;
|
||||
bool m_bShowIncluded = true;
|
||||
bool m_bShowNotIncluded = true;
|
||||
};
|
||||
|
||||
} // namespace InfrastructureManagement
|
||||
Q_DECLARE_METATYPE(ServiceMonitor::EgcuData)
|
||||
Q_DECLARE_METATYPE(InfrastructureManagement::StructureElement)
|
||||
@@ -0,0 +1,223 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* HMI Plugin for Observer Controller - Fault Message Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Filip Biedziak, SLTE, 2021-10-12
|
||||
*/
|
||||
|
||||
#include "smo_fault_message_dialog.h"
|
||||
#include "ui_smo_fault_message_dialog.h"
|
||||
|
||||
#include <AdvancedSymbology/asb_data_plugin_interface.h>
|
||||
#include <Common/logger.h>
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
FaultMessageDialog::FaultMessageDialog(LtsSession::LtsSession *session, QWidget *parent)
|
||||
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel)
|
||||
, m_session(session)
|
||||
, m_requestHelper(new LtsUtils::RequestHelper(this))
|
||||
, m_ui(new Ui::FaultMessageDialog)
|
||||
, m_logger(getLogger(QStringLiteral("FaultMessageDialog")))
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
m_ui->lblCountMax->setText(QString::number(m_maxChars));
|
||||
m_ui->lblCount->setText(QString::number(0));
|
||||
m_ui->lblDevCountMax->setText(QString::number(m_maxPartChars));
|
||||
m_ui->lblDevCount->setText(QString::number(0));
|
||||
connect(m_ui->teComment, &QPlainTextEdit::textChanged, this, &FaultMessageDialog::onTextChanged);
|
||||
connect(m_ui->leDevice, &QLineEdit::textChanged, this, &FaultMessageDialog::onDevTextChanged);
|
||||
setOnlineHelpFilename(QStringLiteral("OC-Fault_Message"));
|
||||
}
|
||||
|
||||
FaultMessageDialog::~FaultMessageDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// PUBLIC
|
||||
|
||||
bool FaultMessageDialog::init(/*const std::shared_ptr<OcSituationServer::Interface::Ftc> &ossFtc*/)
|
||||
{
|
||||
// if (!ossFtc)
|
||||
// return false;
|
||||
|
||||
// m_ossFtc = ossFtc;
|
||||
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> dtcPpm;
|
||||
if (!m_session->getDtc<ParticipantManagement::DataInterface>(dtcPpm))
|
||||
return false;
|
||||
|
||||
if (!m_session->getDtc<TrainingAreaBaseOC::DataInterface>(m_tabocDtc))
|
||||
return false;
|
||||
|
||||
if (!m_session->createTopicClient(m_ossFtc))
|
||||
return false;
|
||||
m_ossFtc->enableEquipmentError();
|
||||
|
||||
// if (!m_session->getFtc<OcSituationServer::Interface::Ftc>(m_ossFtc))
|
||||
// return false;
|
||||
|
||||
if (!m_session->getForeignGuiInterface<ParticipantManagement::ForeignGuiComboboxInterface>(m_ppmGuiCbxIfc))
|
||||
return false;
|
||||
|
||||
#ifdef TABLET_MODE
|
||||
//css didn"t worked
|
||||
m_ui->dvParticipants->setIconSize(QSize(50, 50));
|
||||
#endif
|
||||
std::shared_ptr<AdvancedSymbology::ForeignDataInterface> asb;
|
||||
m_session->getForeignDataInterface<AdvancedSymbology::DataInterface>(asb);
|
||||
m_model = new ParticipantManagement::ParticipantEditModel(this, dtcPpm, asb);
|
||||
// only needed to set recursiveFilteringEnabled
|
||||
m_proxyModel = new ParticipantManagement::ParticipantTreeFilterProxyModel(this);
|
||||
m_proxyModel->setSourceModel(m_model);
|
||||
m_proxyModel->setRecursiveFilteringEnabled(true);
|
||||
m_ui->dvParticipants->setModel(m_proxyModel);
|
||||
|
||||
m_ppmGuiCbxIfc->fillPartyComboBox(m_ui->cbParty);
|
||||
connect(m_ui->dvParticipants, &LtsDataView::LtsDataView::signalSelectionChanged,
|
||||
this, &FaultMessageDialog::onSlotSelectionChanged);
|
||||
|
||||
connect(m_tabocDtc.get(), &TrainingAreaBaseOC::Interface::Dtc::specificsEquipmentChanged,
|
||||
this, &FaultMessageDialog::onSpecificsEquipmentChanged);
|
||||
m_tabocDtc->specificsEquipments([this](const TrainingAreaBaseOC::SpecificsEquipment & data)
|
||||
{
|
||||
onSpecificsEquipmentChanged(data, DataModification::eAdded);
|
||||
});
|
||||
|
||||
connect(m_ui->cbParty, &LtsWidgets::LtsComboBox::currentTextChanged, this, [this]
|
||||
{
|
||||
m_model->onReinitModel(m_ui->cbParty->currentData().toInt());
|
||||
m_ui->dvParticipants->expandAll();
|
||||
});
|
||||
|
||||
m_model->onReinitModel(m_ui->cbParty->currentData().toInt());
|
||||
m_ui->dvParticipants->expandAll();
|
||||
m_ui->dvParticipants->setSortIndicator(0, Qt::AscendingOrder);
|
||||
m_ui->leParticipant->setValidator(new QIntValidator(1, 10000, this));
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// PRIVATE
|
||||
|
||||
void FaultMessageDialog::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Fault Message"));
|
||||
m_uiRequirements->clear();
|
||||
m_uiRequirements->addRequirement({m_ui->lblDevice, [this]() { return !m_ui->leDevice->text().isEmpty(); },
|
||||
tr("Name the faulty devices.")});
|
||||
m_uiRequirements->addRequirement({m_ui->lblComment, [this]()
|
||||
{
|
||||
return (!m_ui->teComment->toPlainText().isEmpty() &&
|
||||
m_ui->teComment->toPlainText().count() <= m_maxChars);
|
||||
},
|
||||
tr("Add a text comment.")});
|
||||
}
|
||||
|
||||
bool FaultMessageDialog::apply()
|
||||
{
|
||||
if (m_ui->leParticipant->text().toInt() <= 0)
|
||||
return false;
|
||||
|
||||
OcSituationServer::EquipmentErrorRequest req;
|
||||
req.equipmentNumber(m_ui->leParticipant->text().toInt());
|
||||
req.device(m_ui->leDevice->text().toStdString());
|
||||
req.text(m_ui->teComment->toPlainText().toStdString());
|
||||
return m_requestHelper->startSingleRequest([req, this]()
|
||||
{
|
||||
return m_ossFtc->equipmentErrorRequest(req, this);
|
||||
});
|
||||
}
|
||||
|
||||
void FaultMessageDialog::tableColumnOrganiserSetting()
|
||||
{
|
||||
//LtsColumnOrganiser
|
||||
m_ui->dvParticipants->setColumnsOrganiserEnabled(identifier(), true);
|
||||
}
|
||||
|
||||
|
||||
void FaultMessageDialog::trimText(QLineEdit *lineEdit, QLabel *label)
|
||||
{
|
||||
QString plainText(lineEdit->text());
|
||||
int currentUsedChars = plainText.toUtf8().size();
|
||||
bool bNeedSetNew = false;
|
||||
|
||||
while (currentUsedChars > m_maxPartChars)
|
||||
{
|
||||
plainText.chop(1);
|
||||
currentUsedChars = plainText.toUtf8().size();
|
||||
bNeedSetNew = true; // do not set text directly, results in recursion
|
||||
}
|
||||
|
||||
// if text longer than allowed
|
||||
if (bNeedSetNew)
|
||||
lineEdit->setText(plainText);
|
||||
label->setText(QString::number(currentUsedChars));
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// PRIVATE SLOTS
|
||||
|
||||
void FaultMessageDialog::onSlotSelectionChanged()
|
||||
{
|
||||
m_selectedEqNr = 0;
|
||||
|
||||
const auto selIndexes = m_ui->dvParticipants->selectedRows();
|
||||
if (!selIndexes.isEmpty())
|
||||
{
|
||||
ParticipantManagement::ParticipantData part = m_model->getParticipantData(selIndexes.first());
|
||||
if (part.equipmentNumber().is_set())
|
||||
m_selectedEqNr = part.equipmentNumber().get();
|
||||
else
|
||||
m_selectedEqNr = -1;
|
||||
}
|
||||
slotChangesMade();
|
||||
if (m_selectedEqNr > 0)
|
||||
m_ui->leParticipant->setText(QString::number(m_selectedEqNr));
|
||||
}
|
||||
|
||||
void FaultMessageDialog::onTextChanged()
|
||||
{
|
||||
QString plainText(m_ui->teComment->toPlainText());
|
||||
int currentUsedChars = plainText.toUtf8().size();
|
||||
bool bNeedSetNew = false;
|
||||
|
||||
while (currentUsedChars > m_maxChars)
|
||||
{
|
||||
plainText.chop(1);
|
||||
currentUsedChars = plainText.toUtf8().size();
|
||||
bNeedSetNew = true; // do not set text directly, results in recursion
|
||||
}
|
||||
|
||||
// if text longer than allowed
|
||||
if (bNeedSetNew)
|
||||
{
|
||||
m_ui->teComment->setPlainText(plainText);
|
||||
m_ui->teComment->moveCursor(QTextCursor::End);
|
||||
}
|
||||
m_ui->lblCount->setText(QString::number(currentUsedChars));
|
||||
}
|
||||
|
||||
void FaultMessageDialog::onDevTextChanged()
|
||||
{
|
||||
trimText(m_ui->leDevice, m_ui->lblDevCount);
|
||||
}
|
||||
|
||||
void FaultMessageDialog::onSpecificsEquipmentChanged(const TrainingAreaBaseOC::SpecificsEquipment &data, const DataModification &modType)
|
||||
{
|
||||
if (DataModification::eRemoved == modType)
|
||||
return;
|
||||
|
||||
m_ownEquipmentId = data.equipmentNumber();
|
||||
if (m_ownEquipmentId <= 0)
|
||||
WARNING_LOG(m_logger) << "EquipmentNumber " << data.equipmentNumber() << " is not present ";
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* HMI Plugin for Observer Controller - Fault Message Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Filip Biedziak, SLTE, 2021-10-12
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsUtilsGuiDds/request_helper.h>
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
#include <OcSituationServer/oss_ftc.h>
|
||||
#include <OcSituationServer/oss.hpp>
|
||||
#include <ParticipantManagement/Gui/Common/participant_edit_model.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
#include <Plugins/TrainingAreaBaseOC/taboc_data_plugin_interface.h>
|
||||
|
||||
|
||||
namespace Ui { class FaultMessageDialog; }
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class FaultMessageDialog : public LtsWidgets::LtsDialog
|
||||
, private OcSituationServer::Interface::Ftc::EquipmentErrorReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit FaultMessageDialog(LtsSession::LtsSession *session, QWidget *parent = nullptr);
|
||||
~FaultMessageDialog();
|
||||
|
||||
bool init();
|
||||
|
||||
void onEquipmentErrorReply(const Core::FunctionReplyObject &replyObject) override
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
|
||||
private:
|
||||
void retranslate() override;
|
||||
bool apply() override;
|
||||
void tableColumnOrganiserSetting() override;
|
||||
|
||||
void trimText(QLineEdit *lineEdit, QLabel *label);
|
||||
|
||||
private slots:
|
||||
void onSlotSelectionChanged();
|
||||
void onTextChanged();
|
||||
void onDevTextChanged();
|
||||
void onSpecificsEquipmentChanged(const TrainingAreaBaseOC::SpecificsEquipment &data, const DataModification &modType);
|
||||
|
||||
private:
|
||||
LtsSession::LtsSession *m_session{nullptr};
|
||||
LtsUtils::RequestHelper *m_requestHelper{nullptr};
|
||||
|
||||
int m_selectedEqNr{-1};
|
||||
int m_maxChars{255};
|
||||
int m_maxPartChars{35};
|
||||
int m_ownEquipmentId{0};
|
||||
|
||||
ParticipantManagement::ParticipantEditModel *m_model{nullptr};
|
||||
LtsWidgets::LtsColumnFilterProxyModel *m_proxyModel{nullptr};
|
||||
|
||||
std::shared_ptr<OcSituationServer::Interface::Ftc> m_ossFtc{nullptr};
|
||||
std::shared_ptr<TrainingAreaBaseOC::Interface::Dtc> m_tabocDtc{nullptr};
|
||||
std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> m_ppmGuiCbxIfc{nullptr};
|
||||
|
||||
Ui::FaultMessageDialog *m_ui{nullptr};
|
||||
NGL::INGLLogger &m_logger;
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,218 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>FaultMessageDialog</class>
|
||||
<widget class="QWidget" name="FaultMessageDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>388</width>
|
||||
<height>757</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">MessagingView</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Party:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="LtsWidgets::LtsComboBox" name="cbParty"/>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="LtsDataView::LtsDataView" name="dvParticipants">
|
||||
<property name="showColumnCount" stdset="0">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="toolButtonsVisible">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="lblDevice">
|
||||
<property name="text">
|
||||
<string>Device:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="lblParticpant">
|
||||
<property name="text">
|
||||
<string>Participant:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="leDevice">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Device</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="lblDevCount">
|
||||
<property name="text">
|
||||
<string notr="true"><COUNT></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string notr="true">/</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="lblDevCountMax">
|
||||
<property name="text">
|
||||
<string notr="true"><MAX></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="leParticipant">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Participant</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="lblComment">
|
||||
<property name="text">
|
||||
<string>Comment:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="teComment">
|
||||
<property name="toolTip">
|
||||
<string>Comment</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Characters:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="lblCount">
|
||||
<property name="text">
|
||||
<string notr="true"><COUNT></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string notr="true">/</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="lblCountMax">
|
||||
<property name="text">
|
||||
<string notr="true"><MAX></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LtsWidgets::LtsComboBox</class>
|
||||
<extends>QComboBox</extends>
|
||||
<header>LtsWidgets/lts_combo_box.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>LtsDataView::LtsDataView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>LtsDataView/lts_data_view.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<tabstops>
|
||||
<tabstop>cbParty</tabstop>
|
||||
<tabstop>leParticipant</tabstop>
|
||||
<tabstop>leDevice</tabstop>
|
||||
<tabstop>teComment</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,218 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Manipulation Message
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-10
|
||||
*/
|
||||
|
||||
#include "smo_manipulation_model.h"
|
||||
#include <LtsSession/lts_session_data.h>
|
||||
#include <Common/logger.h>
|
||||
#include <ngltools/ngltools_dtg.h>
|
||||
#include <QDateTime>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
ManipulationModel::ManipulationModel(QObject *parent)
|
||||
: LtsWidgets::LtsAbstractTableModel<ManipulationData>({tr("Time of Receipt"),
|
||||
tr("Equip. No."),
|
||||
tr("Time (PU)"),
|
||||
tr("Equipment Identification")},
|
||||
parent)
|
||||
, m_logger(getLogger("ManipulationModel"))
|
||||
{}
|
||||
|
||||
bool ManipulationModel::initModel(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "----- initModel";
|
||||
|
||||
if (!pdmDtc || !ppmDtc)
|
||||
return false;
|
||||
|
||||
m_ppmDtc = ppmDtc;
|
||||
m_pdmDtc = pdmDtc;
|
||||
|
||||
auto cbCs = [this](const ProjectDataManagement::CanComponentString &ccs)
|
||||
{
|
||||
m_ccsMap[ccs.canDeviceId()] = ccs;
|
||||
};
|
||||
pdmDtc->canComponentStrings(cbCs);
|
||||
|
||||
connect(m_ppmDtc.get(),
|
||||
&ParticipantManagement::Interface::Dtc::dynamicParticipantDataChanged,
|
||||
this, &ManipulationModel::manipulationDataChanged);
|
||||
connect(m_ppmDtc.get(),
|
||||
&ParticipantManagement::Interface::Dtc::participantChanged,
|
||||
this, &ManipulationModel::participantChanged);
|
||||
|
||||
auto cb = [this](const ParticipantManagement::DynamicParticipantData &partData)
|
||||
{
|
||||
manipulationDataChanged(partData, DataModification::eAdded);
|
||||
};
|
||||
m_ppmDtc->dynamicParticipantDatas(cb);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
QVariant ManipulationModel::data(const QModelIndex &index,
|
||||
int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole || !indexIsValid(index))
|
||||
return QVariant();
|
||||
|
||||
const ManipulationData &data = m_vecData.at(index.row());
|
||||
switch (index.column())
|
||||
{
|
||||
case ReceiveTime:
|
||||
return QDateTime::fromMSecsSinceEpoch(data.sampleTime);
|
||||
case EquipmentNummer:
|
||||
return data.equipNo;
|
||||
case TimePlayerUnit:
|
||||
return QDateTime::fromMSecsSinceEpoch(data.manipulationTime);
|
||||
case EquipmentIdentification:
|
||||
return data.canDevices;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
|
||||
void ManipulationModel::manipulationDataChanged(const ParticipantManagement::DynamicParticipantData &data,
|
||||
DataModification modType)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "manipulationDataChanged: " << data.manipulation().size() << ", " << modType;
|
||||
|
||||
const bool isManipulated = data.manipulation().size() > 0;
|
||||
|
||||
switch (modType)
|
||||
{
|
||||
case DataModification::eAdded:
|
||||
{
|
||||
if (!isManipulated)
|
||||
return;
|
||||
|
||||
const ManipulationData &mData = buildManipulationData(data);
|
||||
if (mData.participantId == 0)
|
||||
return;
|
||||
|
||||
insertRow(mData);
|
||||
m_participantsWithManipulation += data.participantId();
|
||||
break;
|
||||
}
|
||||
case DataModification::eModified:
|
||||
{
|
||||
const int row = findRowForId(data.participantId());
|
||||
if (isManipulated)
|
||||
{
|
||||
if (row >= 0 && data.manipulation().size() > 0 &&
|
||||
m_vecData.at(row).manipulationTime == data.manipulation().at(data.manipulation().size() - 1).manipulationTime())
|
||||
{
|
||||
// manipulation did not change - ignore
|
||||
break;
|
||||
}
|
||||
const ManipulationData mData = buildManipulationData(data);
|
||||
if (mData.participantId == 0)
|
||||
removeRow(row);
|
||||
else if (row == -1)
|
||||
insertRow(mData);
|
||||
else
|
||||
setRowData(row, mData);
|
||||
m_participantsWithManipulation += data.participantId();
|
||||
}
|
||||
else
|
||||
{
|
||||
removeRow(row);
|
||||
m_participantsWithManipulation -= data.participantId();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DataModification::eRemoved:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ManipulationModel::participantChanged(const ParticipantManagement::Participant &data, DataModification modType)
|
||||
{
|
||||
if (!m_participantsWithManipulation.contains(data.id()))
|
||||
return;
|
||||
const int row = findRowForId(data.id());
|
||||
if (row < 0)
|
||||
return;
|
||||
if (!data.equipmentNumber().is_set() || modType == DataModification::eRemoved)
|
||||
{
|
||||
removeRow(row);
|
||||
m_participantsWithManipulation -= data.id();
|
||||
return;
|
||||
}
|
||||
m_vecData[row].equipNo = data.equipmentNumber().get();
|
||||
const QModelIndex idx(index(row, EquipmentNummer));
|
||||
emit dataChanged(idx, idx, {Qt::DisplayRole});
|
||||
}
|
||||
|
||||
ManipulationData ManipulationModel::buildManipulationData(const ParticipantManagement::DynamicParticipantData &data) const
|
||||
{
|
||||
ManipulationData mData;
|
||||
if (data.manipulation().size() == 0)
|
||||
return mData;
|
||||
const auto equipNo = m_ppmDtc->participant(data.participantId()).equipmentNumber();
|
||||
if (!equipNo.is_set())
|
||||
return mData;
|
||||
mData.participantId = data.participantId();
|
||||
mData.equipNo = equipNo.get();
|
||||
mData.sampleTime = data.sampleTime();
|
||||
mData.manipulationTime = data.manipulation().at(data.manipulation().size() - 1).manipulationTime();
|
||||
mData.canDevices = buildCanDeviceString(data.manipulation());
|
||||
return mData;
|
||||
}
|
||||
|
||||
QString ManipulationModel::buildCanDeviceString(const std::vector<ParticipantManagement::ManipulationInformation>& manipulations) const
|
||||
{
|
||||
QStringList canDeviceList;
|
||||
for (const ParticipantManagement::ManipulationInformation &mi : manipulations)
|
||||
{
|
||||
auto it = m_ccsMap.find(mi.equipmentFunctionId());
|
||||
if (it == m_ccsMap.end())
|
||||
canDeviceList.prepend(tr("Unknown can device (%1)").arg(mi.equipmentFunctionId()));
|
||||
else
|
||||
canDeviceList.prepend(m_pdmDtc->trCanComponentStringName(it.value().id()));
|
||||
}
|
||||
return canDeviceList.join(QLatin1Char(','));
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// ManipulationProxyModel
|
||||
//
|
||||
void ManipulationProxyModel::setSourceModel(QAbstractItemModel *sourceModel)
|
||||
{
|
||||
m_sourceModel = qobject_cast<ManipulationModel*>(sourceModel);
|
||||
LtsWidgets::LtsColumnFilterProxyModel::setSourceModel(sourceModel);
|
||||
}
|
||||
|
||||
bool ManipulationProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
|
||||
{
|
||||
if (!m_sourceModel ||
|
||||
source_left.column() != source_right.column() ||
|
||||
!source_left.isValid() ||
|
||||
!source_right.isValid())
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
const auto &dataLeft = m_sourceModel->m_vecData.at(source_left.row());
|
||||
const auto dataRight = m_sourceModel->m_vecData.at(source_right.row());
|
||||
switch (source_left.column())
|
||||
{
|
||||
case ManipulationModel::ReceiveTime:
|
||||
return dataLeft.sampleTime < dataRight.sampleTime;
|
||||
case ManipulationModel::EquipmentNummer:
|
||||
return dataLeft.equipNo < dataRight.equipNo;
|
||||
case ManipulationModel::TimePlayerUnit:
|
||||
return dataLeft.manipulationTime < dataRight.manipulationTime;
|
||||
case ManipulationModel::EquipmentIdentification:
|
||||
return dataLeft.canDevices < dataRight.canDevices;
|
||||
}
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::lessThan(source_left, source_right);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,86 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Manipulation Message
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-10
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_abstract_table_model.h>
|
||||
#include <LtsWidgets/lts_column_filter_proxy_model.h>
|
||||
|
||||
#include <ParticipantManagement/ppm_dtc.h>
|
||||
#include <ProjectDataManagement/pdm_dtc.h>
|
||||
#include <QSet>
|
||||
#include <Common/logger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
struct ManipulationData
|
||||
{
|
||||
int participantId = 0;
|
||||
int equipNo = 0;
|
||||
qint64 sampleTime = 0;
|
||||
qint64 manipulationTime = 0;
|
||||
QString canDevices;
|
||||
|
||||
int id() const { return participantId; }
|
||||
};
|
||||
|
||||
// --------------------------------------------------------
|
||||
// ManipulationModel
|
||||
// --------------------------------------------------------
|
||||
class ManipulationModel final : public LtsWidgets::LtsAbstractTableModel<ManipulationData>
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum Columns
|
||||
{
|
||||
ReceiveTime,
|
||||
EquipmentNummer,
|
||||
TimePlayerUnit,
|
||||
EquipmentIdentification
|
||||
};
|
||||
|
||||
explicit ManipulationModel(QObject *parent = nullptr);
|
||||
|
||||
bool initModel(const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
|
||||
const std::shared_ptr<ProjectDataManagement::Interface::Dtc> &pdmDtc);
|
||||
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
private slots:
|
||||
void manipulationDataChanged(const ParticipantManagement::DynamicParticipantData &data,
|
||||
DataModification modType);
|
||||
void participantChanged(const ParticipantManagement::Participant &data, DataModification modType);
|
||||
|
||||
private:
|
||||
ManipulationData buildManipulationData(const ParticipantManagement::DynamicParticipantData &data) const;
|
||||
QString buildCanDeviceString(const std::vector<ParticipantManagement::ManipulationInformation>& manipulations) const;
|
||||
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc;
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_pdmDtc;
|
||||
QHash<int, ProjectDataManagement::CanComponentString> m_ccsMap;
|
||||
QSet<int> m_participantsWithManipulation;
|
||||
NGL::INGLLogger &m_logger;
|
||||
|
||||
friend class ManipulationProxyModel;
|
||||
};
|
||||
|
||||
class ManipulationProxyModel final : public LtsWidgets::LtsColumnFilterProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using LtsWidgets::LtsColumnFilterProxyModel::LtsColumnFilterProxyModel;
|
||||
void setSourceModel(QAbstractItemModel *sourceModel) override;
|
||||
protected:
|
||||
bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
|
||||
private:
|
||||
ManipulationModel *m_sourceModel = nullptr;
|
||||
};
|
||||
} //namespace ServiceMonitor
|
||||
@@ -0,0 +1,269 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* GUI Plugin for serviceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#include "smo_monitors_gui_plugin.h"
|
||||
#include "smo_dialog.h"
|
||||
#include "smo_fault_message_dialog.h"
|
||||
#include "smo_party_equipment_check_dialog.h"
|
||||
#include "smo_single_service_equipment_check_dialog.h"
|
||||
|
||||
#include <Common/logger.h>
|
||||
#include <Common/settings.h>
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
#include <LtsWidgets/lts_base_layout_widget.h>
|
||||
#include <Plugins/SituationMapPlugin/situation_map_gui_plugin_interface.h>
|
||||
#include <ServiceMonitor/smo_operator_rights.h>
|
||||
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
std::shared_ptr<GuiPluginBase::Interface> GuiPlugin::createGuiInterface(LtsSession::LtsSession *session)
|
||||
{
|
||||
return std::make_shared<InterfaceImpl>(session);
|
||||
}
|
||||
|
||||
|
||||
InterfaceImpl::InterfaceImpl(LtsSession::LtsSession *session)
|
||||
: GuiPluginBase::Interface(session, getLogger("MonitorGuiPlugin"))
|
||||
{}
|
||||
|
||||
bool InterfaceImpl::fetchInterfaces()
|
||||
{
|
||||
//foreign
|
||||
if (!m_session->getDtc<ParticipantManagement::DataInterface>(m_ppmDtc))
|
||||
return false;
|
||||
if (!m_session->getForeignGuiInterface<ParticipantManagement::ForeignGuiComboboxInterface>(m_ppmCbxDtc))
|
||||
return false;
|
||||
if (!m_session->getFtc<ParticipantManagement::DataInterface>(m_ppmFtc))
|
||||
return false;
|
||||
if (!m_session->getForeignGuiInterface<ParticipantManagement::ForeignParticipantInfoGuiInterface>(m_ppmGuiIfcDtc))
|
||||
return false;
|
||||
if (!m_session->getDtc<ProjectDataManagement::DataInterface>(m_pdmDtc))
|
||||
return false;
|
||||
// if (!m_session->getFtc<OcSituationServer::Interface::Ftc>(m_ossFtc))
|
||||
// return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void InterfaceImpl::clearInterfaces()
|
||||
{
|
||||
m_ppmDtc.reset();
|
||||
m_ppmCbxDtc.reset();
|
||||
m_ppmFtc.reset();
|
||||
m_ppmGuiIfcDtc.reset();
|
||||
m_pdmDtc.reset();
|
||||
// m_ossFtc.reset();
|
||||
}
|
||||
|
||||
QVector<LtsWidgets::PluginData> InterfaceImpl::getActions()
|
||||
{
|
||||
QVector<LtsWidgets::PluginData> ret;
|
||||
|
||||
LtsWidgets::PluginData plData;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.menuText = tr("BITE Monitor");
|
||||
plData.identifier = QLatin1String("smoBiteMonitors");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:pi_show_bite.svg"));
|
||||
plData.operatorRight = OperatorRights::BiteMonitorShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorBite(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
|
||||
plData.menuText = tr("Manipulation Monitor");
|
||||
plData.identifier = QStringLiteral("smoManipulationMonitor");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:status.svg"));
|
||||
plData.operatorRight = OperatorRights::ManipulationMonitorShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorMani(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
|
||||
plData.menuText = tr("Party Equipment Check");
|
||||
plData.identifier = QLatin1String("smoPartyEquipmentCheck");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:player_equipment_check.svg"));
|
||||
plData.operatorRight = OperatorRights::EquipmentCheckMonitorShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorPartyEquipmentCheck(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
|
||||
plData.menuText = tr("Single Service Equipment Check");
|
||||
plData.identifier = QLatin1String("smoSingleServiceEquipmentCheck");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:player_equipment_check.svg"));
|
||||
plData.operatorRight = OperatorRights::EquipmentCheckMonitorShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorSingleServiceEquipmentCheck(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
|
||||
plData.menuText = tr("CTAS Error Monitor");
|
||||
plData.identifier = QLatin1String("smoCtasMonitor");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:system_status.svg"));
|
||||
plData.operatorRight = OperatorRights::FaultMonitorShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorCtasError(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
|
||||
plData.menuText = tr("EGCU Monitor");
|
||||
plData.identifier = QLatin1String("smoEgcuMonitor");
|
||||
plData.menuIcon = QIcon(QLatin1String("icon:system_status.svg"));
|
||||
plData.operatorRight = OperatorRights::EquipmentCheckMonitorShow; // OperatorRights::EgcuMonitorShow;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorEgcu(parent);
|
||||
};
|
||||
|
||||
LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance();
|
||||
if (m_session->app() != LtsAppDescriptor::App::OC
|
||||
&& ps->value(QStringLiteral("smo"),
|
||||
QStringLiteral("enableEGCUMonitor")).toBool())
|
||||
ret.append(plData);
|
||||
|
||||
// Action 'Equipment Fault'
|
||||
|
||||
if (m_session->app() != LtsAppDescriptor::App::OC
|
||||
&& ps->value(QStringLiteral("smo"),
|
||||
QStringLiteral("enableFaultMessage")).toBool())
|
||||
{
|
||||
plData.menuText = tr("Fault Message");
|
||||
plData.identifier = QStringLiteral("smoFaultMessage");
|
||||
plData.menuIcon = QIcon(QStringLiteral("icon:player_equipment_fault.svg"));
|
||||
plData.operatorRight = 0;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eExecution;
|
||||
plData.createWidgetFunc = [this](QWidget * parent)
|
||||
{
|
||||
return onShowServiceMonitorFaultMessage(parent);
|
||||
};
|
||||
ret.append(plData);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void InterfaceImpl::showSingleServiceEquipmentCheck(const QVector<int> &equipmentNumbers, bool replace)
|
||||
{
|
||||
LtsWidgets::LtsBaseLayoutWidget *baseLayout = m_session->baseLayout();
|
||||
|
||||
LtsWidgets::PluginData plData;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.identifier = QLatin1String("smoSingleServiceEquipmentCheck");
|
||||
|
||||
SingleServiceEquipmentCheckDialog *dialog = nullptr;
|
||||
LtsWidgets::LtsDialog *ltsDialog = baseLayout->getWidget(plData.menuGroup, plData.identifier, plData.layoutArea);
|
||||
if (ltsDialog)
|
||||
{
|
||||
dialog = dynamic_cast<SingleServiceEquipmentCheckDialog *>(ltsDialog);
|
||||
baseLayout->focusTab(plData.menuGroup, plData.identifier, plData.layoutArea);
|
||||
}
|
||||
else
|
||||
{
|
||||
QWidget *parent = baseLayout;
|
||||
dialog = LtsWidgets::initDialog(new SingleServiceEquipmentCheckDialog(m_session, parent),
|
||||
m_ppmFtc, m_ppmGuiIfcDtc);
|
||||
baseLayout->addWidget(dialog, plData.menuGroup, plData.identifier, plData.layoutArea, plData.closable);
|
||||
}
|
||||
if (dialog)
|
||||
dialog->setEquipmentNumbers(equipmentNumbers, replace);
|
||||
}
|
||||
|
||||
void InterfaceImpl::showEgcuMonitor(const QVector<int> &structureElementIds, bool replace)
|
||||
{
|
||||
// Not yet implemented:
|
||||
Q_UNUSED(structureElementIds);
|
||||
Q_UNUSED(replace);
|
||||
|
||||
|
||||
LtsWidgets::LtsBaseLayoutWidget *baseLayout = m_session->baseLayout();
|
||||
|
||||
LtsWidgets::PluginData plData;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.identifier = QLatin1String("smoEgcuMonitor");
|
||||
|
||||
ServiceMonitorDialog *dialog = nullptr;
|
||||
LtsWidgets::LtsDialog *ltsDialog = baseLayout->getWidget(plData.menuGroup, plData.identifier, plData.layoutArea);
|
||||
if (ltsDialog)
|
||||
{
|
||||
dialog = dynamic_cast<ServiceMonitorDialog *>(ltsDialog);
|
||||
baseLayout->focusTab(plData.menuGroup, plData.identifier, plData.layoutArea);
|
||||
}
|
||||
else
|
||||
{
|
||||
QWidget *parent = baseLayout;
|
||||
dialog = LtsWidgets::initDialog(new ServiceMonitorDialog(ServiceMonitorDialog::Egcu, m_session, parent));
|
||||
baseLayout->addWidget(dialog, plData.menuGroup, plData.identifier, plData.layoutArea, plData.closable);
|
||||
}
|
||||
|
||||
if (dialog)
|
||||
dialog->setSelectedStructureElements(structureElementIds, replace);
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorBite(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new ServiceMonitorDialog(ServiceMonitorDialog::Monitor::Bite,
|
||||
m_session,
|
||||
parent));
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorMani(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new ServiceMonitorDialog(ServiceMonitorDialog::Monitor::Manipulation,
|
||||
m_session,
|
||||
parent));
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorPartyEquipmentCheck(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new PartyEquipmentCheckDialog(m_session, parent),
|
||||
m_ppmFtc, m_ppmCbxDtc);
|
||||
}
|
||||
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorSingleServiceEquipmentCheck(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new SingleServiceEquipmentCheckDialog(m_session, parent),
|
||||
m_ppmFtc, m_ppmGuiIfcDtc);
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorCtasError(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new ServiceMonitorDialog(ServiceMonitorDialog::Monitor::CtasError,
|
||||
m_session,
|
||||
parent));
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorEgcu(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new ServiceMonitorDialog(ServiceMonitorDialog::Monitor::Egcu,
|
||||
m_session,
|
||||
parent));
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowServiceMonitorFaultMessage(QWidget *parent)
|
||||
{
|
||||
return LtsWidgets::initDialog(new FaultMessageDialog(m_session, parent)/*, m_ossFtc*/);
|
||||
}
|
||||
|
||||
}
|
||||
// namespace ServiceMonitor
|
||||
@@ -0,0 +1,77 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Gui Plugin for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <Common/ProjectConfig/project_defines.h>
|
||||
//#include <OcSituationServer/oss_ftc.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_data_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
#include <Plugins/ParticipantManagement/ppm_participant_info_gui_plugin_interface.h>
|
||||
#include <Plugins/ProjectDataManagement/pdm_data_plugin_interface.h>
|
||||
#include <Plugins/ServiceMonitor/smo_monitors_gui_plugin_interface.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class GuiPlugin final : public QObject, public GuiPluginBase::Plugin
|
||||
{
|
||||
Q_PLUGIN_METADATA(IID "gui:3:smo")
|
||||
Q_INTERFACES(GuiPluginBase::Plugin)
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GuiPlugin() = default;
|
||||
~GuiPlugin() = default;
|
||||
|
||||
QString pluginName() override { return QStringLiteral("ServiceMonitorMonitorsGui"); }
|
||||
std::shared_ptr<GuiPluginBase::Interface> createGuiInterface(LtsSession::LtsSession *session) override;
|
||||
bool availableInPartition(IDL::PartitionType partition) const override
|
||||
{
|
||||
return (partition == IDL::PartitionType::Exercise);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class InterfaceImpl final : public QObject, public ForeignGuiInterface, public GuiPluginBase::Interface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit InterfaceImpl(LtsSession::LtsSession *session);
|
||||
|
||||
bool fetchInterfaces() override;
|
||||
void clearInterfaces() override;
|
||||
QVector<LtsWidgets::PluginData> getActions() override;
|
||||
QString menuGroup() const override { return tr("Service Monitors"); }
|
||||
|
||||
void showSingleServiceEquipmentCheck(const QVector<int> &equipmentNumbers, bool replace = true) override;
|
||||
void showEgcuMonitor(const QVector<int> &structureElementIds, bool replace) override;
|
||||
|
||||
private:
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorBite(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorMani(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorPartyEquipmentCheck(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorSingleServiceEquipmentCheck(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorCtasError(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorEgcu(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorSystem(QWidget *parent);
|
||||
LtsWidgets::LtsDialog *onShowServiceMonitorFaultMessage(QWidget *parent);
|
||||
|
||||
// Data
|
||||
// std::shared_ptr<OcSituationServer::Interface::Ftc> m_ossFtc{nullptr};
|
||||
std::shared_ptr<ProjectDataManagement::Interface::Dtc> m_pdmDtc{nullptr};
|
||||
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_ppmDtc{nullptr};
|
||||
std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> m_ppmCbxDtc{nullptr};
|
||||
std::shared_ptr<ParticipantManagement::Interface::Ftc> m_ppmFtc{nullptr};
|
||||
std::shared_ptr<ParticipantManagement::ForeignParticipantInfoGuiInterface> m_ppmGuiIfcDtc{nullptr};
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Party Equipment Check Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
|
||||
#include "smo_party_equipment_check_dialog.h"
|
||||
#include "ui_smo_party_equipment_check_dialog.h"
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
PartyEquipmentCheckDialog::PartyEquipmentCheckDialog(LtsSession::LtsSession *session, QWidget *parent)
|
||||
: BaseEquipmentCheck("PartyEquipmentCheckDialog", session, parent)
|
||||
, m_ui(new Ui::PartyEquipmentCheckDialog)
|
||||
, m_partyPlayerProxyModel(nullptr)
|
||||
, m_ppmCbxDtc(nullptr)
|
||||
, m_filter(ParticipantManagement::ForeignGuiComboboxInterface::eParticipantsWithCtaEquipment)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
connect(m_ui->cbParty, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||
this, &PartyEquipmentCheckDialog::onPartyCbChanged);
|
||||
connect(m_ui->cbTypeClass, QOverload<int>::of(&QComboBox::currentIndexChanged),
|
||||
this, &PartyEquipmentCheckDialog::onTypeClassCbChanged);
|
||||
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Party_Equipment_Check"));
|
||||
}
|
||||
|
||||
PartyEquipmentCheckDialog::~PartyEquipmentCheckDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
LtsDataView::LtsDataView *PartyEquipmentCheckDialog::view()
|
||||
{
|
||||
return m_ui->tvPartyPlayer;
|
||||
}
|
||||
|
||||
const LtsDataView::LtsDataView *PartyEquipmentCheckDialog::view() const
|
||||
{
|
||||
return m_ui->tvPartyPlayer;
|
||||
}
|
||||
|
||||
void PartyEquipmentCheckDialog::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Party Equipment Check"));
|
||||
m_ppmCbxDtc->fillTypeClassComboBox(m_ui->cbTypeClass, m_filter);
|
||||
}
|
||||
|
||||
void PartyEquipmentCheckDialog::tableColumnOrganiserSetting()
|
||||
{
|
||||
//LtsColumnOrganiser
|
||||
m_ui->tvPartyPlayer->setColumnsOrganiserEnabled(identifier(), true);
|
||||
}
|
||||
|
||||
bool PartyEquipmentCheckDialog::init(const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> &ppmCbxDtc)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** init() ";
|
||||
|
||||
if (!BaseEquipmentCheck::init(ppmFtc))
|
||||
return false;
|
||||
|
||||
if (!ppmCbxDtc)
|
||||
{
|
||||
ERROR_LOG(m_logger) << "init: ppmCbxDtc shared_ptr invalid";
|
||||
return false;
|
||||
}
|
||||
|
||||
m_playerModel = new PartyPlayerModel(this);
|
||||
m_playerModel->initModel(m_session);
|
||||
|
||||
m_partyPlayerProxyModel = new PartyPlayerProxyModel(this);
|
||||
m_partyPlayerProxyModel->setSourceModel(m_playerModel);
|
||||
m_ui->tvPartyPlayer->setModel(m_partyPlayerProxyModel);
|
||||
m_ui->tvPartyPlayer->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
#ifndef LTS_DEBUG
|
||||
m_ui->tvPartyPlayer->hideColumn(BasePlayerModel::Columns::ColParticipantId);
|
||||
#endif
|
||||
|
||||
m_ui->tvPartyPlayer->hideColumn(BasePlayerModel::ColParty); // until the filter is in the view via combobox
|
||||
m_ui->tvPartyPlayer->hideColumn(BasePlayerModel::ColTacticalStatus);
|
||||
m_ui->tvPartyPlayer->setSortIndicator(BasePlayerModel::ColEquipmentNummer, Qt::AscendingOrder);
|
||||
|
||||
m_ppmCbxDtc = ppmCbxDtc;
|
||||
m_ppmCbxDtc->fillPartyComboBox(m_ui->cbParty);
|
||||
m_ppmCbxDtc->fillTypeClassComboBox(m_ui->cbTypeClass, m_filter);
|
||||
onPartyCbChanged();
|
||||
onTypeClassCbChanged();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void PartyEquipmentCheckDialog::onPartyCbChanged()
|
||||
{
|
||||
const int partyId = m_ui->cbParty->currentData().toInt();
|
||||
m_partyPlayerProxyModel->setPartyId(partyId);
|
||||
}
|
||||
|
||||
void PartyEquipmentCheckDialog::onTypeClassCbChanged()
|
||||
{
|
||||
const auto tc = ParticipantManagement::TypeClass_def::type(m_ui->cbTypeClass->currentData().toInt());
|
||||
m_partyPlayerProxyModel->setTypeClass(tc);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Party Equipment Check Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_party_player_model.h"
|
||||
#include "smo_base_equipment_check.h"
|
||||
|
||||
#include <Plugins/ParticipantManagement/ppm_gui_combobox_plugin_interface.h>
|
||||
#include <ParticipantManagement/ppm_ftc.h>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class PartyEquipmentCheckDialog;
|
||||
}
|
||||
|
||||
namespace LtsSession
|
||||
{
|
||||
class LtsSession;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class PartyEquipmentCheckDialog final : public BaseEquipmentCheck
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PartyEquipmentCheckDialog(LtsSession::LtsSession *session, QWidget *parent = nullptr);
|
||||
~PartyEquipmentCheckDialog();
|
||||
|
||||
bool init(const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> &ppmCbxDtc);
|
||||
|
||||
private slots:
|
||||
void onPartyCbChanged();
|
||||
void onTypeClassCbChanged();
|
||||
|
||||
protected:
|
||||
LtsDataView::LtsDataView *view() override;
|
||||
const LtsDataView::LtsDataView *view() const override;
|
||||
|
||||
private:
|
||||
void retranslate() override;
|
||||
void tableColumnOrganiserSetting() override;
|
||||
|
||||
Ui::PartyEquipmentCheckDialog *m_ui;
|
||||
PartyPlayerProxyModel *m_partyPlayerProxyModel;
|
||||
std::shared_ptr<ParticipantManagement::ForeignGuiComboboxInterface> m_ppmCbxDtc;
|
||||
const int m_filter;
|
||||
};
|
||||
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PartyEquipmentCheckDialog</class>
|
||||
<widget class="QWidget" name="PartyEquipmentCheckDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>570</width>
|
||||
<height>664</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">Equipment Check</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Party:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="cbParty"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="leTypeClass">
|
||||
<property name="text">
|
||||
<string>Class:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="LtsWidgets::LtsComboBox" name="cbTypeClass"/>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="LtsDataView::LtsDataView" name="tvPartyPlayer"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LtsWidgets::LtsComboBox</class>
|
||||
<extends>QComboBox</extends>
|
||||
<header>LtsWidgets/lts_combo_box.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>LtsDataView::LtsDataView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>LtsDataView/lts_data_view.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Equipment Check Force
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#include "smo_party_player_model.h"
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
PartyPlayerModel::PartyPlayerModel(QObject *parent)
|
||||
: BasePlayerModel(parent)
|
||||
{}
|
||||
|
||||
bool PartyPlayerModel::initModel(LtsSession::LtsSessionDataDds *session)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** initModel";
|
||||
|
||||
if (!BasePlayerModel::initModel(session))
|
||||
return false;
|
||||
|
||||
QVector<PlayerData> playerData;
|
||||
playerData.reserve(m_participants.size());
|
||||
const auto dynPartData = m_ppmDtc->dynamicParticipantDatas();
|
||||
for (const ParticipantManagement::Participant &part : qAsConst(m_participants))
|
||||
{
|
||||
if (!part.equipmentNumber().is_set())
|
||||
continue;
|
||||
playerData.push_back(setPlayerData(part, dynPartData.value(part.id())));
|
||||
};
|
||||
setData(playerData);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------
|
||||
// PartyPlayerProxyModel
|
||||
// --------------------------------------------------------
|
||||
bool PartyPlayerProxyModel::filterAcceptsRow(int source_row,
|
||||
const QModelIndex &source_parent) const
|
||||
{
|
||||
if (m_sourceModel)
|
||||
{
|
||||
if (m_partyId > 0 &&
|
||||
!m_sourceModel->isPartyId(source_row, m_partyId))
|
||||
return false;
|
||||
if (m_typeClass != ParticipantManagement::TypeClass::Unknown &&
|
||||
!m_sourceModel->isTypeClass(source_row, m_typeClass))
|
||||
return false;
|
||||
}
|
||||
return LtsWidgets::LtsColumnFilterProxyModel::filterAcceptsRow(source_row, source_parent);
|
||||
}
|
||||
|
||||
void PartyPlayerProxyModel::setPartyId(int partyId)
|
||||
{
|
||||
if (m_partyId == partyId)
|
||||
return;
|
||||
m_partyId = partyId;
|
||||
invalidateFilter();
|
||||
}
|
||||
|
||||
void PartyPlayerProxyModel::setTypeClass(ParticipantManagement::TypeClass typeClass)
|
||||
{
|
||||
if (m_typeClass == typeClass)
|
||||
return;
|
||||
m_typeClass = typeClass;
|
||||
invalidateFilter();
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Equipment Check Force
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_base_player_model.h"
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
// --------------------------------------------------------
|
||||
// PartyPlayerModel
|
||||
// --------------------------------------------------------
|
||||
class PartyPlayerModel final : public BasePlayerModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PartyPlayerModel(QObject *parent = nullptr);
|
||||
|
||||
bool initModel(LtsSession::LtsSessionDataDds *session) override;
|
||||
QVector<int> updateDataView(const QVector<int> &equipNumberList) override { Q_UNUSED(equipNumberList); return {}; }
|
||||
void loadData(const QVector<int> &idList) override { Q_UNUSED(idList); }
|
||||
|
||||
};
|
||||
|
||||
// --------------------------------------------------------
|
||||
// PartyPlayerProxyModel
|
||||
// --------------------------------------------------------
|
||||
class PartyPlayerProxyModel final : public BasePlayerProxyModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using BasePlayerProxyModel::BasePlayerProxyModel;
|
||||
|
||||
public slots:
|
||||
void setPartyId(int partyId);
|
||||
void setTypeClass(ParticipantManagement::TypeClass typeClass);
|
||||
|
||||
protected:
|
||||
bool filterAcceptsRow(int source_row,
|
||||
const QModelIndex &source_parent) const override;
|
||||
|
||||
int m_partyId = -1;
|
||||
ParticipantManagement::TypeClass m_typeClass = ParticipantManagement::TypeClass::Unknown;
|
||||
};
|
||||
|
||||
} //namespace ServiceMonitor
|
||||
@@ -0,0 +1,161 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Equipment Check Single Service
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#include "smo_single_player_model.h"
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
void SinglePlayerModel::loadData(const QVector<int> &idList)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** loadData: ";
|
||||
|
||||
const QMap<qint32,ParticipantManagement::Participant> participants =
|
||||
m_ppmDtc->participants();
|
||||
const QMap<qint32, ParticipantManagement::DynamicParticipantData> dynPartData =
|
||||
m_ppmDtc->dynamicParticipantDatas();
|
||||
|
||||
QVector<int> equipNos;
|
||||
QVector<PlayerData> newRows;
|
||||
newRows.reserve(idList.size());
|
||||
for (int id : idList)
|
||||
{
|
||||
if (id < 0)
|
||||
{
|
||||
equipNos += id;
|
||||
continue;
|
||||
}
|
||||
auto itParticipants = participants.find(id);
|
||||
if (itParticipants == participants.end())
|
||||
continue; // participant with id not available
|
||||
const auto &participant = itParticipants.value();
|
||||
if (!participant.equipmentNumber().is_set())
|
||||
continue; // participant has (currently) no equipment number
|
||||
const int row = findRowForId(participant.id());
|
||||
if (row == -1)
|
||||
{
|
||||
auto itDynData = dynPartData.find(participant.id());
|
||||
newRows.push_back(setPlayerData(itParticipants.value(), itDynData == dynPartData.end() ?
|
||||
ParticipantManagement::DynamicParticipantData() :
|
||||
itDynData.value()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// nothing to do, participant already in list
|
||||
}
|
||||
}
|
||||
if (!equipNos.isEmpty())
|
||||
{
|
||||
for (const auto &participant : participants)
|
||||
{
|
||||
if (equipNos.isEmpty())
|
||||
break;
|
||||
if (participant.equipmentNumber().is_set() && equipNos.contains(-participant.equipmentNumber().get()))
|
||||
{
|
||||
equipNos.removeAll(-participant.equipmentNumber().get());
|
||||
int row = findRowForId(participant.id());
|
||||
if (row < 0)
|
||||
row = findRowForId(-participant.equipmentNumber().get());
|
||||
if (row == -1)
|
||||
{
|
||||
auto itDynData = dynPartData.find(participant.id());
|
||||
newRows.push_back(setPlayerData(participant, itDynData == dynPartData.end() ?
|
||||
ParticipantManagement::DynamicParticipantData() :
|
||||
itDynData.value()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int equipNo : qAsConst(equipNos))
|
||||
{
|
||||
ParticipantManagement::Participant p;
|
||||
p.id(equipNo); // already negative
|
||||
p.equipmentNumber(-equipNo);
|
||||
if (!findParticipantId(p.id()))
|
||||
newRows.push_back(setPlayerData(p, ParticipantManagement::DynamicParticipantData()));
|
||||
}
|
||||
insertRows(newRows);
|
||||
}
|
||||
|
||||
QVector<int> SinglePlayerModel::updateDataView(const QVector<int> &equipNumberList)
|
||||
{
|
||||
QVector<int> ret;
|
||||
DEBUG_LOG(m_logger) << "**** updateDataView: ";
|
||||
|
||||
QVector<PlayerData> newRows;
|
||||
newRows.reserve(equipNumberList.size());
|
||||
|
||||
const QHash<int, ParticipantManagement::Participant> equipNo2PartMap(participantsByEquipNo());
|
||||
const QMap<qint32, ParticipantManagement::DynamicParticipantData> dynPartData =
|
||||
m_ppmDtc->dynamicParticipantDatas();
|
||||
|
||||
for (int number : equipNumberList)
|
||||
{
|
||||
auto itEquipNo = equipNo2PartMap.find(number);
|
||||
if (itEquipNo == equipNo2PartMap.end())
|
||||
{
|
||||
ParticipantManagement::Participant p;
|
||||
p.id(-number);
|
||||
p.equipmentNumber(number);
|
||||
if (!findParticipantId(p.id()))
|
||||
newRows.push_back(setPlayerData(p, ParticipantManagement::DynamicParticipantData()));
|
||||
continue; // equipNo currently not available
|
||||
}
|
||||
const auto &participant = itEquipNo.value();
|
||||
ret += participant.id();
|
||||
const int row = findRowForId(participant.id());
|
||||
if (row == -1)
|
||||
{
|
||||
auto itDynData = dynPartData.find(participant.id());
|
||||
newRows.push_back(setPlayerData(itEquipNo.value(),
|
||||
itDynData == dynPartData.end() ?
|
||||
ParticipantManagement::DynamicParticipantData() :
|
||||
itDynData.value()));
|
||||
}
|
||||
else
|
||||
{
|
||||
// nothing to do, equipment number already in list
|
||||
}
|
||||
}
|
||||
insertRows(newRows);
|
||||
return ret;
|
||||
}
|
||||
|
||||
QHash<int,ParticipantManagement::Participant> SinglePlayerModel::participantsByEquipNo() const
|
||||
{
|
||||
QHash<int,ParticipantManagement::Participant> ret;
|
||||
ret.reserve(m_participants.size());
|
||||
for (const ParticipantManagement::Participant &part : m_participants)
|
||||
{
|
||||
if (part.equipmentNumber().is_set())
|
||||
ret.insert(part.equipmentNumber().get(), part);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
QStringList SinglePlayerModel::getAllParticipantIds() const
|
||||
{
|
||||
QStringList ids;
|
||||
ids.reserve(m_vecData.size());
|
||||
for (const auto &playerData : m_vecData)
|
||||
ids.append(QString::number(playerData.participantId));
|
||||
return ids;
|
||||
}
|
||||
|
||||
bool SinglePlayerModel::findParticipantId(int id) const
|
||||
{
|
||||
for (const auto &playerData : m_vecData)
|
||||
{
|
||||
if (playerData.participantId == id)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Model for Equipment Check
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_base_player_model.h"
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
// --------------------------------------------------------
|
||||
// SinglePlayerModel
|
||||
// --------------------------------------------------------
|
||||
class SinglePlayerModel final : public BasePlayerModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
using BasePlayerModel::BasePlayerModel;
|
||||
|
||||
QVector<int> updateDataView(const QVector<int> &equipNumberList) override;
|
||||
void loadData(const QVector<int> &idList) override;
|
||||
QStringList getAllParticipantIds() const override;
|
||||
|
||||
private:
|
||||
// EquipNo, ParticipantId
|
||||
QHash<int, ParticipantManagement::Participant> participantsByEquipNo() const;
|
||||
bool findParticipantId(int id) const;
|
||||
};
|
||||
|
||||
} //namespace ServiceMonitor
|
||||
+266
@@ -0,0 +1,266 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Single Service Equipment Check Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#include "smo_single_service_equipment_check_dialog.h"
|
||||
#include "ui_smo_single_service_equipment_check_dialog.h"
|
||||
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <FileManagement/flm_translation.h>
|
||||
|
||||
#include <QJsonArray>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
SingleServiceEquipmentCheckDialog::SingleServiceEquipmentCheckDialog(LtsSession::LtsSession *session, QWidget *parent)
|
||||
: BaseEquipmentCheck("SingleServiceEquipmentCheckDialog", session, parent)
|
||||
, m_ppmGuiIfcDtc(nullptr)
|
||||
, m_flmGui(nullptr)
|
||||
, m_ui(new Ui::SingleServiceEquipmentCheckDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Show,
|
||||
this,
|
||||
&SingleServiceEquipmentCheckDialog::onShowClicked);
|
||||
m_buttonBox->connectButton(LtsWidgets::DialogButton::Remove,
|
||||
this,
|
||||
&SingleServiceEquipmentCheckDialog::onRemoveClicked);
|
||||
|
||||
// Save/Load from Library Button
|
||||
m_buttonBox->connectLibraryButton(this,
|
||||
&SingleServiceEquipmentCheckDialog::onLoadClicked,
|
||||
&SingleServiceEquipmentCheckDialog::onSaveClicked);
|
||||
|
||||
if (!session->getForeignGuiInterface<FileManagement::ForeignGuiInterface>(m_flmGui))
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Library, false);
|
||||
|
||||
connect(m_ui->leEquipNumber, &QLineEdit::returnPressed,
|
||||
this, &SingleServiceEquipmentCheckDialog::onAddEquipmentNr);
|
||||
connect(m_ui->pbAddEquip, &QPushButton::clicked,
|
||||
this, &SingleServiceEquipmentCheckDialog::onAddEquipmentNr);
|
||||
connect(m_ui->tvSinglePlayer, &LtsDataView::LtsDataView::doubleClicked,
|
||||
this, &SingleServiceEquipmentCheckDialog::onShowClicked);
|
||||
|
||||
m_ui->cbRequestBITOnAdd->setChecked(true);
|
||||
|
||||
setOnlineHelpFilename(QStringLiteral("Situation-Single_Service_Equipment_Check"));
|
||||
}
|
||||
|
||||
SingleServiceEquipmentCheckDialog::~SingleServiceEquipmentCheckDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Single Service Equipment Check"));
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::tableColumnOrganiserSetting()
|
||||
{
|
||||
//LtsColumnOrganiser
|
||||
m_ui->tvSinglePlayer->setColumnsOrganiserEnabled(identifier(), true);
|
||||
}
|
||||
|
||||
bool SingleServiceEquipmentCheckDialog::init(const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignParticipantInfoGuiInterface> &ppmGuiIfcDtc)
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** init() ";
|
||||
|
||||
if (!BaseEquipmentCheck::init(ppmFtc))
|
||||
{
|
||||
ERROR_LOG(m_logger) << "init: ppmDtc or ppmFtc shared_ptr invalid";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!ppmGuiIfcDtc)
|
||||
{
|
||||
ERROR_LOG(m_logger) << "init: ppmGuiIfcDtc shared_ptr invalid";
|
||||
return false;
|
||||
}
|
||||
m_ppmGuiIfcDtc = ppmGuiIfcDtc;
|
||||
|
||||
if (!m_session->getForeignGuiInterface<FileManagement::ForeignGuiInterface>(m_flmGui))
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Load, false);
|
||||
|
||||
m_playerModel = new SinglePlayerModel(this);
|
||||
m_playerModel->initModel(m_session);
|
||||
auto proxyModel = new BasePlayerProxyModel(this);
|
||||
proxyModel->setSourceModel(static_cast<SinglePlayerModel *>(m_playerModel));
|
||||
proxyModel->setDynamicSortFilter(false);
|
||||
m_ui->tvSinglePlayer->setSortingEnabled(true);
|
||||
m_ui->tvSinglePlayer->setModel(proxyModel);
|
||||
m_ui->tvSinglePlayer->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||
#ifndef LTS_DEBUG
|
||||
m_ui->tvSinglePlayer->hideColumn(BasePlayerModel::ColParticipantId);
|
||||
#endif
|
||||
m_ui->tvSinglePlayer->setSortIndicator(BasePlayerModel::ColPositionAge, Qt::AscendingOrder);
|
||||
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Save, false);
|
||||
connect(m_playerModel, &SinglePlayerModel::rowsInserted, this, [this]()
|
||||
{
|
||||
if (m_flmGui)
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Save, m_playerModel->rowCount() > 0);
|
||||
});
|
||||
connect(m_playerModel, &SinglePlayerModel::rowsRemoved, this, [this]()
|
||||
{
|
||||
if (m_flmGui)
|
||||
m_buttonBox->setButtonEnabled(LtsWidgets::DialogButton::Save, m_playerModel->rowCount() > 0);
|
||||
});
|
||||
|
||||
|
||||
const bool showPvSan = LtsUtils::ProjectSettings::isFunctionEnabled(QStringLiteral("ParticipantInformation"),
|
||||
QStringLiteral("HasPvSan"));
|
||||
m_ui->cbResetSanMat->setVisible(showPvSan);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::setEquipmentNumbers(const QVector<int> &equipmentNumbers, bool replace)
|
||||
{
|
||||
// do not trigger BITE:
|
||||
m_ui->cbRequestBITOnAdd->setChecked(false);
|
||||
|
||||
if (replace)
|
||||
m_playerModel->clear();
|
||||
SinglePlayerModel *spm = static_cast<SinglePlayerModel *>(m_playerModel);
|
||||
spm->updateDataView(equipmentNumbers);
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
BaseEquipmentCheck::keyPressEvent(event);
|
||||
if (event->key() == Qt::Key_Delete)
|
||||
onRemoveClicked();
|
||||
}
|
||||
|
||||
LtsDataView::LtsDataView *SingleServiceEquipmentCheckDialog::view()
|
||||
{
|
||||
return m_ui->tvSinglePlayer;
|
||||
}
|
||||
|
||||
const LtsDataView::LtsDataView *SingleServiceEquipmentCheckDialog::view() const
|
||||
{
|
||||
return m_ui->tvSinglePlayer;
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::onShowClicked()
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** onShowClicked() ";
|
||||
|
||||
const QModelIndexList selectedRows = m_ui->tvSinglePlayer->selectedRows();
|
||||
for (const QModelIndex &idx : selectedRows)
|
||||
{
|
||||
const int id = m_playerModel->getRowData(idx.row()).participantId;
|
||||
if (id <= 0)
|
||||
continue;
|
||||
m_ppmGuiIfcDtc->showParticipantInfoWindow(id);
|
||||
}
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::onRemoveClicked()
|
||||
{
|
||||
DEBUG_LOG(m_logger) << "**** onRemoveClicked() ";
|
||||
|
||||
m_playerModel->removeItems(m_ui->tvSinglePlayer->selectedRows());
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::onSaveClicked()
|
||||
{
|
||||
if (!m_flmGui)
|
||||
return;
|
||||
DEBUG_LOG(m_logger) << "**** onSaveClicked() ";
|
||||
|
||||
QJsonArray ids = QJsonArray::fromStringList(m_playerModel->getAllParticipantIds());
|
||||
|
||||
if (ids.isEmpty())
|
||||
return;
|
||||
|
||||
QJsonObject saveObject;
|
||||
saveObject[QStringLiteral("XmlType")] = FileManagement::toString(FileManagement::XmlType::SMOSingleServiceEquipmentCheck);
|
||||
saveObject[QStringLiteral("Ids")] = ids;
|
||||
|
||||
const QJsonDocument saveDoc(saveObject);
|
||||
|
||||
int fileId = m_flmGui->saveFileContent(this, FileManagement::FileType::Xml, m_session->exerciseId(), saveDoc.toJson(QJsonDocument::Compact));
|
||||
if (fileId > 0)
|
||||
DEBUG_LOG(m_logger) << "Saved file with id = " << fileId;
|
||||
else
|
||||
ERROR_LOG(m_logger) << "Could not save file in library ";
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::onLoadClicked()
|
||||
{
|
||||
if (!m_flmGui)
|
||||
return;
|
||||
|
||||
DEBUG_LOG(m_logger) << "**** onLoadClicked() ";
|
||||
|
||||
QByteArray content;
|
||||
int fileId = m_flmGui->loadFileContent(this, content, {FileManagement::FileType::Xml}, m_session->exerciseId(), FileManagement::toString(FileManagement::XmlType::SMOSingleServiceEquipmentCheck));
|
||||
if (fileId > 0)
|
||||
{
|
||||
if (!m_flmGui->isXmlType(content, FileManagement::toString(FileManagement::XmlType::SMOSingleServiceEquipmentCheck)))
|
||||
{
|
||||
QHash<LtsWidgets::Button, QString> texts({{LtsWidgets::Button::Yes, tr("Ok")}});
|
||||
LtsWidgets::LtsMessageDialog::showMessage(this,
|
||||
tr("Invalid xml file content"),
|
||||
windowTitle(),
|
||||
LtsWidgets::Behaviour::Modal,
|
||||
LtsWidgets::Button::Yes,
|
||||
texts);
|
||||
}
|
||||
else
|
||||
{
|
||||
const QJsonDocument loadDoc(QJsonDocument::fromJson(content));
|
||||
const QJsonArray arr = loadDoc.object().value(QStringLiteral("Ids")).toArray();
|
||||
QVector<int> playerList;
|
||||
playerList.reserve(arr.size());
|
||||
for (const auto &val : arr)
|
||||
playerList.append(val.toString().toInt());
|
||||
|
||||
m_playerModel->loadData(playerList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::addEquipmentNr(int equipmentNumber)
|
||||
{
|
||||
auto ret = m_playerModel->updateDataView({equipmentNumber});
|
||||
|
||||
if (ret.isEmpty())
|
||||
return;
|
||||
|
||||
std::vector<int> vec;
|
||||
vec.push_back(ret.first());
|
||||
if (m_ui->cbRequestBITOnAdd->isChecked())
|
||||
sendBiteRequest(vec, false);
|
||||
|
||||
sendInitRequest(vec,
|
||||
m_ui->cbResetManipulation->isChecked(),
|
||||
m_ui->cbResetGearCharge->isChecked(),
|
||||
m_ui->cbInit->isChecked(),
|
||||
m_ui->cbResetSanMat->isChecked());
|
||||
}
|
||||
|
||||
void SingleServiceEquipmentCheckDialog::onAddEquipmentNr()
|
||||
{
|
||||
if (m_ui->leEquipNumber->text().isEmpty())
|
||||
return;
|
||||
|
||||
const int eqNo = m_ui->leEquipNumber->text().toInt();
|
||||
m_ui->leEquipNumber->clear();
|
||||
|
||||
addEquipmentNr(eqNo);
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Single Service Equipment Check Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-16
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_base_equipment_check.h"
|
||||
#include "smo_single_player_model.h"
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
|
||||
#include <Plugins/ParticipantManagement/ppm_participant_info_gui_plugin_interface.h>
|
||||
#include <Plugins/FileManagement/flm_explorer_gui_plugin_interface.h>
|
||||
|
||||
class QItemSelection;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class SingleServiceEquipmentCheckDialog;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class SingleServiceEquipmentCheckDialog final : public BaseEquipmentCheck
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SingleServiceEquipmentCheckDialog(LtsSession::LtsSession *session, QWidget *parent = nullptr);
|
||||
~SingleServiceEquipmentCheckDialog();
|
||||
|
||||
bool init(const std::shared_ptr<ParticipantManagement::Interface::Ftc> &ppmFtc,
|
||||
const std::shared_ptr<ParticipantManagement::ForeignParticipantInfoGuiInterface> &ppmGuiIfcDtc);
|
||||
|
||||
void setEquipmentNumbers(const QVector<int> &equipmentNumbers, bool replace = true);
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *event) override;
|
||||
LtsDataView::LtsDataView *view() override;
|
||||
const LtsDataView::LtsDataView *view() const override;
|
||||
|
||||
private slots:
|
||||
void onShowClicked();
|
||||
void onRemoveClicked();
|
||||
void onSaveClicked();
|
||||
void onLoadClicked();
|
||||
void onAddEquipmentNr();
|
||||
|
||||
private:
|
||||
void addEquipmentNr(int equipmentNumber);
|
||||
void retranslate() override;
|
||||
void tableColumnOrganiserSetting() override;
|
||||
|
||||
std::shared_ptr<ParticipantManagement::ForeignParticipantInfoGuiInterface> m_ppmGuiIfcDtc;
|
||||
std::shared_ptr<FileManagement::ForeignGuiInterface> m_flmGui;
|
||||
Ui::SingleServiceEquipmentCheckDialog *m_ui;
|
||||
};
|
||||
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SingleServiceEquipmentCheckDialog</class>
|
||||
<widget class="QWidget" name="SingleServiceEquipmentCheckDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>999</width>
|
||||
<height>473</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true">Equipment Check</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="lEquipNumber">
|
||||
<property name="text">
|
||||
<string>Add Equipment Number:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="leEquipNumber"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pbAddEquip">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Add</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbRequestBITOnAdd">
|
||||
<property name="text">
|
||||
<string>Request BITE</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbInit">
|
||||
<property name="text">
|
||||
<string>Init</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbResetManipulation">
|
||||
<property name="text">
|
||||
<string>Reset Manipulation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbResetGearCharge">
|
||||
<property name="text">
|
||||
<string>Reset Gear Charge</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="cbResetSanMat">
|
||||
<property name="text">
|
||||
<string>Reset Medical Supplies</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="LtsDataView::LtsDataView" name="tvSinglePlayer" native="true"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>LtsDataView::LtsDataView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>LtsDataView/lts_data_view.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,173 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Edit the defaults for an EGCU
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Malte Diers, SLTE, 2021-05-10
|
||||
*/
|
||||
|
||||
#include "smo_structure_element_edit.h"
|
||||
#include "ui_smo_structure_element_edit.h"
|
||||
|
||||
#include <Common/logger.h>
|
||||
|
||||
// Lts
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsUtilsGuiDds/request_helper.h>
|
||||
|
||||
// DDS
|
||||
#include <AssetManagement/asm_data_plugin_interface.h>
|
||||
#include <InfrastructureManagement/ism_data_plugin_interface.h>
|
||||
|
||||
// Qt
|
||||
#include <QComboBox>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonArray>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
StructureElementEdit::StructureElementEdit(const QString &menuGroup, QWidget *parent, LtsWidgets::ButtonCombination buttonCombination)
|
||||
: LtsWidgets::LtsDialog(parent, buttonCombination)
|
||||
, m_menuGroup(menuGroup)
|
||||
, m_requestHelper(new LtsUtils::RequestHelper(this))
|
||||
, m_logger(getLogger(QLatin1String("StructureElementEdit")))
|
||||
, m_ui(new Ui::StructureElementEdit)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
}
|
||||
|
||||
bool StructureElementEdit::init(const InfrastructureManagement::StructureElement &data, LtsSession::LtsSession *session)
|
||||
{
|
||||
m_structureElement = data;
|
||||
|
||||
if (!session->getDtc<InfrastructureManagement::DataInterface>(m_ismDtc))
|
||||
return false;
|
||||
if (!session->getFtc<InfrastructureManagement::DataInterface>(m_ismFtc))
|
||||
return false;
|
||||
|
||||
if (m_structureElement.structureElementTypeId() != InfrastructureManagement::StructureElementType_def::Building)
|
||||
{
|
||||
m_ui->groupBox->hide(); // Flashing
|
||||
}
|
||||
|
||||
|
||||
m_ui->cbFlashing->addItem(tr("Off"), InfrastructureManagement::EffectOverride_def::PermanentOff);
|
||||
m_ui->cbFlashing->addItem(tr("Auto"), InfrastructureManagement::EffectOverride_def::Automatic);
|
||||
m_ui->cbFlashing->setCurrentIndex(m_ui->cbFlashing->findData(InfrastructureManagement::EffectOverride_def::Automatic));
|
||||
|
||||
updateComboBoxes();
|
||||
|
||||
m_ui->lblRoom->hide();
|
||||
m_ui->lbxRoom->hide();
|
||||
m_ui->lblFloor->hide();
|
||||
m_ui->lbxFloor->hide();
|
||||
|
||||
switch (m_structureElement.path().size()) {
|
||||
case 3:
|
||||
m_ui->lblRoom->setText(structureElementName(m_structureElement.path()[2]));
|
||||
m_ui->lblRoom->show();
|
||||
m_ui->lbxRoom->show();
|
||||
Q_FALLTHROUGH();
|
||||
case 2:
|
||||
m_ui->lblFloor->setText(structureElementName(m_structureElement.path()[1]));
|
||||
m_ui->lblFloor->show();
|
||||
m_ui->lbxFloor->show();
|
||||
Q_FALLTHROUGH();
|
||||
case 1:
|
||||
m_ui->lblBuilding->setText(structureElementName(m_structureElement.path()[0]));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
QString StructureElementEdit::structureElementName(int seId)
|
||||
{
|
||||
InfrastructureManagement::StructureElement se;
|
||||
m_ismDtc->getStructureElementById(seId, se);
|
||||
return QString::fromStdString(se.displayName());
|
||||
}
|
||||
|
||||
|
||||
StructureElementEdit::~StructureElementEdit()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void StructureElementEdit::updateComboBoxes()
|
||||
{
|
||||
QJsonParseError parserError;
|
||||
QByteArray content = QByteArray::fromStdString(m_structureElement.properties());
|
||||
const QJsonDocument doc(QJsonDocument::fromJson(content, &parserError));
|
||||
|
||||
if (parserError.error != QJsonParseError::NoError)
|
||||
return;
|
||||
|
||||
QJsonObject docObj = QJsonObject(doc.object());
|
||||
|
||||
if ( !docObj.contains(QStringLiteral("Overrides")))
|
||||
return;
|
||||
QJsonObject overridesObj = docObj.value(QStringLiteral("Overrides")).toObject();
|
||||
|
||||
int flashValue = overridesObj.value(QStringLiteral("flash")).toInt();
|
||||
m_ui->cbFlashing->setCurrentIndex(m_ui->cbFlashing->findData(flashValue));
|
||||
}
|
||||
|
||||
QString StructureElementEdit::dialogIdentifier() const
|
||||
{
|
||||
return QLatin1String("StructureElementEdit") + QString::number(m_structureElement.id());
|
||||
}
|
||||
|
||||
void StructureElementEdit::retranslate()
|
||||
{
|
||||
translate(m_ui, tr("Edit Building/Floor/Room: %1").arg(QString::fromStdString(m_structureElement.displayName())));
|
||||
}
|
||||
|
||||
void StructureElementEdit::onStructureElementModifyReply(const Core::FunctionReplyObject &replyObject)
|
||||
{
|
||||
m_requestHelper->requestReply(replyObject);
|
||||
}
|
||||
|
||||
bool StructureElementEdit::apply()
|
||||
{
|
||||
std::string properties;
|
||||
QByteArray content_neu;
|
||||
|
||||
properties= m_structureElement.properties();
|
||||
DEBUG_LOG(m_logger) << "structureElementId=" << m_structureElement.id()
|
||||
<< " properties=" << properties
|
||||
<< " MountingPointType=" << m_structureElement.mountingPointTypeId()
|
||||
<< " structureElementTypeId=" << m_structureElement.structureElementTypeId();
|
||||
|
||||
QJsonObject resultObj;
|
||||
QJsonObject overrideObj;
|
||||
if (m_ui->cbFlashing->currentData().toInt() != InfrastructureManagement::EffectOverride_def::Automatic)
|
||||
overrideObj.insert(QStringLiteral("flash"), m_ui->cbFlashing->currentData().toInt());
|
||||
if (overrideObj.size())
|
||||
resultObj.insert (QStringLiteral("Overrides"), overrideObj);
|
||||
content_neu = QJsonDocument(resultObj).toJson(QJsonDocument::Compact);
|
||||
|
||||
if (content_neu.toStdString() == properties)
|
||||
return true;
|
||||
|
||||
m_structureElement.properties(content_neu.toStdString());
|
||||
ERROR_LOG(m_logger) << "properties=" << m_structureElement.properties()
|
||||
<< " name=" << m_structureElement.name()
|
||||
<< " seId=" << m_structureElement.id()
|
||||
<< " mountingPointId=" << m_structureElement.mountingPointId();
|
||||
|
||||
InfrastructureManagement::StructureElementModifyRequest request;
|
||||
request.mainStructureElementId(m_structureElement.mainStructureElementId());
|
||||
request.elements().resize(1);
|
||||
request.elements().at(0) = m_structureElement;
|
||||
|
||||
m_requestHelper->addRequest([this, request]() {return m_ismFtc->structureElementModifyRequest(request, this);});
|
||||
m_requestHelper->startRequests();
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Edit the defaults for an EGCU
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Malte Diers, SLTE, 2021-05-10
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "smo_egcu_model.h"
|
||||
|
||||
#include <InfrastructureManagement/ism_ftc.h>
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
|
||||
|
||||
namespace Ui {
|
||||
class StructureElementEdit;
|
||||
}
|
||||
namespace LtsSession {
|
||||
class LtsSession;
|
||||
}
|
||||
namespace LtsUtils {
|
||||
class RequestHelper;
|
||||
}
|
||||
class QTreeWidgetItem;
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class StructureElementEdit
|
||||
: public LtsWidgets::LtsDialog
|
||||
, protected InfrastructureManagement::Interface::Ftc::StructureElementModifyReplyHandler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit StructureElementEdit(const QString &menuGroup,
|
||||
QWidget *parent = nullptr,
|
||||
LtsWidgets::ButtonCombination buttonCombination = LtsWidgets::ButtonCombination::OkApplyCancel);
|
||||
~StructureElementEdit();
|
||||
QString menuGroup() const { return m_menuGroup; }
|
||||
QString dialogIdentifier() const;
|
||||
|
||||
bool init(const InfrastructureManagement::StructureElement &data, LtsSession::LtsSession *session);
|
||||
|
||||
void onStructureElementModifyReply(const Core::FunctionReplyObject &replyObject) override final;
|
||||
|
||||
bool apply() override;
|
||||
private:
|
||||
void retranslate() override;
|
||||
void updateComboBoxes();
|
||||
|
||||
private:
|
||||
|
||||
InfrastructureManagement::StructureElement m_structureElement;
|
||||
QString m_menuGroup;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Dtc> m_ismDtc;
|
||||
std::shared_ptr<InfrastructureManagement::Interface::Ftc> m_ismFtc;
|
||||
LtsUtils::RequestHelper *m_requestHelper;
|
||||
|
||||
NGL::INGLLogger &m_logger;
|
||||
Ui::StructureElementEdit *m_ui;
|
||||
QString structureElementName(int seId);
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,101 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>StructureElementEdit</class>
|
||||
<widget class="QWidget" name="StructureElementEdit">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>781</width>
|
||||
<height>473</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="lbxFloor">
|
||||
<property name="text">
|
||||
<string>Floor:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="lbxRoom">
|
||||
<property name="text">
|
||||
<string>Room:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Flashing</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QComboBox" name="cbFlashing"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="lblRoom">
|
||||
<property name="text">
|
||||
<string notr="true"><ROOM></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="lbxBuilding">
|
||||
<property name="text">
|
||||
<string>Building:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="lblBuilding">
|
||||
<property name="text">
|
||||
<string notr="true"><BUILDING></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>210</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="lblFloor">
|
||||
<property name="text">
|
||||
<string notr="true"><FLOOR></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -0,0 +1,32 @@
|
||||
#
|
||||
# $Id$
|
||||
# $HeadURL$
|
||||
# $Author$
|
||||
# Created by Astrid Mueller, SLSE, 2016-02-29
|
||||
#
|
||||
|
||||
SET(smo_system_monitor_gui_SRCS
|
||||
smo_system_monitor_gui_plugin.cpp
|
||||
smo_system_monitor_gui_plugin.h
|
||||
smo_system_monitor_dialog.cpp
|
||||
smo_system_monitor_dialog.h
|
||||
)
|
||||
|
||||
NGL_WRAP_UI(smo_system_monitor_gui_SRCS
|
||||
smo_system_monitor_dialog.ui
|
||||
)
|
||||
|
||||
NGL_ADD_LIBRARY(WS SmoSystemMonitorGuiPlugin MODULE ${smo_system_monitor_gui_SRCS})
|
||||
NGL_TARGET_LINK_LIBRARIES(SmoSystemMonitorGuiPlugin
|
||||
LtsSession
|
||||
LtsUtilsSettings
|
||||
Qt5::WebEngineWidgets
|
||||
Qt5::Widgets
|
||||
SmoCommon
|
||||
SmoSystemMonitorGuiPluginInterface
|
||||
svcSmoDummy
|
||||
)
|
||||
|
||||
NGL_INSTALL_TARGET(SmoSystemMonitorGuiPlugin)
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* System Monitor Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-30
|
||||
*/
|
||||
|
||||
#include "smo_system_monitor_dialog.h"
|
||||
#include "ui_smo_system_monitor_dialog.h"
|
||||
#include <QWebEngineView>
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
SystemMonitorDialog::SystemMonitorDialog(bool systemMonitor)
|
||||
: LtsWidgets::LtsDialog(nullptr, LtsWidgets::ButtonCombination::SeamlessDialog, false)
|
||||
, m_ui(new Ui::SystemMonitorDialog)
|
||||
, m_systemMonitor(systemMonitor)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
}
|
||||
|
||||
bool SystemMonitorDialog::init()
|
||||
{
|
||||
LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance();
|
||||
QString webPage;
|
||||
if (m_systemMonitor)
|
||||
{
|
||||
// Get Nagios Path from Settings
|
||||
webPage = ps->value(QStringLiteral("smo"),
|
||||
QStringLiteral("nagios"),
|
||||
QString()).toString();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get SPS Path from Settings
|
||||
webPage = ps->value(QStringLiteral("smo"),
|
||||
QStringLiteral("sps"),
|
||||
QString()).toString();
|
||||
}
|
||||
if (webPage.isEmpty())
|
||||
return false;
|
||||
m_ui->wevSystemMonitor->load(QUrl(webPage));
|
||||
return true;
|
||||
}
|
||||
|
||||
SystemMonitorDialog::~SystemMonitorDialog()
|
||||
{
|
||||
m_ui->wevSystemMonitor->setParent(nullptr);
|
||||
m_ui->wevSystemMonitor->hide();
|
||||
m_ui->wevSystemMonitor->deleteLater();
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void SystemMonitorDialog::retranslate()
|
||||
{
|
||||
if (m_systemMonitor)
|
||||
translate(m_ui, tr("System Monitor"));
|
||||
else
|
||||
translate(m_ui, tr("SPS Monitor"));
|
||||
}
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,40 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* System Monitor Add Dialog
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-06-30
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LtsWidgets/lts_dialog.h>
|
||||
#include <LtsSession/lts_session.h>
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class SystemMonitorDialog;
|
||||
}
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
class SystemMonitorDialog : public LtsWidgets::LtsDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
explicit SystemMonitorDialog(bool systemMonitor);
|
||||
bool init();
|
||||
~SystemMonitorDialog();
|
||||
|
||||
|
||||
private:
|
||||
void retranslate() override;
|
||||
|
||||
Ui::SystemMonitorDialog *m_ui;
|
||||
bool m_systemMonitor;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SystemMonitorDialog</class>
|
||||
<widget class="QWidget" name="SystemMonitorDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QWebEngineView" name="wevSystemMonitor">
|
||||
<property name="url">
|
||||
<url>
|
||||
<string>about:blank</string>
|
||||
</url>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>QWebEngineView</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">QtWebEngineWidgets/QWebEngineView</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* GUI Plugin for SystemMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-07-06
|
||||
*/
|
||||
|
||||
#include "smo_system_monitor_gui_plugin.h"
|
||||
#include "smo_system_monitor_dialog.h"
|
||||
|
||||
#include <LtsSession/lts_session.h>
|
||||
#include <LtsUtilsSettings/settings.h>
|
||||
#include <ServiceMonitor/smo_operator_rights.h>
|
||||
#include <Common/logger.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
std::shared_ptr<GuiPluginBase::Interface> GuiPlugin::createGuiInterface(LtsSession::LtsSession *session)
|
||||
{
|
||||
return std::make_shared<InterfaceImpl>(session);
|
||||
}
|
||||
|
||||
|
||||
InterfaceImpl::InterfaceImpl(LtsSession::LtsSession *session)
|
||||
: GuiPluginBase::Interface(session, getLogger("SystemMonitorInterface"))
|
||||
{}
|
||||
|
||||
QVector<LtsWidgets::PluginData> InterfaceImpl::getActions()
|
||||
{
|
||||
QVector<LtsWidgets::PluginData> ret;
|
||||
LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance();
|
||||
|
||||
if (getFlags().testFlag(LtsAppDescriptor::PluginInfo::Flag::MAIN))
|
||||
{
|
||||
LtsWidgets::PluginData plData;
|
||||
if (ps->value(QStringLiteral("smo"), QStringLiteral("enableSps")).toBool())
|
||||
{
|
||||
NOTICE_LOG(m_logger) << "Enable SPS";
|
||||
plData.layoutArea = LtsWidgets::LayoutArea::eMainTab;
|
||||
plData.createInstant = LtsWidgets::CreateInstantType::CreateInstantAndDiscardAction;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.menuText = tr("SPS Monitor");
|
||||
plData.identifier = QLatin1String("smoSpsMonitor");
|
||||
plData.operatorRight = OperatorRights::SystemMonitorSPS;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eSpecial;
|
||||
plData.createWidgetFunc = [this](QWidget *)
|
||||
{
|
||||
return onShowSystemMonitor(false);
|
||||
};
|
||||
ret.append(plData);
|
||||
}
|
||||
plData.layoutArea = LtsWidgets::LayoutArea::eMainTab;
|
||||
plData.createInstant = LtsWidgets::CreateInstantType::CreateInstantAndDiscardAction;
|
||||
plData.menuGroup = menuGroup();
|
||||
plData.menuText = tr("System Monitor");
|
||||
plData.identifier = QLatin1String("smoSystemMonitor");
|
||||
plData.operatorRight = OperatorRights::SystemMonitorNagios;
|
||||
plData.exercisePart = LtsWidgets::ExercisePart::eSpecial;
|
||||
plData.createWidgetFunc = [this](QWidget *)
|
||||
{
|
||||
return onShowSystemMonitor(true);
|
||||
};
|
||||
ret.append(plData);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
LtsWidgets::LtsDialog *InterfaceImpl::onShowSystemMonitor(bool isSystemMonitor)
|
||||
{
|
||||
SystemMonitorDialog *dlg = new SystemMonitorDialog(isSystemMonitor);
|
||||
if (dlg->init())
|
||||
return dlg;
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
// namespace ServiceMonitor
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* Gui Plugin for SystemMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-07-06
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <PluginInterfaces/gui_plugin_interface.h>
|
||||
#include <Common/ProjectConfig/project_defines.h>
|
||||
#include <Plugins/ServiceMonitor/smo_system_monitor_gui_plugin_interface.h>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class GuiPlugin final : public QObject, public GuiPluginBase::Plugin
|
||||
{
|
||||
Q_PLUGIN_METADATA(IID "gui:3:smo.systemmonitor")
|
||||
Q_INTERFACES(GuiPluginBase::Plugin)
|
||||
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit GuiPlugin() = default;
|
||||
~GuiPlugin() = default;
|
||||
|
||||
QString pluginName() override { return QStringLiteral("ServiceMonitorSystemMonitorGui"); }
|
||||
std::shared_ptr<GuiPluginBase::Interface> createGuiInterface(LtsSession::LtsSession *session) override;
|
||||
bool availableInPartition(IDL::PartitionType partition) const override
|
||||
{
|
||||
return (partition == IDL::PartitionType::Global ||
|
||||
partition == IDL::PartitionType::Exercise);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class InterfaceImpl final : public QObject, public GuiPluginBase::Interface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit InterfaceImpl(LtsSession::LtsSession *session);
|
||||
|
||||
QVector<LtsWidgets::PluginData> getActions() override;
|
||||
QString menuGroup() const override { return tr("System Monitor"); }
|
||||
|
||||
private:
|
||||
LtsWidgets::LtsDialog *onShowSystemMonitor(bool isSystemMonitor);
|
||||
};
|
||||
|
||||
} // namespace ServiceMonitor
|
||||
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* HMI Plugin for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2018-01-15
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class ForeignGfsMonitorGuiInterface
|
||||
{
|
||||
public:
|
||||
ForeignGfsMonitorGuiInterface() = default;
|
||||
virtual ~ForeignGfsMonitorGuiInterface() = default;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* HMI Plugin for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Philipp Dassow, SLEA, 2017-09-06
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class ForeignHgrAndMineSearchGuiInterface
|
||||
{
|
||||
public:
|
||||
ForeignHgrAndMineSearchGuiInterface() = default;
|
||||
virtual ~ForeignHgrAndMineSearchGuiInterface() = default;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* HMI Plugin for ServiceMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-05-04
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QVector>
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class ForeignGuiInterface
|
||||
{
|
||||
public:
|
||||
ForeignGuiInterface() = default;
|
||||
virtual ~ForeignGuiInterface() = default;
|
||||
|
||||
virtual void showSingleServiceEquipmentCheck(const QVector<int> &equipmentNumbers, bool replace = true) = 0;
|
||||
virtual void showEgcuMonitor(const QVector<int> &structureElementIds, bool replace) = 0;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* HMI Plugin for SystemMonitor
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Astrid Mueller, SGAS, 2017-07-06
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace ServiceMonitor
|
||||
{
|
||||
|
||||
class ForeignSystemMonitorGuiInterface
|
||||
{
|
||||
public:
|
||||
ForeignSystemMonitorGuiInterface() = default;
|
||||
virtual ~ForeignSystemMonitorGuiInterface() = default;
|
||||
};
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user