mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-02-23 08:46:55 +00:00
Start hiding stories from chats list.
This commit is contained in:
parent
17a5c27658
commit
d0e1ac1238
@ -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) {
|
||||
|
@ -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 {
|
||||
|
@ -94,6 +94,7 @@ struct StoriesList {
|
||||
base::flat_set<StoryId> ids;
|
||||
StoryId readTill = 0;
|
||||
int total = 0;
|
||||
bool hidden = false;
|
||||
|
||||
[[nodiscard]] bool unread() const;
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user