From 5fb71cb165089181af266e9dc34fec14b7674cb8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 3 May 2022 18:43:04 +0300 Subject: [PATCH] Added ability to append pinned to bottom content to settings sections. --- .../SourceFiles/info/info_content_widget.cpp | 23 +++++++++++++------ .../SourceFiles/info/info_content_widget.h | 2 ++ .../info/settings/info_settings_widget.cpp | 23 ++++++++++++++++++- .../info/settings/info_settings_widget.h | 1 + .../SourceFiles/settings/settings_common.h | 4 ++++ 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/Telegram/SourceFiles/info/info_content_widget.cpp b/Telegram/SourceFiles/info/info_content_widget.cpp index bec308988..eadc09e7c 100644 --- a/Telegram/SourceFiles/info/info_content_widget.cpp +++ b/Telegram/SourceFiles/info/info_content_widget.cpp @@ -61,7 +61,9 @@ ContentWidget::ContentWidget( refreshSearchField(shown); }, lifetime()); } - _scrollTopSkip.changes( + rpl::merge( + _scrollTopSkip.changes(), + _scrollBottomSkip.changes() ) | rpl::start_with_next([this] { updateControlsGeometry(); }, lifetime()); @@ -79,7 +81,7 @@ void ContentWidget::updateControlsGeometry() { auto newScrollTop = _scroll->scrollTop() + _topDelta; auto scrollGeometry = rect().marginsRemoved( - QMargins(0, _scrollTopSkip.current(), 0, 0)); + { 0, _scrollTopSkip.current(), 0, _scrollBottomSkip.current() }); if (_scroll->geometry() != scrollGeometry) { _scroll->setGeometry(scrollGeometry); } @@ -159,9 +161,11 @@ Ui::RpWidget *ContentWidget::doSetInnerWidget( } int ContentWidget::scrollTillBottom(int forHeight) const { - auto scrollHeight = forHeight - _scrollTopSkip.current(); - auto scrollBottom = _scroll->scrollTop() + scrollHeight; - auto desired = _innerDesiredHeight; + const auto scrollHeight = forHeight + - _scrollTopSkip.current() + - _scrollBottomSkip.current(); + const auto scrollBottom = _scroll->scrollTop() + scrollHeight; + const auto desired = _innerDesiredHeight; return std::max(desired - scrollBottom, 0); } @@ -173,6 +177,10 @@ void ContentWidget::setScrollTopSkip(int scrollTopSkip) { _scrollTopSkip = scrollTopSkip; } +void ContentWidget::setScrollBottomSkip(int scrollBottomSkip) { + _scrollBottomSkip = scrollBottomSkip; +} + rpl::producer ContentWidget::scrollHeightValue() const { return _scroll->heightValue(); } @@ -187,8 +195,9 @@ rpl::producer ContentWidget::desiredHeightValue() const { using namespace rpl::mappers; return rpl::combine( _innerWrap->entity()->desiredHeightValue(), - _scrollTopSkip.value() - ) | rpl::map(_1 + _2); + _scrollTopSkip.value(), + _scrollBottomSkip.value() + ) | rpl::map(_1 + _2 + _3); } rpl::producer ContentWidget::desiredShadowVisibility() const { diff --git a/Telegram/SourceFiles/info/info_content_widget.h b/Telegram/SourceFiles/info/info_content_widget.h index 3cc5b34a5..be548fbf1 100644 --- a/Telegram/SourceFiles/info/info_content_widget.h +++ b/Telegram/SourceFiles/info/info_content_widget.h @@ -94,6 +94,7 @@ protected: void paintEvent(QPaintEvent *e) override; void setScrollTopSkip(int scrollTopSkip); + void setScrollBottomSkip(int scrollBottomSkip); int scrollTopSave() const; void scrollTopRestore(int scrollTop); void scrollTo(const Ui::ScrollToRequest &request); @@ -109,6 +110,7 @@ private: style::color _bg; rpl::variable _scrollTopSkip = -1; + rpl::variable _scrollBottomSkip = -1; rpl::event_stream _scrollTillBottomChanges; object_ptr _scroll; Ui::PaddingWrap *_innerWrap = nullptr; diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp index d20d5490f..285497ed6 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.cpp +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.cpp @@ -48,7 +48,8 @@ Widget::Widget( , _inner( setInnerWidget( _type()->create(this, controller->parentController()))) -, _pinnedToTop(_inner->createPinnedToTop(this)) { +, _pinnedToTop(_inner->createPinnedToTop(this)) +, _pinnedToBottom(_inner->createPinnedToBottom(this)) { _inner->sectionShowOther( ) | rpl::start_with_next([=](Type type) { controller->showSettings(type); @@ -81,6 +82,26 @@ Widget::Widget( setScrollTopSkip(h); }, _pinnedToTop->lifetime()); } + + if (_pinnedToBottom) { + const auto processHeight = [=](int bottomHeight, int height) { + setScrollBottomSkip(bottomHeight); + _pinnedToBottom->moveToLeft( + _pinnedToBottom->x(), + height - bottomHeight); + }; + + _inner->sizeValue( + ) | rpl::start_with_next([=](const QSize &s) { + _pinnedToBottom->resizeToWidth(s.width()); + processHeight(_pinnedToBottom->height(), height()); + }, _pinnedToBottom->lifetime()); + + rpl::combine( + _pinnedToBottom->heightValue(), + heightValue() + ) | rpl::start_with_next(processHeight, _pinnedToBottom->lifetime()); + } } Widget::~Widget() = default; diff --git a/Telegram/SourceFiles/info/settings/info_settings_widget.h b/Telegram/SourceFiles/info/settings/info_settings_widget.h index d6de4287d..5b6290ba8 100644 --- a/Telegram/SourceFiles/info/settings/info_settings_widget.h +++ b/Telegram/SourceFiles/info/settings/info_settings_widget.h @@ -83,6 +83,7 @@ private: not_null<::Settings::AbstractSection*> _inner; QPointer _pinnedToTop; + QPointer _pinnedToBottom; rpl::event_stream> _removesFromStack; diff --git a/Telegram/SourceFiles/settings/settings_common.h b/Telegram/SourceFiles/settings/settings_common.h index 03566fdfb..adf4e62fd 100644 --- a/Telegram/SourceFiles/settings/settings_common.h +++ b/Telegram/SourceFiles/settings/settings_common.h @@ -96,6 +96,10 @@ public: not_null parent) { return nullptr; } + [[nodiscard]] virtual QPointer createPinnedToBottom( + not_null parent) { + return nullptr; + } }; template