forked from qt-creator/qt-creator
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:
@@ -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)
|
||||||
{
|
{
|
||||||
QApplication::instance()->installEventFilter(this);
|
if (!m_immutable)
|
||||||
|
QApplication::instance()->installEventFilter(this);
|
||||||
QDockWidget::enterEvent(event);
|
QDockWidget::enterEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DockWidget::leaveEvent(QEvent *event)
|
void DockWidget::leaveEvent(QEvent *event)
|
||||||
{
|
{
|
||||||
if (!isFloating()) {
|
if (!m_immutable) {
|
||||||
m_timer.stop();
|
if (!isFloating()) {
|
||||||
m_titleBar->setActive(false);
|
m_timer.stop();
|
||||||
|
m_titleBar->setActive(false);
|
||||||
|
}
|
||||||
|
QApplication::instance()->removeEventFilter(this);
|
||||||
}
|
}
|
||||||
QApplication::instance()->removeEventFilter(this);
|
|
||||||
QDockWidget::leaveEvent(event);
|
QDockWidget::leaveEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,25 +373,27 @@ 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);
|
||||||
|
|
||||||
connect(dockWidget, &QDockWidget::visibilityChanged,
|
if (!immutable) {
|
||||||
[this, dockWidget](bool visible) {
|
connect(dockWidget, &QDockWidget::visibilityChanged,
|
||||||
if (d->m_handleDockVisibilityChanges)
|
[this, dockWidget](bool visible) {
|
||||||
dockWidget->setProperty(dockWidgetActiveState, visible);
|
if (d->m_handleDockVisibilityChanges)
|
||||||
});
|
dockWidget->setProperty(dockWidgetActiveState, visible);
|
||||||
|
});
|
||||||
|
|
||||||
connect(dockWidget->toggleViewAction(), &QAction::triggered,
|
connect(dockWidget->toggleViewAction(), &QAction::triggered,
|
||||||
this, &FancyMainWindow::onDockActionTriggered,
|
this, &FancyMainWindow::onDockActionTriggered,
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
|
|
||||||
dockWidget->setProperty(dockWidgetActiveState, true);
|
dockWidget->setProperty(dockWidgetActiveState, true);
|
||||||
|
}
|
||||||
|
|
||||||
return dockWidget;
|
return dockWidget;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user