aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/controls/SingleChildControl.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui/controls/SingleChildControl.h')
-rw-r--r--include/cru/ui/controls/SingleChildControl.h55
1 files changed, 55 insertions, 0 deletions
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 <typename TRenderObject>
+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<void(Control*)>& predicate) override {
+ if (child_) {
+ predicate(child_);
+ }
+ }
+
+ private:
+ Control* child_;
+ std::unique_ptr<TRenderObject> container_render_object_;
+};
+} // namespace cru::ui::controls