From ef9f7ab27ad398c10336c60678cc6cfb7b056977 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 30 Jan 2025 12:32:22 +0300 Subject: [PATCH] Moved process of separated window for shared media to correspond file. --- Telegram/CMakeLists.txt | 1 + .../info/media/info_media_buttons.cpp | 87 +++++++++++++++ .../info/media/info_media_buttons.h | 19 +++- .../info/media/info_media_inner_widget.cpp | 3 +- .../profile/info_profile_inner_widget.cpp | 103 +----------------- .../info/saved/info_saved_sublists_widget.cpp | 3 +- 6 files changed, 109 insertions(+), 107 deletions(-) create mode 100644 Telegram/SourceFiles/info/media/info_media_buttons.cpp diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index b2298db22..47081bf7a 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -959,6 +959,7 @@ PRIVATE info/global_media/info_global_media_inner_widget.h info/global_media/info_global_media_provider.cpp info/global_media/info_global_media_provider.h + info/media/info_media_buttons.cpp info/media/info_media_buttons.h info/media/info_media_common.cpp info/media/info_media_common.h diff --git a/Telegram/SourceFiles/info/media/info_media_buttons.cpp b/Telegram/SourceFiles/info/media/info_media_buttons.cpp new file mode 100644 index 000000000..92dd44e16 --- /dev/null +++ b/Telegram/SourceFiles/info/media/info_media_buttons.cpp @@ -0,0 +1,87 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "info/media/info_media_buttons.h" + + +#include "base/call_delayed.h" +#include "ui/widgets/popup_menu.h" +#include "window/window_separate_id.h" +#include "styles/style_menu_icons.h" + +namespace Info { +namespace Media { +namespace { + +Window::SeparateSharedMediaType ToSeparateType( + Storage::SharedMediaType type) { + using Type = Storage::SharedMediaType; + using SeparatedType = Window::SeparateSharedMediaType; + return (type == Type::Photo) + ? SeparatedType::Photos + : (type == Type::Video) + ? SeparatedType::Videos + : (type == Type::File) + ? SeparatedType::Files + : (type == Type::MusicFile) + ? SeparatedType::Audio + : (type == Type::Link) + ? SeparatedType::Links + : (type == Type::RoundVoiceFile) + ? SeparatedType::Voices + : (type == Type::GIF) + ? SeparatedType::GIF + : SeparatedType::None; +} + +} // namespace + +Fn SeparateWindowFactory( + not_null controller, + not_null peer, + MsgId topicRootId, + Storage::SharedMediaType type) { + const auto separateType = ToSeparateType(type); + if (separateType == Window::SeparateSharedMediaType::None) { + return nullptr; + } + return [=] { + controller->showInNewWindow({ + Window::SeparateSharedMedia(separateType, peer, topicRootId), + }); + }; +} + +void AddContextMenuToButton( + not_null button, + Fn openInWindow) { + if (!openInWindow) { + return; + } + button->setAcceptBoth(); + struct State final { + base::unique_qptr menu; + }; + const auto state = button->lifetime().make_state(); + button->addClickHandler([=](Qt::MouseButton mouse) { + if (mouse != Qt::RightButton) { + return; + } + state->menu = base::make_unique_q( + button.get(), + st::popupMenuWithIcons); + state->menu->addAction(tr::lng_context_new_window(tr::now), [=] { + base::call_delayed( + st::popupMenuWithIcons.showDuration, + crl::guard(button, openInWindow)); + }, &st::menuIconNewWindow); + state->menu->popup(QCursor::pos()); + }); +} + +} // namespace Media +} // namespace Info diff --git a/Telegram/SourceFiles/info/media/info_media_buttons.h b/Telegram/SourceFiles/info/media/info_media_buttons.h index 7d894be0b..7023868d6 100644 --- a/Telegram/SourceFiles/info/media/info_media_buttons.h +++ b/Telegram/SourceFiles/info/media/info_media_buttons.h @@ -84,6 +84,16 @@ inline auto AddCountedButton( return button; }; +Fn SeparateWindowFactory( + not_null controller, + not_null peer, + MsgId topicRootId, + Type type); + +void AddContextMenuToButton( + not_null button, + Fn openInWindow); + inline auto AddButton( Ui::VerticalLayout *parent, not_null navigation, @@ -91,13 +101,18 @@ inline auto AddButton( MsgId topicRootId, PeerData *migrated, Type type, - Ui::MultiSlideTracker &tracker, - Fn openInWindow) { + Ui::MultiSlideTracker &tracker) { auto result = AddCountedButton( parent, Profile::SharedMediaCountValue(peer, topicRootId, migrated, type), MediaText(type), tracker)->entity(); + const auto openInWindow = SeparateWindowFactory( + navigation->parentController(), + peer, + topicRootId, + type); + AddContextMenuToButton(result, openInWindow); result->addClickHandler([=](Qt::MouseButton mouse) { if (mouse == Qt::RightButton) { return; diff --git a/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp b/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp index f0afc716d..eed93256b 100644 --- a/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp @@ -92,8 +92,7 @@ void InnerWidget::createTypeButtons() { topicRootId, migrated, buttonType, - tracker, - nullptr); + tracker); object_ptr( result, icon, diff --git a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp index b4eefed8c..3171fa194 100644 --- a/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp +++ b/Telegram/SourceFiles/info/profile/info_profile_inner_widget.cpp @@ -7,119 +7,29 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #include "info/profile/info_profile_inner_widget.h" -#include "base/call_delayed.h" -#include "info/info_memento.h" -#include "info/info_controller.h" #include "info/profile/info_profile_widget.h" -#include "info/profile/info_profile_text.h" -#include "info/profile/info_profile_values.h" #include "info/profile/info_profile_cover.h" #include "info/profile/info_profile_icon.h" #include "info/profile/info_profile_members.h" #include "info/profile/info_profile_actions.h" #include "info/media/info_media_buttons.h" -#include "boxes/abstract_box.h" -#include "boxes/add_contact_box.h" #include "data/data_changes.h" #include "data/data_forum_topic.h" #include "data/data_photo.h" #include "data/data_file_origin.h" -#include "ui/boxes/confirm_box.h" -#include "mainwidget.h" #include "main/main_session.h" #include "apiwrap.h" #include "api/api_peer_photo.h" -#include "window/main_window.h" -#include "window/window_separate_id.h" -#include "window/window_session_controller.h" -#include "storage/storage_shared_media.h" #include "lang/lang_keys.h" #include "ui/widgets/buttons.h" #include "ui/widgets/checkbox.h" -#include "ui/widgets/popup_menu.h" #include "ui/widgets/scroll_area.h" #include "ui/widgets/shadow.h" -#include "ui/widgets/box_content_divider.h" -#include "ui/wrap/slide_wrap.h" -#include "ui/wrap/vertical_layout.h" #include "ui/ui_utility.h" -#include "data/data_channel.h" -#include "data/data_shared_media.h" -#include "styles/style_info.h" -#include "styles/style_boxes.h" -#include "styles/style_menu_icons.h" namespace Info { namespace Profile { -namespace { - -Window::SeparateSharedMediaType ToSeparateType( - Storage::SharedMediaType type) { - using Type = Storage::SharedMediaType; - using SeparatedType = Window::SeparateSharedMediaType; - return (type == Type::Photo) - ? SeparatedType::Photos - : (type == Type::Video) - ? SeparatedType::Videos - : (type == Type::File) - ? SeparatedType::Files - : (type == Type::MusicFile) - ? SeparatedType::Audio - : (type == Type::Link) - ? SeparatedType::Links - : (type == Type::RoundVoiceFile) - ? SeparatedType::Voices - : (type == Type::GIF) - ? SeparatedType::GIF - : SeparatedType::None; -} - -Fn SeparateWindowFactory( - not_null controller, - not_null peer, - MsgId topicRootId, - Storage::SharedMediaType type) { - const auto separateType = ToSeparateType(type); - if (separateType == Window::SeparateSharedMediaType::None) { - return nullptr; - } - return [=] { - controller->showInNewWindow({ - Window::SeparateSharedMedia(separateType, peer, topicRootId), - }); - }; -} - -void AddContextMenu( - not_null button, - Fn openInWindow) { - if (!openInWindow) { - return; - } - button->setAcceptBoth(); - struct State final { - base::unique_qptr menu; - }; - const auto state = button->lifetime().make_state(); - button->addClickHandler([=](Qt::MouseButton mouse) { - if (mouse != Qt::RightButton) { - return; - } - state->menu = base::make_unique_q( - button.get(), - st::popupMenuWithIcons); - state->menu->addAction(tr::lng_context_new_window(tr::now), [=] { - base::call_delayed( - st::popupMenuWithIcons.showDuration, - crl::guard(button, openInWindow)); - }, &st::menuIconNewWindow); - state->menu->popup(QCursor::pos()); - }); -} - -} // namespace - InnerWidget::InnerWidget( QWidget *parent, not_null controller, @@ -224,23 +134,14 @@ object_ptr InnerWidget::setupSharedMedia( auto addMediaButton = [&]( MediaType type, const style::icon &icon) { - const auto topicRootId = _topic ? _topic->rootId() : 0; - const auto window = _controller->parentController(); - const auto openInWindow = SeparateWindowFactory( - window, - _peer, - topicRootId, - type); auto result = Media::AddButton( content, _controller, _peer, - topicRootId, + _topic ? _topic->rootId() : 0, _migrated, type, - tracker, - openInWindow); - AddContextMenu(result, openInWindow); + tracker); object_ptr( result, icon, diff --git a/Telegram/SourceFiles/info/saved/info_saved_sublists_widget.cpp b/Telegram/SourceFiles/info/saved/info_saved_sublists_widget.cpp index b0b07b961..3a3ff46ad 100644 --- a/Telegram/SourceFiles/info/saved/info_saved_sublists_widget.cpp +++ b/Telegram/SourceFiles/info/saved/info_saved_sublists_widget.cpp @@ -109,8 +109,7 @@ void SublistsWidget::setupOtherTypes() { MsgId(), // topicRootId nullptr, // migrated buttonType, - tracker, - nullptr); + tracker); object_ptr( result, icon,