forked from qt-creator/qt-creator
FancyMainWindow: Save collapse state
Change-Id: I5ed336eff1eb5381c3033b2bde2db0df1576ee78 Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
@@ -26,6 +26,7 @@
|
|||||||
static const char ShowCentralWidgetKey[] = "ShowCentralWidget";
|
static const char ShowCentralWidgetKey[] = "ShowCentralWidget";
|
||||||
static const char StateKey[] = "State";
|
static const char StateKey[] = "State";
|
||||||
static const char HiddenDockAreasKey[] = "HiddenDockAreas";
|
static const char HiddenDockAreasKey[] = "HiddenDockAreas";
|
||||||
|
static const char DockWidgetStatesKey[] = "CollapseState";
|
||||||
|
|
||||||
static const int settingsVersion = 2;
|
static const int settingsVersion = 2;
|
||||||
static const char dockWidgetActiveState[] = "DockWidgetActiveState";
|
static const char dockWidgetActiveState[] = "DockWidgetActiveState";
|
||||||
@@ -107,6 +108,9 @@ public:
|
|||||||
bool isCollapsed() const;
|
bool isCollapsed() const;
|
||||||
void setCollapsed(bool collapse);
|
void setCollapsed(bool collapse);
|
||||||
|
|
||||||
|
QVariant saveState() const;
|
||||||
|
void restoreState(const QVariant &data);
|
||||||
|
|
||||||
FancyMainWindow *q;
|
FancyMainWindow *q;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -114,7 +118,7 @@ signals:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QList<QDockWidget *> docksInArea();
|
QList<QDockWidget *> docksInArea();
|
||||||
void ensureWidgetShown();
|
void setInnerWidgetShown(bool visible);
|
||||||
DocksAndSizes verticallyArrangedDocks();
|
DocksAndSizes verticallyArrangedDocks();
|
||||||
|
|
||||||
QWidget *m_hiddenInnerWidget = nullptr;
|
QWidget *m_hiddenInnerWidget = nullptr;
|
||||||
@@ -342,8 +346,10 @@ DockWidget::DockWidget(QWidget *inner, FancyMainWindow *parent, bool immutable)
|
|||||||
origCloseButton, &QAbstractButton::clicked);
|
origCloseButton, &QAbstractButton::clicked);
|
||||||
|
|
||||||
connect(q, &FancyMainWindow::dockWidgetsChanged, this, [this] {
|
connect(q, &FancyMainWindow::dockWidgetsChanged, this, [this] {
|
||||||
if (!q->isBlockingAutomaticUncollapse() && isVisible() && !supportsCollapse())
|
if (!q->isBlockingAutomaticUncollapse() && q->isVisible() && isVisible()
|
||||||
ensureWidgetShown();
|
&& !supportsCollapse()) {
|
||||||
|
setInnerWidgetShown(true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,12 +363,18 @@ QList<QDockWidget *> DockWidget::docksInArea()
|
|||||||
return q->docksInArea(q->dockWidgetArea(this));
|
return q->docksInArea(q->dockWidgetArea(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DockWidget::ensureWidgetShown()
|
void DockWidget::setInnerWidgetShown(bool visible)
|
||||||
{
|
{
|
||||||
if (m_hiddenInnerWidget) {
|
if (visible && m_hiddenInnerWidget) {
|
||||||
delete widget();
|
delete widget();
|
||||||
setWidget(m_hiddenInnerWidget);
|
setWidget(m_hiddenInnerWidget);
|
||||||
m_hiddenInnerWidget = nullptr;
|
m_hiddenInnerWidget = nullptr;
|
||||||
|
} else if (!visible && !m_hiddenInnerWidget) {
|
||||||
|
m_hiddenInnerWidgetHeight = height() - m_titleBar->sizeHint().height();
|
||||||
|
m_hiddenInnerWidget = widget();
|
||||||
|
auto w = new QWidget;
|
||||||
|
w->setMaximumHeight(0);
|
||||||
|
setWidget(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,11 +413,7 @@ void DockWidget::setCollapsed(bool collapse)
|
|||||||
DocksAndSizes verticalDocks = verticallyArrangedDocks();
|
DocksAndSizes verticalDocks = verticallyArrangedDocks();
|
||||||
const auto titleBarHeight = [this] { return m_titleBar->sizeHint().height(); };
|
const auto titleBarHeight = [this] { return m_titleBar->sizeHint().height(); };
|
||||||
if (collapse) {
|
if (collapse) {
|
||||||
m_hiddenInnerWidgetHeight = height() - titleBarHeight();
|
setInnerWidgetShown(false);
|
||||||
m_hiddenInnerWidget = widget();
|
|
||||||
auto w = new QWidget;
|
|
||||||
w->setMaximumHeight(0);
|
|
||||||
setWidget(w);
|
|
||||||
|
|
||||||
if (verticalDocks.docks.size() > 1) { // not only this dock
|
if (verticalDocks.docks.size() > 1) { // not only this dock
|
||||||
// fixup dock sizes, so the dock below this one gets the space if possible
|
// fixup dock sizes, so the dock below this one gets the space if possible
|
||||||
@@ -421,7 +429,7 @@ void DockWidget::setCollapsed(bool collapse)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ensureWidgetShown();
|
setInnerWidgetShown(true);
|
||||||
|
|
||||||
if (verticalDocks.docks.size() > 1) { // not only this dock
|
if (verticalDocks.docks.size() > 1) { // not only this dock
|
||||||
// steal space from dock below if possible
|
// steal space from dock below if possible
|
||||||
@@ -445,6 +453,31 @@ void DockWidget::setCollapsed(bool collapse)
|
|||||||
emit collapseChanged();
|
emit collapseChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char kDockWidgetInnerWidgetHeight[] = "InnerWidgetHeight";
|
||||||
|
|
||||||
|
QVariant DockWidget::saveState() const
|
||||||
|
{
|
||||||
|
QVariantMap state;
|
||||||
|
if (m_hiddenInnerWidget)
|
||||||
|
state.insert(kDockWidgetInnerWidgetHeight, m_hiddenInnerWidgetHeight);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DockWidget::restoreState(const QVariant &data)
|
||||||
|
{
|
||||||
|
const auto state = data.toMap();
|
||||||
|
bool ok;
|
||||||
|
const int hiddenInnerWidgetHeight
|
||||||
|
= state.value(kDockWidgetInnerWidgetHeight).toString().toInt(&ok);
|
||||||
|
if (!ok) {
|
||||||
|
// dock was not collapsed, make sure to uncollapse
|
||||||
|
setInnerWidgetShown(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setInnerWidgetShown(false);
|
||||||
|
m_hiddenInnerWidgetHeight = hiddenInnerWidgetHeight;
|
||||||
|
}
|
||||||
|
|
||||||
DocksAndSizes DockWidget::verticallyArrangedDocks()
|
DocksAndSizes DockWidget::verticallyArrangedDocks()
|
||||||
{
|
{
|
||||||
DocksAndSizes result;
|
DocksAndSizes result;
|
||||||
@@ -635,10 +668,14 @@ Store FancyMainWindow::saveSettings() const
|
|||||||
Store settings;
|
Store settings;
|
||||||
settings.insert(StateKey, saveState(settingsVersion));
|
settings.insert(StateKey, saveState(settingsVersion));
|
||||||
settings.insert(ShowCentralWidgetKey, d->m_showCentralWidget.isChecked());
|
settings.insert(ShowCentralWidgetKey, d->m_showCentralWidget.isChecked());
|
||||||
|
QVariantHash dockWidgetStates;
|
||||||
for (QDockWidget *dockWidget : dockWidgets()) {
|
for (QDockWidget *dockWidget : dockWidgets()) {
|
||||||
settings.insert(keyFromString(dockWidget->objectName()),
|
settings.insert(keyFromString(dockWidget->objectName()),
|
||||||
dockWidget->property(dockWidgetActiveState));
|
dockWidget->property(dockWidgetActiveState));
|
||||||
|
if (DockWidget *dock = qobject_cast<DockWidget *>(dockWidget))
|
||||||
|
dockWidgetStates.insert(dockWidget->objectName(), dock->saveState());
|
||||||
}
|
}
|
||||||
|
settings.insert(DockWidgetStatesKey, dockWidgetStates);
|
||||||
settings.insert(HiddenDockAreasKey, d->hiddenDockAreasToHash());
|
settings.insert(HiddenDockAreasKey, d->hiddenDockAreasToHash());
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
@@ -653,9 +690,12 @@ bool FancyMainWindow::restoreSettings(const Store &settings)
|
|||||||
qWarning() << "Restoring the state of dock widgets failed.";
|
qWarning() << "Restoring the state of dock widgets failed.";
|
||||||
}
|
}
|
||||||
d->m_showCentralWidget.setChecked(settings.value(ShowCentralWidgetKey, true).toBool());
|
d->m_showCentralWidget.setChecked(settings.value(ShowCentralWidgetKey, true).toBool());
|
||||||
|
const QVariantHash dockWidgetStates = settings.value(DockWidgetStatesKey).toHash();
|
||||||
for (QDockWidget *widget : dockWidgets()) {
|
for (QDockWidget *widget : dockWidgets()) {
|
||||||
widget->setProperty(dockWidgetActiveState,
|
widget->setProperty(dockWidgetActiveState,
|
||||||
settings.value(keyFromString(widget->objectName()), false));
|
settings.value(keyFromString(widget->objectName()), false));
|
||||||
|
if (DockWidget *dock = qobject_cast<DockWidget *>(widget))
|
||||||
|
dock->restoreState(dockWidgetStates.value(widget->objectName()));
|
||||||
}
|
}
|
||||||
d->restoreHiddenDockAreasFromHash(settings.value(HiddenDockAreasKey).toHash());
|
d->restoreHiddenDockAreasFromHash(settings.value(HiddenDockAreasKey).toHash());
|
||||||
emit dockWidgetsChanged();
|
emit dockWidgetsChanged();
|
||||||
|
|||||||
Reference in New Issue
Block a user