From b8863c403a44c1c7ac35f1a1da92bbf3c8858552 Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 9 Feb 2022 23:53:18 +0800 Subject: ... --- include/cru/ui/controls/SingleChildControl.h | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 include/cru/ui/controls/SingleChildControl.h (limited to 'include/cru/ui/controls/SingleChildControl.h') diff --git a/include/cru/ui/controls/SingleChildControl.h b/include/cru/ui/controls/SingleChildControl.h new file mode 100644 index 00000000..037d6dd3 --- /dev/null +++ b/include/cru/ui/controls/SingleChildControl.h @@ -0,0 +1,55 @@ +#pragma once +#include "Control.h" + +namespace cru::ui::controls { +template +class CRU_UI_API SingleChildControl : public Control { + protected: + SingleChildControl() : container_render_object_(new TRenderObject()) { + container_render_object_->SetAttachedControl(this); + } + + public: + CRU_DELETE_COPY(SingleChildControl) + CRU_DELETE_MOVE(SingleChildControl) + + ~SingleChildControl() override {} + + Control* GetChild() const { return child_; } + void SetChild(Control* child) { + if (child == child_) return; + + assert(child == nullptr || child->GetParent() == nullptr); + + if (child_) { + child_->SetParent(nullptr); + } + + child_ = child; + + if (child) { + child->SetParent(this); + } + + container_render_object_->SetChild(child->GetRenderObject()); + } + + render::RenderObject* GetRenderObject() const override { + return container_render_object_.get(); + } + + TRenderObject* GetContainerRenderObject() const { + return container_render_object_.get(); + } + + void ForEachChild(const std::function& predicate) override { + if (child_) { + predicate(child_); + } + } + + private: + Control* child_; + std::unique_ptr container_render_object_; +}; +} // namespace cru::ui::controls -- cgit v1.2.3