From 4c1dd6f6f2aaac8fad804fa87f0ecf70fd77e68b Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Fri, 12 Oct 2018 10:14:40 +0200
Subject: [PATCH] Code of FancyMainWindow is updated from Qt-creator source
 (project is not in compilable state)

---
 .../qt-manhattan-style/fancymainwindow.cpp    | 565 +++++++++++++-----
 .../GUI/qt-manhattan-style/fancymainwindow.h  |  75 +--
 2 files changed, 436 insertions(+), 204 deletions(-)

diff --git a/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp
index eec96e4f63d..de73c6edaaa 100644
--- a/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp
+++ b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 **
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of Qt Creator.
 **
@@ -9,89 +9,379 @@
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.  For licensing terms and
-** conditions see http://qt.digia.com/licensing.  For further information
-** use the contact form at http://qt.digia.com/contact-us.
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
 **
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights.  These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 **
 ****************************************************************************/
 
 #include "fancymainwindow.h"
 
+#include "algorithm.h"
 #include "qtcassert.h"
+#include "stringutils.h"
 
-#include <QList>
-#include <QHash>
-
-#include <QAction>
+#include <QAbstractButton>
+#include <QApplication>
 #include <QContextMenuEvent>
-#include <QMenu>
 #include <QDockWidget>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QMenu>
+#include <QPainter>
 #include <QSettings>
+#include <QStyle>
+#include <QStyleOption>
+#include <QTimer>
+#include <QToolButton>
+
+static const char AutoHideTitleBarsKey[] = "AutoHideTitleBars";
+static const char ShowCentralWidgetKey[] = "ShowCentralWidget";
+static const char StateKey[] = "State";
 
-static const char lockedKeyC[] = "Locked";
-static const char stateKeyC[] = "State";
 static const int settingsVersion = 2;
 static const char dockWidgetActiveState[] = "DockWidgetActiveState";
 
