forked from qt-creator/qt-creator
Re-introduce option to toggle FancyMainWindow auto-hiding
This reverts commit 1541fbd2ba
in parts. The title bars can now always be shown (the same
state as the old "Unlocked" state) or not always be shown
(the previously "new" behavior).
The default is now "Always shown". Hopefully that makes hiding
the titlebars a conscious (usually one-time) activity
that's not forgotten.
Change-Id: Id31fb193b2eb6376000c845d4a61194e2ed33129
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
This commit is contained in:
@@ -31,12 +31,11 @@
|
|||||||
|
|
||||||
#include "qtcassert.h"
|
#include "qtcassert.h"
|
||||||
|
|
||||||
|
#include <QAbstractButton>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QContextMenuEvent>
|
#include <QContextMenuEvent>
|
||||||
#include <QDebug>
|
|
||||||
#include <QDockWidget>
|
#include <QDockWidget>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QIcon>
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
@@ -46,12 +45,50 @@
|
|||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
|
|
||||||
static const char stateKeyC[] = "State";
|
static const char AutoHideTitleBarsKey[] = "AutoHideTitleBars";
|
||||||
|
static const char StateKey[] = "State";
|
||||||
|
|
||||||
static const int settingsVersion = 2;
|
static const int settingsVersion = 2;
|
||||||
static const char dockWidgetActiveState[] = "DockWidgetActiveState";
|
static const char dockWidgetActiveState[] = "DockWidgetActiveState";
|
||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
// Stolen from QDockWidgetTitleButton
|
// Stolen from QDockWidgetTitleButton
|
||||||
class DockWidgetTitleButton : public QAbstractButton
|
class DockWidgetTitleButton : public QAbstractButton
|
||||||
{
|
{
|
||||||
@@ -80,13 +117,15 @@ public:
|
|||||||
|
|
||||||
void enterEvent(QEvent *event)
|
void enterEvent(QEvent *event)
|
||||||
{
|
{
|
||||||
if (isEnabled()) update();
|
if (isEnabled())
|
||||||
|
update();
|
||||||
QAbstractButton::enterEvent(event);
|
QAbstractButton::enterEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void leaveEvent(QEvent *event)
|
void leaveEvent(QEvent *event)
|
||||||
{
|
{
|
||||||
if (isEnabled()) update();
|
if (isEnabled())
|
||||||
|
update();
|
||||||
QAbstractButton::leaveEvent(event);
|
QAbstractButton::leaveEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,11 +149,10 @@ void DockWidgetTitleButton::paintEvent(QPaintEvent *)
|
|||||||
style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);
|
style()->drawComplexControl(QStyle::CC_ToolButton, &opt, &p, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class TitleBarWidget : public QWidget
|
class TitleBarWidget : public QWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TitleBarWidget(QDockWidget *parent, const QStyleOptionDockWidget &opt)
|
TitleBarWidget(DockWidget *parent, const QStyleOptionDockWidget &opt)
|
||||||
: QWidget(parent), q(parent), m_active(true)
|
: QWidget(parent), q(parent), m_active(true)
|
||||||
{
|
{
|
||||||
m_titleLabel = new QLabel(this);
|
m_titleLabel = new QLabel(this);
|
||||||
@@ -150,6 +188,14 @@ public:
|
|||||||
layout->addWidget(m_floatButton);
|
layout->addWidget(m_floatButton);
|
||||||
layout->addWidget(m_closeButton);
|
layout->addWidget(m_closeButton);
|
||||||
setLayout(layout);
|
setLayout(layout);
|
||||||
|
|
||||||
|
setProperty("managed_titlebar", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enterEvent(QEvent *event)
|
||||||
|
{
|
||||||
|
setActive(true);
|
||||||
|
QWidget::enterEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void leaveEvent(QEvent *event)
|
void leaveEvent(QEvent *event)
|
||||||
@@ -161,128 +207,127 @@ public:
|
|||||||
|
|
||||||
void setActive(bool on)
|
void setActive(bool on)
|
||||||
{
|
{
|
||||||
if (m_active == on)
|
|
||||||
return;
|
|
||||||
m_active = on;
|
m_active = on;
|
||||||
m_titleLabel->setVisible(on);
|
updateChildren();
|
||||||
m_floatButton->setVisible(on);
|
}
|
||||||
m_closeButton->setVisible(on);
|
|
||||||
update();
|
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->titleBarsAlwaysVisible();
|
||||||
}
|
}
|
||||||
|
|
||||||
QSize sizeHint() const
|
QSize sizeHint() const
|
||||||
{
|
{
|
||||||
ensurePolished();
|
ensurePolished();
|
||||||
return m_active ? m_maximumActiveSize : m_maximumInactiveSize;
|
return isClickable() ? m_maximumActiveSize : m_maximumInactiveSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSize minimumSizeHint() const
|
QSize minimumSizeHint() const
|
||||||
{
|
{
|
||||||
ensurePolished();
|
ensurePolished();
|
||||||
return m_active ? m_minimumActiveSize : m_minimumInactiveSize;
|
return isClickable() ? m_minimumActiveSize : m_minimumInactiveSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
private:
|
||||||
QDockWidget *q;
|
DockWidget *q;
|
||||||
bool m_active;
|
bool m_active;
|
||||||
QSize m_minimumActiveSize;
|
QSize m_minimumActiveSize;
|
||||||
QSize m_maximumActiveSize;
|
QSize m_maximumActiveSize;
|
||||||
QSize m_minimumInactiveSize;
|
QSize m_minimumInactiveSize;
|
||||||
QSize m_maximumInactiveSize;
|
QSize m_maximumInactiveSize;
|
||||||
|
|
||||||
|
public:
|
||||||
QLabel *m_titleLabel;
|
QLabel *m_titleLabel;
|
||||||
DockWidgetTitleButton *m_floatButton;
|
DockWidgetTitleButton *m_floatButton;
|
||||||
DockWidgetTitleButton *m_closeButton;
|
DockWidgetTitleButton *m_closeButton;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent)
|
||||||
class DockWidget : public QDockWidget
|
: QDockWidget(parent), q(parent), m_inner(inner)
|
||||||
{
|
{
|
||||||
public:
|
setWidget(inner);
|
||||||
DockWidget(QWidget *inner, QWidget *parent)
|
setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
|
||||||
: QDockWidget(parent), m_inner(inner)
|
setObjectName(inner->objectName() + QLatin1String("DockWidget"));
|
||||||
{
|
setWindowTitle(inner->windowTitle());
|
||||||
setWidget(inner);
|
setMouseTracking(true);
|
||||||
setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetFloatable);
|
|
||||||
setObjectName(inner->objectName() + QLatin1String("DockWidget"));
|
|
||||||
setWindowTitle(inner->windowTitle());
|
|
||||||
setMouseTracking(true);
|
|
||||||
|
|
||||||
QStyleOptionDockWidget opt;
|
QStyleOptionDockWidget opt;
|
||||||
initStyleOption(&opt);
|
initStyleOption(&opt);
|
||||||
m_titleBar = new TitleBarWidget(this, opt);
|
m_titleBar = new TitleBarWidget(this, opt);
|
||||||
m_titleBar->m_titleLabel->setText(inner->windowTitle());
|
m_titleBar->m_titleLabel->setText(inner->windowTitle());
|
||||||
setTitleBarWidget(m_titleBar);
|
setTitleBarWidget(m_titleBar);
|
||||||
|
|
||||||
m_timer.setSingleShot(true);
|
m_timer.setSingleShot(true);
|
||||||
m_timer.setInterval(500);
|
m_timer.setInterval(500);
|
||||||
|
|
||||||
connect(&m_timer, &QTimer::timeout, this, &DockWidget::handleMouseTimeout);
|
connect(&m_timer, &QTimer::timeout, this, &DockWidget::handleMouseTimeout);
|
||||||
|
|
||||||
connect(this, &QDockWidget::topLevelChanged, this, &DockWidget::handleToplevelChanged);
|
connect(this, &QDockWidget::topLevelChanged, this, &DockWidget::handleToplevelChanged);
|
||||||
|
|
||||||
connect(toggleViewAction(), &QAction::triggered,
|
connect(toggleViewAction(), &QAction::triggered,
|
||||||
[this]() {
|
[this]() {
|
||||||
if (isVisible())
|
if (isVisible())
|
||||||
raise();
|
raise();
|
||||||
});
|
});
|
||||||
|
|
||||||
auto origFloatButton = findChild<QAbstractButton *>(QLatin1String("qt_dockwidget_floatbutton"));
|
auto origFloatButton = findChild<QAbstractButton *>(QLatin1String("qt_dockwidget_floatbutton"));
|
||||||
connect(m_titleBar->m_floatButton, &QAbstractButton::clicked,
|
connect(m_titleBar->m_floatButton, &QAbstractButton::clicked,
|
||||||
origFloatButton, &QAbstractButton::clicked);
|
origFloatButton, &QAbstractButton::clicked);
|
||||||
|
|
||||||
auto origCloseButton = findChild<QAbstractButton *>(QLatin1String("qt_dockwidget_closebutton"));
|
auto origCloseButton = findChild<QAbstractButton *>(QLatin1String("qt_dockwidget_closebutton"));
|
||||||
connect(m_titleBar->m_closeButton, &QAbstractButton::clicked,
|
connect(m_titleBar->m_closeButton, &QAbstractButton::clicked,
|
||||||
origCloseButton, &QAbstractButton::clicked);
|
origCloseButton, &QAbstractButton::clicked);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool eventFilter(QObject *, QEvent *event)
|
bool DockWidget::eventFilter(QObject *, QEvent *event)
|
||||||
{
|
{
|
||||||
if (event->type() == QEvent::MouseMove) {
|
if (event->type() == QEvent::MouseMove && !q->titleBarsAlwaysVisible()) {
|
||||||
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();
|
||||||
int h = m_titleBar->m_floatButton->height();
|
int h = m_titleBar->m_floatButton->height();
|
||||||
if (!isFloating() && 0 <= x && x < m_inner->width() && 0 <= y && y <= h) {
|
if (!isFloating() && 0 <= x && x < m_inner->width() && 0 <= y && y <= h) {
|
||||||
m_timer.start();
|
m_timer.start();
|
||||||
m_startPos = mapToGlobal(me->pos());
|
m_startPos = mapToGlobal(me->pos());
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void enterEvent(QEvent *event)
|
|
||||||
{
|
|
||||||
QApplication::instance()->installEventFilter(this);
|
|
||||||
QDockWidget::enterEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void leaveEvent(QEvent *event)
|
|
||||||
{
|
|
||||||
QApplication::instance()->removeEventFilter(this);
|
|
||||||
QDockWidget::leaveEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleMouseTimeout()
|
|
||||||
{
|
|
||||||
QPoint dist = m_startPos - QCursor::pos();
|
|
||||||
if (!isFloating() && dist.manhattanLength() < 4) {
|
|
||||||
m_titleBar->setActive(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockWidget::enterEvent(QEvent *event)
|
||||||
|
{
|
||||||
|
QApplication::instance()->installEventFilter(this);
|
||||||
|
QDockWidget::enterEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockWidget::leaveEvent(QEvent *event)
|
||||||
|
{
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
if (!floating)
|
||||||
|
m_titleBar->setActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
void handleToplevelChanged(bool floating)
|
|
||||||
{
|
|
||||||
if (!floating)
|
|
||||||
m_titleBar->setActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
QPoint m_startPos;
|
|
||||||
QWidget *m_inner;
|
|
||||||
TitleBarWidget *m_titleBar;
|
|
||||||
QTimer m_timer;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*! \class Utils::FancyMainWindow
|
/*! \class Utils::FancyMainWindow
|
||||||
|
|
||||||
@@ -294,29 +339,31 @@ private:
|
|||||||
in a Window-menu.
|
in a Window-menu.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class FancyMainWindowPrivate
|
FancyMainWindowPrivate::FancyMainWindowPrivate(FancyMainWindow *parent) :
|
||||||
{
|
q(parent),
|
||||||
public:
|
|
||||||
FancyMainWindowPrivate();
|
|
||||||
|
|
||||||
bool m_handleDockVisibilityChanges;
|
|
||||||
|
|
||||||
QAction m_menuSeparator;
|
|
||||||
QAction m_resetLayoutAction;
|
|
||||||
QDockWidget *m_toolBarDockWidget;
|
|
||||||
};
|
|
||||||
|
|
||||||
FancyMainWindowPrivate::FancyMainWindowPrivate() :
|
|
||||||
m_handleDockVisibilityChanges(true),
|
m_handleDockVisibilityChanges(true),
|
||||||
m_menuSeparator(0),
|
m_menuSeparator1(0),
|
||||||
|
m_menuSeparator2(0),
|
||||||
m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), 0),
|
m_resetLayoutAction(FancyMainWindow::tr("Reset to Default Layout"), 0),
|
||||||
m_toolBarDockWidget(0)
|
m_toolBarDockWidget(0),
|
||||||
|
m_autoHideTitleBars(FancyMainWindow::tr("Automatically Hide View Title Bars"), 0)
|
||||||
{
|
{
|
||||||
m_menuSeparator.setSeparator(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) {
|
||||||
|
foreach (QDockWidget *dock, q->dockWidgets()) {
|
||||||
|
if (auto titleBar = dynamic_cast<TitleBarWidget *>(dock->titleBarWidget()))
|
||||||
|
titleBar->updateChildren();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
FancyMainWindow::FancyMainWindow(QWidget *parent) :
|
FancyMainWindow::FancyMainWindow(QWidget *parent) :
|
||||||
QMainWindow(parent), d(new FancyMainWindowPrivate)
|
QMainWindow(parent), d(new FancyMainWindowPrivate(this))
|
||||||
{
|
{
|
||||||
connect(&d->m_resetLayoutAction, &QAction::triggered,
|
connect(&d->m_resetLayoutAction, &QAction::triggered,
|
||||||
this, &FancyMainWindow::resetLayout);
|
this, &FancyMainWindow::resetLayout);
|
||||||
@@ -341,12 +388,24 @@ QDockWidget *FancyMainWindow::addDockForWidget(QWidget *widget)
|
|||||||
dockWidget->setProperty(dockWidgetActiveState, visible);
|
dockWidget->setProperty(dockWidgetActiveState, visible);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(dockWidget->toggleViewAction(), &QAction::triggered,
|
||||||
|
this, &FancyMainWindow::onDockActionTriggered,
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
|
||||||
dockWidget->setProperty(dockWidgetActiveState, true);
|
dockWidget->setProperty(dockWidgetActiveState, true);
|
||||||
|
|
||||||
return dockWidget;
|
return dockWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FancyMainWindow::onDockActionTriggered()
|
||||||
|
{
|
||||||
|
QDockWidget *dw = qobject_cast<QDockWidget *>(sender()->parent());
|
||||||
|
if (dw) {
|
||||||
|
if (dw->isVisible())
|
||||||
|
dw->raise();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void FancyMainWindow::setTrackingEnabled(bool enabled)
|
void FancyMainWindow::setTrackingEnabled(bool enabled)
|
||||||
{
|
{
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
@@ -412,7 +471,9 @@ void FancyMainWindow::restoreSettings(const QSettings *settings)
|
|||||||
QHash<QString, QVariant> FancyMainWindow::saveSettings() const
|
QHash<QString, QVariant> FancyMainWindow::saveSettings() const
|
||||||
{
|
{
|
||||||
QHash<QString, QVariant> settings;
|
QHash<QString, QVariant> settings;
|
||||||
settings.insert(QLatin1String(stateKeyC), saveState(settingsVersion));
|
settings.insert(QLatin1String(StateKey), saveState(settingsVersion));
|
||||||
|
settings.insert(QLatin1String(AutoHideTitleBarsKey),
|
||||||
|
d->m_autoHideTitleBars.isChecked());
|
||||||
foreach (QDockWidget *dockWidget, dockWidgets()) {
|
foreach (QDockWidget *dockWidget, dockWidgets()) {
|
||||||
settings.insert(dockWidget->objectName(),
|
settings.insert(dockWidget->objectName(),
|
||||||
dockWidget->property(dockWidgetActiveState));
|
dockWidget->property(dockWidgetActiveState));
|
||||||
@@ -422,9 +483,11 @@ QHash<QString, QVariant> FancyMainWindow::saveSettings() const
|
|||||||
|
|
||||||
void FancyMainWindow::restoreSettings(const QHash<QString, QVariant> &settings)
|
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())
|
if (!ba.isEmpty())
|
||||||
restoreState(ba, settingsVersion);
|
restoreState(ba, settingsVersion);
|
||||||
|
bool on = settings.value(QLatin1String(AutoHideTitleBarsKey), true).toBool();
|
||||||
|
d->m_autoHideTitleBars.setChecked(on);
|
||||||
foreach (QDockWidget *widget, dockWidgets()) {
|
foreach (QDockWidget *widget, dockWidgets()) {
|
||||||
widget->setProperty(dockWidgetActiveState,
|
widget->setProperty(dockWidgetActiveState,
|
||||||
settings.value(widget->objectName(), false));
|
settings.value(widget->objectName(), false));
|
||||||
@@ -436,6 +499,11 @@ QList<QDockWidget *> FancyMainWindow::dockWidgets() const
|
|||||||
return findChildren<QDockWidget *>();
|
return findChildren<QDockWidget *>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FancyMainWindow::titleBarsAlwaysVisible() const
|
||||||
|
{
|
||||||
|
return d->m_autoHideTitleBars.isChecked();
|
||||||
|
}
|
||||||
|
|
||||||
static bool actionLessThan(const QAction *action1, const QAction *action2)
|
static bool actionLessThan(const QAction *action1, const QAction *action2)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(action1, return true);
|
QTC_ASSERT(action1, return true);
|
||||||
@@ -457,13 +525,25 @@ void FancyMainWindow::addDockActionsToMenu(QMenu *menu)
|
|||||||
qSort(actions.begin(), actions.end(), actionLessThan);
|
qSort(actions.begin(), actions.end(), actionLessThan);
|
||||||
foreach (QAction *action, actions)
|
foreach (QAction *action, actions)
|
||||||
menu->addAction(action);
|
menu->addAction(action);
|
||||||
menu->addAction(&d->m_menuSeparator);
|
menu->addAction(&d->m_menuSeparator1);
|
||||||
|
menu->addAction(&d->m_autoHideTitleBars);
|
||||||
|
menu->addAction(&d->m_menuSeparator2);
|
||||||
menu->addAction(&d->m_resetLayoutAction);
|
menu->addAction(&d->m_resetLayoutAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
QAction *FancyMainWindow::menuSeparator() const
|
QAction *FancyMainWindow::menuSeparator1() const
|
||||||
{
|
{
|
||||||
return &d->m_menuSeparator;
|
return &d->m_menuSeparator1;
|
||||||
|
}
|
||||||
|
|
||||||
|
QAction *FancyMainWindow::autoHideTitleBarsAction() const
|
||||||
|
{
|
||||||
|
return &d->m_autoHideTitleBars;
|
||||||
|
}
|
||||||
|
|
||||||
|
QAction *FancyMainWindow::menuSeparator2() const
|
||||||
|
{
|
||||||
|
return &d->m_menuSeparator2;
|
||||||
}
|
}
|
||||||
|
|
||||||
QAction *FancyMainWindow::resetLayoutAction() const
|
QAction *FancyMainWindow::resetLayoutAction() const
|
||||||
@@ -475,7 +555,9 @@ void FancyMainWindow::setDockActionsVisible(bool v)
|
|||||||
{
|
{
|
||||||
foreach (const QDockWidget *dockWidget, dockWidgets())
|
foreach (const QDockWidget *dockWidget, dockWidgets())
|
||||||
dockWidget->toggleViewAction()->setVisible(v);
|
dockWidget->toggleViewAction()->setVisible(v);
|
||||||
d->m_menuSeparator.setVisible(v);
|
d->m_autoHideTitleBars.setVisible(v);
|
||||||
|
d->m_menuSeparator1.setVisible(v);
|
||||||
|
d->m_menuSeparator2.setVisible(v);
|
||||||
d->m_resetLayoutAction.setVisible(v);
|
d->m_resetLayoutAction.setVisible(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ QT_END_NAMESPACE
|
|||||||
|
|
||||||
namespace Utils {
|
namespace Utils {
|
||||||
|
|
||||||
class FancyMainWindowPrivate;
|
struct FancyMainWindowPrivate;
|
||||||
|
|
||||||
class QTCREATOR_UTILS_EXPORT FancyMainWindow : public QMainWindow
|
class QTCREATOR_UTILS_EXPORT FancyMainWindow : public QMainWindow
|
||||||
{
|
{
|
||||||
@@ -63,27 +63,33 @@ public:
|
|||||||
void restoreSettings(const QHash<QString, QVariant> &settings);
|
void restoreSettings(const QHash<QString, QVariant> &settings);
|
||||||
|
|
||||||
// Additional context menu actions
|
// Additional context menu actions
|
||||||
QAction *menuSeparator() const;
|
QAction *menuSeparator1() const;
|
||||||
|
QAction *autoHideTitleBarsAction() const;
|
||||||
|
QAction *menuSeparator2() const;
|
||||||
QAction *resetLayoutAction() const;
|
QAction *resetLayoutAction() const;
|
||||||
|
|
||||||
// Overwritten to add locked/reset.
|
|
||||||
void addDockActionsToMenu(QMenu *menu);
|
void addDockActionsToMenu(QMenu *menu);
|
||||||
|
|
||||||
QDockWidget *toolBarDockWidget() const;
|
QDockWidget *toolBarDockWidget() const;
|
||||||
void setToolBarDockWidget(QDockWidget *dock);
|
void setToolBarDockWidget(QDockWidget *dock);
|
||||||
|
|
||||||
void setDockActionsVisible(bool v);
|
bool titleBarsAlwaysVisible() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
// Emitted by resetLayoutAction(). Connect to a slot
|
// Emitted by resetLayoutAction(). Connect to a slot
|
||||||
// restoring the default layout.
|
// restoring the default layout.
|
||||||
void resetLayout();
|
void resetLayout();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setDockActionsVisible(bool v);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void hideEvent(QHideEvent *event);
|
void hideEvent(QHideEvent *event);
|
||||||
void showEvent(QShowEvent *event);
|
void showEvent(QShowEvent *event);
|
||||||
void contextMenuEvent(QContextMenuEvent *event);
|
void contextMenuEvent(QContextMenuEvent *event);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onDockActionTriggered();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void handleVisibilityChanged(bool visible);
|
void handleVisibilityChanged(bool visible);
|
||||||
|
|
||||||
|
|||||||
@@ -290,10 +290,18 @@ void AnalyzerManagerPrivate::delayedInit()
|
|||||||
// Populate Windows->Views menu with standard actions.
|
// Populate Windows->Views menu with standard actions.
|
||||||
Context analyzerContext(C_ANALYZEMODE);
|
Context analyzerContext(C_ANALYZEMODE);
|
||||||
ActionContainer *viewsMenu = Core::ActionManager::actionContainer(Id(M_WINDOW_VIEWS));
|
ActionContainer *viewsMenu = Core::ActionManager::actionContainer(Id(M_WINDOW_VIEWS));
|
||||||
Command *cmd = Core::ActionManager::registerAction(m_mainWindow->menuSeparator(),
|
Command *cmd = Core::ActionManager::registerAction(m_mainWindow->menuSeparator1(),
|
||||||
"Analyzer.Views.Separator1", analyzerContext);
|
"Analyzer.Views.Separator1", analyzerContext);
|
||||||
cmd->setAttribute(Command::CA_Hide);
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
viewsMenu->addAction(cmd, G_DEFAULT_THREE);
|
viewsMenu->addAction(cmd, G_DEFAULT_THREE);
|
||||||
|
cmd = Core::ActionManager::registerAction(m_mainWindow->autoHideTitleBarsAction(),
|
||||||
|
"Analyzer.Views.AutoHideTitleBars", analyzerContext);
|
||||||
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
viewsMenu->addAction(cmd, G_DEFAULT_THREE);
|
||||||
|
cmd = Core::ActionManager::registerAction(m_mainWindow->menuSeparator2(),
|
||||||
|
"Analyzer.Views.Separator2", analyzerContext);
|
||||||
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
viewsMenu->addAction(cmd, G_DEFAULT_THREE);
|
||||||
cmd = Core::ActionManager::registerAction(m_mainWindow->resetLayoutAction(),
|
cmd = Core::ActionManager::registerAction(m_mainWindow->resetLayoutAction(),
|
||||||
"Analyzer.Views.ResetSimple", analyzerContext);
|
"Analyzer.Views.ResetSimple", analyzerContext);
|
||||||
cmd->setAttribute(Command::CA_Hide);
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
|||||||
@@ -314,8 +314,16 @@ void DebuggerMainWindowPrivate::createViewsMenuItems()
|
|||||||
cmd->setAttribute(Command::CA_Hide);
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
m_viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE);
|
m_viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE);
|
||||||
|
|
||||||
cmd = Core::ActionManager::registerAction(q->menuSeparator(),
|
cmd = Core::ActionManager::registerAction(q->menuSeparator1(),
|
||||||
"Debugger.Views.Separator", debugcontext);
|
"Debugger.Views.Separator1", debugcontext);
|
||||||
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
m_viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE);
|
||||||
|
cmd = Core::ActionManager::registerAction(q->autoHideTitleBarsAction(),
|
||||||
|
"Debugger.Views.AutoHideTitleBars", debugcontext);
|
||||||
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
m_viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE);
|
||||||
|
cmd = Core::ActionManager::registerAction(q->menuSeparator2(),
|
||||||
|
"Debugger.Views.Separator2", debugcontext);
|
||||||
cmd->setAttribute(Command::CA_Hide);
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
m_viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE);
|
m_viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE);
|
||||||
}
|
}
|
||||||
@@ -436,6 +444,8 @@ QWidget *DebuggerMainWindow::createContents(IMode *mode)
|
|||||||
setDockNestingEnabled(true);
|
setDockNestingEnabled(true);
|
||||||
connect(this, SIGNAL(resetLayout()),
|
connect(this, SIGNAL(resetLayout()),
|
||||||
d, SLOT(resetDebuggerLayout()));
|
d, SLOT(resetDebuggerLayout()));
|
||||||
|
connect(autoHideTitleBarsAction(), SIGNAL(triggered()),
|
||||||
|
d, SLOT(updateDockWidgetSettings()));
|
||||||
|
|
||||||
QBoxLayout *editorHolderLayout = new QVBoxLayout;
|
QBoxLayout *editorHolderLayout = new QVBoxLayout;
|
||||||
editorHolderLayout->setMargin(0);
|
editorHolderLayout->setMargin(0);
|
||||||
|
|||||||
@@ -2570,6 +2570,7 @@ void DebuggerPluginPrivate::createNewDock(QWidget *widget)
|
|||||||
{
|
{
|
||||||
QDockWidget *dockWidget =
|
QDockWidget *dockWidget =
|
||||||
m_mainWindow->createDockWidget(CppLanguage, widget);
|
m_mainWindow->createDockWidget(CppLanguage, widget);
|
||||||
|
dockWidget->setWindowTitle(widget->windowTitle());
|
||||||
dockWidget->setFeatures(QDockWidget::DockWidgetClosable);
|
dockWidget->setFeatures(QDockWidget::DockWidgetClosable);
|
||||||
dockWidget->show();
|
dockWidget->show();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -349,8 +349,14 @@ void FormEditorData::setupViewActions()
|
|||||||
|
|
||||||
addDockViewAction(viewMenu, ActionEditorSubWindow, m_contexts,
|
addDockViewAction(viewMenu, ActionEditorSubWindow, m_contexts,
|
||||||
tr("Action Editor"), "FormEditor.ActionEditor");
|
tr("Action Editor"), "FormEditor.ActionEditor");
|
||||||
// Reset
|
// Lock/Reset
|
||||||
Command *cmd = addToolAction(m_editorWidget->menuSeparator(), m_contexts, "FormEditor.SeparatorReset", viewMenu);
|
Command *cmd = addToolAction(m_editorWidget->menuSeparator1(), m_contexts, "FormEditor.SeparatorLock", viewMenu);
|
||||||
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
|
||||||
|
cmd = addToolAction(m_editorWidget->autoHideTitleBarsAction(), m_contexts, "FormEditor.Locked", viewMenu);
|
||||||
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
|
||||||
|
cmd = addToolAction(m_editorWidget->menuSeparator2(), m_contexts, "FormEditor.SeparatorReset", viewMenu);
|
||||||
cmd->setAttribute(Command::CA_Hide);
|
cmd->setAttribute(Command::CA_Hide);
|
||||||
|
|
||||||
cmd = addToolAction(m_editorWidget->resetLayoutAction(), m_contexts, "FormEditor.ResetToDefaultLayout", viewMenu);
|
cmd = addToolAction(m_editorWidget->resetLayoutAction(), m_contexts, "FormEditor.ResetToDefaultLayout", viewMenu);
|
||||||
|
|||||||
Reference in New Issue
Block a user