From c468f8b3c67312bddfc29983d4306ba766e2a765 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 18 May 2022 14:17:10 +0400 Subject: [PATCH] Allow adding any buttons to BoxContent. --- ui/layers/box_content.cpp | 63 +++++++++++++++++++++++++++++++++- ui/layers/box_content.h | 62 +++++++++++++-------------------- ui/layers/box_layer_widget.cpp | 49 ++++++++++---------------- ui/layers/box_layer_widget.h | 25 ++++---------- 4 files changed, 111 insertions(+), 88 deletions(-) diff --git a/ui/layers/box_content.cpp b/ui/layers/box_content.cpp index d669d80..e1a0423 100644 --- a/ui/layers/box_content.cpp +++ b/ui/layers/box_content.cpp @@ -24,6 +24,13 @@ void BoxContent::setTitle(rpl::producer title) { getDelegate()->setTitle(std::move(title) | Text::ToWithEntities()); } +QPointer BoxContent::addButton( + object_ptr button) { + auto result = QPointer(button.data()); + getDelegate()->addButton(std::move(button)); + return result; +} + QPointer BoxContent::addButton( rpl::producer text, Fn clickCallback) { @@ -33,15 +40,69 @@ QPointer BoxContent::addButton( getDelegate()->style().button); } +QPointer BoxContent::addButton( + rpl::producer text, + const style::RoundButton &st) { + return addButton(std::move(text), nullptr, st); +} + +QPointer BoxContent::addButton( + rpl::producer text, + Fn clickCallback, + const style::RoundButton &st) { + auto button = object_ptr(this, std::move(text), st); + auto result = QPointer(button.data()); + result->setTextTransform(RoundButton::TextTransform::NoTransform); + result->setClickedCallback(std::move(clickCallback)); + getDelegate()->addButton(std::move(button)); + return result; +} + +QPointer BoxContent::addLeftButton( + object_ptr button) { + auto result = QPointer(button.data()); + getDelegate()->addLeftButton(std::move(button)); + return result; +} + QPointer BoxContent::addLeftButton( rpl::producer text, Fn clickCallback) { - return getDelegate()->addLeftButton( + return addLeftButton( std::move(text), std::move(clickCallback), getDelegate()->style().button); } +QPointer BoxContent::addLeftButton( + rpl::producer text, + Fn clickCallback, + const style::RoundButton &st) { + auto button = object_ptr(this, std::move(text), st); + const auto result = QPointer(button.data()); + result->setTextTransform(RoundButton::TextTransform::NoTransform); + result->setClickedCallback(std::move(clickCallback)); + getDelegate()->addLeftButton(std::move(button)); + return result; +} + +QPointer BoxContent::addTopButton( + object_ptr button) { + auto result = QPointer(button.data()); + getDelegate()->addTopButton(std::move(button)); + return result; +} + +QPointer BoxContent::addTopButton( + const style::IconButton &st, + Fn clickCallback) { + auto button = object_ptr(this, st); + const auto result = QPointer(button.data()); + result->setClickedCallback(std::move(clickCallback)); + getDelegate()->addTopButton(std::move(button)); + return result; +} + void BoxContent::setInner(object_ptr inner) { setInner(std::move(inner), st::boxScroll); } diff --git a/ui/layers/box_content.h b/ui/layers/box_content.h index e1a5bb4..fa275f5 100644 --- a/ui/layers/box_content.h +++ b/ui/layers/box_content.h @@ -43,6 +43,7 @@ inline object_ptr Box(Args &&...args) { namespace Ui { +class AbstractButton; class RoundButton; class IconButton; class ScrollArea; @@ -60,17 +61,9 @@ public: virtual void setCloseByOutsideClick(bool close) = 0; virtual void clearButtons() = 0; - virtual QPointer addButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) = 0; - virtual QPointer addLeftButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) = 0; - virtual QPointer addTopButton( - const style::IconButton &st, - Fn clickCallback) = 0; + virtual void addButton(object_ptr button) = 0; + virtual void addLeftButton(object_ptr button) = 0; + virtual void addTopButton(object_ptr button) = 0; virtual void showLoading(bool show) = 0; virtual void updateButtonsPositions() = 0; @@ -141,40 +134,31 @@ public: void clearButtons() { getDelegate()->clearButtons(); } + QPointer addButton(object_ptr button); QPointer addButton( rpl::producer text, Fn clickCallback = nullptr); + QPointer addButton( + rpl::producer text, + const style::RoundButton &st); + QPointer addButton( + rpl::producer text, + Fn clickCallback, + const style::RoundButton &st); + QPointer addLeftButton( + object_ptr button); + QPointer addLeftButton( + rpl::producer text, + Fn clickCallback = nullptr); QPointer addLeftButton( rpl::producer text, - Fn clickCallback = nullptr); + Fn clickCallback, + const style::RoundButton& st); + QPointer addTopButton( + object_ptr button); QPointer addTopButton( - const style::IconButton &st, - Fn clickCallback = nullptr) { - return getDelegate()->addTopButton(st, std::move(clickCallback)); - } - QPointer addButton( - rpl::producer text, - const style::RoundButton &st) { - return getDelegate()->addButton(std::move(text), nullptr, st); - } - QPointer addButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) { - return getDelegate()->addButton( - std::move(text), - std::move(clickCallback), - st); - } - QPointer addLeftButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton& st) { - return getDelegate()->addLeftButton( - std::move(text), - std::move(clickCallback), - st); - } + const style::IconButton &st, + Fn clickCallback = nullptr); void showLoading(bool show) { getDelegate()->showLoading(show); } diff --git a/ui/layers/box_layer_widget.cpp b/ui/layers/box_layer_widget.cpp index 1336a5c..860fead 100644 --- a/ui/layers/box_layer_widget.cpp +++ b/ui/layers/box_layer_widget.cpp @@ -263,46 +263,35 @@ void BoxLayerWidget::clearButtons() { _topButton = nullptr; } -QPointer BoxLayerWidget::addButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) { - _buttons.emplace_back(this, std::move(text), st); - auto result = QPointer(_buttons.back()); - result->setTextTransform(RoundButton::TextTransform::NoTransform); - result->setClickedCallback(std::move(clickCallback)); - result->show(); - result->widthValue( +void BoxLayerWidget::addButton(object_ptr button) { + _buttons.push_back(std::move(button)); + const auto raw = _buttons.back().data(); + raw->setParent(this); + raw->show(); + raw->widthValue( ) | rpl::start_with_next([=] { updateButtonsPositions(); - }, result->lifetime()); - return result; + }, raw->lifetime()); } -QPointer BoxLayerWidget::addLeftButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) { - _leftButton = object_ptr(this, std::move(text), st); - auto result = QPointer(_leftButton); - result->setTextTransform(RoundButton::TextTransform::NoTransform); - result->setClickedCallback(std::move(clickCallback)); - result->show(); - result->widthValue( +void BoxLayerWidget::addLeftButton(object_ptr button) { + _leftButton = std::move(button); + const auto raw = _leftButton.data(); + raw->setParent(this); + raw->show(); + raw->widthValue( ) | rpl::start_with_next([=] { updateButtonsPositions(); - }, result->lifetime()); - return result; + }, raw->lifetime()); } -QPointer BoxLayerWidget::addTopButton(const style::IconButton &st, Fn clickCallback) { - _topButton = base::make_unique_q(this, st); - auto result = QPointer(_topButton.get()); - result->setClickedCallback(std::move(clickCallback)); - result->show(); +void BoxLayerWidget::addTopButton(object_ptr button) { + _topButton = base::make_unique_q(button.release()); + const auto raw = _topButton.get(); + raw->setParent(this); + raw->show(); updateButtonsPositions(); updateTitlePosition(); - return result; } void BoxLayerWidget::showLoading(bool show) { diff --git a/ui/layers/box_layer_widget.h b/ui/layers/box_layer_widget.h index b1f1fce..8d6e182 100644 --- a/ui/layers/box_layer_widget.h +++ b/ui/layers/box_layer_widget.h @@ -21,15 +21,12 @@ enum class type : uchar; } // namespace anim namespace style { -struct RoundButton; -struct IconButton; struct Box; } // namespace style namespace Ui { -class RoundButton; -class IconButton; +class AbstractButton; class FlatLabel; class BoxLayerWidget : public LayerWidget, public BoxContentDelegate { @@ -56,17 +53,9 @@ public: } void clearButtons() override; - QPointer addButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) override; - QPointer addLeftButton( - rpl::producer text, - Fn clickCallback, - const style::RoundButton &st) override; - QPointer addTopButton( - const style::IconButton &st, - Fn clickCallback) override; + void addButton(object_ptr button) override; + void addLeftButton(object_ptr button) override; + void addTopButton(object_ptr button) override; void showLoading(bool show) override; void updateButtonsPositions() override; QPointer outerContainer() override; @@ -141,9 +130,9 @@ private: int _titleTop = 0; bool _closeByOutsideClick = true; - std::vector> _buttons; - object_ptr _leftButton = { nullptr }; - base::unique_qptr _topButton = { nullptr }; + std::vector> _buttons; + object_ptr _leftButton = { nullptr }; + base::unique_qptr _topButton = { nullptr }; std::unique_ptr _loadingProgress; };