diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index 3c2ea6a73b..ce42a119fa 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -805,6 +805,7 @@ PRIVATE media/view/media_view_playback_controls.h media/view/media_view_playback_progress.cpp media/view/media_view_playback_progress.h + media/view/media_view_open_common.h mtproto/config_loader.cpp mtproto/config_loader.h mtproto/connection_abstract.cpp diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index 6f6ccc349d..840b3b9781 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -44,6 +44,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_domain.h" #include "main/main_session.h" #include "media/view/media_view_overlay_widget.h" +#include "media/view/media_view_open_common.h" #include "mtproto/mtproto_dc_options.h" #include "mtproto/mtproto_config.h" #include "mtproto/mtp_instance.h" @@ -284,6 +285,13 @@ void Application::run() { && Ui::Integration::Instance().openglLastCheckFailed()) { showOpenGLCrashNotification(); } + + _window->openInMediaViewRequests( + ) | rpl::start_with_next([=](Media::View::OpenRequest &&request) { + if (_mediaView) { + _mediaView->show(std::move(request)); + } + }, _window->lifetime()); } void Application::showOpenGLCrashNotification() { diff --git a/Telegram/SourceFiles/media/view/media_view_open_common.h b/Telegram/SourceFiles/media/view/media_view_open_common.h new file mode 100644 index 0000000000..9a034ffb75 --- /dev/null +++ b/Telegram/SourceFiles/media/view/media_view_open_common.h @@ -0,0 +1,70 @@ +/* +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 +*/ +#pragma once + +#include "data/data_cloud_themes.h" + +class DocumentData; +class PeerData; +class PhotoData; +class HistoryItem; + +namespace Media::View { + +struct OpenRequest { +public: + OpenRequest(not_null photo, HistoryItem *item) + : _photo(photo) + , _item(item) { + } + OpenRequest(not_null photo, not_null peer) + : _photo(photo) + , _peer(peer) { + } + + OpenRequest(not_null document, HistoryItem *item) + : _document(document) + , _item(item) { + } + OpenRequest( + not_null document, + const Data::CloudTheme &cloudTheme) + : _document(document) + , _cloudTheme(cloudTheme) { + } + + PeerData *peer() const { + return _peer; + } + + PhotoData *photo() const { + return _photo; + } + + HistoryItem *item() const { + return _item; + } + + DocumentData *document() const { + return _document; + } + + std::optional cloudTheme() const { + return _cloudTheme; + } + +private: + DocumentData *_document = nullptr; + PhotoData *_photo = nullptr; + PeerData *_peer = nullptr; + HistoryItem *_item = nullptr; + std::optional _cloudTheme = std::nullopt; + +}; + +} // namespace Media::View diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 8d276b10dd..b865cad676 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -2315,6 +2315,9 @@ void OverlayWidget::showDocument( } } +void OverlayWidget::show(OpenRequest request) { +} + void OverlayWidget::displayPhoto(not_null photo, HistoryItem *item) { if (photo->isNull()) { displayDocument(nullptr, item); diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h index 6854494edf..d38490cc6b 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.h +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.h @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_web_page.h" #include "data/data_cloud_themes.h" // Data::CloudTheme. #include "media/view/media_view_playback_controls.h" +#include "media/view/media_view_open_common.h" namespace Data { class PhotoMedia; @@ -86,6 +87,8 @@ public: not_null document, const Data::CloudTheme &cloud); + void show(OpenRequest request); + //void leaveToChildEvent(QEvent *e, QWidget *child) override { // // e -- from enterEvent() of child TWidget // updateOverState(OverNone); diff --git a/Telegram/SourceFiles/window/window_controller.cpp b/Telegram/SourceFiles/window/window_controller.cpp index 81a21798b5..ec2bb50a15 100644 --- a/Telegram/SourceFiles/window/window_controller.cpp +++ b/Telegram/SourceFiles/window/window_controller.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "main/main_session_settings.h" #include "main/main_app_config.h" +#include "media/view/media_view_open_common.h" #include "intro/intro_widget.h" #include "mtproto/mtproto_config.h" #include "ui/layers/box_content.h" @@ -373,4 +374,17 @@ Window::Adaptive &Controller::adaptive() const { return *_adaptive; } +void Controller::openInMediaView(Media::View::OpenRequest &&request) { + _openInMediaViewRequests.fire(std::move(request)); +} + +auto Controller::openInMediaViewRequests() const +-> rpl::producer { + return _openInMediaViewRequests.events(); +} + +rpl::lifetime &Controller::lifetime() { + return _lifetime; +} + } // namespace Window diff --git a/Telegram/SourceFiles/window/window_controller.h b/Telegram/SourceFiles/window/window_controller.h index 1fa3c997d5..9852e61e63 100644 --- a/Telegram/SourceFiles/window/window_controller.h +++ b/Telegram/SourceFiles/window/window_controller.h @@ -15,6 +15,10 @@ namespace Main { class Account; } // namespace Main +namespace Media::View { +struct OpenRequest; +} // namespace Media::View + namespace Window { class Controller final { @@ -79,8 +83,14 @@ public: void preventOrInvoke(Fn &&callback); + void openInMediaView(Media::View::OpenRequest &&request); + [[nodiscard]] auto openInMediaViewRequests() const + -> rpl::producer; + QPoint getPointForCallPanelCenter() const; + rpl::lifetime &lifetime(); + private: void showBox( object_ptr content, @@ -98,6 +108,8 @@ private: base::Timer _isActiveTimer; QPointer _termsBox; + rpl::event_stream _openInMediaViewRequests; + rpl::lifetime _accountLifetime; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 239db221fb..80e7ca9483 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_element.h" #include "history/view/history_view_replies_section.h" #include "media/player/media_player_instance.h" +#include "media/view/media_view_open_common.h" #include "data/data_media_types.h" #include "data/data_session.h" #include "data/data_folder.h" @@ -1217,6 +1218,28 @@ QPointer SessionController::show( return _window->show(std::move(content), options, animated); } +void SessionController::openPhoto( + not_null photo, + FullMsgId contextId) { + _window->openInMediaView(Media::View::OpenRequest( + photo, + session().data().message(contextId))); +} + +void SessionController::openPhoto( + not_null photo, + not_null peer) { + _window->openInMediaView(Media::View::OpenRequest(photo, peer)); +} + +void SessionController::openDocument( + not_null document, + FullMsgId contextId) { + _window->openInMediaView(Media::View::OpenRequest( + document, + session().data().message(contextId))); +} + SessionController::~SessionController() = default; } // namespace Window diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index 7955e1cf0f..ffa6e047b5 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -347,6 +347,10 @@ public: void showPassportForm(const Passport::FormRequest &request); void clearPassportForm(); + void openPhoto(not_null photo, FullMsgId contextId); + void openPhoto(not_null photo, not_null peer); + void openDocument(not_null document, FullMsgId contextId); + void showChooseReportMessages( not_null peer, Ui::ReportReason reason,