2025-01-19 17:08:04 +00:00
|
|
|
#include "ui/Menu/WindowManagerMenu.h"
|
|
|
|
|
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
|
|
|
|
|
#include "ui/MainFrame.h"
|
|
|
|
|
#include "ui/DockWidget.h"
|
|
|
|
|
#include "common/SpdLogger.h"
|
|
|
|
|
|
|
|
|
|
#include "ui_WindowManagerMenu.h"
|
|
|
|
|
|
|
|
|
|
const int DockWidgetRole = Qt::UserRole + 1;
|
|
|
|
|
|
|
|
|
|
WindowManagerMenu::WindowManagerMenu(QWidget* parent)
|
|
|
|
|
: QWidget(parent)
|
|
|
|
|
, ui(new Ui::WindowManagerMenu) {
|
|
|
|
|
ui->setupUi(this);
|
2025-11-09 08:33:48 +00:00
|
|
|
connect(ui->listWidget, &QListWidget::itemClicked, this, &WindowManagerMenu::OnItemClicked);
|
2025-01-19 17:08:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
WindowManagerMenu::~WindowManagerMenu() {
|
|
|
|
|
delete ui;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WindowManagerMenu::AddDockWidget(DockWidget* dockWidget) {
|
|
|
|
|
if (nullptr == dockWidget) {
|
|
|
|
|
LOG_ERROR("dockWidget is nullptr");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QListWidgetItem* item = new QListWidgetItem(dockWidget->windowTitle());
|
|
|
|
|
connect(dockWidget, &DockWidget::windowTitleChanged, [item](const QString& title) {
|
|
|
|
|
item->setText(title);
|
|
|
|
|
}
|
|
|
|
|
);
|
2025-11-09 08:33:48 +00:00
|
|
|
// Initialize check state to match dock visibility
|
2025-11-03 23:23:35 +00:00
|
|
|
item->setCheckState(dockWidget->isVisible() ? Qt::Checked : Qt::Unchecked);
|
2025-11-09 12:58:24 +00:00
|
|
|
// Store as QPointer to prevent dangling pointer on dock destruction
|
|
|
|
|
item->setData(DockWidgetRole, QVariant::fromValue(QPointer<DockWidget>(dockWidget)));
|
2025-11-09 08:33:48 +00:00
|
|
|
// Sync dock visibility changes to check state
|
2025-11-03 23:23:35 +00:00
|
|
|
connect(dockWidget, &DockWidget::visibilityChanged, [item](bool visible) {
|
|
|
|
|
item->setCheckState(visible ? Qt::Checked : Qt::Unchecked);
|
|
|
|
|
});
|
2025-01-21 00:52:43 +00:00
|
|
|
connect(dockWidget, &DockWidget::signalClose, [this, item]() {
|
|
|
|
|
item->setCheckState(Qt::Unchecked);
|
|
|
|
|
});
|
2025-11-09 08:33:48 +00:00
|
|
|
// Remove the corresponding item when the DockWidget is destroyed
|
|
|
|
|
connect(dockWidget, &QObject::destroyed, this, [this, dockWidget]() {
|
|
|
|
|
RemoveDockWidget(dockWidget);
|
|
|
|
|
});
|
2025-01-19 17:08:04 +00:00
|
|
|
ui->listWidget->addItem(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WindowManagerMenu::RemoveDockWidget(class DockWidget* dockWidget) {
|
2025-11-09 08:33:48 +00:00
|
|
|
if (!ui || !ui->listWidget) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 0; i < ui->listWidget->count(); ++i) {
|
|
|
|
|
QListWidgetItem* item = ui->listWidget->item(i);
|
2025-11-09 12:58:24 +00:00
|
|
|
QPointer<DockWidget> ptr = item->data(DockWidgetRole).value<QPointer<DockWidget>>();
|
|
|
|
|
DockWidget* dock = ptr.data();
|
2025-11-09 08:33:48 +00:00
|
|
|
if (dock == dockWidget) {
|
|
|
|
|
// Remove and delete the list item
|
|
|
|
|
delete ui->listWidget->takeItem(i);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-01-19 17:08:04 +00:00
|
|
|
|
2025-11-09 08:33:48 +00:00
|
|
|
void WindowManagerMenu::OnItemClicked(QListWidgetItem* item) {
|
|
|
|
|
bool checked = !(item->checkState() == Qt::Checked);
|
|
|
|
|
item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
|
2025-11-09 12:58:24 +00:00
|
|
|
QPointer<DockWidget> ptr = item->data(DockWidgetRole).value<QPointer<DockWidget>>();
|
|
|
|
|
DockWidget* dock = ptr.data();
|
2025-11-09 08:33:48 +00:00
|
|
|
if (dock) {
|
|
|
|
|
dock->setVisible(checked);
|
|
|
|
|
}
|
2025-01-19 17:08:04 +00:00
|
|
|
}
|