Compare commits

...

2 Commits

Author SHA1 Message Date
50144adbc9 add commond to menu 2025-11-09 16:50:59 +08:00
142a61f1d0 modify system menu ui 2025-11-09 16:33:48 +08:00
10 changed files with 107 additions and 37 deletions

View File

@ -25,7 +25,7 @@ DockWidget::DockWidget(const QString& title, QWidget* parent)
if (nullptr != windowManagerMenu) { if (nullptr != windowManagerMenu) {
windowManagerMenu->AddDockWidget(this); windowManagerMenu->AddDockWidget(this);
} }
// 同步到可视的 WindowManagerMenu 列表(如果存在) // Also register with visible WindowManagerMenu list if available
if (auto* listMenu = MainFrame::Get().GetMenuManager<WindowManagerMenu>("window_manager")) { if (auto* listMenu = MainFrame::Get().GetMenuManager<WindowManagerMenu>("window_manager")) {
listMenu->AddDockWidget(this); listMenu->AddDockWidget(this);
} }
@ -41,7 +41,7 @@ DockWidget::DockWidget(QWidget* parent)
if (nullptr != windowManagerMenu) { if (nullptr != windowManagerMenu) {
windowManagerMenu->AddDockWidget(this); windowManagerMenu->AddDockWidget(this);
} }
// 同步到可视的 WindowManagerMenu 列表(如果存在) // Also register with visible WindowManagerMenu list if available
if (auto* listMenu = MainFrame::Get().GetMenuManager<WindowManagerMenu>("window_manager")) { if (auto* listMenu = MainFrame::Get().GetMenuManager<WindowManagerMenu>("window_manager")) {
listMenu->AddDockWidget(this); listMenu->AddDockWidget(this);
} }

View File

