Start hiding stories from chats list.

This commit is contained in:
John Preston 2023-06-02 13:20:27 +04:00
parent 17a5c27658
commit d0e1ac1238
8 changed files with 97 additions and 4 deletions

View File

@ -522,6 +522,7 @@ not_null<UserData*> Session::processUser(const MTPUser &data) {
? Flag::Contact
| Flag::MutualContact
| Flag::DiscardMinPhoto
| Flag::StoriesHidden
: Flag());
const auto flagsSet = (data.is_deleted() ? Flag::Deleted : Flag())
| (data.is_verified() ? Flag::Verified : Flag())
@ -534,6 +535,7 @@ not_null<UserData*> Session::processUser(const MTPUser &data) {
? (data.is_contact() ? Flag::Contact : Flag())
| (data.is_mutual_contact() ? Flag::MutualContact : Flag())
| (data.is_apply_min_photo() ? Flag() : Flag::DiscardMinPhoto)
| (data.is_stories_hidden() ? Flag::StoriesHidden : Flag())
: Flag());
result->setFlags((result->flags() & ~flagsMask) | flagsSet);
if (minimal) {

View File

@ -71,10 +71,10 @@ Story::Story(
not_null<PeerData*> peer,
StoryMedia media,
TimeId date)
: _id(id)
, _peer(peer)
, _media(std::move(media))
, _date(date) {
: _id(id)
, _peer(peer)
, _media(std::move(media))
, _date(date) {
}
Session &Story::owner() const {

View File

@ -94,6 +94,7 @@ struct StoriesList {
base::flat_set<StoryId> ids;
StoryId readTill = 0;
int total = 0;
bool hidden = false;
[[nodiscard]] bool unread() const;

View File

@ -321,6 +321,10 @@ bool UserData::hasPersonalPhoto() const {
return (flags() & UserDataFlag::PersonalPhoto);
}
bool UserData::hasStoriesHidden() const {
return (flags() & UserDataFlag::StoriesHidden);
}
bool UserData::canAddContact() const {
return canShareThisContact() && !isContact();
}

View File

@ -62,6 +62,7 @@ enum class UserDataFlag {
CanReceiveGifts = (1 << 15),
VoiceMessagesForbidden = (1 << 16),
PersonalPhoto = (1 << 17),
StoriesHidden = (1 << 18),
};
inline constexpr bool is_flag_type(UserDataFlag) { return true; };
using UserDataFlags = base::flags<UserDataFlag>;
@ -119,6 +120,7 @@ public:
[[nodiscard]] bool isInaccessible() const;
[[nodiscard]] bool applyMinPhoto() const;
[[nodiscard]] bool hasPersonalPhoto() const;
[[nodiscard]] bool hasStoriesHidden() const;
[[nodiscard]] bool canShareThisContact() const;
[[nodiscard]] bool canAddContact() const;

View File

@ -342,6 +342,27 @@ InnerWidget::InnerWidget(
_controller->openPeerStories(PeerId(int64(id)));
}, lifetime());
_stories->showProfileRequests(
) | rpl::start_with_next([=](uint64 id) {
_controller->showPeerInfo(PeerId(int64(id)));
}, lifetime());
_stories->toggleShown(
) | rpl::start_with_next([=](Stories::ToggleShownRequest request) {
const auto peerId = PeerId(int64(request.id));
const auto user = session().data().peer(peerId)->asUser();
Assert(user != nullptr);
if (user->hasStoriesHidden() == request.shown) {
user->setFlags(request.shown
? (user->flags() & ~UserDataFlag::StoriesHidden)
: (user->flags() | UserDataFlag::StoriesHidden));
session().api().request(MTPcontacts_ToggleStoriesHidden(
user->inputUser,
MTP_bool(!request.shown)
)).send();
}
}, lifetime());
_stories->loadMoreRequests(
) | rpl::start_with_next([=] {
session().data().stories().loadMore();

View File

@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "dialogs/ui/dialogs_stories_list.h"
#include "lang/lang_keys.h"
#include "ui/widgets/popup_menu.h"
#include "ui/painter.h"
#include "styles/style_dialogs.h"
@ -219,6 +220,14 @@ rpl::producer<uint64> List::clicks() const {
return _clicks.events();
}
rpl::producer<uint64> List::showProfileRequests() const {
return _showProfileRequests.events();
}
rpl::producer<ToggleShownRequest> List::toggleShown() const {
return _toggleShown.events();
}
rpl::producer<> List::expandRequests() const {
return _expandRequests.events();
}
@ -685,6 +694,43 @@ void List::mouseReleaseEvent(QMouseEvent *e) {
}
}
void List::contextMenuEvent(QContextMenuEvent *e) {
_menu = nullptr;
if (e->reason() == QContextMenuEvent::Mouse) {
_lastMousePosition = e->globalPos();
updateSelected();
}
if (_selected < 0 || _data.empty()) {
return;
}
auto &item = _data.items[_selected];
_menu = base::make_unique_q<Ui::PopupMenu>(this);
const auto id = item.user.id;
const auto hidden = item.user.hidden;
_menu->addAction(u"View Profile"_q, [=] {
_showProfileRequests.fire_copy(id);
});
_menu->addAction(hidden ? u"Show in Chats"_q : u"Hide"_q, [=] {
_toggleShown.fire({ .id = id, .shown = hidden });
});
QObject::connect(_menu.get(), &QObject::destroyed, [=] {
const auto globalPosition = QCursor::pos();
if (rect().contains(mapFromGlobal(globalPosition))) {
_lastMousePosition = globalPosition;
updateSelected();
}
});
if (_menu->empty()) {
_menu = nullptr;
} else {
_menu->popup(e->globalPos());
e->accept();
}
}
bool List::finishDragging() {
if (!_dragging) {
return false;

View File

@ -12,6 +12,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
class QPainter;
namespace Ui {
class PopupMenu;
} // namespace Ui
namespace Dialogs::Stories {
class Userpic {
@ -25,6 +29,7 @@ struct User {
QString name;
std::shared_ptr<Userpic> userpic;
bool unread = false;
bool hidden = false;
friend inline bool operator==(const User &a, const User &b) = default;
};
@ -37,6 +42,11 @@ struct Content {
const Content &b) = default;
};
struct ToggleShownRequest {
uint64 id = 0;
bool shown = false;
};
class List final : public Ui::RpWidget {
public:
List(
@ -45,6 +55,8 @@ public:
Fn<int()> shownHeight);
[[nodiscard]] rpl::producer<uint64> clicks() const;
[[nodiscard]] rpl::producer<uint64> showProfileRequests() const;
[[nodiscard]] rpl::producer<ToggleShownRequest> toggleShown() const;
[[nodiscard]] rpl::producer<> expandRequests() const;
[[nodiscard]] rpl::producer<> entered() const;
[[nodiscard]] rpl::producer<> loadMoreRequests() const;
@ -103,6 +115,7 @@ private:
void mousePressEvent(QMouseEvent *e) override;
void mouseMoveEvent(QMouseEvent *e) override;
void mouseReleaseEvent(QMouseEvent *e) override;
void contextMenuEvent(QContextMenuEvent *e) override;
void validateUserpic(not_null<Item*> item);
void validateName(not_null<Item*> item);
@ -128,6 +141,8 @@ private:
Data _hidingData;
Fn<int()> _shownHeight = 0;
rpl::event_stream<uint64> _clicks;
rpl::event_stream<uint64> _showProfileRequests;
rpl::event_stream<ToggleShownRequest> _toggleShown;
rpl::event_stream<> _expandRequests;
rpl::event_stream<> _entered;
rpl::event_stream<> _loadMoreRequests;
@ -144,6 +159,8 @@ private:
int _selected = -1;
int _pressed = -1;
base::unique_qptr<Ui::PopupMenu> _menu;
};
} // namespace Dialogs::Stories