Fix possible crash in Recent Actions.

This commit is contained in:
John Preston 2024-11-01 17:18:59 +04:00
parent a333615e53
commit 939f6095ba
2 changed files with 20 additions and 7 deletions

View file

@ -273,13 +273,13 @@ InnerWidget::InnerWidget(
_scrollDateHideTimer.setCallback([=] { scrollDateHideByTimer(); }); _scrollDateHideTimer.setCallback([=] { scrollDateHideByTimer(); });
session().data().viewRepaintRequest( session().data().viewRepaintRequest(
) | rpl::start_with_next([=](auto view) { ) | rpl::start_with_next([=](auto view) {
if (view->delegate() == this) { if (myView(view)) {
repaintItem(view); repaintItem(view);
} }
}, lifetime()); }, lifetime());
session().data().viewResizeRequest( session().data().viewResizeRequest(
) | rpl::start_with_next([=](auto view) { ) | rpl::start_with_next([=](auto view) {
if (view->delegate() == this) { if (myView(view)) {
resizeItem(view); resizeItem(view);
} }
}, lifetime()); }, lifetime());
@ -291,7 +291,7 @@ InnerWidget::InnerWidget(
}, lifetime()); }, lifetime());
session().data().viewLayoutChanged( session().data().viewLayoutChanged(
) | rpl::start_with_next([=](auto view) { ) | rpl::start_with_next([=](auto view) {
if (view->delegate() == this) { if (myView(view)) {
if (view->isUnderCursor()) { if (view->isUnderCursor()) {
updateSelected(); updateSelected();
} }
@ -333,6 +333,10 @@ InnerWidget::InnerWidget(
[=] { requestAdmins(); })); [=] { requestAdmins(); }));
} }
bool InnerWidget::myView(not_null<const HistoryView::Element*> view) const {
return !_items.empty() && (view->delegate().get() == this);
}
Main::Session &InnerWidget::session() const { Main::Session &InnerWidget::session() const {
return _controller->session(); return _controller->session();
} }
@ -790,11 +794,16 @@ void InnerWidget::saveState(not_null<SectionMemento*> memento) {
} }
void InnerWidget::restoreState(not_null<SectionMemento*> memento) { void InnerWidget::restoreState(not_null<SectionMemento*> memento) {
_items = memento->takeItems(); // OwnedItem::refreshView may call requestItemResize.
for (auto &item : _items) { // So we postpone resizing until all views are created.
_items.clear();
auto items = memento->takeItems();
for (auto &item : items) {
item.refreshView(this); item.refreshView(this);
_itemsByData.emplace(item->data(), item.get()); _itemsByData.emplace(item->data(), item.get());
} }
_items = std::move(items);
_eventIds = memento->takeEventIds(); _eventIds = memento->takeEventIds();
_admins = memento->takeAdmins(); _admins = memento->takeAdmins();
_adminsCanEdit = memento->takeAdminsCanEdit(); _adminsCanEdit = memento->takeAdminsCanEdit();

View file

@ -229,8 +229,12 @@ private:
void paintEmpty(Painter &p, not_null<const Ui::ChatStyle*> st); void paintEmpty(Painter &p, not_null<const Ui::ChatStyle*> st);
void clearAfterFilterChange(); void clearAfterFilterChange();
void clearAndRequestLog(); void clearAndRequestLog();
void addEvents(Direction direction, const QVector<MTPChannelAdminLogEvent> &events); void addEvents(
Element *viewForItem(const HistoryItem *item); Direction direction,
const QVector<MTPChannelAdminLogEvent> &events);
[[nodiscard]] Element *viewForItem(const HistoryItem *item);
[[nodiscard]] bool myView(
not_null<const HistoryView::Element*> view) const;
void toggleScrollDateShown(); void toggleScrollDateShown();
void repaintScrollDateCallback(); void repaintScrollDateCallback();