From 9803342c933dc8ea99b3f2a0bc8c2ea034c9bf47 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Thu, 9 Mar 2023 13:13:12 +0300 Subject: [PATCH] Fixed closing media viewer in fullscreen mode with click on top area. --- .../media/view/media_view_overlay_widget.cpp | 19 +++++++++++++++++++ .../platform/platform_overlay_widget.cpp | 14 ++++++++++++++ .../platform/platform_overlay_widget.h | 5 +++++ 3 files changed, 38 insertions(+) diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 7182491fa..c8a5b38e8 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -474,6 +474,25 @@ OverlayWidget::OverlayWidget() } return base::EventFilterResult::Continue; }); + _helper->mouseEvents( + ) | rpl::start_with_next([=](not_null e) { + const auto type = e->type(); + const auto position = e->pos(); + if (_helper->skipTitleHitTest(position)) { + return; + } + if (type == QEvent::MouseButtonPress) { + handleMousePress(position, e->button()); + } else if (type == QEvent::MouseButtonRelease) { + handleMouseRelease(position, e->button()); + } else if (type == QEvent::MouseMove) { + handleMouseMove(position); + } else if (type == QEvent::MouseButtonDblClick) { + if (!handleDoubleClick(position, e->button())) { + handleMousePress(position, e->button()); + } + } + }, lifetime()); _window->setTitle(u"Media viewer"_q); _window->setTitleStyle(st::mediaviewTitle); diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp index 39b9394cf..aa1f38b16 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.cpp +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.cpp @@ -234,4 +234,18 @@ void DefaultOverlayWidgetHelper::setControlsOpacity(float64 opacity) { _buttons->setMasterOpacity(opacity); } +auto DefaultOverlayWidgetHelper::mouseEvents() const +-> rpl::producer> { + return _controls->wrap.events( + ) | rpl::filter([](not_null e) { + const auto type = e->type(); + return (type == QEvent::MouseButtonPress) + || (type == QEvent::MouseButtonRelease) + || (type == QEvent::MouseMove) + || (type == QEvent::MouseButtonDblClick); + }) | rpl::map([](not_null e) { + return not_null{ static_cast(e.get()) }; + }); +} + } // namespace Platform diff --git a/Telegram/SourceFiles/platform/platform_overlay_widget.h b/Telegram/SourceFiles/platform/platform_overlay_widget.h index 8ba537d84..26e6220ec 100644 --- a/Telegram/SourceFiles/platform/platform_overlay_widget.h +++ b/Telegram/SourceFiles/platform/platform_overlay_widget.h @@ -49,6 +49,10 @@ public: } virtual void setControlsOpacity(float64 opacity) { } + [[nodiscard]] virtual auto mouseEvents() const + -> rpl::producer> { + return rpl::never>(); + } }; [[nodiscard]] std::unique_ptr CreateOverlayWidgetHelper( @@ -68,6 +72,7 @@ public: void beforeShow(bool fullscreen) override; void clearState() override; void setControlsOpacity(float64 opacity) override; + rpl::producer> mouseEvents() const override; private: class Buttons;