-namespace Manhattan {
+namespace Utils {
 
-/*! \class Manhattan::FancyMainWindow
-
-    \brief MainWindow with dock widgets and additional "lock" functionality
-    (locking the dock widgets in place) and "reset layout" functionality.
-
-    The dock actions and the additional actions should be accessible
-    in a Window-menu.
-*/
+class TitleBarWidget;
 
 struct FancyMainWindowPrivate
 {
-    FancyMainWindowPrivate();
+    FancyMainWindowPrivate(FancyMainWindow *parent);
 
-    bool m_locked;
-    bool m_handleDockVisibilityChanges;
+    FancyMainWindow *q;
 
+    bool m_handleDockVisibilityChanges;
+    QAction m_showCentralWidget;
     QAction m_menuSeparator1;
-    QAction m_toggleLockedAction;
     QAction m_menuSeparator2;
     QAction m_resetLayoutAction;
-    QDockWidget *m_toolBarDockWidget;
+    QAction m_autoHideTitleBars;
 };
 
-FancyMainWindowPrivate::FancyMainWindowPrivate() :
-    m_locked(true),
+class DockWidget : public QDockWidget
+{
+public:
+    DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable = false);
+
+    bool eventFilter(QObject *, QEvent *event) override;
+    void enterEvent(QEvent *event) override;
+    void leaveEvent(QEvent *event) override;
+    void handleMouseTimeout();
+    void handleToplevelChanged(bool floating);
+
+    FancyMainWindow *q;
+
+private:
+    QPoint m_startPos;
+    TitleBarWidget *m_titleBar;
+    QTimer m_timer;
+    bool m_immutable = false;
+};
+
+// Stolen from QDockWidgetTitleButton
+class DockWidgetTitleButton : public QAbstractButton
+{
+public:
+    DockWidgetTitleButton(QWidget *parent)
+        : QAbstractButton(parent)
+    {
+        setFocusPolicy(Qt::NoFocus);
+    }
+
+    QSize sizeHint() const override
+    {
+        ensurePolished();
+
+        int size = 2*style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, nullptr, this);
+        if (!icon().isNull()) {
+            int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this);
+            QSize sz = icon().actualSize(QSize(iconSize, iconSize));
+            size += qMax(sz.width(), sz.height());
+        }
+
+        return QSize(size, size);
+    }
+
+    QSize minimumSizeHint() const override { return sizeHint(); }
+
+    void enterEvent(QEvent *event) override
+    {
+        if (isEnabled())
+            update();
+        QAbstractButton::enterEvent(event);
+    }
+
+    void leaveEvent(QEvent *event) override
+    {
+        if (isEnabled())
+            update();
+        QAbstractButton::leaveEvent(event);
+    }
+
+    void paintEvent(QPaintEvent *event) override;
+};
+
+void DockWidgetTitleButton::paintEvent(QPaintEvent *)
+{
+    QPainter p(this);
+
+    QStyleOptionToolButton opt;
+    opt.init(this);
+    opt.state |= QStyle::State_AutoRaise;
+    opt.icon = icon();
+    opt.subControls = nullptr;
+    opt.activeSubControls = nullptr;
+    opt.features = QStyleOptionToolButton::None;
+    opt.arrowType = Qt::NoArrow;
+    int size = style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this);
+    opt.iconSize = QSize(size, size);
+    style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);
+}
+
+class TitleBarWidget : public QWidget
+{
+public:
+    TitleBarWidget(DockWidget *parent, const QStyleOptionDockWidget &opt)
+      : QWidget(parent), q(parent), m_active(true)
+    {
+        m_titleLabel = new QLabel(this);
+
+        m_floatButton = new DockWidgetTitleButton(this);
+        m_floatButton->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarNormalButton, &opt, q));
+
+        m_closeButton = new DockWidgetTitleButton(this);
+        m_closeButton->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarCloseButton, &opt, q));
+
+#ifndef QT_NO_ACCESSIBILITY
+        m_floatButton->setAccessibleName(QDockWidget::tr("Float"));
+        m_floatButton->setAccessibleDescription(QDockWidget::tr("Undocks and re-attaches the dock widget"));
+        m_closeButton->setAccessibleName(QDockWidget::tr("Close"));
+        m_closeButton->setAccessibleDescription(QDockWidget::tr("Closes the dock widget"));
+#endif
+
+        setActive(false);
+
+        const int minWidth = 10;
+        const int maxWidth = 10000;
+        const int inactiveHeight = 0;
+        const int activeHeight = m_closeButton->sizeHint().height() + 2;
+
+        m_minimumInactiveSize = QSize(minWidth, inactiveHeight);
+        m_maximumInactiveSize = QSize(maxWidth, inactiveHeight);
+        m_minimumActiveSize   = QSize(minWidth, activeHeight);
+        m_maximumActiveSize   = QSize(maxWidth, activeHeight);
+
+        auto layout = new QHBoxLayout(this);
+        layout->setMargin(0);
+        layout->setSpacing(0);
+        layout->setContentsMargins(4, 0, 0, 0);
+        layout->addWidget(m_titleLabel);
+        layout->addStretch();
+        layout->addWidget(m_floatButton);
+        layout->addWidget(m_closeButton);
+        setLayout(layout);
+
+        setProperty("managed_titlebar", 1);
+    }
+
+    void enterEvent(QEvent *event) override
+    {
+        setActive(true);
+        QWidget::enterEvent(event);
+    }
+
+    void setActive(bool on)
+    {
+        m_active = on;
+        updateChildren();
+    }
+
+    void updateChildren()
+    {
+        bool clickable = isClickable();
+        m_titleLabel->setVisible(clickable);
+        m_floatButton->setVisible(clickable);
+        m_closeButton->setVisible(clickable);
+    }
+
+    bool isClickable() const
+    {
+        return m_active || !q->q->autoHideTitleBars();
+    }
+
+    QSize sizeHint() const override
+    {
+        ensurePolished();
+        return isClickable() ? m_maximumActiveSize : m_maximumInactiveSize;
+    }
+
+    QSize minimumSizeHint() const override
+    {
+        ensurePolished();
+        return isClickable() ? m_minimumActiveSize : m_minimumInactiveSize;
+    }
+
+private:
+    DockWidget *q;
+    bool m_active;
+    QSize m_minimumActiveSize;
+    QSize m_maximumActiveSize;
+    QSize m_minimumInactiveSize;
+    QSize m_maximumInactiveSize;
+
+public:
+    QLabel *m_titleLabel;
+    DockWidgetTitleButton *m_floatButton;
+    DockWidgetTitleButton *m_closeButton;
+};
+
+DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable)
+    : QDockWidget(parent), q(parent), m_immutable(immutable)
+{
+    setWidget(inner);
+    setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
+    setObjectName(inner->objectName() + QLatin1String("DockWidget"));
+    setMouseTracking(true);
+
+    QString title = inner->windowTitle();
+    toggleViewAction()->setProperty("original_title", title);
+    title = Utils::stripAccelerator(title);
+    setWindowTitle(title);
+
+    QStyleOptionDockWidget opt;
+    initStyleOption(&opt);
+    m_titleBar = new TitleBarWidget(this, opt);
+    m_titleBar->m_titleLabel->setText(title);
+    setTitleBarWidget(m_titleBar);
+
+    if (immutable)
+        return;
+
+    m_timer.setSingleShot(true);
+    m_timer.setInterval(500);
+
+    connect(&m_timer, &QTimer::timeout, this, &DockWidget::handleMouseTimeout);
+
+    connect(this, &QDockWidget::topLevelChanged, this, &DockWidget::handleToplevelChanged);
+
+    connect(toggleViewAction(), &QAction::triggered,
+            [this]() {
+                if (isVisible())
+                    raise();
+            });
+
+    auto origFloatButton = findChild<QAbstractButton *>(QLatin1String("qt_dockwidget_floatbutton"));
+    connect(m_titleBar->m_floatButton, &QAbstractButton::clicked,
+            origFloatButton, &QAbstractButton::clicked);
+
+    auto origCloseButton = findChild<QAbstractButton *>(QLatin1String("qt_dockwidget_closebutton"));
+    connect(m_titleBar->m_closeButton, &QAbstractButton::clicked,
+            origCloseButton, &QAbstractButton::clicked);
+}
+
+bool DockWidget::eventFilter(QObject *, QEvent *event)
+{
+    if (!m_immutable && event->type() == QEvent::MouseMove && q->autoHideTitleBars()) {
+        auto me = static_cast<QMouseEvent *>(event);
+        int y = me->pos().y();
+        int x = me->pos().x();
+        int h = qMin(8, m_titleBar->m_floatButton->height());
+        if (!isFloating() && widget() && 0 <= x && x < widget()->width() && 0 <= y && y <= h) {
+            m_timer.start();
+            m_startPos = mapToGlobal(me->pos());
+        }
+    }
+    return false;
+}
+
+void DockWidget::enterEvent(QEvent *event)
+{
+    if (!m_immutable)
+        QApplication::instance()->installEventFilter(this);
+    QDockWidget::enterEvent(event);
+}
+
+void DockWidget::leaveEvent(QEvent *event)
+{
+    if (!m_immutable) {
+        if (!isFloating()) {
+            m_timer.stop();
+            m_titleBar->setActive(false);
+        }
+        QApplication::instance()->removeEventFilter(this);
+    }
+    QDockWidget::leaveEvent(event);
+}
+
+void DockWidget::handleMouseTimeout()
+{
+    QPoint dist = m_startPos - QCursor::pos();
+    if (!isFloating() && dist.manhattanLength() < 4)
+        m_titleBar->setActive(true);
+}
+
+void DockWidget::handleToplevelChanged(bool floating)
+{
+    m_titleBar->setActive(floating);
+}
+
+
+
+/*! \class Utils::FancyMainWindow
+
+    \brief The FancyMainWindow class is a MainWindow with dock widgets and
+    additional "lock" functionality
+    (locking the dock widgets in place) and "reset layout" functionality.
+
+    The dock actions and the additional actions should be accessible
+    in a Window-menu.
+*/
+
+FancyMainWindowPrivate::FancyMainWindowPrivate(FancyMainWindow *parent) :
+    q(parent),
     m_handleDockVisibilityChanges(true),
