From 3262c2d1b9a0a17ef0019be5fc0602090e7cc612 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 1 Mar 2022 18:55:35 +0300 Subject: [PATCH] Support select by drag in Downloads. --- .../downloads/info_downloads_provider.cpp | 35 ++++++++++++++++++- .../info/media/info_media_list_section.cpp | 17 --------- .../info/media/info_media_list_section.h | 2 -- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/Telegram/SourceFiles/info/downloads/info_downloads_provider.cpp b/Telegram/SourceFiles/info/downloads/info_downloads_provider.cpp index 14180063fd..f984ba1e65 100644 --- a/Telegram/SourceFiles/info/downloads/info_downloads_provider.cpp +++ b/Telegram/SourceFiles/info/downloads/info_downloads_provider.cpp @@ -370,7 +370,40 @@ void Provider::applyDragSelection( bool skipFrom, not_null tillItem, bool skipTill) { - // #TODO downloads selection + auto from = ranges::find(_elements, fromItem, &Element::item); + auto till = ranges::find(_elements, tillItem, &Element::item); + if (from == end(_elements) || till == end(_elements)) { + return; + } + if (skipFrom) { + ++from; + } + if (!skipTill) { + ++till; + } + if (from >= till) { + selected.clear(); + return; + } + auto chosen = base::flat_set>(); + chosen.reserve(till - from); + for (auto i = from; i != till; ++i) { + const auto item = i->item; + chosen.emplace(item); + ChangeItemSelection( + selected, + item, + computeSelectionData(item, FullSelection)); + } + if (selected.size() != chosen.size()) { + for (auto i = begin(selected); i != end(selected);) { + if (selected.contains(i->first)) { + ++i; + } else { + i = selected.erase(i); + } + } + } } bool Provider::allowSaveFileAs( diff --git a/Telegram/SourceFiles/info/media/info_media_list_section.cpp b/Telegram/SourceFiles/info/media/info_media_list_section.cpp index 03ecdb6f53..9a41a25f1e 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_section.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_section.cpp @@ -158,23 +158,6 @@ std::optional ListSection::findItemByItem( return std::nullopt; } -ListFoundItem ListSection::findItemNearId(UniversalMsgId universalId) const { - Expects(!_items.empty()); - - // #TODO downloads - auto itemIt = ranges::lower_bound( - _items, - universalId, - std::greater<>(), - [](const auto &item) { return GetUniversalId(item); }); - if (itemIt == _items.end()) { - --itemIt; - } - const auto item = *itemIt; - const auto exact = (GetUniversalId(item) == universalId); - return { item, findItemRect(item), exact }; -} - ListFoundItem ListSection::findItemDetails( not_null item) const { return { item, findItemRect(item), true }; diff --git a/Telegram/SourceFiles/info/media/info_media_list_section.h b/Telegram/SourceFiles/info/media/info_media_list_section.h index e03660bf00..77666a31a0 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_section.h +++ b/Telegram/SourceFiles/info/media/info_media_list_section.h @@ -34,8 +34,6 @@ public: bool removeItem(not_null item); [[nodiscard]] std::optional findItemByItem( not_null item) const; - [[nodiscard]] ListFoundItem findItemNearId( - UniversalMsgId universalId) const; [[nodiscard]] ListFoundItem findItemDetails( not_null item) const; [[nodiscard]] ListFoundItem findItemByPoint(QPoint point) const;