From c3f7978df9e586fd4dcfb88d579836024e2fa154 Mon Sep 17 00:00:00 2001 From: brige Date: Tue, 14 Oct 2025 00:15:18 +0800 Subject: [PATCH] modify commond --- src/translations/Dyt_zh_CN.ts | 143 +++++++++++------- src/ui/MainFrame.cpp | 10 +- src/ui/Menu/SimuRunMenu.cpp | 109 ++++++++++++- src/ui/Menu/SimuRunMenu.h | 22 ++- src/ui/PropertyBrowser/qtpropertymanager.cpp | 22 +++ .../PropertyBrowser/qtworkspaceattribute.cpp | 16 ++ src/ui/PropertyBrowser/qtworkspaceattribute.h | 4 + src/workspace/CommandManager.cpp | 28 ++++ src/workspace/CommandManager.h | 5 + 9 files changed, 290 insertions(+), 69 deletions(-) diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index 25f661b1..0bf8e388 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -559,27 +559,27 @@ MainFrame - + Dyt - + file manager - + simu manager - + play manager - + system manager @@ -972,26 +972,26 @@ - - + + Curve[%1] - - + + Surface[%1] - - + + Table[%1] - - + + Light[%1] @@ -1067,48 +1067,48 @@ QtConeWaveComponentManager - - + + ConeWaveComponent - + Height - + Radius - + waveCount - + waveSpeed - + baseColor - + waveColor - + ringBrightAlpha - + ringDarkAlpha @@ -1214,28 +1214,28 @@ QtDashedLineComponentManager - - + + DashedLineComponent - + Start - + End - + Radius - + Color @@ -1251,17 +1251,17 @@ QtEntityPropertyManager - + Name - + Visible - + Transform @@ -1343,13 +1343,13 @@ QtMeshComponetManager - - + + MeshComponent - + Mesh @@ -1398,13 +1398,13 @@ QtPathComponentManager - - + + PathComponent - + Path @@ -1654,87 +1654,92 @@ QtWorkspacePropertyManager - + Name - + Description - + Timestep - + SimMatlab - + MatlabParam - + WavePath - + ReportPath - + RDPath - + + CommondPath + + + + Count - + Curve[%1] - + Surface[%1] - + Table[%1] - + Light[%1] - + Curves - + Surfaces - + Tables - + Lights @@ -1762,6 +1767,34 @@ + + SimuRunMenu + + + no workspace + + + + + no commands + + + + + OnCreate + + + + + OnLoad + + + + + unnamed + + + SimuRunMenuClass diff --git a/src/ui/MainFrame.cpp b/src/ui/MainFrame.cpp index e351078d..0e69b60b 100644 --- a/src/ui/MainFrame.cpp +++ b/src/ui/MainFrame.cpp @@ -25,6 +25,8 @@ #include "ui/Menu/ChartPlotMenu.h" // lz 20140914 #include "common/SpdLogger.h" +#include "ui/Menu/SimuRunMenu.h" + #include "ui_MainFrame.h" #include "viewer/OsgWidget.h" @@ -104,8 +106,12 @@ void MainFrame::InitUI() { //AddMenuWidget("view_manager", tr("view manager"), new ViewManagerMenu(this)); //AddMenuWidget("plan_manager", tr("plan manager"), new PlanManagerMenu(this)); //AddMenuWidget("dynamic_display", tr("dynamic display"), new DynamicDisplayMenu(this)); - ChartPlotMenu* chartMenu = new ChartPlotMenu(this); - AddMenuWidget("simu_manager", tr("simu manager"), chartMenu); + // ChartPlotMenu* chartMenu = new ChartPlotMenu(this); + // AddMenuWidget("simu_manager", tr("simu manager"), chartMenu); + + // Command buttons menu based on parsed commands + SimuRunMenu* simuRunMenu = new SimuRunMenu(this); + AddMenuWidget("simu_manager", tr("simu manager"), simuRunMenu); PlayManagerMenu* playMenu = new PlayManagerMenu(this); AddMenuWidget("play_manager", tr("play manager"), playMenu); diff --git a/src/ui/Menu/SimuRunMenu.cpp b/src/ui/Menu/SimuRunMenu.cpp index cb555e12..1edb0365 100644 --- a/src/ui/Menu/SimuRunMenu.cpp +++ b/src/ui/Menu/SimuRunMenu.cpp @@ -1,10 +1,107 @@ -#include "SimuRunMenu.h" +#include "ui/Menu/SimuRunMenu.h" + +#include +#include +#include + +#include "workspace/WorkSpaceManager.h" +#include "workspace/WorkSpace.h" +#include "workspace/CommandManager.h" SimuRunMenu::SimuRunMenu(QWidget *parent) - : QWidget(parent) -{ - ui.setupUi(this); + : QWidget(parent) { + ui.setupUi(this); + + // Create a vertical layout to host grouped command rows + auto* layout = new QVBoxLayout(this); + layout->setContentsMargins(9, 0, 0, 0); + layout->setSpacing(6); + setLayout(layout); + + // Refresh when workspace changes + connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, + this, &SimuRunMenu::OnWorkspaceChanged); + + // Initial population + RefreshButtons(); } -SimuRunMenu::~SimuRunMenu() -{} +SimuRunMenu::~SimuRunMenu() { +} + +void SimuRunMenu::OnWorkspaceChanged(WorkSpace* ws) { + Q_UNUSED(ws); + RefreshButtons(); +} + +void SimuRunMenu::RefreshButtons() { + // Clear existing buttons + if (auto* layout = qobject_cast(this->layout())) { + while (layout->count() > 0) { + QLayoutItem* item = layout->takeAt(0); + if (item) { + if (auto* w = item->widget()) { + w->deleteLater(); + } + delete item; + } + } + } + + auto* ws = WorkSpaceManager::Get().GetCurrent(); + if (!ws) { + // Show hint when no workspace + if (auto* layout = qobject_cast(this->layout())) { + auto* hint = new QLabel(tr("no workspace"), this); + layout->addWidget(hint); + } + return; + } + + CommandManager mgr; + const auto items = mgr.ListCommands(ws); + if (items.empty()) { + if (auto* layout = qobject_cast(this->layout())) { + auto* hint = new QLabel(tr("no commands"), this); + layout->addWidget(hint); + } + return; + } + + // Render all commands in a single group without trigger distinction + CreateGroup(tr("Commands"), items); +} + +void SimuRunMenu::CreateGroup(const QString& title, + const std::vector& items) { + auto* root = qobject_cast(this->layout()); + if (!root) return; + + auto* label = new QLabel(title, this); + root->addWidget(label); + + auto* row = new QHBoxLayout(); + row->setSpacing(6); + for (const auto& item : items) { + auto* btn = new QToolButton(this); + btn->setText(item.name.isEmpty() ? tr("unnamed") : item.name); + QString tip = item.descript; + if (!item.program.isEmpty()) { + tip += QStringLiteral("\nprog: ") + item.program; + } + if (!item.path.isEmpty()) { + tip += QStringLiteral("\npath: ") + item.path; + } + btn->setToolTip(tip); + row->addWidget(btn); + + connect(btn, &QToolButton::clicked, this, [name = item.name]() { + auto* wsCur = WorkSpaceManager::Get().GetCurrent(); + if (!wsCur) return; + CommandManager execMgr; + execMgr.ExecuteByName(wsCur, name); + }); + } + row->addStretch(1); + root->addLayout(row); +} diff --git a/src/ui/Menu/SimuRunMenu.h b/src/ui/Menu/SimuRunMenu.h index 28ac1222..fb1630b9 100644 --- a/src/ui/Menu/SimuRunMenu.h +++ b/src/ui/Menu/SimuRunMenu.h @@ -2,15 +2,25 @@ #include #include "ui_SimuRunMenu.h" +#include "workspace/CommandManager.h" +#include "workspace/CommandExecutor.h" -class SimuRunMenu : public QWidget -{ - Q_OBJECT +class SimuRunMenu : public QWidget { + Q_OBJECT public: - SimuRunMenu(QWidget *parent = nullptr); - ~SimuRunMenu(); + SimuRunMenu(QWidget *parent = nullptr); + ~SimuRunMenu(); + +private slots: + void OnWorkspaceChanged(class WorkSpace* ws); private: - Ui::SimuRunMenuClass ui; + void RefreshButtons(); + void CreateGroup(const QString& title, + const std::vector& items); + + +private: + Ui::SimuRunMenuClass ui; }; diff --git a/src/ui/PropertyBrowser/qtpropertymanager.cpp b/src/ui/PropertyBrowser/qtpropertymanager.cpp index 0de1686e..2b4d5162 100644 --- a/src/ui/PropertyBrowser/qtpropertymanager.cpp +++ b/src/ui/PropertyBrowser/qtpropertymanager.cpp @@ -7920,6 +7920,7 @@ public: QMap m_properyToWavePath; QMap m_properyToReportPath; QMap m_properyToRDPath; + QMap m_properyToCommondPath; QMap m_nameToPropery; QMap m_descriptionToPropery; @@ -7929,6 +7930,7 @@ public: QMap m_wavePathToPropery; QMap m_reportPathToPropery; QMap m_rdPathToPropery; + QMap m_commondPathToPropery; // Grouped file entries: Curve QMap m_properyToCurveGroup; @@ -8000,6 +8002,10 @@ void QtWorkspacePropertyManagerPrivate::slotStringChanged(QtProperty* property, QWorkspaceAttribute c = m_values[prop]; c.SetRDPath(value); q_ptr->setValue(prop, c); + } else if (QtProperty* prop = m_commondPathToPropery.value(property, 0)) { + QWorkspaceAttribute c = m_values[prop]; + c.SetCommondFilePath(value); + q_ptr->setValue(prop, c); } else if (QtProperty* prop = m_curvePathToPropery.value(property, 0)) { QWorkspaceAttribute c = m_values[prop]; int idx = m_curvePathIndex.value(property, 0); @@ -8213,6 +8219,7 @@ void QtWorkspacePropertyManager::setValue(QtProperty* property, const QWorkspace d_ptr->m_filesProperyManager->setValue(d_ptr->m_properyToWavePath[property], value.GetWavePath()); d_ptr->m_filesProperyManager->setValue(d_ptr->m_properyToReportPath[property], value.GetReportPath()); d_ptr->m_filesProperyManager->setValue(d_ptr->m_properyToRDPath[property], value.GetRDPath()); + d_ptr->m_filesProperyManager->setValue(d_ptr->m_properyToCommondPath[property], value.GetCommondFilePath()); auto syncGroup = [&](FileEntryType type, QMap& propToGroup, @@ -8334,6 +8341,14 @@ void QtWorkspacePropertyManager::initializeProperty(QtProperty* property) { d_ptr->m_rdPathToPropery[prop] = property; property->addSubProperty(prop); + // Command XML path + prop = d_ptr->m_filesProperyManager->addProperty(); + prop->setPropertyName(tr("CommondPath")); + d_ptr->m_filesProperyManager->setValueOnly(prop, val.GetCommondFilePath()); + d_ptr->m_properyToCommondPath[property] = prop; + d_ptr->m_commondPathToPropery[prop] = property; + property->addSubProperty(prop); + // Add grouped file sections auto addGroup = [&](FileEntryType type, const QString& groupName, QMap& propToGroup, @@ -8455,6 +8470,13 @@ void QtWorkspacePropertyManager::uninitializeProperty(QtProperty* property) { } d_ptr->m_properyToRDPath.remove(property); + prop = d_ptr->m_commondPathToPropery[property]; + if (prop) { + d_ptr->m_commondPathToPropery.remove(prop); + delete prop; + } + d_ptr->m_properyToCommondPath.remove(property); + // Cleanup grouped file properties auto cleanupGroup = [&](QMap& propToGroup, QMap& groupToProp, diff --git a/src/ui/PropertyBrowser/qtworkspaceattribute.cpp b/src/ui/PropertyBrowser/qtworkspaceattribute.cpp index d4b7f89f..9dbf0a8c 100644 --- a/src/ui/PropertyBrowser/qtworkspaceattribute.cpp +++ b/src/ui/PropertyBrowser/qtworkspaceattribute.cpp @@ -174,6 +174,22 @@ const QString QWorkspaceAttribute::GetRDPath() const return workspace_->GetRDPath(); } +void QWorkspaceAttribute::SetCommondFilePath(const QString& path) +{ + if (nullptr == workspace_) { + return; + } + workspace_->SetCommondFilePath(path); +} + +const QString QWorkspaceAttribute::GetCommondFilePath() const +{ + if (nullptr == workspace_) { + return ""; + } + return workspace_->GetCommondFilePath(); +} + std::vector QWorkspaceAttribute::GetFileEntries(FileEntryType type) const { if (nullptr == workspace_) { return {}; diff --git a/src/ui/PropertyBrowser/qtworkspaceattribute.h b/src/ui/PropertyBrowser/qtworkspaceattribute.h index 397a3ccc..f1add88a 100644 --- a/src/ui/PropertyBrowser/qtworkspaceattribute.h +++ b/src/ui/PropertyBrowser/qtworkspaceattribute.h @@ -80,6 +80,10 @@ public: void SetRDPath(const QString& path); const QString GetRDPath() const; + // Command XML path + void SetCommondFilePath(const QString& path); + const QString GetCommondFilePath() const; + // Grouped files API std::vector GetFileEntries(FileEntryType type) const; void SetFileEntryCount(FileEntryType type, int count); diff --git a/src/workspace/CommandManager.cpp b/src/workspace/CommandManager.cpp index f5313b9d..0bd2a401 100644 --- a/src/workspace/CommandManager.cpp +++ b/src/workspace/CommandManager.cpp @@ -114,4 +114,32 @@ void CommandManager::Execute(WorkSpace* ws, WorkSpace::CommandWhen when) { for (auto& exec : list) { exec->Execute(ws, when); } +} + +std::vector CommandManager::ListCommands(WorkSpace* ws) { + std::vector items; + Reload(ws); + for (auto& exec : onCreate_) { + items.push_back(exec->Get()); + } + for (auto& exec : onLoad_) { + items.push_back(exec->Get()); + } + return items; +} + +bool CommandManager::ExecuteByName(WorkSpace* ws, const QString& name) { + Reload(ws); + auto matchAndRun = [&](std::vector>& list, WorkSpace::CommandWhen when) -> bool { + for (auto& exec : list) { + if (exec->Get().name == name) { + exec->Execute(ws, when); + return true; + } + } + return false; + }; + if (matchAndRun(onCreate_, WorkSpace::CommandWhen::OnCreate)) return true; + if (matchAndRun(onLoad_, WorkSpace::CommandWhen::OnLoad)) return true; + return false; } \ No newline at end of file diff --git a/src/workspace/CommandManager.h b/src/workspace/CommandManager.h index 178f2fa3..3dbf9170 100644 --- a/src/workspace/CommandManager.h +++ b/src/workspace/CommandManager.h @@ -11,6 +11,11 @@ public: void Reload(WorkSpace* ws); void Execute(WorkSpace* ws, WorkSpace::CommandWhen when); + // List parsed commands (no trigger distinction for UI consumption) + std::vector ListCommands(WorkSpace* ws); + // Execute a single command by its name (exact match) + bool ExecuteByName(WorkSpace* ws, const QString& name); + private: std::vector> onCreate_; std::vector> onLoad_;