diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp index c3dc482b21..169ccadac5 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_suggestions.cpp @@ -2376,6 +2376,7 @@ void Suggestions::updateControlsGeometry() { } const auto expanding = false; + const auto contentTillBottom = true; for (const auto &[key, list] : _mediaLists) { const auto full = !list.wrap->scrollBottomSkip(); const auto additionalScroll = (full ? st::boxRadius : 0); @@ -2384,6 +2385,7 @@ void Suggestions::updateControlsGeometry() { list.wrap->updateGeometry( wrapGeometry, expanding, + contentTillBottom, additionalScroll, content.height()); } diff --git a/Telegram/SourceFiles/info/community/info_community_widget.cpp b/Telegram/SourceFiles/info/community/info_community_widget.cpp index 13d51f0439..4f18b4e6a7 100644 --- a/Telegram/SourceFiles/info/community/info_community_widget.cpp +++ b/Telegram/SourceFiles/info/community/info_community_widget.cpp @@ -24,6 +24,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/rp_widget.h" #include "ui/ui_utility.h" #include "styles/style_info.h" +#include "styles/style_layers.h" namespace Info::Community { @@ -241,19 +242,22 @@ std::unique_ptr Widget::setupAddChatButton() { Dialogs::PaintBottomFade(p, wrap->width(), fadeHeight, st::boxBg); }); - scroll()->setVerticalBarBottomSkip(st::communityAddChatButtonMargin.top() - + st::communityAddChatButton.height - + st::communityAddChatButtonMargin.bottom()); - widthValue() | rpl::on_next([=](int width) { wrap->resizeToWidth(width); }, wrap->lifetime()); rpl::combine( wrap->heightValue(), - heightValue() - ) | rpl::on_next([=](int height, int fullHeight) { - wrap->move(0, fullHeight - height); + heightValue(), + this->controller()->contentTillBottomValue() + ) | rpl::on_next([=](int height, int fullHeight, bool tillBottom) { + const auto shift = tillBottom ? 0 : st::boxRadius; + wrap->move(0, fullHeight - height + shift); + + const auto scrollSkip = st::communityAddChatButtonMargin.top() + + st::communityAddChatButton.height + + st::communityAddChatButtonMargin.bottom(); + scroll()->setVerticalBarBottomSkip(scrollSkip - shift); }, wrap->lifetime()); return result; diff --git a/Telegram/SourceFiles/info/info_controller.cpp b/Telegram/SourceFiles/info/info_controller.cpp index 8cd29e8049..5a5fca60fb 100644 --- a/Telegram/SourceFiles/info/info_controller.cpp +++ b/Telegram/SourceFiles/info/info_controller.cpp @@ -393,6 +393,10 @@ rpl::producer Controller::wrapValue() const { return _widget->wrapValue(); } +rpl::producer Controller::contentTillBottomValue() const { + return _widget->contentTillBottomValue(); +} + not_null Controller::wrapWidget() const { return _widget; } diff --git a/Telegram/SourceFiles/info/info_controller.h b/Telegram/SourceFiles/info/info_controller.h index 3bc66f1fb0..e501f82e74 100644 --- a/Telegram/SourceFiles/info/info_controller.h +++ b/Telegram/SourceFiles/info/info_controller.h @@ -326,6 +326,7 @@ public: [[nodiscard]] Wrap wrap() const; [[nodiscard]] rpl::producer wrapValue() const; [[nodiscard]] not_null wrapWidget() const; + [[nodiscard]] rpl::producer contentTillBottomValue() const; void setSection(not_null memento); [[nodiscard]] bool hasBackButton() const; diff --git a/Telegram/SourceFiles/info/info_layer_widget.cpp b/Telegram/SourceFiles/info/info_layer_widget.cpp index 361c41e22f..a0e0ffdb34 100644 --- a/Telegram/SourceFiles/info/info_layer_widget.cpp +++ b/Telegram/SourceFiles/info/info_layer_widget.cpp @@ -331,7 +331,7 @@ QRect LayerWidget::countGeometry(int newWidth) { contentTop, contentWidth, contentHeight, - }, expanding, additionalScroll, maxVisibleHeight); + }, expanding, _contentTillBottom, additionalScroll, maxVisibleHeight); return QRect(newLeft, newTop, newWidth, desiredHeight); } diff --git a/Telegram/SourceFiles/info/info_section_widget.cpp b/Telegram/SourceFiles/info/info_section_widget.cpp index 3dc737b486..0cb471757a 100644 --- a/Telegram/SourceFiles/info/info_section_widget.cpp +++ b/Telegram/SourceFiles/info/info_section_widget.cpp @@ -50,6 +50,7 @@ void SectionWidget::init() { return (_content != nullptr); }) | rpl::on_next([=](QSize size, int) { const auto expanding = false; + const auto contentTillBottom = true; const auto full = !_content->scrollBottomSkip(); const auto additionalScroll = (full ? st::boxRadius : 0); const auto height = size.height() - (full ? 0 : st::boxRadius); @@ -57,6 +58,7 @@ void SectionWidget::init() { _content->updateGeometry( wrapGeometry, expanding, + contentTillBottom, additionalScroll, size.height()); }, lifetime()); diff --git a/Telegram/SourceFiles/info/info_wrap_widget.cpp b/Telegram/SourceFiles/info/info_wrap_widget.cpp index f7c8771966..6376939a87 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.cpp +++ b/Telegram/SourceFiles/info/info_wrap_widget.cpp @@ -772,6 +772,10 @@ void WrapWidget::setWrap(Wrap wrap) { _wrap = wrap; } +rpl::producer WrapWidget::contentTillBottomValue() const { + return _contentTillBottom.value(); +} + rpl::producer<> WrapWidget::contentChanged() const { return _contentChanges.events(); } @@ -1107,6 +1111,7 @@ object_ptr WrapWidget::createTopBarSurrogate( void WrapWidget::updateGeometry( QRect newGeometry, bool expanding, + bool contentTillBottom, int additionalScroll, int maxVisibleHeight) { auto scrollChanged = (_additionalScroll != additionalScroll); @@ -1115,6 +1120,7 @@ void WrapWidget::updateGeometry( _additionalScroll = additionalScroll; _maxVisibleHeight = maxVisibleHeight; _expanding = expanding; + _contentTillBottom = contentTillBottom; _content->applyMaxVisibleHeight(maxVisibleHeight); diff --git a/Telegram/SourceFiles/info/info_wrap_widget.h b/Telegram/SourceFiles/info/info_wrap_widget.h index 02a55092eb..ed096dc3e1 100644 --- a/Telegram/SourceFiles/info/info_wrap_widget.h +++ b/Telegram/SourceFiles/info/info_wrap_widget.h @@ -93,17 +93,18 @@ public: Wrap wrap, not_null memento); - Key key() const; + [[nodiscard]] Key key() const; Dialogs::RowDescriptor activeChat() const override; - Wrap wrap() const { + [[nodiscard]] Wrap wrap() const { return _wrap.current(); } - rpl::producer wrapValue() const; + [[nodiscard]] rpl::producer wrapValue() const; void setWrap(Wrap wrap); - rpl::producer<> contentChanged() const; + [[nodiscard]] rpl::producer contentTillBottomValue() const; + [[nodiscard]] rpl::producer<> contentChanged() const; - not_null controller() { + [[nodiscard]] not_null controller() { return _controller.get(); } @@ -137,6 +138,7 @@ public: void updateGeometry( QRect newGeometry, bool expanding, + bool contentTillBottom, int additionalScroll, int maxVisibleHeight); [[nodiscard]] int scrollBottomSkip() const; @@ -229,6 +231,7 @@ private: int _maxVisibleHeight = 0; bool _expanding = false; rpl::variable _grabbingForExpanding = false; + rpl::variable _contentTillBottom = false; object_ptr _topBar = { nullptr }; object_ptr _topBarSurrogate = { nullptr }; Ui::Animations::Simple _topBarOverrideAnimation;