From 0077435897ff8c2d264110a9f4a0330754b92f0a Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 27 Feb 2016 02:52:16 +0100 Subject: QMainWindowLayout: eradicate Q_FOREACH loops: Extract Method allMyDockWidgets() Extract a loop repeated four times in the code into a separate function. Port to use C++11 range-for loops and not create temporary QLists. Saves 2.4KiB in text size on optimized GCC 5.3 Linux AMD64 builds. Change-Id: I7eb78ffaac33627b595e35cafb6ce0769fb760a8 Reviewed-by: Lars Knoll --- src/widgets/widgets/qmainwindowlayout.cpp | 35 ++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 63a6c718bc..99c32e9acc 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -852,6 +852,25 @@ static QList findChildrenHelper(const QObject *o) return result; } +#ifndef QT_NO_DOCKWIDGET +static QList allMyDockWidgets(const QWidget *mainWindow) +{ + QList result; + for (QObject *c : mainWindow->children()) { + if (auto *dw = qobject_cast(c)) { + result.append(dw); + } else if (auto *gw = qobject_cast(c)) { + for (QObject *c : gw->children()) { + if (auto *dw = qobject_cast(c)) + result.append(dw); + } + } + } + + return result; +} +#endif // QT_NO_DOCKWIDGET + //pre4.3 tests the format that was used before 4.3 bool QMainWindowLayoutState::checkFormat(QDataStream &stream) { @@ -875,9 +894,7 @@ bool QMainWindowLayoutState::checkFormat(QDataStream &stream) #ifndef QT_NO_DOCKWIDGET case QDockAreaLayout::DockWidgetStateMarker: { - QList dockWidgets = findChildrenHelper(mainWindow); - foreach (QDockWidgetGroupWindow *floating, findChildrenHelper(mainWindow)) - dockWidgets += findChildrenHelper(floating); + const auto dockWidgets = allMyDockWidgets(mainWindow); if (!dockAreaLayout.restoreState(stream, dockWidgets, true /*testing*/)) { return false; } @@ -889,9 +906,7 @@ bool QMainWindowLayoutState::checkFormat(QDataStream &stream) QRect geom; stream >> geom; QDockAreaLayoutInfo info; - QList dockWidgets = findChildrenHelper(mainWindow); - foreach (QDockWidgetGroupWindow *floating, findChildrenHelper(mainWindow)) - dockWidgets += findChildrenHelper(floating); + auto dockWidgets = allMyDockWidgets(mainWindow); if (!info.restoreState(stream, dockWidgets, true /* testing*/)) return false; } @@ -935,9 +950,7 @@ bool QMainWindowLayoutState::restoreState(QDataStream &_stream, #ifndef QT_NO_DOCKWIDGET case QDockAreaLayout::DockWidgetStateMarker: { - QList dockWidgets = findChildrenHelper(mainWindow); - foreach (QDockWidgetGroupWindow *floating, findChildrenHelper(mainWindow)) - dockWidgets += findChildrenHelper(floating); + const auto dockWidgets = allMyDockWidgets(mainWindow); if (!dockAreaLayout.restoreState(stream, dockWidgets)) return false; @@ -961,9 +974,7 @@ bool QMainWindowLayoutState::restoreState(QDataStream &_stream, #ifndef QT_NO_TABBAR case QDockAreaLayout::FloatingDockWidgetTabMarker: { - QList dockWidgets = findChildrenHelper(mainWindow); - foreach (QDockWidgetGroupWindow *floating, findChildrenHelper(mainWindow)) - dockWidgets += findChildrenHelper(floating); + auto dockWidgets = allMyDockWidgets(mainWindow); QDockWidgetGroupWindow* floatingTab = qt_mainwindow_layout(mainWindow)->createTabbedDockWindow(); *floatingTab->layoutInfo() = QDockAreaLayoutInfo(&dockAreaLayout.sep, QInternal::LeftDock, Qt::Horizontal, QTabBar::RoundedSouth, mainWindow); -- cgit v1.2.3