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,15 +313,17 @@ 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 (const auto info = data.vviews()) { if (!data.is_min()) {
views = info->data().vviews_count().v; if (const auto info = data.vviews()) {
if (const auto list = info->data().vrecent_viewers()) { views = info->data().vviews_count().v;
recent.reserve(list->v.size()); if (const auto list = info->data().vrecent_viewers()) {
auto &owner = _peer->owner(); recent.reserve(list->v.size());
for (const auto &id : list->v) { auto &owner = _peer->owner();
recent.push_back(owner.peer(peerFromUser(id))); for (const auto &id : list->v) {
recent.push_back(owner.peer(peerFromUser(id)));
}
} }
} }
} }
@ -331,7 +333,7 @@ bool Story::applyChanges(StoryMedia media, const MTPDstoryItem &data) {
|| (_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);
_views = views; if (views >= 0) {
_views = views;
}
_recentViewers = std::move(recent); _recentViewers = std::move(recent);
return true; return true;
} }

View file

@ -150,15 +150,41 @@ 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() {
_userpicsLifetime = ContentByUsers( _userpicsLifetime = ContentByUsers(
_data.list _data.list
) | rpl::start_with_next([=]( ) | rpl::start_with_next([=](
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,11 +348,17 @@ void GroupCallUserpics::update(
_speakingAnimation.start(); _speakingAnimation.start();
} }
if (!visible) { if (visible) {
for (auto &userpic : _list) { recountAndRepaint();
userpic.shownAnimation.stop(); } else {
userpic.leftAnimation.stop(); finishAnimating();
} }
}
void GroupCallUserpics::finishAnimating() {
for (auto &userpic : _list) {
userpic.shownAnimation.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;