diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index df0615038e..4768714ddf 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -723,6 +723,16 @@ void Stories::applyDeleted(FullStoryId id) { } _owner->refreshStoryItemViews(id); Assert(!_pollingSettings.contains(story.get())); + if (const auto j = _items.find(id.peer); j != end(_items)) { + const auto k = j->second.find(id.story); + if (k != end(j->second)) { + Assert(!k->second.lock()); + j->second.erase(k); + if (j->second.empty()) { + _items.erase(j); + } + } + } if (i->second.empty()) { _stories.erase(i); } diff --git a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp index 459f1408c9..ae029cf9ea 100644 --- a/Telegram/SourceFiles/info/media/info_media_list_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_list_widget.cpp @@ -548,6 +548,7 @@ void ListWidget::refreshRows() { resizeToWidth(width()); restoreScrollState(); mouseActionUpdate(); + update(); } bool ListWidget::preventAutoHide() const { @@ -1942,6 +1943,7 @@ void ListWidget::applyDragSelection(SelectedMap &applyTo) const { void ListWidget::refreshHeight() { resize(width(), recountHeight()); + update(); } int ListWidget::recountHeight() { diff --git a/Telegram/SourceFiles/info/stories/info_stories_provider.cpp b/Telegram/SourceFiles/info/stories/info_stories_provider.cpp index fbe81ebc5b..e582f9ce7e 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_provider.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_provider.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "info/media/info_media_widget.h" #include "info/media/info_media_list_section.h" #include "info/info_controller.h" +#include "data/data_changes.h" #include "data/data_document.h" #include "data/data_media_types.h" #include "data/data_session.h" @@ -54,6 +55,14 @@ Provider::Provider(not_null controller) layout.second.item->invalidateCache(); } }, _lifetime); + + _peer->session().changes().storyUpdates( + Data::StoryUpdate::Flag::Destroyed + ) | rpl::filter([=](const Data::StoryUpdate &update) { + return update.story->peer() == _peer; + }) | rpl::start_with_next([=](const Data::StoryUpdate &update) { + storyRemoved(update.story); + }, _lifetime); } Provider::~Provider() { @@ -253,15 +262,17 @@ bool Provider::isAfter( return (a->id < b->id); } -void Provider::itemRemoved(not_null item) { - const auto id = StoryIdFromMsgId(item->id); - if (const auto i = _layouts.find(id); i != end(_layouts)) { +void Provider::storyRemoved(not_null story) { + Expects(story->peer() == _peer); + + if (const auto i = _layouts.find(story->id()); i != end(_layouts)) { _peer->owner().stories().unregisterPolling( - { _peer->id, id }, + story, Data::Stories::Polling::Chat); _layoutRemoved.fire(i->second.item.get()); _layouts.erase(i); } + _items.remove(story->id()); } BaseLayout *Provider::getLayout( diff --git a/Telegram/SourceFiles/info/stories/info_stories_provider.h b/Telegram/SourceFiles/info/stories/info_stories_provider.h index 3902341280..b43350d971 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_provider.h +++ b/Telegram/SourceFiles/info/stories/info_stories_provider.h @@ -16,6 +16,10 @@ class HistoryItem; class PeerData; class History; +namespace Data { +class Story; +} // namespace Data + namespace Info { class AbstractController; } // namespace Info @@ -97,7 +101,7 @@ private: not_null item, not_null previous) override; - void itemRemoved(not_null item); + void storyRemoved(not_null story); void markLayoutsStale(); void clearStaleLayouts(); void clear();