Compare commits
2 Commits
9c6dd93ef7
...
50144adbc9
| Author | SHA1 | Date | |
|---|---|---|---|
| 50144adbc9 | |||
| 142a61f1d0 |
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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()) {
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
};
|
};
|
||||||
@ -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
|
||||||
|
|||||||
@ -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_;
|
||||||
|
|||||||
@ -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_);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user