@ -52,12 +52,28 @@ void FileManagerMenu::NewWorkSpace() {
} }
void FileManagerMenu::OpenWorkSpace() { void FileManagerMenu::OpenWorkSpace() {
// Select workspace file first
QString fileName = QFileDialog::getOpenFileName(&MainFrame::Get(), QString fileName = QFileDialog::getOpenFileName(&MainFrame::Get(),
QObject::tr("Open Workspace"), Application::GetWorkSpacePath(), QObject::tr("Dyt Files (*.dyt)")); QObject::tr("Open Workspace"), Application::GetWorkSpacePath(), QObject::tr("Dyt Files (*.dyt)"));
if (fileName.isEmpty()) { if (fileName.isEmpty()) {
return; return;
} }
// After a valid file path is selected, prompt to save/unload current workspace
auto* current = WorkSpaceManager::Get().GetCurrent();
if (current) {
QMessageBox::StandardButton ret = QMessageBox::question(
&MainFrame::Get(), QObject::tr("warning"), QObject::tr("save current workspace?"),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
if (ret == QMessageBox::Cancel) {
return;
}
if (ret == QMessageBox::Yes) {
SaveWorkSpace();
}
current->Unlaod();
}
LOG_INFO("open workspace: {}", fileName.toLocal8Bit().constData()); LOG_INFO("open workspace: {}", fileName.toLocal8Bit().constData());
emit LoadDyt(fileName); emit LoadDyt(fileName);
} }

View File

@ -37,16 +37,22 @@ SimuRunMenu::~SimuRunMenu() {
} }
void SimuRunMenu::OnWorkspaceChanged(WorkSpace* ws) { void SimuRunMenu::OnWorkspaceChanged(WorkSpace* ws) {
Q_UNUSED(ws); // Reconnect to workspace commands change to refresh buttons when path changes
if (wsCmdConn_) {
QObject::disconnect(wsCmdConn_);
}
if (ws) {
wsCmdConn_ = connect(ws, &WorkSpace::CommandsChanged, this, &SimuRunMenu::RefreshButtons);
}
RefreshButtons(); RefreshButtons();
} }
void SimuRunMenu::RefreshButtons() { void SimuRunMenu::RefreshButtons() {
// Clear existing buttons // Clear existing buttons
ClearAllBtn(); ClearAllBtn();
CreateMatlabParam(); CreateMatlabParam();
CreateLine(); CreateLine();
auto* ws = WorkSpaceManager::Get().GetCurrent(); auto* ws = WorkSpaceManager::Get().GetCurrent();
if (!ws) if (!ws)
@ -122,21 +128,22 @@ void SimuRunMenu::CreateGroup(const QString& title,
void SimuRunMenu::CreateMatlabParam() void SimuRunMenu::CreateMatlabParam()
{ {
QHBoxLayout* layout = qobject_cast<QHBoxLayout*>(this->layout()); QHBoxLayout* layout = qobject_cast<QHBoxLayout*>(this->layout());
if (!layout) if (!layout)
return; return;
QToolButton *pBtn = new QToolButton(); QToolButton *pBtn = new QToolButton();
pBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); pBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
pBtn->setText(QString::fromLocal8Bit("参数设置")); pBtn->setText(tr("setting param"));
pBtn->setIcon(QIcon(":/res/default/menu_setting_restore.png")); pBtn->setIcon(QIcon(":/res/default/menu_setting_restore.png"));
pBtn->setToolTip(QString::fromLocal8Bit("设置Matlab的输入参数")); pBtn->setToolTip(QString::fromLocal8Bit("set Matlab param"));
connect(pBtn, SIGNAL(clicked()), this, SLOT(slotHandleMatlabParam())); connect(pBtn, SIGNAL(clicked()), this, SLOT(slotHandleMatlabParam()));
layout->addWidget(pBtn); layout->addWidget(pBtn);
} }
void SimuRunMenu::CreateLine() void SimuRunMenu::CreateLine()
{ {
QHBoxLayout* layout = qobject_cast<QHBoxLayout*>(this->layout()); QHBoxLayout* layout = qobject_cast<QHBoxLayout*>(this->layout());
@ -182,18 +189,18 @@ void SimuRunMenu::ClearAllBtn()
void SimuRunMenu::slotHandleMatlabParam() void SimuRunMenu::slotHandleMatlabParam()
{ {
if (WorkSpaceManager::Get().GetCurrent()) if (WorkSpaceManager::Get().GetCurrent())
{ {
if (!m_pParam) if (!m_pParam)
{ {
m_pParam = new DockWidget(m_mainWindow); m_pParam = new DockWidget(m_mainWindow);
m_pParam->setAllowedAreas(Qt::NoDockWidgetArea); m_pParam->setAllowedAreas(Qt::NoDockWidgetArea);
DockTitleBar* titleBar = new DockTitleBar(m_pParam); DockTitleBar* titleBar = new DockTitleBar(m_pParam);
titleBar->SetFloatVisible(false); titleBar->SetFloatVisible(false);
titleBar->SetMaxVisible(false); titleBar->SetMaxVisible(false);
m_pParam->SetDockWidgetTitleBar(titleBar); m_pParam->SetDockWidgetTitleBar(titleBar);
m_pParam->setWindowTitle(QString::fromLocal8Bit("参数设置")); m_pParam->setWindowTitle(tr("set param"));
QString strDir = WorkSpaceManager::Get().GetCurrent()->GetDir(); QString strDir = WorkSpaceManager::Get().GetCurrent()->GetDir();
AddParamSetting *pParam = new AddParamSetting(strDir); AddParamSetting *pParam = new AddParamSetting(strDir);
@ -204,10 +211,10 @@ void SimuRunMenu::slotHandleMatlabParam()
m_pParam->setFloating(true); m_pParam->setFloating(true);
m_pParam->show(); m_pParam->show();
} }
} }
void SimuRunMenu::SetMainWindow(MainWindow* mainWindow) void SimuRunMenu::SetMainWindow(MainWindow* mainWindow)
{ {
m_mainWindow = mainWindow; m_mainWindow = mainWindow;
} }

View File

@ -32,6 +32,9 @@ private:
void ClearAllBtn(); void ClearAllBtn();
private:
QMetaObject::Connection wsCmdConn_;
private: private:
DockWidget *m_pParam; DockWidget *m_pParam;
MainWindow* m_mainWindow; MainWindow* m_mainWindow;

View File

@ -31,26 +31,44 @@ void SystemManagerMenu::AddDockWidget(class DockWidget* dockWidget) {
} }
); );
action->setCheckable(true); action->setCheckable(true);
// 勾选状态应与可见状态一致 // Keep action checked state consistent with dock visibility
action->setChecked(dockWidget->isVisible()); action->setChecked(dockWidget->isVisible());
// 绑定 dock 到 action便于打开菜单时同步状态 // Bind dock widget to action via data for state sync
action->setData(QVariant::fromValue(dockWidget)); action->setData(QVariant::fromValue(dockWidget));
connect(action, &QAction::triggered, [dockWidget, action]() { connect(action, &QAction::triggered, [dockWidget, action]() {
dockWidget->setVisible(action->isChecked()); dockWidget->setVisible(action->isChecked());
} }
); );
// 同步可见性变化到勾选状态 // Sync visibility changes to action checked state
connect(dockWidget, &DockWidget::visibilityChanged, [action](bool visible) { connect(dockWidget, &DockWidget::visibilityChanged, [action](bool visible) {
action->setChecked(visible); action->setChecked(visible);
}); });
connect(dockWidget, &DockWidget::signalClose, [action]() { connect(dockWidget, &DockWidget::signalClose, [action]() {
action->setChecked(false); action->setChecked(false);
}); });
// Remove action when associated DockWidget is destroyed
connect(dockWidget, &QObject::destroyed, this, [this, dockWidget]() {
RemoveDockWidget(dockWidget);
});
windowManagerMenu_->addAction(action); windowManagerMenu_->addAction(action);
} }
void SystemManagerMenu::RemoveDockWidget(class DockWidget* dockWidget) { void SystemManagerMenu::RemoveDockWidget(class DockWidget* dockWidget) {
if (!windowManagerMenu_) {
return;
}
const auto actions = windowManagerMenu_->actions();
for (QAction* act : actions) {
QVariant v = act->data();
if (v.isValid()) {
DockWidget* dock = v.value<DockWidget*>();
if (dock == dockWidget) {
windowManagerMenu_->removeAction(act);
act->deleteLater();
break;
}
}
}
} }
void SystemManagerMenu::InitConnect() { void SystemManagerMenu::InitConnect() {
@ -71,9 +89,9 @@ void SystemManagerMenu::OnExit() {
} }
void SystemManagerMenu::OnWindowManagerMenu() { void SystemManagerMenu::OnWindowManagerMenu() {
// <EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD> // Add window manager menu
LOG_INFO("add window manager menu"); LOG_INFO("add window manager menu");
// 打开菜单前,同步所有条目的勾选状态与当前 dock 可见性 // Before opening, sync action checked state with current dock visibility
for (QAction* act : windowManagerMenu_->actions()) { for (QAction* act : windowManagerMenu_->actions()) {
QVariant v = act->data(); QVariant v = act->data();
if (v.isValid()) { if (v.isValid()) {

View File

@ -14,8 +14,7 @@ WindowManagerMenu::WindowManagerMenu(QWidget* parent)
: QWidget(parent) : QWidget(parent)
, ui(new Ui::WindowManagerMenu) { , ui(new Ui::WindowManagerMenu) {
ui->setupUi(this); ui->setupUi(this);
connect(ui->listWidget, &QListWidget::itemClicked, this, &WindowManagerMenu::OnItemClicked);
} }
WindowManagerMenu::~WindowManagerMenu() { WindowManagerMenu::~WindowManagerMenu() {
@ -33,24 +32,43 @@ void WindowManagerMenu::AddDockWidget(DockWidget* dockWidget) {
item->setText(title); item->setText(title);
} }
); );
// 初始勾选状态与 dock 的可见性同步 // Initialize check state to match dock visibility
item->setCheckState(dockWidget->isVisible() ? Qt::Checked : Qt::Unchecked); item->setCheckState(dockWidget->isVisible() ? Qt::Checked : Qt::Unchecked);
connect(ui->listWidget, &QListWidget::itemClicked, [](QListWidgetItem* item) {
bool checked = !(item->checkState() == Qt::Checked);
item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
item->data(DockWidgetRole).value<DockWidget*>()->setVisible(checked);
});
item->setData(DockWidgetRole, QVariant::fromValue(dockWidget)); item->setData(DockWidgetRole, QVariant::fromValue(dockWidget));
// 同步 dock 可见性变化到勾选状态 // Sync dock visibility changes to check state
connect(dockWidget, &DockWidget::visibilityChanged, [item](bool visible) { connect(dockWidget, &DockWidget::visibilityChanged, [item](bool visible) {
item->setCheckState(visible ? Qt::Checked : Qt::Unchecked); item->setCheckState(visible ? Qt::Checked : Qt::Unchecked);
}); });
connect(dockWidget, &DockWidget::signalClose, [this, item]() { connect(dockWidget, &DockWidget::signalClose, [this, item]() {
item->setCheckState(Qt::Unchecked); item->setCheckState(Qt::Unchecked);
}); });
// Remove the corresponding item when the DockWidget is destroyed
connect(dockWidget, &QObject::destroyed, this, [this, dockWidget]() {
RemoveDockWidget(dockWidget);
});
ui->listWidget->addItem(item); ui->listWidget->addItem(item);
} }
void WindowManagerMenu::RemoveDockWidget(class DockWidget* dockWidget) { void WindowManagerMenu::RemoveDockWidget(class DockWidget* dockWidget) {
if (!ui || !ui->listWidget) {
return;
}
for (int i = 0; i < ui->listWidget->count(); ++i) {
QListWidgetItem* item = ui->listWidget->item(i);
DockWidget* dock = item->data(DockWidgetRole).value<DockWidget*>();
if (dock == dockWidget) {
// Remove and delete the list item
delete ui->listWidget->takeItem(i);
break;
}
}
}
void WindowManagerMenu::OnItemClicked(QListWidgetItem* item) {
bool checked = !(item->checkState() == Qt::Checked);
item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
DockWidget* dock = item->data(DockWidgetRole).value<DockWidget*>();
if (dock) {
dock->setVisible(checked);
}
} }

View File

@ -8,6 +8,8 @@ namespace Ui {
class WindowManagerMenu; class WindowManagerMenu;
} }
class QListWidgetItem;
class WindowManagerMenu : public QWidget { class WindowManagerMenu : public QWidget {
Q_OBJECT Q_OBJECT
@ -23,4 +25,6 @@ protected:
private: private:
Ui::WindowManagerMenu* ui; Ui::WindowManagerMenu* ui;
private slots:
void OnItemClicked(QListWidgetItem* item);
}; };

View File

@ -53,6 +53,7 @@ void WorkSpace::SetCommondFilePath(const QString& path) {
dirPath.toLocal8Bit().data(), dirPath.toLocal8Bit().data(),
sucess); sucess);
commondPath_ = fileInfo.fileName(); commondPath_ = fileInfo.fileName();
emit CommandsChanged();
} }
// Deprecated path APIs removed // Deprecated path APIs removed

View File

@ -141,6 +141,7 @@ Q_SIGNALS:
void TimestepChanged(class Timestep* timestep); void TimestepChanged(class Timestep* timestep);
void LampStatusChanged(class LampStatus* lampStatus); void LampStatusChanged(class LampStatus* lampStatus);
void FilesChanged(FileEntryType type, std::shared_ptr<FileEntry> fileEntry); void FilesChanged(FileEntryType type, std::shared_ptr<FileEntry> fileEntry);
void CommandsChanged();
private: private:
QString name_; QString name_;

View File

@ -161,7 +161,9 @@ void WorkSpaceManager::SetCurrent(WorkSpace* workspace) {
} }
if (nullptr != current_) { if (nullptr != current_) {
// Ensure previous workspace is properly ended and unloaded
current_->End(); current_->End();
current_->Unlaod();
} }
current_ = workspace; current_ = workspace;
workspace->SetActiveScene(scene_); workspace->SetActiveScene(scene_);