Fix a crash in folders editing, happens in Qt 6.4.

Fixes #25074.
This commit is contained in:
John Preston 2022-09-23 13:34:35 +04:00
parent eac13b31f1
commit e01910ac68

View file

@ -526,11 +526,13 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
return [=] { return [=] {
auto ids = prepareGoodIdsForNewFilters(); auto ids = prepareGoodIdsForNewFilters();
using Requests = std::vector<MTPmessages_UpdateDialogFilter>; auto order = std::vector<FilterId>();
auto addRequests = Requests(), removeRequests = Requests(); auto updates = std::vector<MTPUpdate>();
auto addRequests = std::vector<MTPmessages_UpdateDialogFilter>();
auto removeRequests = std::vector<MTPmessages_UpdateDialogFilter>();
auto &realFilters = session->data().chatsFilters(); auto &realFilters = session->data().chatsFilters();
const auto &list = realFilters.list(); const auto &list = realFilters.list();
auto order = std::vector<FilterId>();
order.reserve(rows->size()); order.reserve(rows->size());
for (const auto &row : *rows) { for (const auto &row : *rows) {
const auto id = row.filter.id(); const auto id = row.filter.id();
@ -558,7 +560,7 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
addRequests.push_back(request); addRequests.push_back(request);
order.push_back(newId); order.push_back(newId);
} }
realFilters.apply(MTP_updateDialogFilter( updates.push_back(MTP_updateDialogFilter(
MTP_flags(removed MTP_flags(removed
? MTPDupdateDialogFilter::Flag(0) ? MTPDupdateDialogFilter::Flag(0)
: MTPDupdateDialogFilter::Flag::f_filter), : MTPDupdateDialogFilter::Flag::f_filter),
@ -578,16 +580,31 @@ void FilterRowButton::paintEvent(QPaintEvent *e) {
} }
order.insert(order.begin() + position, FilterId(0)); order.insert(order.begin() + position, FilterId(0));
} }
auto previousId = mtpRequestId(0); crl::on_main(session, [
auto &&requests = ranges::views::concat(removeRequests, addRequests); session,
for (auto &request : requests) { order = std::move(order),
previousId = session->api().request( updates = std::move(updates),
std::move(request) addRequests = std::move(addRequests),
).afterRequest(previousId).send(); removeRequests = std::move(removeRequests)
} ] {
if (!order.empty() && !addRequests.empty()) { const auto api = &session->api();
realFilters.saveOrder(order, previousId); 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);
}
});
}; };
} }