From ec9fa00f4625967d99dee7c3eced665135e18a82 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 31 May 2021 00:05:01 +0400 Subject: [PATCH] Bring second large peer video to the top. --- .../calls/group/calls_group_viewport.cpp | 62 ++++++++++++++----- .../calls/group/calls_group_viewport.h | 2 + 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp b/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp index 1fea883da..0d2395d48 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport.cpp @@ -415,24 +415,12 @@ void Viewport::updateTilesGeometryWide(int outerWidth, int outerHeight) { } void Viewport::updateTilesGeometryNarrow(int outerWidth) { - const auto y = -_scrollTop; - if (outerWidth <= st::groupCallNarrowMembersWidth) { - auto top = 0; - for (const auto &tile : _tiles) { - const auto video = tile.get(); - const auto size = video->trackSize(); - const auto shown = !size.isEmpty() && _large && video != _large; - const auto height = shown - ? st::groupCallNarrowVideoHeight - : 0; - video->setGeometry({ 0, y + top, outerWidth, height }); - top += height ? (height + st::groupCallVideoSmallSkip) : 0; - } - _fullHeight = top; + updateTilesGeometryColumn(outerWidth); return; } + const auto y = -_scrollTop; auto sizes = base::flat_map, QSize>(); sizes.reserve(_tiles.size()); for (const auto &tile : _tiles) { @@ -493,7 +481,53 @@ void Viewport::updateTilesGeometryNarrow(int outerWidth) { } } _fullHeight = rows * (min + skip); +} +void Viewport::updateTilesGeometryColumn(int outerWidth) { + const auto y = -_scrollTop; + auto top = 0; + const auto layoutNext = [&](not_null tile) { + const auto size = tile->trackSize(); + const auto shown = !size.isEmpty() && _large && tile != _large; + const auto height = shown + ? st::groupCallNarrowVideoHeight + : 0; + tile->setGeometry({ 0, y + top, outerWidth, height }); + top += height ? (height + st::groupCallVideoSmallSkip) : 0; + }; + const auto topPeer = _large ? _large->row()->peer().get() : nullptr; + const auto reorderNeeded = [&] { + if (!_large) { + return false; + } + for (const auto &tile : _tiles) { + if (tile.get() != _large && tile->row()->peer() == topPeer) { + return (tile.get() != _tiles.front().get()) + && !tile->trackSize().isEmpty(); + } + } + return false; + }(); + if (reorderNeeded) { + _tilesForOrder.clear(); + _tilesForOrder.reserve(_tiles.size()); + for (const auto &tile : _tiles) { + _tilesForOrder.push_back(tile.get()); + } + ranges::stable_partition( + _tilesForOrder, + [&](not_null tile) { + return (tile->row()->peer() == topPeer); + }); + for (const auto &tile : _tilesForOrder) { + layoutNext(tile); + } + } else { + for (const auto &tile : _tiles) { + layoutNext(tile.get()); + } + } + _fullHeight = top; } void Viewport::setTileGeometry(not_null tile, QRect geometry) { diff --git a/Telegram/SourceFiles/calls/group/calls_group_viewport.h b/Telegram/SourceFiles/calls/group/calls_group_viewport.h index 6361bf013..d4250a500 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_viewport.h +++ b/Telegram/SourceFiles/calls/group/calls_group_viewport.h @@ -117,6 +117,7 @@ private: void updateTilesGeometry(int outerWidth); void updateTilesGeometryWide(int outerWidth, int outerHeight); void updateTilesGeometryNarrow(int outerWidth); + void updateTilesGeometryColumn(int outerWidth); void setTileGeometry(not_null tile, QRect geometry); void refreshHasTwoOrMore(); void updateTopControlsVisibility(); @@ -138,6 +139,7 @@ private: bool _geometryStaleAfterModeChange = false; const std::unique_ptr _content; std::vector> _tiles; + std::vector> _tilesForOrder; rpl::variable _fullHeight = 0; bool _hasTwoOrMore = false; int _scrollTop = 0;