From d258d47b426dcf3e58dab8e46456bc4e396890b7 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 22 Jul 2016 15:53:11 +0200 Subject: [PATCH] FancyMainWindow: Add a way to make the layout immutable To be used in the new Project mode main window to prevent accidental closing of the navigation dock. Change-Id: Id8970ab80a91113e97a9f9a07b9dfb12b9cb0e30 Reviewed-by: Alessandro Portale --- src/libs/utils/fancymainwindow.cpp | 49 ++++++++++++++++++------------ src/libs/utils/fancymainwindow.h | 2 +- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/libs/utils/fancymainwindow.cpp b/src/libs/utils/fancymainwindow.cpp index fd315a8e117..14262fb94d6 100644 --- a/src/libs/utils/fancymainwindow.cpp +++ b/src/libs/utils/fancymainwindow.cpp @@ -67,7 +67,7 @@ struct FancyMainWindowPrivate class DockWidget : public QDockWidget { public: - DockWidget(QWidget *inner, FancyMainWindow *parent); + DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable = false); bool eventFilter(QObject *, QEvent *event); void enterEvent(QEvent *event); @@ -81,6 +81,7 @@ private: QPoint m_startPos; TitleBarWidget *m_titleBar; QTimer m_timer; + bool m_immutable = false; }; // Stolen from QDockWidgetTitleButton @@ -240,8 +241,8 @@ public: DockWidgetTitleButton *m_closeButton; }; -DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent) - : QDockWidget(parent), q(parent) +DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable) + : QDockWidget(parent), q(parent), m_immutable(immutable) { setWidget(inner); setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable); @@ -255,6 +256,9 @@ DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent) m_titleBar->m_titleLabel->setText(inner->windowTitle()); setTitleBarWidget(m_titleBar); + if (immutable) + return; + m_timer.setSingleShot(true); m_timer.setInterval(500); @@ -279,7 +283,7 @@ DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent) bool DockWidget::eventFilter(QObject *, QEvent *event) { - if (event->type() == QEvent::MouseMove && q->autoHideTitleBars()) { + if (!m_immutable && event->type() == QEvent::MouseMove && q->autoHideTitleBars()) { QMouseEvent *me = static_cast(event); int y = me->pos().y(); int x = me->pos().x(); @@ -294,17 +298,20 @@ bool DockWidget::eventFilter(QObject *, QEvent *event) void DockWidget::enterEvent(QEvent *event) { - QApplication::instance()->installEventFilter(this); + if (!m_immutable) + QApplication::instance()->installEventFilter(this); QDockWidget::enterEvent(event); } void DockWidget::leaveEvent(QEvent *event) { - if (!isFloating()) { - m_timer.stop(); - m_titleBar->setActive(false); + if (!m_immutable) { + if (!isFloating()) { + m_timer.stop(); + m_titleBar->setActive(false); + } + QApplication::instance()->removeEventFilter(this); } - QApplication::instance()->removeEventFilter(this); QDockWidget::leaveEvent(event); } @@ -366,25 +373,27 @@ FancyMainWindow::~FancyMainWindow() delete d; } -QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget) +QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget, bool immutable) { QTC_ASSERT(widget, return 0); QTC_CHECK(widget->objectName().size()); QTC_CHECK(widget->windowTitle().size()); - auto dockWidget = new DockWidget(widget, this); + auto dockWidget = new DockWidget(widget, this, immutable); - connect(dockWidget, &QDockWidget::visibilityChanged, - [this, dockWidget](bool visible) { - if (d->m_handleDockVisibilityChanges) - dockWidget->setProperty(dockWidgetActiveState, visible); - }); + if (!immutable) { + connect(dockWidget, &QDockWidget::visibilityChanged, + [this, dockWidget](bool visible) { + if (d->m_handleDockVisibilityChanges) + dockWidget->setProperty(dockWidgetActiveState, visible); + }); - connect(dockWidget->toggleViewAction(), &QAction::triggered, - this, &FancyMainWindow::onDockActionTriggered, - Qt::QueuedConnection); + connect(dockWidget->toggleViewAction(), &QAction::triggered, + this, &FancyMainWindow::onDockActionTriggered, + Qt::QueuedConnection); - dockWidget->setProperty(dockWidgetActiveState, true); + dockWidget->setProperty(dockWidgetActiveState, true); + } return dockWidget; } diff --git a/src/libs/utils/fancymainwindow.h b/src/libs/utils/fancymainwindow.h index f66287e6cf1..50e463b9c0f 100644 --- a/src/libs/utils/fancymainwindow.h +++ b/src/libs/utils/fancymainwindow.h @@ -47,7 +47,7 @@ public: /* The widget passed in should have an objectname set * which will then be used as key for QSettings. */ - QDockWidget *addDockForWidget(QWidget *widget); + QDockWidget *addDockForWidget(QWidget *widget, bool immutable = false); QList dockWidgets() const; void setTrackingEnabled(bool enabled);