32#include <QApplication>
34#include <QStyledItemDelegate>
40#include <ArmarXCore/interface/core/ArmarXManagerInterface.h>
42#include <ArmarXGui/gui-plugins/SystemStateMonitorPlugin/ui_ArmarXManagerRepositoryDialog.h>
52 std::mutex* managerPrxMapMutex,
53 QObject* parent =
nullptr) :
54 QStyledItemDelegate(parent),
55 managerPrxMap(managerPrxMap),
56 managerPrxMapMutex(managerPrxMapMutex)
63 const QStyleOptionViewItem&
option,
64 const QModelIndex&
index)
const override
66 return new QLineEdit(parent);
72 QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
78 const QString cellText =
index.data().toString();
79 const int colonIndex = cellText.indexOf(
":");
85 lineEdit->setText(cellText);
89 QString propValue = cellText;
90 propValue.remove(0, colonIndex + 2);
91 QString propName = cellText;
92 propName.truncate(colonIndex - 1);
93 lineEdit->setText(propValue);
94 lineEdit->setProperty(
"propertyName", propName);
99 QAbstractItemModel* model,
100 const QModelIndex&
index)
const override
102 QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
108 const QString propName = lineEdit->property(
"propertyName").toString();
109 if (propName.isEmpty())
115 model->setData(
index, propName +
" : " + lineEdit->text());
117 armarx::ArmarXManagerInterfacePrx prx;
121 std::unique_lock lock(*managerPrxMapMutex);
123 managerPrxMap->find(
index.parent().parent().parent().data().toString());
124 if (it != managerPrxMap->end())
137 prx->getPropertiesAdmin()
138 ->ice_collocationOptimized(
false)
140 ->setProperties({{propName.toStdString(), lineEdit->text().toStdString()}});
145 ARMARX_WARNING <<
"Failed to set property " << propName.toStdString() <<
": "
152 std::mutex* managerPrxMapMutex;
159 qRegisterMetaType<StateUpdateMap>(
"StateUpdateMap");
160 qRegisterMetaType<ArmarXManagerItem::ManagerDataMap>(
"ArmarXManagerItem::ManagerDataMap");
161 qRegisterMetaType<ArmarXManagerItem::ManagerData>(
"ArmarXManagerItem::ManagerData");
162 qRegisterMetaType<ManagerPrxMap>(
"ManagerPrxMap");
165 filterExpansionTimer.setSingleShot(
true);
166 connect(&filterExpansionTimer, SIGNAL(timeout()),
this, SLOT(delayedFilterExpansion()));
167 connect(ui.btnProblematicOnly,
168 SIGNAL(toggled(
bool)),
170 SLOT(on_btnProblematicOnly_toggled(
bool)),
171 Qt::UniqueConnection);
173 fillLegendLayout(ui.colorLegendLayout, *monitoredManagerModel);
181 stateUpdateTask->stop();
184 delete managerRepositoryModel;
185 delete monitoredManagerModel;
202 managerRepositoryModel, monitoredManagerModel,
getWidget());
203 managerRepositoryDialog->setModal(
true);
204 connect(managerRepositoryDialog, SIGNAL(accepted()),
this, SLOT(
acceptConfig()));
205 connect(managerRepositoryDialog,
206 SIGNAL(requestedManagerScan()),
212 ¤tManagerPrxMap, &managerPrxMapMutex, ui.monitoredManagersTree));
214 filterModel->addCustomFilter(
215 [
this](QAbstractItemModel* model,
int source_row,
const QModelIndex& source_parent)
217 QModelIndex index0 = model->index(source_row, 0, source_parent);
218 if (this->ui.btnProblematicOnly->isChecked())
222 auto variantDependency =
224 if (variant.isValid())
227 if (variant.toBool())
233 if (variantDependency.isValid())
235 if (variantDependency.toBool())
240 if (!variant.isValid() && !variantDependency.isValid())
251 filterModel->setSourceModel(monitoredManagerModel);
252 filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
253 ui.monitoredManagersTree->setModel(filterModel);
255 connect(ui.lineEditFilter,
256 SIGNAL(textChanged(QString)),
258 SLOT(setFilterFixedString(QString)));
259 connect(ui.lineEditFilter,
260 SIGNAL(textChanged(QString)),
262 SLOT(expandFilterSelection(QString)),
263 Qt::QueuedConnection);
278 managerRepositoryModel->populate(settings->value(
"ManagerRepository").toStringList());
280 monitoredManagerModel->populate(settings->value(
"MonitoredManagers").toStringList());
281 ui.monitoredManagersTree->expandToDepth(1);
287 settings->setValue(
"ManagerRepository", managerRepositoryModel->toStringList());
289 settings->setValue(
"MonitoredManagers", monitoredManagerModel->toStringList());
307 "SystemStateMonitorUpdate");
308 stateUpdateTask->setDelayWarningTolerance(5000);
309 stateUpdateTask->start();
310 if (monitoredManagerModel->empty())
325 std::unique_lock lock(managerPrxMapMutex);
326 currentManagerPrxMap = monitoredManagerModel->getManagerProxyMap();
336 stateUpdateTask->stop();
345 stateUpdateTask->stop();
355 std::unique_lock lock(monitoredManagerModel->getMutex());
357 monitoredManagerModel->updateManagerDetails(managerData);
358 filterModel->invalidate();
372 managerData.
proxy = prx;
373 prx = prx->ice_timeout(1000);
374 managerData.
name = QString::fromStdString(prx->ice_getIdentity().name);
375 managerData.
appProperties = prx->getApplicationPropertyInfos();
379 managerData.
connection = prx->ice_collocationOptimized(
false)->ice_getConnection();
382 ? QString::fromStdString(managerData.
connection->getEndpoint()->toString())
383 :
"Endpoint: no connection data";
386 catch (
const IceUtil::Exception& ex)
390 QString::fromStdString(
"? (" + std::string(ex.ice_id()) +
")");
394 managerData.
online = result;
398 managerData.
online =
false;
406 ArmarXManagerInterfacePrx prx,
413 prx = prx->ice_timeout(1000);
426 Ice::StringSeq objectNames = prx->getManagedObjectNames();
428 for (
auto& objectName : objectNames)
431 objEntry.
name = objectName.c_str();
432 objEntry.
state = prx->getObjectState(objectName);
433 objEntry.
connectivity = prx->getObjectConnectivity(objectName);
434 objEntry.
properties = prx->getObjectPropertyInfos(objectName);
437 objEntry.
metaInfoMap = prx->getMetaInfo(objectName);
444 objectStates[objEntry.
name] = (objEntry);
458 decltype(currentManagerPrxMap) proxies;
460 std::unique_lock lock(managerPrxMapMutex);
461 proxies = currentManagerPrxMap;
463 IceUtil::Time start = IceUtil::Time::now();
464 for (
auto it = proxies.begin(); it != proxies.end(); it++)
471 managerDataMap[it->first].name = it->first;
475 << (IceUtil::Time::now() - start).toMilliSecondsDouble();
484 this->managerRepositoryModel->copyFrom(
485 managerRepositoryDialog->getManagerRepositoryModel());
487 this->monitoredManagerModel->copyFrom(managerRepositoryDialog->getMonitoredManagersModel());
488 ui.monitoredManagersTree->expandToDepth(1);
489 std::unique_lock lock(managerPrxMapMutex);
490 currentManagerPrxMap = monitoredManagerModel->getManagerProxyMap();
494 SystemStateMonitorWidget::fetchOnlineManagers()
502 const int pingTimeoutMs = 1000;
510 auto admin =
getIceManager()->getIceGridSession()->getAdmin();
512 IceGrid::ObjectInfoSeq objects = admin->getAllObjectInfos(
"*Manager");
515 IceGrid::ObjectInfoSeq result;
517 for(
const auto& objectInfo : objects)
519 Ice::ObjectPrx current = objectInfo.proxy;
521 ArmarXManagerInterfacePrx object;
526 const std::string proxyName = current->ice_getIdentity().name;
528 object = ArmarXManagerInterfacePrx::checkedCast(current->ice_timeout(pingTimeoutMs));
543 result.push_back(objectInfo);
548 QStringList managers;
549 for (
const IceGrid::ObjectInfo& info : result)
551 managers.append(info.proxy->ice_getIdentity().name.c_str());
560 managerRepositoryDialog->addOnlineManagers(fetchOnlineManagers());
566 managerRepositoryDialog->getManagerRepositoryModel()->copyFrom(managerRepositoryModel);
568 managerRepositoryDialog->getMonitoredManagersModel()->copyFrom(monitoredManagerModel);
572 managerRepositoryDialog->show();
576 SystemStateMonitorWidget::prefillView()
578 managerRepositoryModel->clear();
579 monitoredManagerModel->clear();
581 QStringList managers = fetchOnlineManagers();
586 QMetaObject::invokeMethod(ui.monitoredManagersTree,
"expandToDepth", Q_ARG(
int, 0));
587 std::unique_lock lock(managerPrxMapMutex);
596 for (
auto& name : managerNames)
604 getIceManager()->getProxy<ArmarXManagerInterfacePrx>(name.toStdString());
606 QMetaObject::invokeMethod(monitoredManagerModel,
607 "upsertManagerDetails",
619 SystemStateMonitorWidget::expandFilterSelection(QString filterStr)
622 if (filterStr.length() == 0)
624 ui.monitoredManagersTree->collapseAll();
629 filterExpansionTimer.start(500);
634 SystemStateMonitorWidget::delayedFilterExpansion()
642 armarx::SystemStateMonitorWidget::on_btnProblematicOnly_toggled(
bool checked)
647 filterModel->invalidate();
652 SystemStateMonitorWidget::fillLegendLayout(QHBoxLayout* layout,
ArmarXManagerModel& model)
const
654 auto addLegendEntry = [layout, &model](ManagedIceObjectState state,
const QString& text)
656 QLabel* label =
new QLabel(text);
658 QBrush brush = model.getBrush(state);
659 QPalette p = label->palette();
660 p.setColor(label->backgroundRole(), brush.color());
661 label->setPalette(p);
662 label->setAutoFillBackground(
true);
665 QFont font = label->font();
666 font.setPointSize(10);
667 label->setFont(font);
669 layout->addWidget(label);
672 addLegendEntry(armarx::eManagedIceObjectCreated,
"Created");
673 addLegendEntry(armarx::eManagedIceObjectInitializing,
"Initializing");
674 addLegendEntry(armarx::eManagedIceObjectInitialized,
"Initialized");
675 addLegendEntry(armarx::eManagedIceObjectInitializationFailed,
"Initialization Failed");
676 addLegendEntry(armarx::eManagedIceObjectStarting,
"Connecting");
677 addLegendEntry(armarx::eManagedIceObjectStarted,
"Connected");
678 addLegendEntry(armarx::eManagedIceObjectStartingFailed,
"Connecting Failed");
679 addLegendEntry(armarx::eManagedIceObjectExiting,
"Exiting");
680 addLegendEntry(armarx::eManagedIceObjectExited,
"Exited");
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
#define CHECK_NOT_QT_THREAD(qtObject)
#define CHECK_QT_THREAD(qtObject)
Macro to check whether the current function is executed in the thread of the given Qt object.
std::map< QString, ManagerData > ManagerDataMap
QMap< QString, ManagedIceObjectItem > ObjectMap
ManagerPrxMap getManagerProxyMap()
This proxy model reimplements the filterAcceptsRow function with a new behavior: All elements that fi...
static void ExpandFilterResults(QTreeView *treeView)
Expands the treeview that all items that match the filterstring are expanded and directly visible.
ObjectPropertyInfos properties
ManagedIceObjectState state
StringVariantBaseMap metaInfoMap
ManagedIceObjectConnectivity connectivity
IceManagerPtr getIceManager() const
Returns the IceManager.
The periodic task executes one thread method repeatedly using the time period specified in the constr...
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
PropertyEditingDelegate(armarx::ManagerPrxMap *managerPrxMap, std::mutex *managerPrxMapMutex, QObject *parent=nullptr)
void setEditorData(QWidget *editor, const QModelIndex &index) const override
#define ARMARX_DEBUG_S
The logging level for output that is only interesting while debugging.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_ON_SCOPE_EXIT
Executes given code when the enclosing scope is left.
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::string GetHandledExceptionString()
std::map< QString, ArmarXManagerInterfacePrx > ManagerPrxMap
void postToObject(QObject *context, Function &&function)
Run function on the GUI (main) thread's event loop.
ObjectPropertyInfos appProperties
ArmarXManagerInterfacePrx proxy
Ice::ConnectionPtr connection