SXXXXXXX_PyBusMonitor1553/cpp/GrifoScope/QgScope/qgscopeobjectdockwidget.cpp
2025-12-17 07:59:30 +01:00

180 lines
4.7 KiB
C++

#include "qgscopeobjectdockwidget.h"
#include "ui_qgscopeobjectdockwidget.h"
#include "qgpropertywidget.h"
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QMenu>
#include <QAction>
enum MyTreeRoles
{
objPointer=Qt::UserRole
};
class QgScopeObjectDockWidget::Implementation
{
public:
QTreeWidget* tw;
QTreeWidgetItem* devRoot;
QTreeWidgetItem* chRoot;
QMap<QgScopeDevice*, QTreeWidgetItem*> dMap;
QMenu* deviceMenu;
QAction* aDevActivte;
QAction* aDevFreeze;
QAction* aObjectView;
QgScopeDevice* selectedDevice;
};
QgScopeObjectDockWidget::QgScopeObjectDockWidget(QWidget *parent) :
ads::CDockWidget("Scope Objects"),
p_(*new Implementation)
{
//Devices
{
p_.tw=new QTreeWidget;
QTreeWidget& tw=*p_.tw;
tw.setColumnCount(2);
tw.setHeaderLabels(
QStringList()
<<QString("Name")
<<QString("Status")
);
p_.devRoot=new QTreeWidgetItem;
p_.devRoot->setText(0, "Devices");
p_.chRoot=new QTreeWidgetItem;
p_.chRoot->setText(0, "Channels");
tw.invisibleRootItem()->addChild(p_.devRoot);
tw.invisibleRootItem()->addChild(p_.chRoot);
tw.setRootIsDecorated(true);
tw.setContextMenuPolicy(Qt::CustomContextMenu);
p_.deviceMenu=new QMenu;
p_.aDevActivte=p_.deviceMenu->addAction("Active");
p_.aDevActivte->setCheckable(true);
p_.aDevFreeze=p_.deviceMenu->addAction("Chrono Running");
p_.aDevFreeze->setCheckable(true);
p_.deviceMenu->addSeparator();
p_.aObjectView=p_.deviceMenu->addAction("Object Propertiers...");
connect(&tw, &QTreeWidget::customContextMenuRequested, this, &QgScopeObjectDockWidget::deviceContextMenu);
connect(p_.aDevActivte, &QAction::toggled, this,
[this](bool checked)
{
p_.selectedDevice->setDeviceActive(checked);
}
);
connect(p_.aDevFreeze, &QAction::toggled, this,
[this](bool checked)
{
p_.selectedDevice->chronoTimer().setFreeze(!checked);
}
);
connect(p_.aObjectView, &QAction::triggered, this,
[this]()
{
QgPropertyDialog dlg(p_.selectedDevice, this);
dlg.exec();
}
);
this->setWidget(&tw);
}
}
QgScopeObjectDockWidget::~QgScopeObjectDockWidget()
{
delete &p_;
//delete ui;
}
void QgScopeObjectDockWidget::addChannel(QgScopeChannel* d)
{
QTreeWidgetItem* i=new QTreeWidgetItem;
i->setText(0, d->objectName());
i->setData(0, objPointer, (quint64)d);
p_.chRoot->addChild(i);
}
void QgScopeObjectDockWidget::addDevice(QgScopeDevice* d)
{
QTreeWidgetItem* i=new QTreeWidgetItem;
i->setText(0, d->nickName());
i->setData(0, objPointer, (quint64)d);
i->setData(0, Qt::ToolTipRole, d->tooltipString());
i->setData(1, Qt::DisplayRole, d->statusString());
p_.dMap[d]=i;
p_.devRoot->addChild(i);
i->setDisabled(!d->deviceActive());
connect(d, &QgScopeDevice::deviceActivated, this, QgScopeObjectDockWidget::syncDeviceStatus);
connect(d, &QgScopeDevice::statusStringChanged, this,
[this](const QString& str)
{
QgScopeDevice* d=qobject_cast<QgScopeDevice*>(sender());
auto i=p_.dMap.find(d);
if (i!=p_.dMap.end())
{
i.value()->setData(1, Qt::DisplayRole, str);
}
}
);
connect(d, &QgScopeDevice::tooltipChanged, this,
[this](const QString& str)
{
QgScopeDevice* d=qobject_cast<QgScopeDevice*>(sender());
auto i=p_.dMap.find(d);
if (i!=p_.dMap.end())
{
i.value()->setData(0, Qt::ToolTipRole, str);
}
}
);
}
void QgScopeObjectDockWidget::syncDeviceStatus(bool /*active*/)
{
QgScopeDevice* d=qobject_cast<QgScopeDevice*>(sender());
auto i=p_.dMap.find(d);
if (i!=p_.dMap.end())
{
//i.value()->setDisabled(!active);
}
}
void QgScopeObjectDockWidget::deviceContextMenu(const QPoint& pos)
{
auto gpos=p_.tw->mapToGlobal(pos);
auto i=p_.tw->currentItem();
p_.selectedDevice=qobject_cast<QgScopeDevice*>((QObject*)(i->data(0, objPointer).toULongLong()));
if (!p_.selectedDevice)
return;
//Sync the option
p_.aDevActivte->setChecked(p_.selectedDevice->deviceActive());
p_.aDevFreeze->setChecked(!p_.selectedDevice->chronoTimer().frozen());
p_.deviceMenu->popup(gpos);
}