-    m_menuSeparator1(0),
-    m_toggleLockedAction(FancyMainWindow::tr("Locked"), 0),
-    m_menuSeparator2(0),
-    m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), 0),
-    m_toolBarDockWidget(0)
-{
-    m_toggleLockedAction.setCheckable(true);
-    m_toggleLockedAction.setChecked(m_locked);
+    m_showCentralWidget(FancyMainWindow::tr("Central Widget"), nullptr),
+    m_menuSeparator1(nullptr),
+    m_menuSeparator2(nullptr),
+    m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), nullptr),
+    m_autoHideTitleBars(FancyMainWindow::tr("Automatically Hide View Title Bars"), nullptr)
+{
+    m_showCentralWidget.setCheckable(true);
+    m_showCentralWidget.setChecked(true);
+
     m_menuSeparator1.setSeparator(true);
     m_menuSeparator2.setSeparator(true);
+
+    m_autoHideTitleBars.setCheckable(true);
+    m_autoHideTitleBars.setChecked(true);
+
+    QObject::connect(&m_autoHideTitleBars, &QAction::toggled, q, [this](bool) {
+        for (QDockWidget *dock : q->dockWidgets()) {
+            if (auto titleBar = dynamic_cast<TitleBarWidget *>(dock->titleBarWidget()))
+                titleBar->updateChildren();
+        }
+    });
+
+    QObject::connect(&m_showCentralWidget, &QAction::toggled, q, [this](bool visible) {
+        q->centralWidget()->setVisible(visible);
+    });
 }
 
 FancyMainWindow::FancyMainWindow(QWidget *parent) :
