diff --git a/Telegram/SourceFiles/core/core_settings.cpp b/Telegram/SourceFiles/core/core_settings.cpp index 5a22f6d00..756d42138 100644 --- a/Telegram/SourceFiles/core/core_settings.cpp +++ b/Telegram/SourceFiles/core/core_settings.cpp @@ -1640,8 +1640,8 @@ bool Settings::chatFiltersHorizontal() const { return _chatFiltersHorizontal.current(); } -rpl::producer Settings::chatFiltersHorizontalValue() const { - return _chatFiltersHorizontal.value(); +rpl::producer Settings::chatFiltersHorizontalChanges() const { + return _chatFiltersHorizontal.changes(); } void Settings::setChatFiltersHorizontal(bool value) { diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index d7933efaf..b03f4ed5f 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -930,7 +930,7 @@ public: void setIvZoom(int value); [[nodiscard]] bool chatFiltersHorizontal() const; - [[nodiscard]] rpl::producer chatFiltersHorizontalValue() const; + [[nodiscard]] rpl::producer chatFiltersHorizontalChanges() const; void setChatFiltersHorizontal(bool value); [[nodiscard]] Media::VideoQuality videoQuality() const; diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 056f2a159..df00ed494 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -652,41 +652,10 @@ Widget::Widget( setupDownloadBar(); } - session().data().chatsFilters().changed( - ) | rpl::start_with_next([=] { - if (!session().data().chatsFilters().loaded()) { - return; - } - if (session().data().chatsFilters().has()) { - if (_chatFilters) { - return; - } - _chatFilters = Ui::AddChatFiltersTabsStrip( - this, - &session(), - rpl::single(0), - [=](int h) { updateControlsGeometry(); }, - [=](FilterId id) { controller->setActiveChatsFilter(id); }, - Core::App().settings().chatFiltersHorizontalValue(), - true); - _chatFilters->stackUnder(_scroll); - _chatFilters->resizeToWidth(width()); - updateControlsGeometry(); - const auto shadow = Ui::CreateChild( - _chatFilters); - shadow->show(); - _chatFilters->sizeValue( - ) | rpl::start_with_next([=](const QSize &size) { - shadow->setGeometry( - 0, - size.height() - shadow->height(), - size.width(), - shadow->height()); - }, lifetime()); - } else { - _chatFilters = nullptr; - } - }, lifetime()); + if (session().settings().dialogsFiltersEnabled() + && Core::App().settings().chatFiltersHorizontal()) { + toggleFiltersMenu(true); + } } void Widget::chosenRow(const ChosenRow &row) { @@ -1331,6 +1300,42 @@ void Widget::updateHasFocus(not_null focused) { } } +void Widget::toggleFiltersMenu(bool enabled) { + if (!enabled == !_chatFilters) { + return; + } else if (enabled) { + _chatFilters = base::make_unique_q(this); + const auto raw = _chatFilters.get(); + const auto inner = Ui::AddChatFiltersTabsStrip( + _chatFilters.get(), + &session(), + rpl::single(0), + [this](int h) { updateControlsGeometry(); }, + [this](FilterId id) { + if (controller()->activeChatsFilterCurrent() != id) { + controller()->setActiveChatsFilter(id); + } + }, + true); + raw->show(); + raw->stackUnder(_scroll); + raw->resizeToWidth(width()); + const auto shadow = Ui::CreateChild(raw); + shadow->show(); + inner->sizeValue() | rpl::start_with_next([=](const QSize &s) { + raw->resize(s); + shadow->setGeometry( + 0, + s.height() - shadow->height(), + s.width(), + shadow->height()); + }, _chatFilters->lifetime()); + updateControlsGeometry(); + } else { + _chatFilters = nullptr; + } +} + bool Widget::cancelSearchByMouseBack() { return _searchHasFocus && !_searchSuggestionsLocked diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 83756e01c..b163cef85 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -129,6 +129,7 @@ public: [[nodiscard]] RowDescriptor resolveChatNext(RowDescriptor from = {}) const; [[nodiscard]] RowDescriptor resolveChatPrevious(RowDescriptor from = {}) const; void updateHasFocus(not_null focused); + void toggleFiltersMenu(bool value); // Float player interface. bool floatPlayerHandleWheelEvent(QEvent *e) override; @@ -317,6 +318,8 @@ private: std::unique_ptr _forumRequestsBar; std::unique_ptr _forumReportBar; + base::unique_qptr _chatFilters; + object_ptr _scroll; QPointer _inner; std::unique_ptr _suggestions; @@ -390,8 +393,6 @@ private: QPixmap _widthAnimationCache; - Ui::RpWidget *_chatFilters = nullptr; - int _topDelta = 0; std::unique_ptr _childList; diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 5fc463f0f..5cd766f03 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -1098,6 +1098,12 @@ void MainWidget::dialogsCancelled() { _history->activate(); } +void MainWidget::toggleFiltersMenu(bool value) const { + if (_dialogs) { + _dialogs->toggleFiltersMenu(value); + } +} + void MainWidget::setChatBackground( const Data::WallPaper &background, QImage &&image) { diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index 32e5fff5d..5d6379896 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -213,6 +213,7 @@ public: void showNonPremiumLimitToast(bool download); void dialogsCancelled(); + void toggleFiltersMenu(bool value) const; private: void paintEvent(QPaintEvent *e) override; diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp index e29f90e89..f44cc38b8 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp @@ -40,7 +40,6 @@ struct State final { std::optional lastFilterId = std::nullopt; rpl::lifetime unreadLifetime; base::unique_qptr menu; - rpl::variable additionalToggleOn; Api::RemoveComplexChatFilter removeApi; bool waitingSuggested = false; @@ -130,7 +129,6 @@ not_null AddChatFiltersTabsStrip( rpl::producer multiSelectHeightValue, Fn setAddedTopScrollSkip, Fn choose, - rpl::producer additionalToggleOn, bool trackActiveChatsFilter) { const auto window = Core::App().findWindow(parent); const auto controller = window ? window->sessionController() : nullptr; @@ -151,7 +149,6 @@ not_null AddChatFiltersTabsStrip( object_ptr(parent, st::dialogsSearchTabs), QMargins(sliderPadding, 0, sliderPadding, 0)))->entity(); const auto state = wrap->lifetime().make_state(); - state->additionalToggleOn = std::move(additionalToggleOn); wrap->toggle(false, anim::type::instant); container->sizeValue() | rpl::start_with_next([=](const QSize &s) { scroll->resize(s + QSize(0, scrollSt.deltax * 4)); @@ -289,10 +286,7 @@ not_null AddChatFiltersTabsStrip( slider->contextMenuRequested() | rpl::start_with_next([=](int index) { ShowMenu(wrap, controller, state, index); }, slider->lifetime()); - state->additionalToggleOn.value( - ) | rpl::start_with_next([=](bool enabled) { - wrap->toggle(enabled && (list.size() > 1), anim::type::instant); - }, wrap->lifetime()); + wrap->toggle((list.size() > 1), anim::type::instant); }; session->data().chatsFilters().changed( ) | rpl::start_with_next(rebuild, wrap->lifetime()); diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.h b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.h index 806a2ee14..d57cfdda3 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.h +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.h @@ -23,7 +23,6 @@ not_null AddChatFiltersTabsStrip( rpl::producer multiSelectHeightValue, Fn setAddedTopScrollSkip, Fn choose, - rpl::producer additionalToggleOn = rpl::single(true), bool trackActiveChatsFilter = false); } // namespace Ui diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 8a05d59e5..5c54a79d2 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1315,17 +1315,20 @@ SessionController::SessionController( }, lifetime()); rpl::merge( - session->data().chatsFilters().changed() | rpl::filter([=] { - return session->data().chatsFilters().loaded(); - }) | rpl::map([] { - return Core::App().settings().chatFiltersHorizontalValue( - ) | rpl::to_empty; - }) | rpl::flatten_latest(), + Core::App().settings().chatFiltersHorizontalChanges() | rpl::to_empty, session->data().chatsFilters().changed() ) | rpl::start_with_next([=] { checkOpenedFilter(); - crl::on_main(this, [=] { - refreshFiltersMenu(); + crl::on_main(this, [this] { + if (SessionNavigation::session().data().chatsFilters().has()) { + const auto isHorizontal + = Core::App().settings().chatFiltersHorizontal(); + content()->toggleFiltersMenu(isHorizontal); + toggleFiltersMenu(!isHorizontal); + } else { + content()->toggleFiltersMenu(false); + toggleFiltersMenu(false); + } }); }, lifetime()); @@ -1556,11 +1559,6 @@ void SessionController::toggleFiltersMenu(bool enabled) { _filtersMenuChanged.fire({}); } -void SessionController::refreshFiltersMenu() { - toggleFiltersMenu(session().data().chatsFilters().has() - && !Core::App().settings().chatFiltersHorizontal()); -} - rpl::producer<> SessionController::filtersMenuChanged() const { return _filtersMenuChanged.events(); } diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index c925aacc7..8cb9a590f 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -630,7 +630,6 @@ private: void init(); void setupShortcuts(); - void refreshFiltersMenu(); void checkOpenedFilter(); void suggestArchiveAndMute(); void activateFirstChatsFilter();