From a22cf8e3035ac5da79c4c94faea29e65aae4eeb0 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Tue, 18 Jun 2024 12:32:27 +0400 Subject: [PATCH] Use RpWidget::windowActiveValue --- .../SourceFiles/dialogs/dialogs_widget.cpp | 2 +- .../dialogs/ui/dialogs_stories_list.cpp | 16 +++------------- .../dialogs/ui/dialogs_stories_list.h | 2 +- Telegram/SourceFiles/iv/iv_controller.cpp | 8 +++----- Telegram/SourceFiles/mainwindow.cpp | 6 ++++-- .../media/stories/media_stories_controller.cpp | 11 +++-------- Telegram/SourceFiles/window/main_window.cpp | 18 +++++++++--------- Telegram/SourceFiles/window/main_window.h | 2 +- 8 files changed, 25 insertions(+), 40 deletions(-) diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 61689d105..7caeb6117 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -897,7 +897,7 @@ void Widget::setupStories() { Core::App().saveSettingsDelayed(); }; _stories->setShowTooltip( - parentWidget(), + controller()->content(), rpl::combine( Core::App().settings().storiesClickTooltipHiddenValue(), shownValue(), diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp index 1e4a4cd5d..7bca7a120 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.cpp @@ -903,7 +903,7 @@ TextWithEntities List::computeTooltipText() const { } void List::setShowTooltip( - not_null tooltipParent, + not_null tooltipParent, rpl::producer shown, Fn hide) { _tooltip = nullptr; @@ -925,16 +925,6 @@ void List::setShowTooltip( tooltip->toggleFast(false); updateTooltipGeometry(); - const auto handle = tooltipParent->window()->windowHandle(); - auto windowActive = rpl::single( - handle->isActive() - ) | rpl::then(base::qt_signal_producer( - handle, - &QWindow::activeChanged - ) | rpl::map([=] { - return handle->isActive(); - })) | rpl::distinct_until_changed(); - { const auto recompute = [=] { updateTooltipGeometry(); @@ -955,7 +945,7 @@ void List::setShowTooltip( _tooltipText.value() | rpl::map( notEmpty ) | rpl::distinct_until_changed(), - std::move(windowActive) + tooltipParent->windowActiveValue() ) | rpl::start_with_next([=](bool, bool, bool active) { _tooltipWindowActive = active; if (!isHidden()) { @@ -981,7 +971,7 @@ void List::toggleTooltip(bool fast) { && !isHidden() && _tooltipNotHidden.current() && !_tooltipText.current().empty() - && window()->windowHandle()->isActive(); + && isActiveWindow(); if (_tooltip) { if (fast) { _tooltip->toggleFast(shown); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h index 303938957..c3140a9ca 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_stories_list.h @@ -72,7 +72,7 @@ public: style::align alignSmall, QRect geometryFull = QRect()); void setShowTooltip( - not_null tooltipParent, + not_null tooltipParent, rpl::producer shown, Fn hide); void raiseTooltip(); diff --git a/Telegram/SourceFiles/iv/iv_controller.cpp b/Telegram/SourceFiles/iv/iv_controller.cpp index 3b30dc6db..baad49dd1 100644 --- a/Telegram/SourceFiles/iv/iv_controller.cpp +++ b/Telegram/SourceFiles/iv/iv_controller.cpp @@ -342,11 +342,9 @@ void Controller::createWindow() { _window = std::make_unique(); const auto window = _window.get(); - base::qt_signal_producer( - window->window()->windowHandle(), - &QWindow::activeChanged - ) | rpl::filter([=] { - return _webview && window->window()->windowHandle()->isActive(); + window->windowActiveValue( + ) | rpl::filter([=](bool active) { + return _webview && active; }) | rpl::start_with_next([=] { setInnerFocus(); }, window->lifetime()); diff --git a/Telegram/SourceFiles/mainwindow.cpp b/Telegram/SourceFiles/mainwindow.cpp index 93d6d3060..2e705713f 100644 --- a/Telegram/SourceFiles/mainwindow.cpp +++ b/Telegram/SourceFiles/mainwindow.cpp @@ -139,7 +139,9 @@ void MainWindow::finishFirstShow() { applyInitialWorkMode(); createGlobalMenu(); - windowDeactivateEvents( + windowActiveValue( + ) | rpl::skip(1) | rpl::filter( + !rpl::mappers::_1 ) | rpl::start_with_next([=] { Ui::Tooltip::Hide(); }, lifetime()); @@ -594,7 +596,7 @@ bool MainWindow::eventFilter(QObject *object, QEvent *e) { case QEvent::ApplicationActivate: { if (object == QCoreApplication::instance()) { InvokeQueued(this, [=] { - handleActiveChanged(); + handleActiveChanged(isActiveWindow()); }); } } break; diff --git a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp index 04c06e197..45e17f33f 100644 --- a/Telegram/SourceFiles/media/stories/media_stories_controller.cpp +++ b/Telegram/SourceFiles/media/stories/media_stories_controller.cpp @@ -328,16 +328,11 @@ Controller::Controller(not_null delegate) } }, _lifetime); - const auto window = _wrap->window()->windowHandle(); - Assert(window != nullptr); - base::qt_signal_producer( - window, - &QWindow::activeChanged - ) | rpl::start_with_next([=] { - _windowActive = window->isActive(); + _wrap->windowActiveValue( + ) | rpl::start_with_next([=](bool active) { + _windowActive = active; updatePlayingAllowed(); }, _lifetime); - _windowActive = window->isActive(); _contentFadeAnimation.stop(); } diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp index e776b7637..a8b6cf861 100644 --- a/Telegram/SourceFiles/window/main_window.cpp +++ b/Telegram/SourceFiles/window/main_window.cpp @@ -351,6 +351,13 @@ MainWindow::MainWindow(not_null controller) Ui::Toast::SetDefaultParent(_body.data()); } + windowActiveValue( + ) | rpl::skip(1) | rpl::start_with_next([=](bool active) { + InvokeQueued(this, [=] { + handleActiveChanged(active); + }); + }, lifetime()); + body()->sizeValue( ) | rpl::start_with_next([=](QSize size) { updateControlsGeometry(); @@ -445,13 +452,6 @@ void MainWindow::init() { initHook(); - // Non-queued activeChanged handlers must use QtSignalProducer. - connect( - windowHandle(), - &QWindow::activeChanged, - this, - [=] { handleActiveChanged(); }, - Qt::QueuedConnection); connect( windowHandle(), &QWindow::windowStateChanged, @@ -495,9 +495,9 @@ void MainWindow::handleStateChanged(Qt::WindowState state) { savePosition(state); } -void MainWindow::handleActiveChanged() { +void MainWindow::handleActiveChanged(bool active) { checkActivation(); - if (isActiveWindow()) { + if (active) { Core::App().windowActivated(&controller()); } if (const auto controller = sessionController()) { diff --git a/Telegram/SourceFiles/window/main_window.h b/Telegram/SourceFiles/window/main_window.h index 7bbbf8e86..49f73e6bb 100644 --- a/Telegram/SourceFiles/window/main_window.h +++ b/Telegram/SourceFiles/window/main_window.h @@ -151,7 +151,7 @@ protected: void savePosition(Qt::WindowState state = Qt::WindowActive); void handleStateChanged(Qt::WindowState state); - void handleActiveChanged(); + void handleActiveChanged(bool active); void handleVisibleChanged(bool visible); virtual void checkActivation() {