From e01910ac6897a1853deb133a0448055c207c5b81 Mon Sep 17 00:00:00 2001 From: John Preston <johnprestonmail@gmail.com> Date: Fri, 23 Sep 2022 13:34:35 +0400 Subject: [PATCH] Fix a crash in folders editing, happens in Qt 6.4. Fixes #25074. --- .../SourceFiles/settings/settings_folders.cpp | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/Telegram/SourceFiles/settings/settings_folders.cpp b/Telegram/SourceFiles/settings/settings_folders.cpp index aa62e5746..af6869a7b 100644 --- a/Telegram/SourceFiles/settings/settings_folders.cpp +++ b/Telegram/SourceFiles/settings/settings_folders.cpp @@ -526,11 +526,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { return [=] { auto ids = prepareGoodIdsForNewFilters(); - using Requests = std::vector<MTPmessages_UpdateDialogFilter>; - auto addRequests = Requests(), removeRequests = Requests(); + auto order = std::vector<FilterId>(); + auto updates = std::vector<MTPUpdate>(); + auto addRequests = std::vector<MTPmessages_UpdateDialogFilter>(); + auto removeRequests = std::vector<MTPmessages_UpdateDialogFilter>(); + auto &realFilters = session->data().chatsFilters(); const auto &list = realFilters.list(); - auto order = std::vector<FilterId>(); order.reserve(rows->size()); for (const auto &row : *rows) { const auto id = row.filter.id(); @@ -558,7 +560,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { addRequests.push_back(request); order.push_back(newId); } - realFilters.apply(MTP_updateDialogFilter( + updates.push_back(MTP_updateDialogFilter( MTP_flags(removed ? MTPDupdateDialogFilter::Flag(0) : MTPDupdateDialogFilter::Flag::f_filter), @@ -578,16 +580,31 @@ void FilterRowButton::paintEvent(QPaintEvent *e) { } order.insert(order.begin() + position, FilterId(0)); } - auto previousId = mtpRequestId(0); - auto &&requests = ranges::views::concat(removeRequests, addRequests); - for (auto &request : requests) { - previousId = session->api().request( - std::move(request) - ).afterRequest(previousId).send(); - } - if (!order.empty() && !addRequests.empty()) { - realFilters.saveOrder(order, previousId); - } + crl::on_main(session, [ + session, + order = std::move(order), + updates = std::move(updates), + addRequests = std::move(addRequests), + removeRequests = std::move(removeRequests) + ] { + const auto api = &session->api(); + const auto filters = &session->data().chatsFilters(); + for (const auto &update : updates) { + filters->apply(update); + } + auto previousId = mtpRequestId(0); + auto &&requests = ranges::views::concat( + removeRequests, + addRequests); + for (auto &request : requests) { + previousId = api->request( + std::move(request) + ).afterRequest(previousId).send(); + } + if (!order.empty() && !addRequests.empty()) { + filters->saveOrder(order, previousId); + } + }); }; }