aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/cru/ui/controls/Control.h14
-rw-r--r--include/cru/ui/controls/RootControl.h4
-rw-r--r--include/cru/ui/controls/SingleChildControl.h3
-rw-r--r--include/cru/ui/host/WindowHost.h1
4 files changed, 16 insertions, 6 deletions
diff --git a/include/cru/ui/controls/Control.h b/include/cru/ui/controls/Control.h
index 97096e35..4dad4549 100644
--- a/include/cru/ui/controls/Control.h
+++ b/include/cru/ui/controls/Control.h
@@ -17,6 +17,8 @@ namespace cru::ui::controls {
* former one is even not used.
*/
class CRU_UI_API Control : public Object {
+ friend class RootControl;
+
protected:
Control();
@@ -32,7 +34,7 @@ class CRU_UI_API Control : public Object {
//*************** region: tree ***************
public:
- virtual host::WindowHost* GetWindowHost() const;
+ host::WindowHost* GetWindowHost() const { return window_host_; }
Control* GetParent() const { return parent_; }
void SetParent(Control* parent);
@@ -143,12 +145,22 @@ class CRU_UI_API Control : public Object {
protected:
virtual void OnParentChanged(Control* old_parent, Control* new_parent) {}
+ virtual void OnWindowHostChanged(host::WindowHost* old_host,
+ host::WindowHost* new_host) {}
+
protected:
virtual void OnMouseHoverChange(bool newHover) { CRU_UNUSED(newHover) }
private:
+ void OnParentChangedCore(Control* old_parent, Control* new_parent);
+ void OnWindowHostChangedCore(host::WindowHost* old_host,
+ host::WindowHost* new_host);
+
+ private:
Control* parent_ = nullptr;
+ host::WindowHost* window_host_ = nullptr;
+
private:
bool is_mouse_over_ = false;
diff --git a/include/cru/ui/controls/RootControl.h b/include/cru/ui/controls/RootControl.h
index a1878836..851b4db0 100644
--- a/include/cru/ui/controls/RootControl.h
+++ b/include/cru/ui/controls/RootControl.h
@@ -18,10 +18,6 @@ class CRU_UI_API RootControl
~RootControl() override;
public:
- host::WindowHost* GetWindowHost() const override {
- return window_host_.get();
- }
-
platform::gui::INativeWindow* GetNativeWindow();
protected:
diff --git a/include/cru/ui/controls/SingleChildControl.h b/include/cru/ui/controls/SingleChildControl.h
index 6bf150c0..e733c825 100644
--- a/include/cru/ui/controls/SingleChildControl.h
+++ b/include/cru/ui/controls/SingleChildControl.h
@@ -31,7 +31,8 @@ class SingleChildControl : public Control {
child->SetParent(this);
}
- container_render_object_->SetChild(child->GetRenderObject());
+ container_render_object_->SetChild(
+ child == nullptr ? nullptr : child->GetRenderObject());
}
render::RenderObject* GetRenderObject() const override {
diff --git a/include/cru/ui/host/WindowHost.h b/include/cru/ui/host/WindowHost.h
index 1de915e0..9fe46ac0 100644
--- a/include/cru/ui/host/WindowHost.h
+++ b/include/cru/ui/host/WindowHost.h
@@ -18,6 +18,7 @@ struct AfterLayoutEventArgs {};
// The bridge between control tree and native window.
class CRU_UI_API WindowHost : public Object {
+ friend controls::Control;
CRU_DEFINE_CLASS_LOG_TAG(u"cru::ui::host::WindowHost")
public: