diff options
Diffstat (limited to 'src/widgets/widgets/qdockarealayout.cpp')
-rw-r--r-- | src/widgets/widgets/qdockarealayout.cpp | 93 |
1 files changed, 89 insertions, 4 deletions
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index 2e3602e47a..da0e987171 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -171,6 +171,38 @@ QDockAreaLayoutItem return *this; } +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QDockAreaLayoutItem *item) +{ + QDebugStateSaver saver(dbg); + dbg.nospace(); + return item ? dbg << *item : dbg << "QDockAreaLayoutItem(0x0)"; +} + +QDebug operator<<(QDebug dbg, const QDockAreaLayoutItem &item) +{ + QDebugStateSaver saver(dbg); + dbg.nospace(); + dbg << "QDockAreaLayoutItem(" << static_cast<const void *>(&item) << "->"; + if (item.widgetItem) { + QWidget *widget = item.widgetItem->widget(); + if (auto *dockWidget = qobject_cast<QDockWidget *>(widget)) { + dbg << "widgetItem(" << dockWidget << ")"; + } else if (auto *groupWindow = qobject_cast<QDockWidgetGroupWindow *>(widget)) { + dbg << "widgetItem(" << groupWindow << "->(" << groupWindow->dockWidgets() << "))"; + } else { + dbg << "widgetItem(" << widget << ")"; + } + } else if (item.subinfo) { + dbg << "subInfo(" << item.subinfo << "->(" << item.subinfo->item_list << ")"; + } else if (item.placeHolderItem) { + dbg << "placeHolderItem(" << item.placeHolderItem << ")"; + } + dbg << ")"; + return dbg; +} +#endif // QT_NO_DEBUG_STREAM + /****************************************************************************** ** QDockAreaLayoutInfo */ @@ -986,6 +1018,14 @@ void QDockAreaLayoutInfo::remove(const QList<int> &path) } } +void QDockAreaLayoutInfo::remove(QWidget *widget) +{ + const QList<int> path = indexOf(widget); + if (path.isEmpty()) + return; + remove(path); +} + QLayoutItem *QDockAreaLayoutInfo::plug(const QList<int> &path) { Q_ASSERT(!path.isEmpty()); @@ -1090,6 +1130,21 @@ static QRect dockedGeometry(QWidget *widget) return result; } +bool QDockAreaLayoutInfo::hasGapItem(const QList<int> &path) const +{ + // empty path has no gap item + if (path.isEmpty()) + return false; + + // Index -1 isn't a gap + // Index out of range points at a position to be created. That isn't a gap either. + const int index = path.constFirst(); + if (index < 0 || index >= item_list.count()) + return false; + + return item_list[index].flags & QDockAreaLayoutItem::GapItem; +} + bool QDockAreaLayoutInfo::insertGap(const QList<int> &path, QLayoutItem *dockWidgetItem) { Q_ASSERT(!path.isEmpty()); @@ -1101,8 +1156,6 @@ bool QDockAreaLayoutInfo::insertGap(const QList<int> &path, QLayoutItem *dockWid index = -index - 1; } -// dump(qDebug() << "insertGap() before:" << index << tabIndex, *this, QString()); - if (path.size() > 1) { QDockAreaLayoutItem &item = item_list[index]; @@ -1731,6 +1784,26 @@ QLayoutItem *QDockAreaLayoutInfo::takeAt(int *x, int index) return nullptr; } +// Add a dock widget or dock widget group window to the item list +void QDockAreaLayoutInfo::add(QWidget *widget) +{ + // Do not add twice + if (!indexOf(widget).isEmpty()) + return; + + if (auto *dockWidget = qobject_cast<QDockWidget *>(widget)) { + item_list.append(QDockAreaLayoutItem(new QDockWidgetItem(dockWidget))); + return; + } + + if (auto *groupWindow = qobject_cast<QDockWidgetGroupWindow *>(widget)) { + item_list.append(QDockAreaLayoutItem(new QDockWidgetGroupWindowItem(groupWindow))); + return; + } + + qFatal("Coding error. Add supports only QDockWidget and QDockWidgetGroupWindow"); +} + void QDockAreaLayoutInfo::deleteAllLayoutItems() { for (int i = 0; i < item_list.size(); ++i) { @@ -1924,6 +1997,7 @@ bool QDockAreaLayoutInfo::restoreState(QDataStream &stream, QList<QDockWidget*> if (testing) { //was it is not really added to the layout, we need to delete the object here delete item.widgetItem; + item.widgetItem = nullptr; } } } else if (nextMarker == SequenceMarker) { @@ -1989,14 +2063,20 @@ void QDockAreaLayoutInfo::updateSeparatorWidgets() const break; QWidget *sepWidget; - if (j < separatorWidgets.size() && separatorWidgets.at(j)) { + if (j < separatorWidgets.size()) { sepWidget = separatorWidgets.at(j); + if (!sepWidget) { + qWarning("QDockAreaLayoutInfo::updateSeparatorWidgets: null separator widget"); + sepWidget = mainWindowLayout()->getSeparatorWidget(); + separatorWidgets[j] = sepWidget; + } } else { sepWidget = mainWindowLayout()->getSeparatorWidget(); separatorWidgets.append(sepWidget); } j++; + Q_ASSERT(sepWidget); sepWidget->raise(); QRect sepRect = separatorRect(i).adjusted(-2, -2, 2, 2); @@ -2009,7 +2089,6 @@ void QDockAreaLayoutInfo::updateSeparatorWidgets() const separatorWidgets[k]->hide(); } separatorWidgets.resize(j); - Q_ASSERT(separatorWidgets.size() == j); } /*! \internal @@ -3271,12 +3350,18 @@ void QDockAreaLayout::updateSeparatorWidgets() const QWidget *sepWidget; if (j < separatorWidgets.size()) { sepWidget = separatorWidgets.at(j); + if (!sepWidget) { + qWarning("QDockAreaLayout::updateSeparatorWidgets: null separator widget"); + sepWidget = qt_mainwindow_layout(mainWindow)->getSeparatorWidget(); + separatorWidgets[j] = sepWidget; + } } else { sepWidget = qt_mainwindow_layout(mainWindow)->getSeparatorWidget(); separatorWidgets.append(sepWidget); } j++; + Q_ASSERT(sepWidget); sepWidget->raise(); QRect sepRect = separatorRect(i).adjusted(-2, -2, 2, 2); |