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