-    QMainWindow(parent), d(new FancyMainWindowPrivate)
+    QMainWindow(parent), d(new FancyMainWindowPrivate(this))
 {
-    connect(&d->m_toggleLockedAction, SIGNAL(toggled(bool)),
-            this, SLOT(setLocked(bool)));
-    connect(&d->m_resetLayoutAction, SIGNAL(triggered()),
-            this, SIGNAL(resetLayout()));
+    connect(&d->m_resetLayoutAction, &QAction::triggered,
+            this, &FancyMainWindow::resetLayout);
 }
 
 FancyMainWindow::~FancyMainWindow()
@@ -99,90 +389,51 @@ FancyMainWindow::~FancyMainWindow()
     delete d;
 }
 
-QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget)
+QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget, bool immutable)
 {
-    QDockWidget *dockWidget = new QDockWidget(widget->windowTitle(), this);
-    dockWidget->setWidget(widget);
-    // Set an object name to be used in settings, derive from widget name
-    const QString objectName = widget->objectName();
-    if (objectName.isEmpty()) {
-        dockWidget->setObjectName(QLatin1String("dockWidget")
-                                  + QString::number(dockWidgets().size() + 1));
-    } else {
-        dockWidget->setObjectName(objectName + QLatin1String("DockWidget"));
-    }
-    connect(dockWidget->toggleViewAction(), SIGNAL(triggered()),
-        this, SLOT(onDockActionTriggered()), Qt::QueuedConnection);
-    connect(dockWidget, SIGNAL(visibilityChanged(bool)),
-            this, SLOT(onDockVisibilityChange(bool)));
-    connect(dockWidget, SIGNAL(topLevelChanged(bool)),
-            this, SLOT(onTopLevelChanged()));
-    dockWidget->setProperty(dockWidgetActiveState, true);
-    updateDockWidget(dockWidget);
-    return dockWidget;
-}
+    QTC_ASSERT(widget, return nullptr);
+    QTC_CHECK(widget->objectName().size());
+    QTC_CHECK(widget->windowTitle().size());
 
-void FancyMainWindow::updateDockWidget(QDockWidget *dockWidget)
-{
-    const QDockWidget::DockWidgetFeatures features =
-            (d->m_locked) ?
-            QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable :
-            QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable
-                | QDockWidget::DockWidgetFloatable;
-    // for the debugger tool bar
-    if (dockWidget->property("managed_dockwidget").isNull()) {
-        QWidget *titleBarWidget = dockWidget->titleBarWidget();
-        if (d->m_locked && !titleBarWidget && !dockWidget->isFloating())
-            titleBarWidget = new QWidget(dockWidget);
-        else if ((!d->m_locked || dockWidget->isFloating()) && titleBarWidget) {
-            delete titleBarWidget;
-            titleBarWidget = 0;
-        }
-        dockWidget->setTitleBarWidget(titleBarWidget);
+    auto dockWidget = new DockWidget(widget, this, immutable);
+
+    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);
+
+        dockWidget->setProperty(dockWidgetActiveState, true);
     }
