#include "ui/Menu/WindowManagerMenu.h" #include #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); connect(ui->listWidget, &QListWidget::itemClicked, this, &WindowManagerMenu::OnItemClicked); } 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); } ); // Initialize check state to match dock visibility item->setCheckState(dockWidget->isVisible() ? Qt::Checked : Qt::Unchecked); // Store as QPointer to prevent dangling pointer on dock destruction item->setData(DockWidgetRole, QVariant::fromValue(QPointer(dockWidget))); // Sync dock visibility changes to check state connect(dockWidget, &DockWidget::visibilityChanged, [item](bool visible) { item->setCheckState(visible ? Qt::Checked : Qt::Unchecked); }); connect(dockWidget, &DockWidget::signalClose, [this, item]() { 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); } 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); QPointer ptr = item->data(DockWidgetRole).value>(); DockWidget* dock = ptr.data(); 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); QPointer ptr = item->data(DockWidgetRole).value>(); DockWidget* dock = ptr.data(); if (dock) { dock->setVisible(checked); } }