diff --git a/Telegram/SourceFiles/boxes/choose_filter_box.cpp b/Telegram/SourceFiles/boxes/choose_filter_box.cpp index 2f68bdaca6..304d6d5248 100644 --- a/Telegram/SourceFiles/boxes/choose_filter_box.cpp +++ b/Telegram/SourceFiles/boxes/choose_filter_box.cpp @@ -505,7 +505,8 @@ void SetupFilterDragAndDrop( not_null outer, not_null session, Fn(QPoint)> filterIdAtPosition, - Fn activeFilterId) { + Fn activeFilterId, + Fn selectByFilterId) { const auto hasAction = [=](not_null drop, bool perform) { const auto mimeData = drop->mimeData(); const auto filterId = filterIdAtPosition( @@ -522,6 +523,7 @@ void SetupFilterDragAndDrop( if (perform) { v.add(id); } + selectByFilterId(perform ? FilterId(-1) : id); return true; } } @@ -531,10 +533,12 @@ void SetupFilterDragAndDrop( if (perform) { v.remove(active); } + selectByFilterId(perform ? FilterId(-1) : active); return true; } } } + selectByFilterId(-1); return false; }; outer->setAcceptDrops(true); @@ -560,6 +564,7 @@ void SetupFilterDragAndDrop( dm->ignore(); } } else if (e->type() == QEvent::DragLeave) { + selectByFilterId(-1); } else if (e->type() == QEvent::Drop) { const auto drop = static_cast(e.get()); if (hasAction(drop, true)) { diff --git a/Telegram/SourceFiles/boxes/choose_filter_box.h b/Telegram/SourceFiles/boxes/choose_filter_box.h index 4bcfd3ddcc..59cff96333 100644 --- a/Telegram/SourceFiles/boxes/choose_filter_box.h +++ b/Telegram/SourceFiles/boxes/choose_filter_box.h @@ -62,7 +62,8 @@ void SetupFilterDragAndDrop( not_null outer, not_null session, Fn(QPoint)> filterIdAtPosition, - Fn activeFilterId); + Fn activeFilterId, + Fn selectByFilterId); [[nodiscard]] History *HistoryFromMimeData( const QMimeData *mime, diff --git a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp index 74f93e835d..001d7a9a9e 100644 --- a/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp +++ b/Telegram/SourceFiles/ui/widgets/chat_filters_tabs_strip.cpp @@ -310,7 +310,8 @@ not_null AddChatFiltersTabsStrip( ? slider->lookupSectionLeft(i + 1) : slider->width(); if (x >= left && x < right) { - const auto &list = session->data().chatsFilters().list(); + const auto &list + = session->data().chatsFilters().list(); return (i < list.size()) ? list[i].id() : FilterId(); @@ -318,7 +319,17 @@ not_null AddChatFiltersTabsStrip( } return std::nullopt; }, - [=] { return state->lastFilterId.value_or(FilterId()); }); + [=] { return state->lastFilterId.value_or(FilterId()); }, + [=](FilterId id) { + const auto &list = session->data().chatsFilters().list(); + for (auto i = 0; i < list.size(); i++) { + if (list[i].id() == id) { + slider->selectSection(i); + return; + } + } + slider->selectSection(-1); + }); } wrap->toggle(false, anim::type::instant); scroll->setCustomWheelProcess([=](not_null e) { diff --git a/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp b/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp index 3c80be1720..702d760e33 100644 --- a/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp +++ b/Telegram/SourceFiles/ui/widgets/discrete_sliders.cpp @@ -58,6 +58,27 @@ void DiscreteSlider::finishAnimating() { } } +void DiscreteSlider::selectSection(int index) { + if (index < 0 || index >= _sections.size()) { + for (auto &other : _sections) { + if (other.ripple) { + other.ripple->lastStop(); + } + } + return; + } + auto §ion = _sections[index]; + if (section.ripple && !section.ripple->empty()) { + return; + } + for (auto &other : _sections) { + if (other.ripple) { + other.ripple->lastStop(); + } + } + startRipple(index); +} + void DiscreteSlider::setAdditionalContentWidthToSection(int index, int w) { if (index >= 0 && index < _sections.size()) { auto §ion = _sections[index]; diff --git a/Telegram/SourceFiles/ui/widgets/discrete_sliders.h b/Telegram/SourceFiles/ui/widgets/discrete_sliders.h index 6c7e6405bb..bda6cc7735 100644 --- a/Telegram/SourceFiles/ui/widgets/discrete_sliders.h +++ b/Telegram/SourceFiles/ui/widgets/discrete_sliders.h @@ -45,6 +45,7 @@ public: void setActiveSection(int index); void setActiveSectionFast(int index); void finishAnimating(); + void selectSection(int index); void setAdditionalContentWidthToSection(int index, int width); diff --git a/Telegram/SourceFiles/window/window_filters_menu.cpp b/Telegram/SourceFiles/window/window_filters_menu.cpp index 3cf6af2e40..8dbbc40f83 100644 --- a/Telegram/SourceFiles/window/window_filters_menu.cpp +++ b/Telegram/SourceFiles/window/window_filters_menu.cpp @@ -145,7 +145,12 @@ void FiltersMenu::setupDragAndDrop() { } return std::nullopt; }, - [=] { return _activeFilterId; }); + [=] { return _activeFilterId; }, + [=](FilterId filterId) { + for (const auto &[id, button] : _filters) { + button->setForceRippled(id == filterId); + } + }); } void FiltersMenu::setupMainMenuIcon() {