#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 #include #include #include #include #include #include #include #include "DockManager.h" #include "DockWidget.h" #include "DockAreaWidget.h" #include "DockAreaTitleBar.h" #include "DockAreaTabBar.h" #include "FloatingDockContainer.h" #include "DockComponentsFactory.h" // #include 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 devicesList; QList deviceObjectsList; QList 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(); //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= "

GrifoScope: an advanced(?) Grifo Radar Run-time monitor

"; 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(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(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(sender()); ads::CDockWidget* w=reinterpret_cast(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(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 QgScopeWorkbench::devicesList() const { return qgScope_.devicesList; } QList 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(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 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; }