From 11a3308cf58bcdd1e515e394c966210a13336a79 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 6 Nov 2017 14:00:37 +0400 Subject: [PATCH] Scroll to field on search query update. --- .../info/media/info_media_inner_widget.cpp | 17 ++++++++++++++++- .../info/media/info_media_inner_widget.h | 6 ++++-- .../info/media/info_media_widget.cpp | 4 ++-- .../SourceFiles/info/media/info_media_widget.h | 4 ---- .../SourceFiles/ui/search_field_controller.h | 3 +++ 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp b/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp index 5ee9aa5c2b..42ec30b8af 100644 --- a/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_inner_widget.cpp @@ -216,11 +216,23 @@ void InnerWidget::refreshSearchField() { st::infoMediaSearch); _searchField->resizeToWidth(width()); _searchField->show(); + search->queryChanges() + | rpl::start_with_next([this] { + scrollToSearchField(); + }, _searchField->lifetime()); } else { _searchField = nullptr; } } +void InnerWidget::scrollToSearchField() { + Expects(_searchField != nullptr); + + auto top = _searchField->y(); + auto bottom = top + _searchField->height(); + _scrollToRequests.fire({ top, bottom }); +} + object_ptr InnerWidget::setupList() { auto result = object_ptr( this, @@ -232,7 +244,10 @@ object_ptr InnerWidget::setupList() { using namespace rpl::mappers; result->scrollToRequests() | rpl::map([widget = result.data()](int to) { - return widget->y() + to; + return Ui::ScrollToRequest { + widget->y() + to, + -1 + }; }) | rpl::start_to_stream( _scrollToRequests, diff --git a/Telegram/SourceFiles/info/media/info_media_inner_widget.h b/Telegram/SourceFiles/info/media/info_media_inner_widget.h index 8ceec3fd98..1cfaec6e71 100644 --- a/Telegram/SourceFiles/info/media/info_media_inner_widget.h +++ b/Telegram/SourceFiles/info/media/info_media_inner_widget.h @@ -21,6 +21,7 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #pragma once #include "ui/rp_widget.h" +#include "ui/widgets/scroll_area.h" #include "base/unique_qptr.h" #include "info/media/info_media_widget.h" #include "info/media/info_media_list_widget.h" @@ -51,7 +52,7 @@ public: void saveState(not_null memento); void restoreState(not_null memento); - rpl::producer scrollToRequests() const { + rpl::producer scrollToRequests() const { return _scrollToRequests.events(); } rpl::producer selectedListValue() const; @@ -77,6 +78,7 @@ private: Type type() const; void refreshSearchField(); + void scrollToSearchField(); object_ptr setupList(); const not_null _controller; @@ -90,7 +92,7 @@ private: bool _inResize = false; - rpl::event_stream _scrollToRequests; + rpl::event_stream _scrollToRequests; rpl::event_stream> _selectedLists; }; diff --git a/Telegram/SourceFiles/info/media/info_media_widget.cpp b/Telegram/SourceFiles/info/media/info_media_widget.cpp index a0c685157b..4351cfd9a9 100644 --- a/Telegram/SourceFiles/info/media/info_media_widget.cpp +++ b/Telegram/SourceFiles/info/media/info_media_widget.cpp @@ -88,8 +88,8 @@ Widget::Widget( this, controller)); _inner->scrollToRequests() - | rpl::start_with_next([this](int skip) { - scrollTo({ skip, -1 }); + | rpl::start_with_next([this](Ui::ScrollToRequest request) { + scrollTo(request); }, _inner->lifetime()); } diff --git a/Telegram/SourceFiles/info/media/info_media_widget.h b/Telegram/SourceFiles/info/media/info_media_widget.h index dabd2a27bc..c5bbe0ca9e 100644 --- a/Telegram/SourceFiles/info/media/info_media_widget.h +++ b/Telegram/SourceFiles/info/media/info_media_widget.h @@ -25,10 +25,6 @@ Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org #include "storage/storage_shared_media.h" #include "data/data_search_controller.h" -namespace Ui { -class SearchFieldController; -} // namespace Ui - namespace Info { namespace Media { diff --git a/Telegram/SourceFiles/ui/search_field_controller.h b/Telegram/SourceFiles/ui/search_field_controller.h index 5e296b44f1..edc0e7aebc 100644 --- a/Telegram/SourceFiles/ui/search_field_controller.h +++ b/Telegram/SourceFiles/ui/search_field_controller.h @@ -51,6 +51,9 @@ public: rpl::producer queryValue() const { return _query.value(); } + rpl::producer queryChanges() const { + return _query.changes(); + } rpl::lifetime &lifetime() { return _lifetime;