-    dockWidget->setFeatures(features);
+
+    return dockWidget;
 }
 
 void FancyMainWindow::onDockActionTriggered()
 {
-    QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent());
+    auto dw = qobject_cast<QDockWidget *>(sender()->parent());
     if (dw) {
         if (dw->isVisible())
             dw->raise();
     }
 }
 
-void FancyMainWindow::onDockVisibilityChange(bool visible)
-{
-    if (d->m_handleDockVisibilityChanges)
-        sender()->setProperty(dockWidgetActiveState, visible);
-}
-
-void FancyMainWindow::onTopLevelChanged()
-{
-    updateDockWidget(qobject_cast<QDockWidget*>(sender()));
-}
-
 void FancyMainWindow::setTrackingEnabled(bool enabled)
 {
     if (enabled) {
         d->m_handleDockVisibilityChanges = true;
-        foreach (QDockWidget *dockWidget, dockWidgets())
-            dockWidget->setProperty(dockWidgetActiveState,
-                                    dockWidget->isVisible());
+        for (QDockWidget *dockWidget : dockWidgets())
+            dockWidget->setProperty(dockWidgetActiveState, dockWidget->isVisible());
     } else {
         d->m_handleDockVisibilityChanges = false;
     }
 }
 
-void FancyMainWindow::setLocked(bool locked)
-{
-    d->m_locked = locked;
-    foreach (QDockWidget *dockWidget, dockWidgets()) {
-        updateDockWidget(dockWidget);
-    }
-}
-
 void FancyMainWindow::hideEvent(QHideEvent *event)
 {
     Q_UNUSED(event)
@@ -197,15 +448,15 @@ void FancyMainWindow::showEvent(QShowEvent *event)
 
 void FancyMainWindow::contextMenuEvent(QContextMenuEvent *event)
 {
-    QMenu *menu = createPopupMenu();
-    menu->exec(event->globalPos());
-    delete menu;
+    QMenu menu;
+    addDockActionsToMenu(&menu);
+    menu.exec(event->globalPos());
 }
 
 void FancyMainWindow::handleVisibilityChanged(bool visible)
 {
     d->m_handleDockVisibilityChanges = false;
-    foreach (QDockWidget *dockWidget, dockWidgets()) {
+    for (QDockWidget *dockWidget : dockWidgets()) {
         if (dockWidget->isFloating()) {
             dockWidget->setVisible(visible
                 && dockWidget->property(dockWidgetActiveState).toBool());
@@ -237,9 +488,11 @@ void FancyMainWindow::restoreSettings(const QSettings *settings)
 QHash<QString, QVariant> FancyMainWindow::saveSettings() const
 {
     QHash<QString, QVariant> settings;
-    settings.insert(QLatin1String(stateKeyC), saveState(settingsVersion));
-    settings.insert(QLatin1String(lockedKeyC), d->m_locked);
-    foreach (QDockWidget *dockWidget, dockWidgets()) {
+    settings.insert(QLatin1String(StateKey), saveState(settingsVersion));
+    settings.insert(QLatin1String(AutoHideTitleBarsKey),
+        d->m_autoHideTitleBars.isChecked());
+    settings.insert(ShowCentralWidgetKey, d->m_showCentralWidget.isChecked());
+    for (QDockWidget *dockWidget : dockWidgets()) {
         settings.insert(dockWidget->objectName(),
                 dockWidget->property(dockWidgetActiveState));
     }
@@ -248,55 +501,53 @@ QHash<QString, QVariant> FancyMainWindow::saveSettings() const
 
 void FancyMainWindow::restoreSettings(const QHash<QString, QVariant> &settings)
 {
-    QByteArray ba = settings.value(QLatin1String(stateKeyC),
-                                   QByteArray()).toByteArray();
+    QByteArray ba = settings.value(QLatin1String(StateKey), QByteArray()).toByteArray();
     if (!ba.isEmpty())
         restoreState(ba, settingsVersion);
-    d->m_locked = settings.value(QLatin1String("Locked"), true).toBool();
-    d->m_toggleLockedAction.setChecked(d->m_locked);
-    foreach (QDockWidget *widget, dockWidgets()) {
+    bool on = settings.value(QLatin1String(AutoHideTitleBarsKey), true).toBool();
+    d->m_autoHideTitleBars.setChecked(on);
+    d->m_showCentralWidget.setChecked(settings.value(ShowCentralWidgetKey, true).toBool());
+    for (QDockWidget *widget : dockWidgets()) {
         widget->setProperty(dockWidgetActiveState,
             settings.value(widget->objectName(), false));
     }
 }
 
-QList<QDockWidget *> FancyMainWindow::dockWidgets() const
+const QList<QDockWidget *> FancyMainWindow::dockWidgets() const
 {
-    return this->findChildren<QDockWidget *>();
+    return findChildren<QDockWidget *>();
 }
 
-bool FancyMainWindow::isLocked() const
+bool FancyMainWindow::autoHideTitleBars() const
 {
-    return d->m_locked;
+    return d->m_autoHideTitleBars.isChecked();
 }
 
-static bool actionLessThan(const QAction *action1, const QAction *action2)
-{
-    QTC_ASSERT(action1, return true);
-    QTC_ASSERT(action2, return false);
-    return action1->text().toLower() < action2->text().toLower();
-}
-
-QMenu *FancyMainWindow::createPopupMenu()
+void FancyMainWindow::addDockActionsToMenu(QMenu *menu)
 {
     QList<QAction *> actions;
-    QList<QDockWidget *> dockwidgets = this->findChildren<QDockWidget *>();
+    QList<QDockWidget *> dockwidgets = findChildren<QDockWidget *>();
     for (int i = 0; i < dockwidgets.size(); ++i) {
         QDockWidget *dockWidget = dockwidgets.at(i);
         if (dockWidget->property("managed_dockwidget").isNull()
                 && dockWidget->parentWidget() == this) {
-            actions.append(dockwidgets.at(i)->toggleViewAction());
+            QAction *action = dockWidget->toggleViewAction();
+            action->setText(action->property("original_title").toString());
+            actions.append(action);
         }
     }
-    qSort(actions.begin(), actions.end(), actionLessThan);
-    QMenu *menu = new QMenu(this);
+    Utils::sort(actions, [](const QAction *action1, const QAction *action2) {
+        QTC_ASSERT(action1, return true);
+        QTC_ASSERT(action2, return false);
+        return stripAccelerator(action1->text()).toLower() < stripAccelerator(action2->text()).toLower();
+    });
     foreach (QAction *action, actions)
         menu->addAction(action);
+    menu->addAction(&d->m_showCentralWidget);
     menu->addAction(&d->m_menuSeparator1);
-    menu->addAction(&d->m_toggleLockedAction);
+    menu->addAction(&d->m_autoHideTitleBars);
     menu->addAction(&d->m_menuSeparator2);
     menu->addAction(&d->m_resetLayoutAction);
-    return menu;
 }
 
 QAction *FancyMainWindow::menuSeparator1() const
@@ -304,9 +555,9 @@ QAction *FancyMainWindow::menuSeparator1() const
     return &d->m_menuSeparator1;
 }
 
-QAction *FancyMainWindow::toggleLockedAction() const
+QAction *FancyMainWindow::autoHideTitleBarsAction() const
 {
-    return &d->m_toggleLockedAction;
+    return &d->m_autoHideTitleBars;
 }
 
 QAction *FancyMainWindow::menuSeparator2() const
@@ -319,24 +570,20 @@ QAction *FancyMainWindow::resetLayoutAction() const
     return &d->m_resetLayoutAction;
 }
 
+QAction *FancyMainWindow::showCentralWidgetAction() const
+{
+    return &d->m_showCentralWidget;
+}
+
 void FancyMainWindow::setDockActionsVisible(bool v)
 {
-    foreach (const QDockWidget *dockWidget, dockWidgets())
+    for (const QDockWidget *dockWidget : dockWidgets())
         dockWidget->toggleViewAction()->setVisible(v);
-    d->m_toggleLockedAction.setVisible(v);
+    d->m_showCentralWidget.setVisible(v);
+    d->m_autoHideTitleBars.setVisible(v);
     d->m_menuSeparator1.setVisible(v);
     d->m_menuSeparator2.setVisible(v);
     d->m_resetLayoutAction.setVisible(v);
 }
 
-QDockWidget *FancyMainWindow::toolBarDockWidget() const
-{
-    return d->m_toolBarDockWidget;
-}
-
-void FancyMainWindow::setToolBarDockWidget(QDockWidget *dock)
-{
-    d->m_toolBarDockWidget = dock;
-}
-
-} // namespace Manhattan
+} // namespace Utils
diff --git a/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h
index 4c284489d6f..623ef424086 100644
--- a/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h
+++ b/ThirdParty/GUI/qt-manhattan-style/fancymainwindow.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 **
-** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/legal
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of Qt Creator.
 **
@@ -9,28 +9,23 @@
 ** Licensees holding valid commercial Qt licenses may use this file in
 ** accordance with the commercial license agreement provided with the
 ** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and Digia.  For licensing terms and
-** conditions see http://qt.digia.com/licensing.  For further information
-** use the contact form at http://qt.digia.com/contact-us.
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
 **
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file.  Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Digia gives you certain additional
-** rights.  These rights are described in the Digia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 **
 ****************************************************************************/
 
-#ifndef FANCYMAINWINDOW_H
-#define FANCYMAINWINDOW_H
+#pragma once
 
-#include "qt-manhattan-style_global.hpp"
+#include "utils_global.h"
 
 #include <QMainWindow>
 
@@ -38,25 +33,24 @@ QT_BEGIN_NAMESPACE
 class QSettings;
 QT_END_NAMESPACE
 
-namespace Manhattan {
+namespace Utils {
 
 struct FancyMainWindowPrivate;
 
-class QTMANHATTANSTYLESHARED_EXPORT FancyMainWindow : public QMainWindow
+class QTCREATOR_UTILS_EXPORT FancyMainWindow : public QMainWindow
 {
     Q_OBJECT
 
 public:
-    explicit FancyMainWindow(QWidget *parent = 0);
-    virtual ~FancyMainWindow();
+    explicit FancyMainWindow(QWidget *parent = nullptr);
+    ~FancyMainWindow() override;
 
     /* The widget passed in should have an objectname set
      * which will then be used as key for QSettings. */
-    QDockWidget *addDockForWidget(QWidget *widget);
-    QList<QDockWidget *> dockWidgets() const;
+    QDockWidget *addDockForWidget(QWidget *widget, bool immutable = false);
+    const QList<QDockWidget *> dockWidgets() const;
 
     void setTrackingEnabled(bool enabled);
-    bool isLocked() const;
 
     void saveSettings(QSettings *settings) const;
     void restoreSettings(const QSettings *settings);
@@ -65,16 +59,13 @@ public:
 
     // Additional context menu actions
     QAction *menuSeparator1() const;
-    QAction *toggleLockedAction() const;
+    QAction *autoHideTitleBarsAction() const;
     QAction *menuSeparator2() const;
     QAction *resetLayoutAction() const;
+    QAction *showCentralWidgetAction() const;
+    void addDockActionsToMenu(QMenu *menu);
 
-    // Overwritten to add locked/reset.
-    virtual QMenu *createPopupMenu();
-
-
-    QDockWidget *toolBarDockWidget() const;
-    void setToolBarDockWidget(QDockWidget *dock);
+    bool autoHideTitleBars() const;
 
 signals:
     // Emitted by resetLayoutAction(). Connect to a slot
@@ -82,25 +73,19 @@ signals:
     void resetLayout();
 
 public slots:
-    void setLocked(bool locked);
     void setDockActionsVisible(bool v);
 
 protected:
-    void hideEvent(QHideEvent *event);
-    void showEvent(QShowEvent *event);
-    void contextMenuEvent(QContextMenuEvent *event);
-private slots:
-    void onDockActionTriggered();
-    void onDockVisibilityChange(bool);
-    void onTopLevelChanged();
+    void hideEvent(QHideEvent *event) override;
+    void showEvent(QShowEvent *event) override;
+    void contextMenuEvent(QContextMenuEvent *event) override;
 
 private:
-    void updateDockWidget(QDockWidget *dockWidget);
+    void onDockActionTriggered();
+
     void handleVisibilityChanged(bool visible);
 
     FancyMainWindowPrivate *d;
 };
 
-} // namespace Manhattan
-
-#endif // FANCYMAINWINDOW_H
+} // namespace Utils
-- 
GitLab