Correctly show views count without viewers.

This commit is contained in:
John Preston 2023-06-14 21:31:23 +04:00
parent cdb5f4dc1e
commit 41eac3692c
5 changed files with 56 additions and 29 deletions

View file

@ -313,8 +313,9 @@ bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) {
&owner().session(), &owner().session(),
data.ventities().value_or_empty()), data.ventities().value_or_empty()),
}; };
auto views = 0; auto views = -1;
auto recent = std::vector<not_null<PeerData*>>(); auto recent = std::vector<not_null<PeerData*>>();
if (!data.is_min()) {
if (const auto info = data.vviews()) { if (const auto info = data.vviews()) {
views = info->data().vviews_count().v; views = info->data().vviews_count().v;
if (const auto list = info->data().vrecent_viewers()) { if (const auto list = info->data().vrecent_viewers()) {
@ -325,13 +326,14 @@ bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) {
} }
} }
} }
}
const auto changed = (_media != media) const auto changed = (_media != media)
|| (_pinned != pinned) || (_pinned != pinned)
|| (_isPublic != isPublic) || (_isPublic != isPublic)
|| (_closeFriends != closeFriends) || (_closeFriends != closeFriends)
|| (_caption != caption) || (_caption != caption)
|| (_views != views) || (views >= 0 && _views != views)
|| (_recentViewers != recent); || (_recentViewers != recent);
if (!changed) { if (!changed) {
return false; return false;
@ -341,7 +343,9 @@ bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) {
_isPublic = isPublic; _isPublic = isPublic;
_closeFriends = closeFriends; _closeFriends = closeFriends;
_caption = std::move(caption); _caption = std::move(caption);
if (views >= 0) {
_views = views; _views = views;
}
_recentViewers = std::move(recent); _recentViewers = std::move(recent);
return true; return true;
} }

View file

@ -150,6 +150,31 @@ void RecentViews::show(RecentViewsData data) {
if (usersChanged) { if (usersChanged) {
updateUserpics(); updateUserpics();
} }
refreshClickHandler();
}
void RecentViews::refreshClickHandler() {
const auto nowEmpty = _data.list.empty();
const auto wasEmpty = !_clickHandlerLifetime;
const auto raw = _widget.get();
if (wasEmpty == nowEmpty) {
return;
} else if (nowEmpty) {
_clickHandlerLifetime.destroy();
} else {
_clickHandlerLifetime = raw->events(
) | rpl::filter([=](not_null<QEvent*> e) {
return (_data.total > 0)
&& (e->type() == QEvent::MouseButtonPress)
&& (static_cast<QMouseEvent*>(e.get())->button()
== Qt::LeftButton);
}) | rpl::start_with_next([=] {
showMenu();
});
}
raw->setCursor(_clickHandlerLifetime
? style::cur_pointer
: style::cur_default);
} }
void RecentViews::updateUserpics() { void RecentViews::updateUserpics() {
@ -159,6 +184,7 @@ void RecentViews::updateUserpics() {
const std::vector<Ui::GroupCallUser> &list) { const std::vector<Ui::GroupCallUser> &list) {
_userpics->update(list, true); _userpics->update(list, true);
}); });
_userpics->finishAnimating();
} }
void RecentViews::setupUserpics() { void RecentViews::setupUserpics() {
@ -201,18 +227,6 @@ void RecentViews::setupWidget() {
_textPosition.y(), _textPosition.y(),
raw->width() - _userpicsWidth - st::storiesRecentViewsSkip); raw->width() - _userpicsWidth - st::storiesRecentViewsSkip);
}, raw->lifetime()); }, raw->lifetime());
raw->events(
) | rpl::filter([=](not_null<QEvent*> e) {
return (_data.total > 0)
&& (e->type() == QEvent::MouseButtonPress)
&& (static_cast<QMouseEvent*>(e.get())->button()
== Qt::LeftButton);
}) | rpl::start_with_next([=] {
showMenu();
}, raw->lifetime());
raw->setCursor(style::cur_pointer);
} }
void RecentViews::updatePartsGeometry() { void RecentViews::updatePartsGeometry() {
@ -242,7 +256,7 @@ void RecentViews::updateText() {
} }
void RecentViews::showMenu() { void RecentViews::showMenu() {
if (_menu) { if (_menu || _data.list.empty()) {
return; return;
} }

View file

@ -70,6 +70,7 @@ private:
void addMenuRowPlaceholder(); void addMenuRowPlaceholder();
void rebuildMenuTail(); void rebuildMenuTail();
void subscribeToMenuUserpicsLoading(not_null<Main::Session*> session); void subscribeToMenuUserpicsLoading(not_null<Main::Session*> session);
void refreshClickHandler();
const not_null<Controller*> _controller; const not_null<Controller*> _controller;
@ -88,6 +89,7 @@ private:
rpl::variable<bool> _shortAnimationPlaying; rpl::variable<bool> _shortAnimationPlaying;
bool _waitingUserpicsCheck = false; bool _waitingUserpicsCheck = false;
rpl::lifetime _waitingForUserpicsLifetime; rpl::lifetime _waitingForUserpicsLifetime;
rpl::lifetime _clickHandlerLifetime;
QRect _outer; QRect _outer;
QPoint _userpicsPosition; QPoint _userpicsPosition;

View file

@ -348,12 +348,18 @@ void GroupCallUserpics::update(
_speakingAnimation.start(); _speakingAnimation.start();
} }
if (!visible) { if (visible) {
recountAndRepaint();
} else {
finishAnimating();
}
}
void GroupCallUserpics::finishAnimating() {
for (auto &userpic : _list) { for (auto &userpic : _list) {
userpic.shownAnimation.stop(); userpic.shownAnimation.stop();
userpic.leftAnimation.stop(); userpic.leftAnimation.stop();
} }
}
recountAndRepaint(); recountAndRepaint();
} }

View file

@ -34,6 +34,7 @@ public:
const std::vector<GroupCallUser> &users, const std::vector<GroupCallUser> &users,
bool visible); bool visible);
void paint(QPainter &p, int x, int y, int size); void paint(QPainter &p, int x, int y, int size);
void finishAnimating();
[[nodiscard]] int maxWidth() const; [[nodiscard]] int maxWidth() const;
[[nodiscard]] rpl::producer<int> widthValue() const; [[nodiscard]] rpl::producer<int> widthValue() const;