mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-06-05 06:33:57 +02:00
Start hiding stories from chats list.
This commit is contained in:
parent
17a5c27658
commit
d0e1ac1238
8 changed files with 97 additions and 4 deletions
|
@ -522,6 +522,7 @@ not_null<UserData*> Session::processUser(const MTPUser &data) {
|
||||||
? Flag::Contact
|
? Flag::Contact
|
||||||
| Flag::MutualContact
|
| Flag::MutualContact
|
||||||
| Flag::DiscardMinPhoto
|
| Flag::DiscardMinPhoto
|
||||||
|
| Flag::StoriesHidden
|
||||||
: Flag());
|
: Flag());
|
||||||
const auto flagsSet = (data.is_deleted() ? Flag::Deleted : Flag())
|
const auto flagsSet = (data.is_deleted() ? Flag::Deleted : Flag())
|
||||||
| (data.is_verified() ? Flag::Verified : 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_contact() ? Flag::Contact : Flag())
|
||||||
| (data.is_mutual_contact() ? Flag::MutualContact : Flag())
|
| (data.is_mutual_contact() ? Flag::MutualContact : Flag())
|
||||||
| (data.is_apply_min_photo() ? Flag() : Flag::DiscardMinPhoto)
|
| (data.is_apply_min_photo() ? Flag() : Flag::DiscardMinPhoto)
|
||||||
|
| (data.is_stories_hidden() ? Flag::StoriesHidden : Flag())
|
||||||
: Flag());
|
: Flag());
|
||||||
result->setFlags((result->flags() & ~flagsMask) | flagsSet);
|
result->setFlags((result->flags() & ~flagsMask) | flagsSet);
|
||||||
if (minimal) {
|
if (minimal) {
|
||||||
|
|
|
@ -71,10 +71,10 @@ Story::Story(
|
||||||
not_null<PeerData*> peer,
|
not_null<PeerData*> peer,
|
||||||
StoryMedia media,
|
StoryMedia media,
|
||||||
TimeId date)
|
TimeId date)
|
||||||
: _id(id)
|
: _id(id)
|
||||||
, _peer(peer)
|
, _peer(peer)
|
||||||
, _media(std::move(media))
|
, _media(std::move(media))
|
||||||
, _date(date) {
|
, _date(date) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Session &Story::owner() const {
|
Session &Story::owner() const {
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct StoriesList {
|
||||||
base::flat_set<StoryId> ids;
|
base::flat_set<StoryId> ids;
|
||||||
StoryId readTill = 0;
|
StoryId readTill = 0;
|
||||||
int total = 0;
|
int total = 0;
|
||||||
|
bool hidden = false;
|
||||||
|
|
||||||
[[nodiscard]] bool unread() const;
|
[[nodiscard]] bool unread() const;
|
||||||
|
|
||||||
|
|
|
@ -321,6 +321,10 @@ bool UserData::hasPersonalPhoto() const {
|
||||||
return (flags() & UserDataFlag::PersonalPhoto);
|
return (flags() & UserDataFlag::PersonalPhoto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool UserData::hasStoriesHidden() const {
|
||||||
|
return (flags() & UserDataFlag::StoriesHidden);
|
||||||
|
}
|
||||||
|
|
||||||
bool UserData::canAddContact() const {
|
bool UserData::canAddContact() const {
|
||||||
return canShareThisContact() && !isContact();
|
return canShareThisContact() && !isContact();
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,7 @@ enum class UserDataFlag {
|
||||||
CanReceiveGifts = (1 << 15),
|
CanReceiveGifts = (1 << 15),
|
||||||
VoiceMessagesForbidden = (1 << 16),
|
VoiceMessagesForbidden = (1 << 16),
|
||||||
PersonalPhoto = (1 << 17),
|
PersonalPhoto = (1 << 17),
|
||||||
|
StoriesHidden = (1 << 18),
|
||||||
};
|
};
|
||||||
inline constexpr bool is_flag_type(UserDataFlag) { return true; };
|
inline constexpr bool is_flag_type(UserDataFlag) { return true; };
|
||||||
using UserDataFlags = base::flags<UserDataFlag>;
|
using UserDataFlags = base::flags<UserDataFlag>;
|
||||||
|
@ -119,6 +120,7 @@ public:
|
||||||
[[nodiscard]] bool isInaccessible() const;
|
[[nodiscard]] bool isInaccessible() const;
|
||||||
[[nodiscard]] bool applyMinPhoto() const;
|
[[nodiscard]] bool applyMinPhoto() const;
|
||||||
[[nodiscard]] bool hasPersonalPhoto() const;
|
[[nodiscard]] bool hasPersonalPhoto() const;
|
||||||
|
[[nodiscard]] bool hasStoriesHidden() const;
|
||||||
|
|
||||||
[[nodiscard]] bool canShareThisContact() const;
|
[[nodiscard]] bool canShareThisContact() const;
|
||||||
[[nodiscard]] bool canAddContact() const;
|
[[nodiscard]] bool canAddContact() const;
|
||||||
|
|
|
@ -342,6 +342,27 @@ InnerWidget::InnerWidget(
|
||||||
_controller->openPeerStories(PeerId(int64(id)));
|
_controller->openPeerStories(PeerId(int64(id)));
|
||||||
}, lifetime());
|
}, 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(
|
_stories->loadMoreRequests(
|
||||||
) | rpl::start_with_next([=] {
|
) | rpl::start_with_next([=] {
|
||||||
session().data().stories().loadMore();
|
session().data().stories().loadMore();
|
||||||
|
|
|
@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "dialogs/ui/dialogs_stories_list.h"
|
#include "dialogs/ui/dialogs_stories_list.h"
|
||||||
|
|
||||||
#include "lang/lang_keys.h"
|
#include "lang/lang_keys.h"
|
||||||
|
#include "ui/widgets/popup_menu.h"
|
||||||
#include "ui/painter.h"
|
#include "ui/painter.h"
|
||||||
#include "styles/style_dialogs.h"
|
#include "styles/style_dialogs.h"
|
||||||
|
|
||||||
|
@ -219,6 +220,14 @@ rpl::producer<uint64> List::clicks() const {
|
||||||
return _clicks.events();
|
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 {
|
rpl::producer<> List::expandRequests() const {
|
||||||
return _expandRequests.events();
|
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() {
|
bool List::finishDragging() {
|
||||||
if (!_dragging) {
|
if (!_dragging) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -12,6 +12,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
|
|
||||||
class QPainter;
|
class QPainter;
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class PopupMenu;
|
||||||
|
} // namespace Ui
|
||||||
|
|
||||||
namespace Dialogs::Stories {
|
namespace Dialogs::Stories {
|
||||||
|
|
||||||
class Userpic {
|
class Userpic {
|
||||||
|
@ -25,6 +29,7 @@ struct User {
|
||||||
QString name;
|
QString name;
|
||||||
std::shared_ptr<Userpic> userpic;
|
std::shared_ptr<Userpic> userpic;
|
||||||
bool unread = false;
|
bool unread = false;
|
||||||
|
bool hidden = false;
|
||||||
|
|
||||||
friend inline bool operator==(const User &a, const User &b) = default;
|
friend inline bool operator==(const User &a, const User &b) = default;
|
||||||
};
|
};
|
||||||
|
@ -37,6 +42,11 @@ struct Content {
|
||||||
const Content &b) = default;
|
const Content &b) = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ToggleShownRequest {
|
||||||
|
uint64 id = 0;
|
||||||
|
bool shown = false;
|
||||||
|
};
|
||||||
|
|
||||||
class List final : public Ui::RpWidget {
|
class List final : public Ui::RpWidget {
|
||||||
public:
|
public:
|
||||||
List(
|
List(
|
||||||
|
@ -45,6 +55,8 @@ public:
|
||||||
Fn<int()> shownHeight);
|
Fn<int()> shownHeight);
|
||||||
|
|
||||||
[[nodiscard]] rpl::producer<uint64> clicks() const;
|
[[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<> expandRequests() const;
|
||||||
[[nodiscard]] rpl::producer<> entered() const;
|
[[nodiscard]] rpl::producer<> entered() const;
|
||||||
[[nodiscard]] rpl::producer<> loadMoreRequests() const;
|
[[nodiscard]] rpl::producer<> loadMoreRequests() const;
|
||||||
|
@ -103,6 +115,7 @@ private:
|
||||||
void mousePressEvent(QMouseEvent *e) override;
|
void mousePressEvent(QMouseEvent *e) override;
|
||||||
void mouseMoveEvent(QMouseEvent *e) override;
|
void mouseMoveEvent(QMouseEvent *e) override;
|
||||||
void mouseReleaseEvent(QMouseEvent *e) override;
|
void mouseReleaseEvent(QMouseEvent *e) override;
|
||||||
|
void contextMenuEvent(QContextMenuEvent *e) override;
|
||||||
|
|
||||||
void validateUserpic(not_null<Item*> item);
|
void validateUserpic(not_null<Item*> item);
|
||||||
void validateName(not_null<Item*> item);
|
void validateName(not_null<Item*> item);
|
||||||
|
@ -128,6 +141,8 @@ private:
|
||||||
Data _hidingData;
|
Data _hidingData;
|
||||||
Fn<int()> _shownHeight = 0;
|
Fn<int()> _shownHeight = 0;
|
||||||
rpl::event_stream<uint64> _clicks;
|
rpl::event_stream<uint64> _clicks;
|
||||||
|
rpl::event_stream<uint64> _showProfileRequests;
|
||||||
|
rpl::event_stream<ToggleShownRequest> _toggleShown;
|
||||||
rpl::event_stream<> _expandRequests;
|
rpl::event_stream<> _expandRequests;
|
||||||
rpl::event_stream<> _entered;
|
rpl::event_stream<> _entered;
|
||||||
rpl::event_stream<> _loadMoreRequests;
|
rpl::event_stream<> _loadMoreRequests;
|
||||||
|
@ -144,6 +159,8 @@ private:
|
||||||
int _selected = -1;
|
int _selected = -1;
|
||||||
int _pressed = -1;
|
int _pressed = -1;
|
||||||
|
|
||||||
|
base::unique_qptr<Ui::PopupMenu> _menu;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Dialogs::Stories
|
} // namespace Dialogs::Stories
|
||||||
|
|
Loading…
Add table
Reference in a new issue