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 <alessandro.portale@qt.io>
This commit is contained in:
hjk
2016-07-22 15:53:11 +02:00
committed by Alessandro Portale
parent 3a9e459408
commit d258d47b42
2 changed files with 30 additions and 21 deletions

View File

@@ -67,7 +67,7 @@ struct FancyMainWindowPrivate
class DockWidget : public QDockWidget class DockWidget : public QDockWidget
{ {
public: public:
DockWidget(QWidget *inner, FancyMainWindow *parent); DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable = false);
bool eventFilter(QObject *, QEvent *event); bool eventFilter(QObject *, QEvent *event);
void enterEvent(QEvent *event); void enterEvent(QEvent *event);
@@ -81,6 +81,7 @@ private:
QPoint m_startPos; QPoint m_startPos;
TitleBarWidget *m_titleBar; TitleBarWidget *m_titleBar;
QTimer m_timer; QTimer m_timer;
bool m_immutable = false;
}; };
// Stolen from QDockWidgetTitleButton // Stolen from QDockWidgetTitleButton
@@ -240,8 +241,8 @@ public:
DockWidgetTitleButton *m_closeButton; DockWidgetTitleButton *m_closeButton;
}; };
DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent) DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable)
: QDockWidget(parent), q(parent) : QDockWidget(parent), q(parent), m_immutable(immutable)
{ {
setWidget(inner); setWidget(inner);
setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable); setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
@@ -255,6 +256,9 @@ DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent)
m_titleBar->m_titleLabel->setText(inner->windowTitle()); m_titleBar->m_titleLabel->setText(inner->windowTitle());
setTitleBarWidget(m_titleBar); setTitleBarWidget(m_titleBar);
if (immutable)
return;
m_timer.setSingleShot(true); m_timer.setSingleShot(true);
m_timer.setInterval(500); m_timer.setInterval(500);
@@ -279,7 +283,7 @@ DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent)
bool DockWidget::eventFilter(QObject *, QEvent *event) 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<QMouseEvent *>(event); QMouseEvent *me = static_cast<QMouseEvent *>(event);
int y = me->pos().y(); int y = me->pos().y();
int x = me->pos().x(); int x = me->pos().x();
@@ -294,17 +298,20 @@ bool DockWidget::eventFilter(QObject *, QEvent *event)
void DockWidget::enterEvent(QEvent *event) void DockWidget::enterEvent(QEvent *event)
{ {
if (!m_immutable)
QApplication::instance()->installEventFilter(this); QApplication::instance()->installEventFilter(this);
QDockWidget::enterEvent(event); QDockWidget::enterEvent(event);
} }
void DockWidget::leaveEvent(QEvent *event) void DockWidget::leaveEvent(QEvent *event)
{ {
if (!m_immutable) {
if (!isFloating()) { if (!isFloating()) {
m_timer.stop(); m_timer.stop();
m_titleBar->setActive(false); m_titleBar->setActive(false);
} }
QApplication::instance()->removeEventFilter(this); QApplication::instance()->removeEventFilter(this);
}
QDockWidget::leaveEvent(event); QDockWidget::leaveEvent(event);
} }
@@ -366,14 +373,15 @@ FancyMainWindow::~FancyMainWindow()
delete d; delete d;
} }
QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget) QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget, bool immutable)
{ {
QTC_ASSERT(widget, return 0); QTC_ASSERT(widget, return 0);
QTC_CHECK(widget->objectName().size()); QTC_CHECK(widget->objectName().size());
QTC_CHECK(widget->windowTitle().size()); QTC_CHECK(widget->windowTitle().size());
auto dockWidget = new DockWidget(widget, this); auto dockWidget = new DockWidget(widget, this, immutable);
if (!immutable) {
connect(dockWidget, &QDockWidget::visibilityChanged, connect(dockWidget, &QDockWidget::visibilityChanged,
[this, dockWidget](bool visible) { [this, dockWidget](bool visible) {
if (d->m_handleDockVisibilityChanges) if (d->m_handleDockVisibilityChanges)
@@ -385,6 +393,7 @@ QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget)
Qt::QueuedConnection); Qt::QueuedConnection);
dockWidget->setProperty(dockWidgetActiveState, true); dockWidget->setProperty(dockWidgetActiveState, true);
}
return dockWidget; return dockWidget;
} }

View File

@@ -47,7 +47,7 @@ public:
/* The widget passed in should have an objectname set /* The widget passed in should have an objectname set
* which will then be used as key for QSettings. */ * which will then be used as key for QSettings. */
QDockWidget *addDockForWidget(QWidget *widget); QDockWidget *addDockForWidget(QWidget *widget, bool immutable = false);
QList<QDockWidget *> dockWidgets() const; QList<QDockWidget *> dockWidgets() const;
void setTrackingEnabled(bool enabled); void setTrackingEnabled(bool enabled);