From 6c960243a922bcb4289937f8b9e4c4d3228e49be Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 30 Jun 2023 12:48:42 +0400 Subject: [PATCH] Improve story source context menus. --- .../Resources/icons/menu/stories_archive.png | Bin 0 -> 1847 bytes .../icons/menu/stories_archive@2x.png | Bin 0 -> 2395 bytes .../icons/menu/stories_archive@3x.png | Bin 0 -> 2952 bytes .../Resources/icons/menu/stories_saved.png | Bin 0 -> 1935 bytes .../Resources/icons/menu/stories_saved@2x.png | Bin 0 -> 2521 bytes .../Resources/icons/menu/stories_saved@3x.png | Bin 0 -> 3136 bytes Telegram/Resources/langs/lang.strings | 8 +-- .../boxes/peer_list_controllers.cpp | 22 +++---- Telegram/SourceFiles/data/data_stories.cpp | 3 +- Telegram/SourceFiles/data/data_stories.h | 1 - .../dialogs/dialogs_inner_widget.cpp | 14 +---- .../dialogs/ui/dialogs_stories_content.cpp | 59 ++++++++++++++++-- .../dialogs/ui/dialogs_stories_content.h | 9 +++ .../dialogs/ui/dialogs_stories_list.cpp | 48 +++++--------- .../dialogs/ui/dialogs_stories_list.h | 15 ++--- Telegram/SourceFiles/ui/menu_icons.style | 2 + 16 files changed, 99 insertions(+), 82 deletions(-) create mode 100644 Telegram/Resources/icons/menu/stories_archive.png create mode 100644 Telegram/Resources/icons/menu/stories_archive@2x.png create mode 100644 Telegram/Resources/icons/menu/stories_archive@3x.png create mode 100644 Telegram/Resources/icons/menu/stories_saved.png create mode 100644 Telegram/Resources/icons/menu/stories_saved@2x.png create mode 100644 Telegram/Resources/icons/menu/stories_saved@3x.png diff --git a/Telegram/Resources/icons/menu/stories_archive.png b/Telegram/Resources/icons/menu/stories_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..d86b5dc87df7c9354b102987cacf282e43efe99b GIT binary patch literal 1847 zcmbVNZEVzJ9Pf<{2V@R{FchPuB#Vdi?Rq!v8cue*-q^^BxLe@(BJ0|2*W6uO+TPoS zun`cKL13C8*_@~(V1R(a7hnvQK%$XNKt%W;L0%$akco^T6NXQ3w+k4QNRzft+u!s1 z{omWXXyN?4@h^>sASkcAjHv|oY37-m1+L1JoqNG;oLaV2hoA|Q&C>$4e*_TOH>Ik8 z5nwB5UWs6wpwx(1BBBB`1kIh7P&qy%8gPwRC&_N4zw0OhOM)9&;$R6@^@>5MtX>oS z^$V-``Vj9Dka=&wa}zWmh=>LUCn8~4rxR`@#Y=;=`5H&y6vPO*5sxVd2iQfhSJ6b+ zg^?&v5F|Xug>g>7KF2}LhHZq6!U+nuQ7GZ09Yr)X2TmUdkkf=(x{@hPi-9LM5;P2z z#_@POj>RcV(duy0<#OSK4Y%1)fI#)6Y;Xxw)@P0~FrvUJZ%nO0Fi(yygwj=%_Q zJSYOv|48=;Ojl}+IH!r8IuNa=mJ<$)$IU(*@dN*-i>Ysq^z0}c3<7hR8A0G7GsHw0 zOfC(Ks5KQN13{Mla>i5ToWxg8t8ZMp))xqDX>M+=crY|Hl(|&Rx4c*aTmKoz5+tot>Y}&a%EE|9D{e(166U>>m`G{rjz3 zmMc>N>vu2RUszZ;HbAuc*Y`BFww@liex_+N$lb=?)f>L?{nluK#$C!M-pXYi=C7^X Lw~*OWQoZ_bTX&P* literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stories_archive@2x.png b/Telegram/Resources/icons/menu/stories_archive@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c59be33802eaa0d1781a5f0b985d2794cc3840 GIT binary patch literal 2395 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 HZcY0S{h81^ literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stories_saved.png b/Telegram/Resources/icons/menu/stories_saved.png new file mode 100644 index 0000000000000000000000000000000000000000..727dc35f301f8aa11736e35bbed1c896f5cb5f02 GIT binary patch literal 1935 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 literal 0 HcmV?d00001 diff --git a/Telegram/Resources/icons/menu/stories_saved@3x.png b/Telegram/Resources/icons/menu/stories_saved@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc3db0d68c9d57901062163af4889d99e93d545 GIT binary patch literal 3136 zcmbVO2~-o;8V+DU5y2`_5YQMvWXVES2n3!53K3b$5hq{#pQ1S{AEMG$2d zl%-{J305oM!;QKHrR=3FBBw4?iCJs`0HLA)E?-1PPc&Ucqxc*;I)veU^{ToF3uA`VZ)5r`PPJ&jDE5vi!f3k|E2aH44eZl5kH zgWu?A9t4SLI9z;uJT{()1tnaZor8k|4o|=l2pAZFktT>BmJB13nthPq21wZwz8K4OJYUR#W=wc!^v1;oE;Xg@@WCcVK3ptv67etieX;a$j!ca_ikl3(q54 zcYlOLYKzJ}S02bW+~;mlA6fr%Fw6L2IClEV%sAWrUg_P-zeG$VJEy#qm)T249Jy_+ zRH>qyO-@Zs&CKZO=;-L`Mx2do*4I1_jdnFQHg4Sro0*9zyUa(Ss!!qL*w()|4T zz3=8t9pjcEk^TMs2W**4=G3cK2O*b~IYU!Zp-80AFh6}PJG-O1+ibG-)TyyMc{b@( zwhp^xe5eV&G8;BKI))1ZDHO_2b-O;E?Hm|bziu5_I}`sl=-4s3JZ64wwoLh`{l`-wv%*bpj+85vo)@30sj0cU zyYo0=o5{&Z6I0W5QG@5Xdb2Obe!{h7Y8qMEOixcsF2-%!cChA%T87r`ko0G5#~o8I z1#deVSwEsd-1@1nfkf)hv!Qiq<(hGLOOz5f^fFB z=H~6CE*^VtMxCmuL2T;zrK-Zq(xt;s8C0#N=J#_5bfbcz<)mritrdwxA_JQYFk$8) zZwDK|RNC{^$qp%V_Td@VoHR5vE@*0Ic>yO}hYSl*@G@6RZOdCY+P%7Y#l^;FlE?2k ztlPIDr*vc_nqupp;IL&)SZqfb?DgFaJ42oCo+@@W^&mHM>W>{;Z!nmqrN==!sW&MU zJ{@_@GY=m=-RB&6YjiY06Pxg$ZMj=W| zZ-a@63CE}mX6ucMEBP%opSn@ya`~*N)-6(9$TdQRF-%7GzdCc~O#f(MV8g+T4E`Lc z|61#OQKs3<(XWjuG1=#qWrft|^x)XI*)KXFH*LIfpN7_QnCgZ4d8ICU1L(O=gHuwR zk(V_sLM;5 zecD_5SvAjs%l(C+UN3tQb<#cc-sPl_*Ed|~^qrnyXJ@CAPT}D;@8vp=k1&f-@Bt)X za+3`fi|sQt(iZ%rsGQa{rF}!gpEZiBI22*n;<{3iE-M?fr9Y`e6jOv@!NCSeez1)Z z4Wi?5PK8ybOeQ9>57)8LASgMRK5RNt&|U4@J(<4!;?rGMQ`SNLYrecHOH4#3A6QeC znVG4pv27AXr53!o_BjNTurUy>>&T6zaF@w#yghU2S8!KHSJx+PEy>TEr6aA(iLs%f zp>4NXzJMm~)BBozePl7@yGo@W;U1@2p+*ly7Kh~I++WHrt3l$&$R6a4o=23ldMUL?bUTV@wChO zD(WGA4R_uHRlJIwpg^FZaZ;hcVlbxUjrNX?8CYRdR7F@pFjCe44o5SdG9Ns9M&DgP z#^ayAo)+vN&X3C`Z!|Y=va+hJug_0ZXB!FpYTK!UCOrvoqf4*xD!`V@K^{-`Zax{- n84+>62N4PXfo_<;bDUk7e>?K5%S9`>>Wt5D_i PrepareContactsBox( &sessionController->session()); const auto raw = controller.get(); auto init = [=](not_null box) { - using namespace Dialogs; + using namespace Dialogs::Stories; struct State { - Stories::List *stories = nullptr; + List *stories = nullptr; QPointer<::Ui::IconButton> toggleSort; Mode mode = ContactsBoxController::SortMode::Online; ::Ui::Animations::Simple scrollAnimation; @@ -82,10 +82,10 @@ object_ptr PrepareContactsBox( }); raw->setSortMode(Mode::Online); - auto list = object_ptr( + auto list = object_ptr( box, st::dialogsStoriesList, - Stories::ContentForSession( + ContentForSession( &sessionController->session(), Data::StorySourcesList::Hidden), [=] { return state->stories->height() - box->scrollTop(); }); @@ -102,17 +102,9 @@ object_ptr PrepareContactsBox( Data::StorySourcesList::Hidden); }, raw->lifetime()); - raw->showProfileRequests( - ) | rpl::start_with_next([=](uint64 id) { - sessionController->showPeerInfo(PeerId(int64(id))); - }, raw->lifetime()); - - raw->toggleShown( - ) | rpl::start_with_next([=](Stories::ToggleShownRequest request) { - stories->toggleHidden( - PeerId(int64(request.id)), - !request.shown, - sessionController->uiShow()); + raw->showMenuRequests( + ) | rpl::start_with_next([=](const ShowMenuRequest &request) { + FillSourceMenu(sessionController, request); }, raw->lifetime()); raw->loadMoreRequests( diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index 15710d021..61c41ffa3 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -76,7 +76,6 @@ StoriesSourceInfo StoriesSource::info() const { .last = ids.empty() ? 0 : ids.back().date, .unread = unread(), .premium = user->isPremium(), - .hidden = hidden, }; } @@ -943,7 +942,7 @@ void Stories::toggleHidden( tr::now, lt_user, Ui::Text::Bold(name), - Ui::Text::WithEntities)); + Ui::Text::RichLangValue)); } }); diff --git a/Telegram/SourceFiles/data/data_stories.h b/Telegram/SourceFiles/data/data_stories.h index 648535187..630e8cc31 100644 --- a/Telegram/SourceFiles/data/data_stories.h +++ b/Telegram/SourceFiles/data/data_stories.h @@ -43,7 +43,6 @@ struct StoriesSourceInfo { TimeId last = 0; bool unread = false; bool premium = false; - bool hidden = false; friend inline bool operator==( StoriesSourceInfo, diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 35a19da9a..091ebaf16 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -347,17 +347,9 @@ InnerWidget::InnerWidget( Data::StorySourcesList::NotHidden); }, lifetime()); - _stories->showProfileRequests( - ) | rpl::start_with_next([=](uint64 id) { - _controller->showPeerInfo(PeerId(int64(id))); - }, lifetime()); - - _stories->toggleShown( - ) | rpl::start_with_next([=](Stories::ToggleShownRequest request) { - session().data().stories().toggleHidden( - PeerId(int64(request.id)), - !request.shown, - _controller->uiShow()); + _stories->showMenuRequests( + ) | rpl::start_with_next([=](const Stories::ShowMenuRequest &request) { + FillSourceMenu(_controller, request); }, lifetime()); _stories->loadMoreRequests( diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp index e686811aa..253b789ce 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.cpp @@ -17,9 +17,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_stories.h" #include "data/data_user.h" #include "dialogs/ui/dialogs_stories_list.h" +#include "info/stories/info_stories_widget.h" +#include "info/info_controller.h" +#include "info/info_memento.h" #include "main/main_session.h" #include "lang/lang_keys.h" #include "ui/painter.h" +#include "window/window_session_controller.h" +#include "styles/style_menu_icons.h" namespace Dialogs::Stories { namespace { @@ -325,9 +330,7 @@ State::State(not_null data, Data::StorySourcesList list) } Content State::next() { - auto result = Content{ - .hidden = (_list == Data::StorySourcesList::Hidden) - }; + auto result = Content(); const auto &sources = _data->sources(_list); result.elements.reserve(sources.size()); for (const auto &info : sources) { @@ -349,9 +352,6 @@ Content State::next() { : user->shortName()), .thumbnail = std::move(userpic), .unread = info.unread, - .suggestHide = !info.hidden, - .suggestUnhide = info.hidden, - .profile = true, .skipSmall = user->isSelf(), }); } @@ -466,4 +466,51 @@ std::shared_ptr MakeStoryThumbnail( }); } +void FillSourceMenu( + not_null controller, + const ShowMenuRequest &request) { + const auto owner = &controller->session().data(); + const auto peer = owner->peer(PeerId(request.id)); + const auto &add = request.callback; + if (peer->isSelf()) { + add(tr::lng_stories_archive_button(tr::now), [=] { + controller->showSection(Info::Stories::Make( + peer, + Info::Stories::Tab::Archive)); + }, &st::menuIconStoriesArchive); + add(tr::lng_stories_my_title(tr::now), [=] { + controller->showSection(Info::Stories::Make(peer)); + }, &st::menuIconStoriesSaved); + } else { + add(tr::lng_profile_send_message(tr::now), [=] { + controller->showPeerHistory(peer); + }, &st::menuIconChatBubble); + add(tr::lng_context_view_profile(tr::now), [=] { + controller->showPeerInfo(peer); + }, &st::menuIconProfile); + const auto in = [&](Data::StorySourcesList list) { + return ranges::contains( + owner->stories().sources(list), + peer->id, + &Data::StoriesSourceInfo::id); + }; + const auto toggle = [=](bool shown) { + owner->stories().toggleHidden( + peer->id, + !shown, + controller->uiShow()); + }; + if (in(Data::StorySourcesList::NotHidden)) { + add(tr::lng_stories_hide_to_contacts(tr::now), [=] { + toggle(false); + }, &st::menuIconCancel); + } + if (in(Data::StorySourcesList::Hidden)) { + add(tr::lng_stories_show_in_chats(tr::now), [=] { + toggle(true); + }, &st::menuIconAddToFolder); + } + } +} + } // namespace Dialogs::Stories diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.h b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.h index bdbb3afea..b42715d54 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_content.h @@ -16,10 +16,15 @@ namespace Main { class Session; } // namespace Main +namespace Window { +class SessionController; +} // namespace Window + namespace Dialogs::Stories { struct Content; class Thumbnail; +struct ShowMenuRequest; [[nodiscard]] rpl::producer ContentForSession( not_null session, @@ -32,4 +37,8 @@ class Thumbnail; [[nodiscard]] std::shared_ptr MakeStoryThumbnail( not_null story); +void FillSourceMenu( + not_null controller, + const ShowMenuRequest &request); + } // namespace Dialogs::Stories diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index a76cb5deb..b94ef43b1 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -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/menu/menu_add_action_callback_factory.h" #include "ui/widgets/popup_menu.h" #include "ui/painter.h" #include "styles/style_dialogs.h" @@ -108,9 +109,6 @@ void List::showContent(Content &&content) { item.nameCache = QImage(); } item.element.unread = element.unread; - item.element.suggestHide = element.suggestHide; - item.element.suggestUnhide = element.suggestUnhide; - item.element.profile = element.profile; } else { _data.items.emplace_back(Item{ .element = element }); } @@ -237,12 +235,8 @@ rpl::producer List::clicks() const { return _clicks.events(); } -rpl::producer List::showProfileRequests() const { - return _showProfileRequests.events(); -} - -rpl::producer List::toggleShown() const { - return _toggleShown.events(); +rpl::producer List::showMenuRequests() const { + return _showMenuRequests.events(); } rpl::producer List::toggleExpandedRequests() const { @@ -852,24 +846,16 @@ void List::contextMenuEvent(QContextMenuEvent *e) { if (_selected < 0 || _data.empty()) { return; } - - auto &item = _data.items[_selected]; - _menu = base::make_unique_q(this); - - const auto id = item.element.id; - if (item.element.profile) { - _menu->addAction(tr::lng_context_view_profile(tr::now), [=] { - _showProfileRequests.fire_copy(id); - }); - } - if (item.element.suggestHide) { - _menu->addAction( - tr::lng_stories_hide_to_contacts(tr::now), - [=] { _toggleShown.fire({ .id = id, .shown = false }); }); - } else if (item.element.suggestUnhide) { - _menu->addAction( - tr::lng_stories_show_in_chats(tr::now), - [=] { _toggleShown.fire({ .id = id, .shown = true }); }); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); + _showMenuRequests.fire({ + _data.items[_selected].element.id, + Ui::Menu::CreateAddActionCallback(_menu), + }); + if (_menu->empty()) { + _menu = nullptr; + return; } const auto updateAfterMenuDestroyed = [=] { const auto globalPosition = QCursor::pos(); @@ -882,12 +868,8 @@ void List::contextMenuEvent(QContextMenuEvent *e) { _menu.get(), &QObject::destroyed, crl::guard(&_menuGuard, updateAfterMenuDestroyed)); - if (_menu->empty()) { - _menu = nullptr; - } else { - _menu->popup(e->globalPos()); - e->accept(); - } + _menu->popup(e->globalPos()); + e->accept(); } bool List::finishDragging() { diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h index e1bebe00f..49391432c 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/qt/qt_compare.h" #include "base/timer.h" #include "base/weak_ptr.h" +#include "ui/widgets/menu/menu_add_action_callback.h" #include "ui/rp_widget.h" class QPainter; @@ -36,9 +37,6 @@ struct Element { QString name; std::shared_ptr thumbnail; bool unread : 1 = false; - bool suggestHide : 1 = false; - bool suggestUnhide : 1 = false; - bool profile : 1 = false; bool skipSmall : 1 = false; friend inline bool operator==( @@ -48,16 +46,15 @@ struct Element { struct Content { std::vector elements; - bool hidden = false; friend inline bool operator==( const Content &a, const Content &b) = default; }; -struct ToggleShownRequest { +struct ShowMenuRequest { uint64 id = 0; - bool shown = false; + Ui::Menu::MenuCallback callback; }; class List final : public Ui::RpWidget { @@ -72,8 +69,7 @@ public: void setTouchScrollActive(bool active); [[nodiscard]] rpl::producer clicks() const; - [[nodiscard]] rpl::producer showProfileRequests() const; - [[nodiscard]] rpl::producer toggleShown() const; + [[nodiscard]] rpl::producer showMenuRequests() const; [[nodiscard]] rpl::producer toggleExpandedRequests() const; [[nodiscard]] rpl::producer<> entered() const; [[nodiscard]] rpl::producer<> loadMoreRequests() const; @@ -169,8 +165,7 @@ private: Data _hidingData; Fn _shownHeight = 0; rpl::event_stream _clicks; - rpl::event_stream _showProfileRequests; - rpl::event_stream _toggleShown; + rpl::event_stream _showMenuRequests; rpl::event_stream _toggleExpandedRequests; rpl::event_stream<> _entered; rpl::event_stream<> _loadMoreRequests; diff --git a/Telegram/SourceFiles/ui/menu_icons.style b/Telegram/SourceFiles/ui/menu_icons.style index 7be43b08f..922cbaab8 100644 --- a/Telegram/SourceFiles/ui/menu_icons.style +++ b/Telegram/SourceFiles/ui/menu_icons.style @@ -104,6 +104,8 @@ menuIconNewWindow: icon {{ "menu/new_window", menuIconColor }}; menuIconChatBubble: icon {{ "menu/chat_bubble", menuIconColor }}; menuIconPhone: icon {{ "menu/phone", menuIconColor }}; menuIconChannel: icon {{ "menu/channel", menuIconColor }}; +menuIconStoriesSaved: icon {{ "menu/stories_saved", menuIconColor }}; +menuIconStoriesArchive: icon {{ "menu/stories_archive", menuIconColor }}; menuIconTTLAny: icon {{ "menu/auto_delete_plain", menuIconColor }}; menuIconTTLAnyTextPosition: point(11px, 22px);