Added ability to append pinned to bottom content to settings sections.

This commit is contained in:
23rd 2022-05-03 18:43:04 +03:00
parent 972666440e
commit 5fb71cb165
5 changed files with 45 additions and 8 deletions

View file

@ -61,7 +61,9 @@ ContentWidget::ContentWidget(
refreshSearchField(shown); refreshSearchField(shown);
}, lifetime()); }, lifetime());
} }
_scrollTopSkip.changes( rpl::merge(
_scrollTopSkip.changes(),
_scrollBottomSkip.changes()
) | rpl::start_with_next([this] { ) | rpl::start_with_next([this] {
updateControlsGeometry(); updateControlsGeometry();
}, lifetime()); }, lifetime());
@ -79,7 +81,7 @@ void ContentWidget::updateControlsGeometry() {
auto newScrollTop = _scroll->scrollTop() + _topDelta; auto newScrollTop = _scroll->scrollTop() + _topDelta;
auto scrollGeometry = rect().marginsRemoved( auto scrollGeometry = rect().marginsRemoved(
QMargins(0, _scrollTopSkip.current(), 0, 0)); { 0, _scrollTopSkip.current(), 0, _scrollBottomSkip.current() });
if (_scroll->geometry() != scrollGeometry) { if (_scroll->geometry() != scrollGeometry) {
_scroll->setGeometry(scrollGeometry); _scroll->setGeometry(scrollGeometry);
} }
@ -159,9 +161,11 @@ Ui::RpWidget *ContentWidget::doSetInnerWidget(
} }
int ContentWidget::scrollTillBottom(int forHeight) const { int ContentWidget::scrollTillBottom(int forHeight) const {
auto scrollHeight = forHeight - _scrollTopSkip.current(); const auto scrollHeight = forHeight
auto scrollBottom = _scroll->scrollTop() + scrollHeight; - _scrollTopSkip.current()
auto desired = _innerDesiredHeight; - _scrollBottomSkip.current();
const auto scrollBottom = _scroll->scrollTop() + scrollHeight;
const auto desired = _innerDesiredHeight;
return std::max(desired - scrollBottom, 0); return std::max(desired - scrollBottom, 0);
} }
@ -173,6 +177,10 @@ void ContentWidget::setScrollTopSkip(int scrollTopSkip) {
_scrollTopSkip = scrollTopSkip; _scrollTopSkip = scrollTopSkip;
} }
void ContentWidget::setScrollBottomSkip(int scrollBottomSkip) {
_scrollBottomSkip = scrollBottomSkip;
}
rpl::producer<int> ContentWidget::scrollHeightValue() const { rpl::producer<int> ContentWidget::scrollHeightValue() const {
return _scroll->heightValue(); return _scroll->heightValue();
} }
@ -187,8 +195,9 @@ rpl::producer<int> ContentWidget::desiredHeightValue() const {
using namespace rpl::mappers; using namespace rpl::mappers;
return rpl::combine( return rpl::combine(
_innerWrap->entity()->desiredHeightValue(), _innerWrap->entity()->desiredHeightValue(),
_scrollTopSkip.value() _scrollTopSkip.value(),
) | rpl::map(_1 + _2); _scrollBottomSkip.value()
) | rpl::map(_1 + _2 + _3);
} }
rpl::producer<bool> ContentWidget::desiredShadowVisibility() const { rpl::producer<bool> ContentWidget::desiredShadowVisibility() const {

View file

@ -94,6 +94,7 @@ protected:
void paintEvent(QPaintEvent *e) override; void paintEvent(QPaintEvent *e) override;
void setScrollTopSkip(int scrollTopSkip); void setScrollTopSkip(int scrollTopSkip);
void setScrollBottomSkip(int scrollBottomSkip);
int scrollTopSave() const; int scrollTopSave() const;
void scrollTopRestore(int scrollTop); void scrollTopRestore(int scrollTop);
void scrollTo(const Ui::ScrollToRequest &request); void scrollTo(const Ui::ScrollToRequest &request);
@ -109,6 +110,7 @@ private:
style::color _bg; style::color _bg;
rpl::variable<int> _scrollTopSkip = -1; rpl::variable<int> _scrollTopSkip = -1;
rpl::variable<int> _scrollBottomSkip = -1;
rpl::event_stream<int> _scrollTillBottomChanges; rpl::event_stream<int> _scrollTillBottomChanges;
object_ptr<Ui::ScrollArea> _scroll; object_ptr<Ui::ScrollArea> _scroll;
Ui::PaddingWrap<Ui::RpWidget> *_innerWrap = nullptr; Ui::PaddingWrap<Ui::RpWidget> *_innerWrap = nullptr;

View file

@ -48,7 +48,8 @@ Widget::Widget(
, _inner( , _inner(
setInnerWidget( setInnerWidget(
_type()->create(this, controller->parentController()))) _type()->create(this, controller->parentController())))
, _pinnedToTop(_inner->createPinnedToTop(this)) { , _pinnedToTop(_inner->createPinnedToTop(this))
, _pinnedToBottom(_inner->createPinnedToBottom(this)) {
_inner->sectionShowOther( _inner->sectionShowOther(
) | rpl::start_with_next([=](Type type) { ) | rpl::start_with_next([=](Type type) {
controller->showSettings(type); controller->showSettings(type);
@ -81,6 +82,26 @@ Widget::Widget(
setScrollTopSkip(h); setScrollTopSkip(h);
}, _pinnedToTop->lifetime()); }, _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; Widget::~Widget() = default;

View file

@ -83,6 +83,7 @@ private:
not_null<::Settings::AbstractSection*> _inner; not_null<::Settings::AbstractSection*> _inner;
QPointer<Ui::RpWidget> _pinnedToTop; QPointer<Ui::RpWidget> _pinnedToTop;
QPointer<Ui::RpWidget> _pinnedToBottom;
rpl::event_stream<std::vector<Type>> _removesFromStack; rpl::event_stream<std::vector<Type>> _removesFromStack;

View file

@ -96,6 +96,10 @@ public:
not_null<QWidget*> parent) { not_null<QWidget*> parent) {
return nullptr; return nullptr;
} }
[[nodiscard]] virtual QPointer<Ui::RpWidget> createPinnedToBottom(
not_null<Ui::RpWidget*> parent) {
return nullptr;
}
}; };
template <typename SectionType> template <typename SectionType>