Clear DocumentMedia in media overview.

This commit is contained in:
John Preston 2020-05-21 17:13:29 +04:00
parent 58f82620e0
commit ad5507f2c8
5 changed files with 57 additions and 7 deletions

View File

@ -804,8 +804,19 @@ void ListWidget::invalidatePaletteCache() {
}
}
void ListWidget::registerHeavyItem(not_null<BaseLayout*> item) {
_heavyLayouts.emplace(item);
void ListWidget::registerHeavyItem(not_null<const BaseLayout*> item) {
if (!_heavyLayouts.contains(item)) {
_heavyLayouts.emplace(item);
_heavyLayoutsInvalidated = true;
}
}
void ListWidget::unregisterHeavyItem(not_null<const BaseLayout*> item) {
const auto i = _heavyLayouts.find(item);
if (i != _heavyLayouts.end()) {
_heavyLayouts.erase(i);
_heavyLayoutsInvalidated = true;
}
}
SparseIdsMergedSlice::Key ListWidget::sliceKey(
@ -1114,18 +1125,25 @@ void ListWidget::clearHeavyItems() {
if (!visibleHeight) {
return;
}
_heavyLayoutsInvalidated = false;
const auto above = _visibleTop - visibleHeight;
const auto below = _visibleBottom + visibleHeight;
for (auto i = _heavyLayouts.begin(); i != _heavyLayouts.end();) {
const auto item = *i;
const auto item = const_cast<BaseLayout*>(i->get());
const auto rect = findItemDetails(item).geometry;
if (rect.top() + rect.height() <= above || rect.top() >= below) {
i = _heavyLayouts.erase(i);
item->clearHeavyPart();
if (_heavyLayoutsInvalidated) {
break;
}
} else {
++i;
}
}
if (_heavyLayoutsInvalidated) {
clearHeavyItems();
}
}
auto ListWidget::countScrollState() const -> ScrollTopState {

View File

@ -76,7 +76,8 @@ public:
void saveState(not_null<Memento*> memento);
void restoreState(not_null<Memento*> memento);
void registerHeavyItem(not_null<BaseLayout*> item) override;
void registerHeavyItem(not_null<const BaseLayout*> item) override;
void unregisterHeavyItem(not_null<const BaseLayout*> item) override;
private:
struct Context;
@ -289,8 +290,9 @@ private:
int _idsLimit = kMinimalIdsLimit;
SparseIdsMergedSlice _slice;
base::flat_map<UniversalMsgId, CachedItem> _layouts;
base::flat_set<not_null<BaseLayout*>> _heavyLayouts;
std::unordered_map<UniversalMsgId, CachedItem> _layouts;
base::flat_set<not_null<const BaseLayout*>> _heavyLayouts;
bool _heavyLayoutsInvalidated = false;
std::vector<Section> _sections;
int _visibleTop = 0;

View File

@ -533,6 +533,11 @@ void Video::ensureDataMediaCreated() const {
_dataMedia = _data->createMediaView();
_dataMedia->goodThumbnailWanted();
_dataMedia->thumbnailWanted(parent()->fullId());
delegate()->registerHeavyItem(this);
}
void Video::clearHeavyPart() {
_dataMedia = nullptr;
}
float64 Video::dataProgress() const {
@ -828,6 +833,11 @@ void Voice::ensureDataMediaCreated() const {
return;
}
_dataMedia = _data->createMediaView();
delegate()->registerHeavyItem(this);
}
void Voice::clearHeavyPart() {
_dataMedia = nullptr;
}
float64 Voice::dataProgress() const {
@ -1298,6 +1308,11 @@ void Document::ensureDataMediaCreated() const {
}
_dataMedia = _data->createMediaView();
_dataMedia->thumbnailWanted(parent()->fullId());
delegate()->registerHeavyItem(this);
}
void Document::clearHeavyPart() {
_dataMedia = nullptr;
}
float64 Document::dataProgress() const {
@ -1613,6 +1628,7 @@ void Link::validateThumbnail() {
: ImageRoundRadius::Small;
_thumbnail = thumbnail->pixSingle(parent()->fullId(), _pixw, _pixh, st::linksPhotoSize, st::linksPhotoSize, roundRadius);
_documentMedia = nullptr;
delegate()->unregisterHeavyItem(this);
}
} else {
const auto size = QSize(st::linksPhotoSize, st::linksPhotoSize);
@ -1654,6 +1670,11 @@ void Link::ensureDocumentMediaCreated() {
}
_documentMedia = _page->document->createMediaView();
_documentMedia->thumbnailWanted(parent()->fullId());
delegate()->registerHeavyItem(this);
}
void Link::clearHeavyPart() {
_documentMedia = nullptr;
}
TextState Link::getState(

View File

@ -210,6 +210,8 @@ public:
QPoint point,
StateRequest request) const override;
void clearHeavyPart() override;
protected:
float64 dataProgress() const override;
bool dataFinished() const override;
@ -244,6 +246,8 @@ public:
QPoint point,
StateRequest request) const override;
void clearHeavyPart() override;
protected:
float64 dataProgress() const override;
bool dataFinished() const override;
@ -284,6 +288,8 @@ public:
QPoint point,
StateRequest request) const override;
void clearHeavyPart() override;
protected:
float64 dataProgress() const override;
bool dataFinished() const override;
@ -334,6 +340,8 @@ public:
QPoint point,
StateRequest request) const override;
void clearHeavyPart() override;
protected:
const style::RoundCheckbox &checkboxStyle() const override;

View File

@ -14,7 +14,8 @@ class ItemBase;
class Delegate {
public:
virtual void registerHeavyItem(not_null<ItemBase*> item) = 0;
virtual void registerHeavyItem(not_null<const ItemBase*> item) = 0;
virtual void unregisterHeavyItem(not_null<const ItemBase*> item) = 0;
};