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 [=] {
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);
}
});
};
}