Added ability to unload not visible GIFs as heavy parts in overview.

This commit is contained in:
23rd 2021-07-22 20:57:48 +03:00 committed by John Preston
parent 039ffd3d34
commit a153059b38
5 changed files with 22 additions and 1 deletions

View File

@ -934,6 +934,15 @@ void ListWidget::unregisterHeavyItem(not_null<const BaseLayout*> item) {
}
}
bool ListWidget::itemVisible(not_null<const BaseLayout*> item) {
if (const auto &found = findItemById(GetUniversalId(item))) {
const auto geometry = found->geometry;
return (geometry.top() < _visibleBottom)
&& (geometry.top() + geometry.height() > _visibleTop);
}
return true;
}
void ListWidget::openPhoto(not_null<PhotoData*> photo, FullMsgId id) {
_controller->parentController()->openPhoto(photo, id);
}

View File

@ -80,6 +80,7 @@ public:
void registerHeavyItem(not_null<const BaseLayout*> item) override;
void unregisterHeavyItem(not_null<const BaseLayout*> item) override;
void repaintItem(not_null<const BaseLayout*> item) override;
bool itemVisible(not_null<const BaseLayout*> item) override;
void openPhoto(not_null<PhotoData*> photo, FullMsgId id) override;
void openDocument(

View File

@ -1895,7 +1895,8 @@ void Gif::clipCallback(Media::Clip::Notification notification) {
height,
ImageRoundRadius::None, RectPart::None);
}
} else if (_gif->autoPausedGif()/* && !context()->inlineItemVisible(this)*/) {
} else if (_gif->autoPausedGif()
&& !delegate()->itemVisible(this)) {
clearHeavyPart();
}
}
@ -2057,9 +2058,17 @@ void Gif::ensureDataMediaCreated() const {
}
void Gif::clearHeavyPart() {
_gif.reset();
_dataMedia = nullptr;
}
void Gif::setPosition(int32 position) {
ItemBase::setPosition(position);
if (position < 0) {
_gif.reset();
}
}
float64 Gif::dataProgress() const {
ensureDataMediaCreated();
return _dataMedia->progress();

View File

@ -225,6 +225,7 @@ public:
StateRequest request) const override;
void clearHeavyPart() override;
void setPosition(int32 position);
protected:
float64 dataProgress() const override;

View File

@ -17,6 +17,7 @@ public:
virtual void registerHeavyItem(not_null<const ItemBase*> item) = 0;
virtual void unregisterHeavyItem(not_null<const ItemBase*> item) = 0;
virtual void repaintItem(not_null<const ItemBase*> item) = 0;
virtual bool itemVisible(not_null<const ItemBase*> item) = 0;
virtual void openPhoto(not_null<PhotoData*> photo, FullMsgId id) = 0;
virtual void openDocument(