diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp index f06370bbcf..d0488d5955 100644 --- a/src/widgets/widgets/qmdiarea.cpp +++ b/src/widgets/widgets/qmdiarea.cpp @@ -447,9 +447,11 @@ QRect MinOverlapPlacer::findMinOverlapRect(const QVector &source, const Q \internal Gets candidates for the final placement. */ -void MinOverlapPlacer::getCandidatePlacements(const QSize &size, const QVector &rects, - const QRect &domain,QVector &candidates) +QVector MinOverlapPlacer::getCandidatePlacements(const QSize &size, const QVector &rects, + const QRect &domain) { + QVector result; + QVector xlist; xlist.reserve(2 + rects.size()); xlist << domain.left() << domain.right() - size.width() + 1; @@ -471,10 +473,11 @@ void MinOverlapPlacer::getCandidatePlacements(const QSize &size, const QVector &source, - QVector &result) +QVector MinOverlapPlacer::findNonInsiders(const QRect &domain, QVector &source) { + QVector result; + result.reserve(source.size()); + QMutableVectorIterator it(source); while (it.hasNext()) { const QRect srcRect = it.next(); @@ -493,6 +498,8 @@ void MinOverlapPlacer::findNonInsiders(const QRect &domain, QVector &sour it.remove(); } } + + return result; } /*! @@ -500,9 +507,11 @@ void MinOverlapPlacer::findNonInsiders(const QRect &domain, QVector &sour Finds all rectangles in 'source' that overlaps 'domain' by the maximum overlap area between 'domain' and any rectangle in 'source'. The result is stored in 'result'. */ -void MinOverlapPlacer::findMaxOverlappers(const QRect &domain, const QVector &source, - QVector &result) +QVector MinOverlapPlacer::findMaxOverlappers(const QRect &domain, const QVector &source) { + QVector result; + result.reserve(source.size()); + int maxOverlap = -1; foreach (const QRect &srcRect, source) { QRect intersection = domain.intersected(srcRect); @@ -515,6 +524,8 @@ void MinOverlapPlacer::findMaxOverlappers(const QRect &domain, const QVector &rects, QVector &source) { - QVector nonInsiders; - findNonInsiders(domain, source, nonInsiders); + const QVector nonInsiders = findNonInsiders(domain, source); if (!source.empty()) return findMinOverlapRect(source, rects).topLeft(); - QVector maxOverlappers; - findMaxOverlappers(domain, nonInsiders, maxOverlappers); + QVector maxOverlappers = findMaxOverlappers(domain, nonInsiders); return findMinOverlapRect(maxOverlappers, rects).topLeft(); } @@ -554,8 +563,7 @@ QPoint MinOverlapPlacer::place(const QSize &size, const QVector &rects, return QPoint(); } - QVector candidates; - getCandidatePlacements(size, rects, domain, candidates); + QVector candidates = getCandidatePlacements(size, rects, domain); return findBestPlacement(domain, rects, candidates); } diff --git a/src/widgets/widgets/qmdiarea_p.h b/src/widgets/widgets/qmdiarea_p.h index 7d562e1212..360ed2508c 100644 --- a/src/widgets/widgets/qmdiarea_p.h +++ b/src/widgets/widgets/qmdiarea_p.h @@ -126,15 +126,10 @@ class MinOverlapPlacer : public Placer QPoint place(const QSize &size, const QVector &rects, const QRect &domain) const; static int accumulatedOverlap(const QRect &source, const QVector &rects); static QRect findMinOverlapRect(const QVector &source, const QVector &rects); - static void getCandidatePlacements( - const QSize &size, const QVector &rects, const QRect &domain, - QVector &candidates); - static QPoint findBestPlacement( - const QRect &domain, const QVector &rects, QVector &source); - static void findNonInsiders( - const QRect &domain, QVector &source, QVector &result); - static void findMaxOverlappers( - const QRect &domain, const QVector &source, QVector &result); + static QVector getCandidatePlacements(const QSize &size, const QVector &rects, const QRect &domain); + static QPoint findBestPlacement(const QRect &domain, const QVector &rects, QVector &source); + static QVector findNonInsiders(const QRect &domain, QVector &source); + static QVector findMaxOverlappers(const QRect &domain, const QVector &source); }; } // namespace QMdi