2012-10-02 09:12:39 +02:00
|
|
|
/****************************************************************************
|
2009-08-06 16:01:51 +02:00
|
|
|
**
|
2014-01-07 13:27:11 +01:00
|
|
|
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
|
2012-10-02 09:12:39 +02:00
|
|
|
** Contact: http://www.qt-project.org/legal
|
2009-08-06 16:01:51 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** This file is part of Qt Creator.
|
2009-08-06 16:01:51 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** Commercial License Usage
|
|
|
|
|
** 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
|
2014-10-01 13:21:18 +02:00
|
|
|
** conditions see http://www.qt.io/licensing. For further information
|
|
|
|
|
** use the contact form at http://www.qt.io/contact-us.
|
2009-08-06 16:01:51 +02:00
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
2012-10-02 09:12:39 +02:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
2014-10-01 13:21:18 +02:00
|
|
|
** General Public License version 2.1 or version 3 as published by the Free
|
|
|
|
|
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
|
|
|
|
|
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
|
|
|
|
|
** following information to ensure the GNU Lesser General Public License
|
|
|
|
|
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
|
|
|
|
|
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2009-08-06 16:01:51 +02:00
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
** In addition, as a special exception, Digia gives you certain additional
|
|
|
|
|
** rights. These rights are described in the Digia Qt LGPL Exception
|
2010-12-17 16:01:08 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
2012-10-02 09:12:39 +02:00
|
|
|
****************************************************************************/
|
2009-08-06 16:01:51 +02:00
|
|
|
|
|
|
|
|
#include "fancymainwindow.h"
|
|
|
|
|
|
2011-07-13 10:35:41 +02:00
|
|
|
#include "qtcassert.h"
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
#include <QAbstractButton>
|
2014-07-17 14:26:46 +02:00
|
|
|
#include <QApplication>
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QContextMenuEvent>
|
|
|
|
|
#include <QDockWidget>
|
2014-07-14 16:47:51 +02:00
|
|
|
#include <QHBoxLayout>
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QMenu>
|
|
|
|
|
#include <QPainter>
|
2012-02-15 10:42:41 +01:00
|
|
|
#include <QSettings>
|
2014-07-14 16:47:51 +02:00
|
|
|
#include <QStyle>
|
|
|
|
|
#include <QStyleOption>
|
2014-07-17 14:26:46 +02:00
|
|
|
#include <QTimer>
|
2014-07-14 16:47:51 +02:00
|
|
|
#include <QToolButton>
|
2009-10-01 16:38:08 +02:00
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
static const char AutoHideTitleBarsKey[] = "AutoHideTitleBars";
|
|
|
|
|
static const char StateKey[] = "State";
|
|
|
|
|
|
2010-06-29 18:12:22 +02:00
|
|
|
static const int settingsVersion = 2;
|
2011-02-07 15:17:30 +01:00
|
|
|
static const char dockWidgetActiveState[] = "DockWidgetActiveState";
|
2010-04-20 16:46:35 +02:00
|
|
|
|
2010-03-17 17:44:46 +01:00
|
|
|
namespace Utils {
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
class TitleBarWidget;
|
|
|
|
|
|
|
|
|
|
struct FancyMainWindowPrivate
|
|
|
|
|
{
|
|
|
|
|
FancyMainWindowPrivate(FancyMainWindow *parent);
|
|
|
|
|
|
|
|
|
|
FancyMainWindow *q;
|
|
|
|
|
|
|
|
|
|
bool m_handleDockVisibilityChanges;
|
|
|
|
|
QAction m_menuSeparator1;
|
|
|
|
|
QAction m_menuSeparator2;
|
|
|
|
|
QAction m_resetLayoutAction;
|
|
|
|
|
QDockWidget *m_toolBarDockWidget;
|
|
|
|
|
QAction m_autoHideTitleBars;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class DockWidget : public QDockWidget
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
DockWidget(QWidget *inner, FancyMainWindow *parent);
|
|
|
|
|
|
|
|
|
|
bool eventFilter(QObject *, QEvent *event);
|
|
|
|
|
void enterEvent(QEvent *event);
|
|
|
|
|
void leaveEvent(QEvent *event);
|
|
|
|
|
void handleMouseTimeout();
|
|
|
|
|
void handleToplevelChanged(bool floating);
|
|
|
|
|
|
|
|
|
|
FancyMainWindow *q;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QPoint m_startPos;
|
|
|
|
|
QWidget *m_inner;
|
|
|
|
|
TitleBarWidget *m_titleBar;
|
|
|
|
|
QTimer m_timer;
|
|
|
|
|
};
|
|
|
|
|
|
2014-07-14 16:47:51 +02:00
|
|
|
// Stolen from QDockWidgetTitleButton
|
|
|
|
|
class DockWidgetTitleButton : public QAbstractButton
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
DockWidgetTitleButton(QWidget *parent)
|
|
|
|
|
: QAbstractButton(parent)
|
|
|
|
|
{
|
|
|
|
|
setFocusPolicy(Qt::NoFocus);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize sizeHint() const
|
|
|
|
|
{
|
|
|
|
|
ensurePolished();
|
|
|
|
|
|
|
|
|
|
int size = 2*style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin, 0, this);
|
|
|
|
|
if (!icon().isNull()) {
|
|
|
|
|
int iconSize = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);
|
|
|
|
|
QSize sz = icon().actualSize(QSize(iconSize, iconSize));
|
|
|
|
|
size += qMax(sz.width(), sz.height());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return QSize(size, size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize minimumSizeHint() const { return sizeHint(); }
|
|
|
|
|
|
|
|
|
|
void enterEvent(QEvent *event)
|
|
|
|
|
{
|
2014-09-29 17:03:25 +02:00
|
|
|
if (isEnabled())
|
|
|
|
|
update();
|
2014-07-14 16:47:51 +02:00
|
|
|
QAbstractButton::enterEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void leaveEvent(QEvent *event)
|
|
|
|
|
{
|
2014-09-29 17:03:25 +02:00
|
|
|
if (isEnabled())
|
|
|
|
|
update();
|
2014-07-14 16:47:51 +02:00
|
|
|
QAbstractButton::leaveEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void paintEvent(QPaintEvent *event);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void DockWidgetTitleButton::paintEvent(QPaintEvent *)
|
|
|
|
|
{
|
|
|
|
|
QPainter p(this);
|
|
|
|
|
|
|
|
|
|
QStyleOptionToolButton opt;
|
|
|
|
|
opt.init(this);
|
|
|
|
|
opt.state |= QStyle::State_AutoRaise;
|
|
|
|
|
opt.icon = icon();
|
|
|
|
|
opt.subControls = 0;
|
|
|
|
|
opt.activeSubControls = 0;
|
|
|
|
|
opt.features = QStyleOptionToolButton::None;
|
|
|
|
|
opt.arrowType = Qt::NoArrow;
|
|
|
|
|
int size = style()->pixelMetric(QStyle::PM_SmallIconSize, 0, this);
|
|
|
|
|
opt.iconSize = QSize(size, size);
|
|
|
|
|
style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class TitleBarWidget : public QWidget
|
|
|
|
|
{
|
|
|
|
|
public:
|
2014-09-29 17:03:25 +02:00
|
|
|
TitleBarWidget(DockWidget *parent, const QStyleOptionDockWidget &opt)
|
2014-07-14 16:47:51 +02:00
|
|
|
: 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_floatButton->setAccessibleName(QDockWidget::tr("Float"));
|
|
|
|
|
m_floatButton->setAccessibleDescription(QDockWidget::tr("Undocks and re-attaches the dock widget"));
|
|
|
|
|
|
|
|
|
|
m_closeButton = new DockWidgetTitleButton(this);
|
|
|
|
|
m_closeButton->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarCloseButton, &opt, q));
|
|
|
|
|
m_closeButton->setAccessibleName(QDockWidget::tr("Close"));
|
|
|
|
|
m_closeButton->setAccessibleDescription(QDockWidget::tr("Closes the dock widget"));
|
|
|
|
|
|
|
|
|
|
setActive(false);
|
|
|
|
|
|
|
|
|
|
const int minWidth = 10;
|
|
|
|
|
const int maxWidth = 10000;
|
2014-07-17 14:26:46 +02:00
|
|
|
const int inactiveHeight = 0;
|
2014-07-14 16:47:51 +02:00
|
|
|
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);
|
2014-09-29 17:03:25 +02:00
|
|
|
|
|
|
|
|
setProperty("managed_titlebar", 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void enterEvent(QEvent *event)
|
|
|
|
|
{
|
|
|
|
|
setActive(true);
|
|
|
|
|
QWidget::enterEvent(event);
|
2014-07-14 16:47:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void leaveEvent(QEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (!q->isFloating())
|
|
|
|
|
setActive(false);
|
|
|
|
|
QWidget::leaveEvent(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setActive(bool on)
|
|
|
|
|
{
|
|
|
|
|
m_active = on;
|
2014-09-29 17:03:25 +02:00
|
|
|
updateChildren();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void updateChildren()
|
|
|
|
|
{
|
|
|
|
|
bool clickable = isClickable();
|
|
|
|
|
m_titleLabel->setVisible(clickable);
|
|
|
|
|
m_floatButton->setVisible(clickable);
|
|
|
|
|
m_closeButton->setVisible(clickable);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool isClickable() const
|
|
|
|
|
{
|
2014-10-10 12:32:53 +02:00
|
|
|
return m_active || !q->q->autoHideTitleBars();
|
2014-07-14 16:47:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize sizeHint() const
|
|
|
|
|
{
|
|
|
|
|
ensurePolished();
|
2014-09-29 17:03:25 +02:00
|
|
|
return isClickable() ? m_maximumActiveSize : m_maximumInactiveSize;
|
2014-07-14 16:47:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QSize minimumSizeHint() const
|
|
|
|
|
{
|
|
|
|
|
ensurePolished();
|
2014-09-29 17:03:25 +02:00
|
|
|
return isClickable() ? m_minimumActiveSize : m_minimumInactiveSize;
|
2014-07-14 16:47:51 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
private:
|
|
|
|
|
DockWidget *q;
|
2014-07-14 16:47:51 +02:00
|
|
|
bool m_active;
|
|
|
|
|
QSize m_minimumActiveSize;
|
|
|
|
|
QSize m_maximumActiveSize;
|
|
|
|
|
QSize m_minimumInactiveSize;
|
|
|
|
|
QSize m_maximumInactiveSize;
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
public:
|
2014-07-14 16:47:51 +02:00
|
|
|
QLabel *m_titleLabel;
|
|
|
|
|
DockWidgetTitleButton *m_floatButton;
|
|
|
|
|
DockWidgetTitleButton *m_closeButton;
|
|
|
|
|
};
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent)
|
|
|
|
|
: QDockWidget(parent), q(parent), m_inner(inner)
|
2014-07-14 16:47:51 +02:00
|
|
|
{
|
2014-09-29 17:03:25 +02:00
|
|
|
setWidget(inner);
|
|
|
|
|
setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
|
|
|
|
|
setObjectName(inner->objectName() + QLatin1String("DockWidget"));
|
|
|
|
|
setWindowTitle(inner->windowTitle());
|
|
|
|
|
setMouseTracking(true);
|
|
|
|
|
|
|
|
|
|
QStyleOptionDockWidget opt;
|
|
|
|
|
initStyleOption(&opt);
|
|
|
|
|
m_titleBar = new TitleBarWidget(this, opt);
|
|
|
|
|
m_titleBar->m_titleLabel->setText(inner->windowTitle());
|
|
|
|
|
setTitleBarWidget(m_titleBar);
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|
2014-07-17 14:26:46 +02:00
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
bool DockWidget::eventFilter(QObject *, QEvent *event)
|
|
|
|
|
{
|
2014-10-10 12:32:53 +02:00
|
|
|
if (event->type() == QEvent::MouseMove && q->autoHideTitleBars()) {
|
2014-09-29 17:03:25 +02:00
|
|
|
QMouseEvent *me = static_cast<QMouseEvent *>(event);
|
|
|
|
|
int y = me->pos().y();
|
|
|
|
|
int x = me->pos().x();
|
|
|
|
|
int h = m_titleBar->m_floatButton->height();
|
|
|
|
|
if (!isFloating() && 0 <= x && x < m_inner->width() && 0 <= y && y <= h) {
|
|
|
|
|
m_timer.start();
|
|
|
|
|
m_startPos = mapToGlobal(me->pos());
|
2014-07-17 14:26:46 +02:00
|
|
|
}
|
|
|
|
|
}
|
2014-09-29 17:03:25 +02:00
|
|
|
return false;
|
|
|
|
|
}
|
2014-07-17 14:26:46 +02:00
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
void DockWidget::enterEvent(QEvent *event)
|
|
|
|
|
{
|
|
|
|
|
QApplication::instance()->installEventFilter(this);
|
|
|
|
|
QDockWidget::enterEvent(event);
|
|
|
|
|
}
|
2014-07-17 14:26:46 +02:00
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
void DockWidget::leaveEvent(QEvent *event)
|
|
|
|
|
{
|
|
|
|
|
QApplication::instance()->removeEventFilter(this);
|
|
|
|
|
QDockWidget::leaveEvent(event);
|
|
|
|
|
}
|
2014-07-17 14:26:46 +02:00
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
void DockWidget::handleMouseTimeout()
|
|
|
|
|
{
|
|
|
|
|
QPoint dist = m_startPos - QCursor::pos();
|
|
|
|
|
if (!isFloating() && dist.manhattanLength() < 4)
|
|
|
|
|
m_titleBar->setActive(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DockWidget::handleToplevelChanged(bool floating)
|
|
|
|
|
{
|
2014-11-04 10:26:41 +01:00
|
|
|
m_titleBar->setActive(floating);
|
2014-09-29 17:03:25 +02:00
|
|
|
}
|
2014-07-17 14:26:46 +02:00
|
|
|
|
|
|
|
|
|
2014-07-14 16:47:51 +02:00
|
|
|
|
2011-03-02 17:13:33 +01:00
|
|
|
/*! \class Utils::FancyMainWindow
|
|
|
|
|
|
2013-06-05 14:29:24 +02:00
|
|
|
\brief The FancyMainWindow class is a MainWindow with dock widgets and
|
|
|
|
|
additional "lock" functionality
|
2011-03-02 17:13:33 +01:00
|
|
|
(locking the dock widgets in place) and "reset layout" functionality.
|
|
|
|
|
|
|
|
|
|
The dock actions and the additional actions should be accessible
|
|
|
|
|
in a Window-menu.
|
|
|
|
|
*/
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
FancyMainWindowPrivate::FancyMainWindowPrivate(FancyMainWindow *parent) :
|
|
|
|
|
q(parent),
|
2011-02-07 15:32:14 +01:00
|
|
|
m_handleDockVisibilityChanges(true),
|
2014-09-29 17:03:25 +02:00
|
|
|
m_menuSeparator1(0),
|
|
|
|
|
m_menuSeparator2(0),
|
2011-02-07 15:32:14 +01:00
|
|
|
m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), 0),
|
2014-09-29 17:03:25 +02:00
|
|
|
m_toolBarDockWidget(0),
|
|
|
|
|
m_autoHideTitleBars(FancyMainWindow::tr("Automatically Hide View Title Bars"), 0)
|
2010-03-17 17:44:46 +01:00
|
|
|
{
|
2014-09-29 17:03:25 +02:00
|
|
|
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) {
|
|
|
|
|
foreach (QDockWidget *dock, q->dockWidgets()) {
|
|
|
|
|
if (auto titleBar = dynamic_cast<TitleBarWidget *>(dock->titleBarWidget()))
|
|
|
|
|
titleBar->updateChildren();
|
|
|
|
|
}
|
|
|
|
|
});
|
2010-03-17 17:44:46 +01:00
|
|
|
}
|
2009-08-06 16:01:51 +02:00
|
|
|
|
2010-03-17 17:44:46 +01:00
|
|
|
FancyMainWindow::FancyMainWindow(QWidget *parent) :
|
2014-09-29 17:03:25 +02:00
|
|
|
QMainWindow(parent), d(new FancyMainWindowPrivate(this))
|
2009-08-06 16:01:51 +02:00
|
|
|
{
|
2014-08-26 13:40:12 +02:00
|
|
|
connect(&d->m_resetLayoutAction, &QAction::triggered,
|
|
|
|
|
this, &FancyMainWindow::resetLayout);
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
|
2010-03-17 17:44:46 +01:00
|
|
|
FancyMainWindow::~FancyMainWindow()
|
|
|
|
|
{
|
|
|
|
|
delete d;
|
|
|
|
|
}
|
|
|
|
|
|
2009-08-06 16:01:51 +02:00
|
|
|
QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget)
|
|
|
|
|
{
|
2014-07-14 16:47:51 +02:00
|
|
|
QTC_ASSERT(widget, return 0);
|
|
|
|
|
QTC_CHECK(widget->objectName().size());
|
|
|
|
|
QTC_CHECK(widget->windowTitle().size());
|
|
|
|
|
|
|
|
|
|
auto dockWidget = new DockWidget(widget, this);
|
2009-08-06 16:01:51 +02:00
|
|
|
|
2014-08-26 13:40:12 +02:00
|
|
|
connect(dockWidget, &QDockWidget::visibilityChanged,
|
|
|
|
|
[this, dockWidget](bool visible) {
|
|
|
|
|
if (d->m_handleDockVisibilityChanges)
|
|
|
|
|
dockWidget->setProperty(dockWidgetActiveState, visible);
|
|
|
|
|
});
|
2009-08-06 16:01:51 +02:00
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
connect(dockWidget->toggleViewAction(), &QAction::triggered,
|
|
|
|
|
this, &FancyMainWindow::onDockActionTriggered,
|
|
|
|
|
Qt::QueuedConnection);
|
2009-08-06 16:01:51 +02:00
|
|
|
|
2014-08-26 13:40:12 +02:00
|
|
|
dockWidget->setProperty(dockWidgetActiveState, true);
|
|
|
|
|
|
|
|
|
|
return dockWidget;
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
void FancyMainWindow::onDockActionTriggered()
|
|
|
|
|
{
|
|
|
|
|
QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent());
|
|
|
|
|
if (dw) {
|
|
|
|
|
if (dw->isVisible())
|
|
|
|
|
dw->raise();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2009-08-06 16:01:51 +02:00
|
|
|
void FancyMainWindow::setTrackingEnabled(bool enabled)
|
|
|
|
|
{
|
|
|
|
|
if (enabled) {
|
2010-03-17 17:44:46 +01:00
|
|
|
d->m_handleDockVisibilityChanges = true;
|
2011-02-07 15:17:30 +01:00
|
|
|
foreach (QDockWidget *dockWidget, dockWidgets())
|
|
|
|
|
dockWidget->setProperty(dockWidgetActiveState, dockWidget->isVisible());
|
2009-08-06 16:01:51 +02:00
|
|
|
} else {
|
2010-03-17 17:44:46 +01:00
|
|
|
d->m_handleDockVisibilityChanges = false;
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FancyMainWindow::hideEvent(QHideEvent *event)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(event)
|
|
|
|
|
handleVisibilityChanged(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FancyMainWindow::showEvent(QShowEvent *event)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(event)
|
|
|
|
|
handleVisibilityChanged(true);
|
|
|
|
|
}
|
|
|
|
|
|
2010-09-20 18:13:56 +02:00
|
|
|
void FancyMainWindow::contextMenuEvent(QContextMenuEvent *event)
|
|
|
|
|
{
|
2014-07-15 12:47:15 +02:00
|
|
|
QMenu menu;
|
|
|
|
|
addDockActionsToMenu(&menu);
|
|
|
|
|
menu.exec(event->globalPos());
|
2010-09-20 18:13:56 +02:00
|
|
|
}
|
|
|
|
|
|
2009-08-06 16:01:51 +02:00
|
|
|
void FancyMainWindow::handleVisibilityChanged(bool visible)
|
|
|
|
|
{
|
2010-03-17 17:44:46 +01:00
|
|
|
d->m_handleDockVisibilityChanges = false;
|
2011-02-07 15:17:30 +01:00
|
|
|
foreach (QDockWidget *dockWidget, dockWidgets()) {
|
2009-08-06 16:01:51 +02:00
|
|
|
if (dockWidget->isFloating()) {
|
2011-02-07 15:17:30 +01:00
|
|
|
dockWidget->setVisible(visible
|
|
|
|
|
&& dockWidget->property(dockWidgetActiveState).toBool());
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (visible)
|
2010-03-17 17:44:46 +01:00
|
|
|
d->m_handleDockVisibilityChanges = true;
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FancyMainWindow::saveSettings(QSettings *settings) const
|
|
|
|
|
{
|
2009-08-10 13:01:10 +02:00
|
|
|
QHash<QString, QVariant> hash = saveSettings();
|
|
|
|
|
QHashIterator<QString, QVariant> it(hash);
|
|
|
|
|
while (it.hasNext()) {
|
|
|
|
|
it.next();
|
|
|
|
|
settings->setValue(it.key(), it.value());
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-04-06 11:23:11 +02:00
|
|
|
void FancyMainWindow::restoreSettings(const QSettings *settings)
|
2009-08-06 16:01:51 +02:00
|
|
|
{
|
2009-08-10 13:01:10 +02:00
|
|
|
QHash<QString, QVariant> hash;
|
|
|
|
|
foreach (const QString &key, settings->childKeys()) {
|
|
|
|
|
hash.insert(key, settings->value(key));
|
|
|
|
|
}
|
|
|
|
|
restoreSettings(hash);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QHash<QString, QVariant> FancyMainWindow::saveSettings() const
|
|
|
|
|
{
|
|
|
|
|
QHash<QString, QVariant> settings;
|
2014-09-29 17:03:25 +02:00
|
|
|
settings.insert(QLatin1String(StateKey), saveState(settingsVersion));
|
|
|
|
|
settings.insert(QLatin1String(AutoHideTitleBarsKey),
|
|
|
|
|
d->m_autoHideTitleBars.isChecked());
|
2011-02-07 15:17:30 +01:00
|
|
|
foreach (QDockWidget *dockWidget, dockWidgets()) {
|
2011-02-07 15:05:07 +01:00
|
|
|
settings.insert(dockWidget->objectName(),
|
2011-02-07 15:17:30 +01:00
|
|
|
dockWidget->property(dockWidgetActiveState));
|
2009-08-10 13:01:10 +02:00
|
|
|
}
|
|
|
|
|
return settings;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FancyMainWindow::restoreSettings(const QHash<QString, QVariant> &settings)
|
|
|
|
|
{
|
2014-09-29 17:03:25 +02:00
|
|
|
QByteArray ba = settings.value(QLatin1String(StateKey), QByteArray()).toByteArray();
|
2009-08-10 16:24:29 +02:00
|
|
|
if (!ba.isEmpty())
|
2010-04-20 16:46:35 +02:00
|
|
|
restoreState(ba, settingsVersion);
|
2014-09-29 17:03:25 +02:00
|
|
|
bool on = settings.value(QLatin1String(AutoHideTitleBarsKey), true).toBool();
|
|
|
|
|
d->m_autoHideTitleBars.setChecked(on);
|
2011-02-07 15:17:30 +01:00
|
|
|
foreach (QDockWidget *widget, dockWidgets()) {
|
|
|
|
|
widget->setProperty(dockWidgetActiveState,
|
|
|
|
|
settings.value(widget->objectName(), false));
|
2009-08-06 16:01:51 +02:00
|
|
|
}
|
|
|
|
|
}
|
2010-03-17 17:44:46 +01:00
|
|
|
|
|
|
|
|
QList<QDockWidget *> FancyMainWindow::dockWidgets() const
|
|
|
|
|
{
|
2012-09-20 12:48:50 +02:00
|
|
|
return findChildren<QDockWidget *>();
|
2010-03-17 17:44:46 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-10 12:32:53 +02:00
|
|
|
bool FancyMainWindow::autoHideTitleBars() const
|
2014-09-29 17:03:25 +02:00
|
|
|
{
|
|
|
|
|
return d->m_autoHideTitleBars.isChecked();
|
|
|
|
|
}
|
|
|
|
|
|
2011-07-13 10:35:41 +02:00
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-15 12:47:15 +02:00
|
|
|
void FancyMainWindow::addDockActionsToMenu(QMenu *menu)
|
2010-04-20 16:46:35 +02:00
|
|
|
{
|
2011-07-13 10:35:41 +02:00
|
|
|
QList<QAction *> actions;
|
2012-09-20 12:48:50 +02:00
|
|
|
QList<QDockWidget *> dockwidgets = findChildren<QDockWidget *>();
|
2011-02-17 15:43:54 +01:00
|
|
|
for (int i = 0; i < dockwidgets.size(); ++i) {
|
|
|
|
|
QDockWidget *dockWidget = dockwidgets.at(i);
|
|
|
|
|
if (dockWidget->property("managed_dockwidget").isNull()
|
|
|
|
|
&& dockWidget->parentWidget() == this) {
|
2011-07-13 10:35:41 +02:00
|
|
|
actions.append(dockwidgets.at(i)->toggleViewAction());
|
2011-02-17 15:43:54 +01:00
|
|
|
}
|
|
|
|
|
}
|
2011-07-13 10:35:41 +02:00
|
|
|
qSort(actions.begin(), actions.end(), actionLessThan);
|
|
|
|
|
foreach (QAction *action, actions)
|
|
|
|
|
menu->addAction(action);
|
2014-09-29 17:03:25 +02:00
|
|
|
menu->addAction(&d->m_menuSeparator1);
|
|
|
|
|
menu->addAction(&d->m_autoHideTitleBars);
|
|
|
|
|
menu->addAction(&d->m_menuSeparator2);
|
2011-02-07 15:32:14 +01:00
|
|
|
menu->addAction(&d->m_resetLayoutAction);
|
2010-04-20 16:46:35 +02:00
|
|
|
}
|
|
|
|
|
|
2014-09-29 17:03:25 +02:00
|
|
|
QAction *FancyMainWindow::menuSeparator1() const
|
|
|
|
|
{
|
|
|
|
|
return &d->m_menuSeparator1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QAction *FancyMainWindow::autoHideTitleBarsAction() const
|
|
|
|
|
{
|
|
|
|
|
return &d->m_autoHideTitleBars;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QAction *FancyMainWindow::menuSeparator2() const
|
2010-04-20 16:46:35 +02:00
|
|
|
{
|
2014-09-29 17:03:25 +02:00
|
|
|
return &d->m_menuSeparator2;
|
2010-04-20 16:46:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QAction *FancyMainWindow::resetLayoutAction() const
|
|
|
|
|
{
|
2011-02-07 15:32:14 +01:00
|
|
|
return &d->m_resetLayoutAction;
|
2010-04-20 16:46:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FancyMainWindow::setDockActionsVisible(bool v)
|
|
|
|
|
{
|
2011-02-07 15:32:14 +01:00
|
|
|
foreach (const QDockWidget *dockWidget, dockWidgets())
|
2010-04-20 16:46:35 +02:00
|
|
|
dockWidget->toggleViewAction()->setVisible(v);
|
2014-09-29 17:03:25 +02:00
|
|
|
d->m_autoHideTitleBars.setVisible(v);
|
|
|
|
|
d->m_menuSeparator1.setVisible(v);
|
|
|
|
|
d->m_menuSeparator2.setVisible(v);
|
2011-02-07 15:32:14 +01:00
|
|
|
d->m_resetLayoutAction.setVisible(v);
|
2010-04-20 16:46:35 +02:00
|
|
|
}
|
|
|
|
|
|
2010-06-29 18:12:22 +02:00
|
|
|
QDockWidget *FancyMainWindow::toolBarDockWidget() const
|
|
|
|
|
{
|
|
|
|
|
return d->m_toolBarDockWidget;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FancyMainWindow::setToolBarDockWidget(QDockWidget *dock)
|
|
|
|
|
{
|
|
|
|
|
d->m_toolBarDockWidget = dock;
|
|
|
|
|
}
|
|
|
|
|
|
2010-03-17 17:44:46 +01:00
|
|
|
} // namespace Utils
|