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

524 lines
14 KiB
C++

#include "qgscopeworkbench.h"
#include "qgscopemainwindow.h"
#include "qgloggerdockwidget.h"
#include "qgscopechrono.h"
#include "qgscopedevice.h"
#include "qgscopeobjectdockwidget.h"
#include "qgaboutdialog.h"
#include "qgrunsession.h"
#include <QMainWindow>
#include <QStatusBar>
#include <QDockWidget>
#include <QToolBar>
#include <QMenu>
#include <QInputDialog>
#include <QComboBox>
#include <QToolButton>
#include "DockManager.h"
#include "DockWidget.h"
#include "DockAreaWidget.h"
#include "DockAreaTitleBar.h"
#include "DockAreaTabBar.h"
#include "FloatingDockContainer.h"
#include "DockComponentsFactory.h"
//
#include <QtGlobal>
Q_DECLARE_METATYPE(QgScopeWorkbench)
Q_DECLARE_METATYPE(QgScopeChronoTimer)
//Q_DECLARE_METATYPE(QgScopeChrono)
QgScopeScriptSiteAdaptor::~QgScopeScriptSiteAdaptor()
{
}
class DummySciptSite: public QgScopeScriptSiteAdaptor
{
public:
virtual void registerObject(const QString& /*objName*/, QObject* /*obj*/) override
{
}
};
class QGScopeImplementation
{
public:
QgScopeMainWindow* mainWindow;
QgRunSession* session;
QString appTitle;
QString prjName;
QToolBar* tb;
QToolButton* tbChronoFreeze;
QToolButton* tbMenu;
QMenu* wbMenu;
QMenu* docksMenu;
QMenu* perspectiveMenu;
QAction* savePerspective;
QString lastPerspective;
QgScopeObjectDockWidget* wObj;
QgLoggerDockWidget* logDock;
QList<QgScopeDevice*> devicesList;
QList<QObject*> deviceObjectsList;
QList<QObject*> channelObjectsList;
QgScopeObjMap objMap;
QVariant objMapVariant;
QgScopeScriptSiteAdaptor* ssAdaptor;
DummySciptSite dummyScriptSite;
ads::CDockManager* DockManager;
QString aboutMsg;
void updateTitle()
{
mainWindow->setWindowTitle(prjName+" ["+appTitle+"]");
}
QGScopeImplementation():
ssAdaptor(&dummyScriptSite)
{
//session=&QgRunSession::defaultSession();
objMapVariant=objMap;
}
};
QGScopeImplementation qgScope_;
static void myMessageOutput(QtMsgType type, const QMessageLogContext &/*context*/, const QString &msg)
{
QgLogger::LogMessageType qgtype=QgLogger::InfoMsg;
switch (type) {
case QtDebugMsg:
qgtype=QgLogger::DebugMsg;
break;
case QtInfoMsg:
qgtype=QgLogger::InfoMsg;
break;
case QtWarningMsg:
qgtype=QgLogger::WarningMsg;
break;
case QtFatalMsg:
default:
qgtype=QgLogger::FatalMsg;
break;
//case QtCriticalMsg:
// qgtype=QgLogger::ErrorMsg;
// break;
case QtSystemMsg:
qgtype=QgLogger::SystemFatalMsg;
break;
}
qgScope_.logDock->log(msg, qgtype, "QT");
}
QgScopeWorkbench::QgScopeWorkbench(QObject *parent) : QObject(parent)
{
setObjectName("QgScopeWorkbench");
}
QgScopeWorkbench::QgScopeWorkbench(const QgScopeWorkbench& wb):
QObject(wb.parent())
{
}
QgScopeWorkbench::~QgScopeWorkbench()
{
}
const QString& QgScopeWorkbench::version()
{
static QString ver("1.0");
return ver;
}
QVariant QgScopeWorkbench::objs() const
{
return QVariant(qgScope_.objMap); //.objMapVariant;
}
//Public, just to be dbg-nice
QgScopeWorkbench* theInstance=0;
//Q_DECLARE_METATYPE(QgScopeChrono)
QgScopeWorkbench& QgScopeWorkbench::instance()
{
if (!theInstance)
{
//LV singleton per la creazione della schermata principale con widget
theInstance=new QgScopeWorkbench;
Q_INIT_RESOURCE(ads);
//qRegisterMetaType<QgScopeChrono>();
//main window, che contiene tutti widget.
qgScope_.mainWindow=new QgScopeMainWindow;
qgScope_.tb=qgScope_.mainWindow->addToolBar(QString("Main Menu"));
qgScope_.tb->setVisible(true);
qgScope_.tb->toggleViewAction()->setEnabled(false);
//barra superiore con gestione chrono
{
qgScope_.tbMenu=new QToolButton;
qgScope_.tbMenu->setText("=");
qgScope_.wbMenu=new QMenu("Main Menu");
qgScope_.docksMenu=new QMenu("Docks");
QAction* actAbout=new QAction("About...", qgScope_.mainWindow);
connect(actAbout, &QAction::triggered, theInstance,
[]()
{
static QString myMsg=
"<p><b>GrifoScope</b>: an advanced(?) Grifo Radar Run-time monitor</p>";
if (!qgScope_.aboutMsg.isEmpty())
myMsg=qgScope_.aboutMsg;
static QgAboutDialog dlgAbout(myMsg);
dlgAbout.exec();
});
{
qgScope_.perspectiveMenu=new QMenu("Perspectives");
QAction* act=qgScope_.perspectiveMenu->addAction("switch to...");
connect(act, &QAction::triggered, theInstance, []()
{
QStringList plist=qgScope_.DockManager->perspectiveNames();
QString pname=QInputDialog::getItem(0, "Switch Perspective", QString(), plist, 0, true);
if (!pname.isEmpty())
{
if (plist.contains(pname, Qt::CaseInsensitive))
{
qgScope_.DockManager->openPerspective(pname);
}
else
{
qgScope_.DockManager->addPerspective(pname);
}
//qgScope_.lastPerspective=pname;
}
});
qgScope_.savePerspective=qgScope_.perspectiveMenu->addAction("save...");
connect(qgScope_.savePerspective, &QAction::triggered, theInstance, []()
{
QStringList plist=qgScope_.DockManager->perspectiveNames();
QString pname=QInputDialog::getItem(0, "Save Perspective", QString(), plist, 0, true);
if (!pname.isEmpty())
{
qgScope_.DockManager->addPerspective(pname);
}
});
act=qgScope_.perspectiveMenu->addAction("save default...");
connect(act, &QAction::triggered, theInstance, []()
{
QStringList plist=qgScope_.DockManager->perspectiveNames();
QString pname=QInputDialog::getItem(0, "Save As Defualt Perspective", QString(), plist, 0, true);
if (!pname.isEmpty())
{
//qgScope_.DockManager->addPerspective(pname);
qgScope_.lastPerspective=pname;
}
});
}
qgScope_.wbMenu->addMenu(qgScope_.docksMenu);
qgScope_.wbMenu->addMenu(qgScope_.perspectiveMenu);
qgScope_.wbMenu->addAction(actAbout);
qgScope_.tbMenu->setMenu(qgScope_.wbMenu);
//qgScope_.tbMenu->setIcon(st->standardIcon(QStyle::SP_ArrowDown)); //QIcon(":/icons/icons/list89.png"));
qgScope_.tbMenu->setContextMenuPolicy(Qt::ActionsContextMenu);
qgScope_.tbMenu->setPopupMode(QToolButton::InstantPopup);
}
qgScope_.tbChronoFreeze=new QToolButton;
qgScope_.tbChronoFreeze->setText("!");
qgScope_.tbChronoFreeze->setCheckable(true);
connect(&QgScopeChrono::instance(), &QgScopeChrono::chronoFrozen, theInstance,
[&](bool checked)
{
qgScope_.tbChronoFreeze->setChecked(checked);
}
);
connect(qgScope_.tbChronoFreeze, &QToolButton::toggled, &QgScopeChrono::instance(), QgScopeChrono::setFreeze);
qgScope_.tb->setIconSize(QSize(24, 24));
qgScope_.tb->addWidget(qgScope_.tbMenu);
qgScope_.tb->addWidget(qgScope_.tbChronoFreeze);
qgScope_.tb->addWidget(qgScope_.mainWindow->chronoCB());
ads::CDockManager::setConfigFlag(ads::CDockManager::FocusHighlighting, true);
ads::CDockManager::setConfigFlag(ads::CDockManager::OpaqueSplitterResize, false);
ads::CDockManager::setConfigFlag(ads::CDockManager::OpaqueUndocking, false);
ads::CDockManager::setConfigFlag(ads::CDockManager::DragPreviewIsDynamic, false);
ads::CDockManager::setConfigFlag(ads::CDockManager::DragPreviewShowsContentPixmap, false);
ads::CDockManager::setConfigFlag(ads::CDockManager::DragPreviewHasWindowFrame, false);
qgScope_.DockManager = new ads::CDockManager(qgScope_.mainWindow);
//widget per la visualizzazione degli oggetti
qgScope_.wObj=new QgScopeObjectDockWidget;
//qgScope_.mainWindow->addDockWidget(Qt::LeftDockWidgetArea, qgScope_.wObj);
//qgScope_.DockManager->addDockWidget(ads::LeftDockWidgetArea, qgScope_.wObj);
theInstance->addOuterPannel(Qt::LeftDockWidgetArea, qgScope_.wObj);
//widget con la visualizzazione del logger
qgScope_.logDock=new QgLoggerDockWidget;
qgScope_.mainWindow->addDockWidget(Qt::BottomDockWidgetArea, qgScope_.logDock);
qInstallMessageHandler(myMessageOutput);
qgScope_.session=&QgRunSession::defaultSession();
}
//qgScope_.ssAdaptor->registerObject("session", qgScope_.session);
return *theInstance;
}
void QgScopeWorkbench::initializeStdToolBars()
{
}
void QgScopeWorkbench::setAboutMessage(const QString& msg)
{
qgScope_.aboutMsg=msg;
}
void QgScopeWorkbench::setScriptSiteAdptor(QgScopeScriptSiteAdaptor* adaptor)
{
qgScope_.ssAdaptor=adaptor ? adaptor : &qgScope_.dummyScriptSite;
qgScope_.ssAdaptor->registerObject("session", qgScope_.session);
}
QgLoggerDockWidget& QgScopeWorkbench::loggerWidget()
{
return *qgScope_.logDock;
}
void QgScopeWorkbench::log(const QString &str)
{
qgScope_.logDock->log(str);
}
void QgScopeWorkbench::setApplicationTitle(const QString& title)
{
qgScope_.appTitle=title;
qgScope_.updateTitle();
}
void QgScopeWorkbench::setClientInitilizer(void (*handler)(void))
{
qgScope_.mainWindow->setClientInitializer(handler);
}
void QgScopeWorkbench::setProjectName(const QString& name)
{
qgScope_.prjName=name;
qgScope_.updateTitle();
}
QMainWindow* QgScopeWorkbench::mainWindow() const
{
//if (!qgScope_.mainWindow)
// qgScope_.mainWindow=new QgScopeMainWindow;
return qgScope_.mainWindow;
}
ads::CDockManager* QgScopeWorkbench::dockManager()
{
return qgScope_.DockManager;
}
void QgScopeWorkbench::show() const
{
mainWindow()->show();
mainWindow()->statusBar()->showMessage("Wellcome to the GrifoScope workbench");
}
ads::CDockWidget* QgScopeWorkbench::addOuterPannel(Qt::DockWidgetArea area, QWidget* w, const QString &group)
{
static int dock_counter;
#if 0
QDockWidget* dw=qobject_cast<QDockWidget*>(w);
if (dw==0)
{
QString tmp=w->objectName();
if (tmp.isEmpty())
tmp=QString("dock_%1").arg(dock_counter);
else
tmp=tmp+QString("_dock_%1").arg(dock_counter);
dw=new QDockWidget;
dw->setWindowTitle(w->objectName());
dw->setObjectName(tmp);
dw->setWidget(w);
++dock_counter;
}
#endif
auto dw=new ads::CDockWidget(w->windowTitle()); //w->objectName());
dw->setWidget(w);
ads::DockWidgetArea ads_area=static_cast<ads::DockWidgetArea>(area+1);
if (area==Qt::AllDockWidgetAreas)
ads_area=ads::CenterDockWidgetArea;
auto ads_dock=qgScope_.DockManager->addDockWidget(ads_area, dw);
onAdsDockCreated(dw, group);
#if 0
QMenu* dMenu=qgScope_.docksMenu;
if (!group.isEmpty())
{
//qgScope_.docksMenu->fi
}
QAction* dockAction=dw->toggleViewAction();
#if 0
QAction* dockAction=new QAction(w->windowTitle(), this);
dockAction->setData((qulonglong)ads_dock);
connect(dockAction, &QAction::triggered, this, [this](bool checked)
{
QAction* a=qobject_cast<QAction*>(sender());
ads::CDockWidget* w=reinterpret_cast<ads::CDockWidget*>(a->data().toULongLong());
w->setToggleViewActionChecked(checked);
});
#endif
dMenu->addAction(dockAction);
#endif
return dw;
}
void QgScopeWorkbench::onAppMenuCreated(QMenu* m)
{
qgScope_.wbMenu->insertMenu(qgScope_.wbMenu->actions()[0], m);
}
void QgScopeWorkbench::onAppReady()
{
restoreLayout();
}
void QgScopeWorkbench::onAdsDockCreated(ads::CDockWidget* dw, const QString& groupname)
{
QMenu* dMenu=qgScope_.docksMenu;
if (!groupname.isEmpty())
{
//qgScope_.docksMenu->fi
QMenu* ch=dMenu->findChild<QMenu*>(groupname);
if (ch)
{
dMenu=ch;
}
else
{
ch=dMenu->addMenu(groupname); //new QMenu(groupname);
ch->setObjectName(groupname);
dMenu->addMenu(ch);
dMenu=ch;
}
}
QAction* dockAction=dw->toggleViewAction();
dMenu->addAction(dockAction);
}
QList<QgScopeDevice *> QgScopeWorkbench::devicesList() const
{
return qgScope_.devicesList;
}
QList<QObject *> QgScopeWorkbench::deviceObjectsList() const
{
return qgScope_.deviceObjectsList;
}
void QgScopeWorkbench::addDevice(QgScopeDevice* d)
{
qgScope_.devicesList.append(d);
qgScope_.deviceObjectsList.append(d);
qgScope_.wObj->addDevice(d);
const QString name=d->nickName();
auto dmapped=qgScope_.objMap.find(name);
if (dmapped!=qgScope_.objMap.end())
qgScope_.logDock->log(QString("Duplicated object name: %1").arg(name), QgLogger::WarningMsg, "WB");
else
{
qgScope_.logDock->log(QString("Registered device: %1").arg(name), QgLogger::InfoMsg, "WB");
qgScope_.objMap[d->nickName()]=QVariant::fromValue(static_cast<QObject*>(d));
}
qgScope_.ssAdaptor->registerObject(d->scriptableName(), d);
}
QgScopeChrono* QgScopeWorkbench::chrono() const
{
return &QgScopeChrono::instance();
}
QObject* QgScopeWorkbench::chronoObject() const
{
return chrono();
}
void QgScopeWorkbench::addChannel(QgScopeChannel* c)
{
//qgScope_.devicesList.append(d);
qgScope_.channelObjectsList.append(c);
qgScope_.wObj->addChannel(c);
qgScope_.ssAdaptor->registerObject(c->scriptableName(), c);
}
QList<QObject *> QgScopeWorkbench::channelObjectsList() const
{
return qgScope_.channelObjectsList;
}
QgRunSession* QgScopeWorkbench::runSession() const
{
return qgScope_.session;
}
void QgScopeWorkbench::restoreLayout(const QString &lyname)
{
//if (lyname.isEmpty())
{
QString lastPerspective=qgScope_.mainWindow->restoreLayout(lyname);
qgScope_.lastPerspective=lastPerspective.isEmpty() ? "default" : lastPerspective;
}
}
QMenu* QgScopeWorkbench::wbMenu()
{
return qgScope_.wbMenu;
}
QString QgScopeWorkbench::defaultPerspectiveName() const
{
return qgScope_.lastPerspective.isEmpty() ? "default" : qgScope_.lastPerspective;
}