diff --git a/src/DockWidgetBase.cpp b/src/DockWidgetBase.cpp index 56b549b6..f499b417 100644 --- a/src/DockWidgetBase.cpp +++ b/src/DockWidgetBase.cpp @@ -547,7 +547,7 @@ void DockWidgetBase::Private::restoreToPreviousPosition() MultiSplitterLayout *layout = DockRegistry::self()->layoutForItem(m_lastPosition.layoutItem()); Q_ASSERT(layout); - layout->restorePlaceholder(m_lastPosition.layoutItem(), m_lastPosition.m_tabIndex); + layout->restorePlaceholder(q, m_lastPosition.layoutItem(), m_lastPosition.m_tabIndex); } void DockWidgetBase::Private::maybeRestoreToPreviousPosition() diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index e621e3d7..f0083559 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -294,7 +294,7 @@ void Frame::restoreToPreviousPosition() return; } - m_layoutItem->setIsVisible(true); + m_layoutItem->restorePlaceholder(this); } int Frame::currentTabIndex() const diff --git a/src/private/multisplitter/Item.cpp b/src/private/multisplitter/Item.cpp index 63b0716e..453b89a8 100644 --- a/src/private/multisplitter/Item.cpp +++ b/src/private/multisplitter/Item.cpp @@ -66,7 +66,6 @@ void Item::setFrame(QWidget *w) disconnect(m_widget, &QObject::objectNameChanged, this, &Item::updateObjectName); } - m_widget = w; if (m_widget) { @@ -74,6 +73,8 @@ void Item::setFrame(QWidget *w) connect(m_widget, &QObject::objectNameChanged, this, &Item::updateObjectName); connect(m_widget, &QObject::destroyed, this, &Item::onWidgetDestroyed); connect(m_widget, SIGNAL(layoutInvalidated()), this, SLOT(onWidgetLayoutRequested())); // TODO: old-style + m_widget->setParent(m_hostWidget); + //setMinSize(m_widget->min) } updateObjectName(); @@ -107,6 +108,13 @@ QWidget *Item::hostWidget() const return m_hostWidget; } +void Item::restorePlaceholder(QWidget *widget) +{ + Q_ASSERT(isVisible() && !frame()); + setFrame(widget); + setIsVisible(true); +} + void Item::resize(QSize newSize) { setSize(newSize); @@ -326,6 +334,8 @@ void Item::setIsVisible(bool is) m_isVisible = is; Q_EMIT minSizeChanged(this); // min-size is 0x0 when hidden Q_EMIT visibleChanged(this, is); + if (m_widget) + m_widget->setVisible(is); } } diff --git a/src/private/multisplitter/Item_p.h b/src/private/multisplitter/Item_p.h index d7208090..c1a9255d 100644 --- a/src/private/multisplitter/Item_p.h +++ b/src/private/multisplitter/Item_p.h @@ -247,6 +247,7 @@ public: int refCount() const; QWidget *hostWidget() const; + void restorePlaceholder(QWidget *); Q_SIGNALS: void geometryChanged(); diff --git a/src/private/multisplitter/MultiSplitterLayout.cpp b/src/private/multisplitter/MultiSplitterLayout.cpp index e28f2893..67b87db0 100644 --- a/src/private/multisplitter/MultiSplitterLayout.cpp +++ b/src/private/multisplitter/MultiSplitterLayout.cpp @@ -172,7 +172,6 @@ void MultiSplitterLayout::addWidget(QWidgetOrQuick *w, Location location, Frame auto newItem = new Item(multiSplitter()); newItem->setFrame(w); - w->setParent(multiSplitter()); relativeTo->insertItem(newItem, Layouting::Location(location)); unrefOldPlaceholders(framesFrom(w)); @@ -347,9 +346,23 @@ QVector MultiSplitterLayout::dockWidgets() const return result; } -void MultiSplitterLayout::restorePlaceholder(Item *, int /*tabIndex*/) +void MultiSplitterLayout::restorePlaceholder(DockWidgetBase *dw, Item *item, int tabIndex) { - // TODO + if (item->isPlaceholder()) { + Frame *newFrame = Config::self().frameworkWidgetFactory()->createFrame(multiSplitter()); + item->restorePlaceholder(newFrame); + } + + Frame *frame = qobject_cast(item->frame()); + Q_ASSERT(frame); + + if (tabIndex != -1 && frame->dockWidgetCount() >= tabIndex) { + frame->insertWidget(dw, tabIndex); + } else { + frame->addWidget(dw); + } + + frame->setVisible(true); } bool MultiSplitterLayout::checkSanity() const diff --git a/src/private/multisplitter/MultiSplitterLayout_p.h b/src/private/multisplitter/MultiSplitterLayout_p.h index 66394133..4d01d677 100644 --- a/src/private/multisplitter/MultiSplitterLayout_p.h +++ b/src/private/multisplitter/MultiSplitterLayout_p.h @@ -291,7 +291,7 @@ public: */ QVector dockWidgets() const; - void restorePlaceholder(Layouting::Item *, int tabIndex); + void restorePlaceholder(DockWidgetBase *dw, Layouting::Item *, int tabIndex); struct Length { Length() = default;