diff options
author | crupest <crupest@outlook.com> | 2022-02-10 22:06:50 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-02-10 22:06:50 +0800 |
commit | f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0 (patch) | |
tree | c24a3a25284c94d52af5264dda996bfdd311857b /include/cru | |
parent | a236a2a146bfcc4eb5c93a85cd99ac330e83a7f5 (diff) | |
download | cru-f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0.tar.gz cru-f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0.tar.bz2 cru-f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0.zip |
...
Diffstat (limited to 'include/cru')
-rw-r--r-- | include/cru/ui/controls/Control.h | 4 | ||||
-rw-r--r-- | include/cru/ui/controls/TreeView.h | 41 |
2 files changed, 42 insertions, 3 deletions
diff --git a/include/cru/ui/controls/Control.h b/include/cru/ui/controls/Control.h index 242db3f4..1d976970 100644 --- a/include/cru/ui/controls/Control.h +++ b/include/cru/ui/controls/Control.h @@ -9,9 +9,11 @@ namespace cru::ui::controls { * \remarks If you want to write a new control. You should override following * methods: * - GetControlType() + * - GetRenderObject() * - ForEachChild(const std::function<void(Control*)>& predicate) * - RemoveChild(Control* child) - * - GetRenderObject() + * The last two methods are totally for convenient control tree management. The + * former one is even not used. */ class CRU_UI_API Control : public Object { protected: diff --git a/include/cru/ui/controls/TreeView.h b/include/cru/ui/controls/TreeView.h index b36ca553..6c3c360b 100644 --- a/include/cru/ui/controls/TreeView.h +++ b/include/cru/ui/controls/TreeView.h @@ -1,5 +1,6 @@ #pragma once #include "Control.h" +#include "cru/ui/render/TreeRenderObject.h" namespace cru::ui::controls { class TreeView; @@ -7,31 +8,67 @@ class TreeView; class CRU_UI_API TreeViewItem : public Object { friend TreeView; + private: + TreeViewItem(TreeView* tree_view, TreeViewItem* parent, + render::TreeRenderObjectItem* render_object_item); + ~TreeViewItem() override; + public: - TreeViewItem(TreeView* tree_view, TreeViewItem* parent); CRU_DELETE_COPY(TreeViewItem) CRU_DELETE_MOVE(TreeViewItem) - ~TreeViewItem() override; TreeView* GetTreeView() { return tree_view_; } TreeViewItem* GetParent() { return parent_; } + render::TreeRenderObjectItem* GetRenderObjectItem() const { + return render_object_item_; + } + const std::vector<TreeViewItem*>& GetChildren() const { return children_; } Index GetChildCount() const { return children_.size(); } TreeViewItem* GetChildAt(Index index) { Expects(index >= 0 && index < children_.size()); return children_[index]; } + Index IndexOf(TreeViewItem* item) const; TreeViewItem* AddItem(Index position); void RemoveItem(Index position); + void RemoveFromParent(); + + Control* GetControl() const { return control_; } + void SetControl(Control* control); + + void TraverseDescendants(std::function<void(TreeViewItem*)> callback); private: TreeView* tree_view_; + render::TreeRenderObjectItem* render_object_item_; TreeViewItem* parent_; std::vector<TreeViewItem*> children_; Control* control_; }; +class CRU_UI_API TreeView : public Control { + public: + constexpr static StringView kControlType = u"TreeView"; + + TreeView(); + CRU_DELETE_COPY(TreeView) + CRU_DELETE_MOVE(TreeView) + ~TreeView() override; + + String GetControlType() const override { return kControlType.ToString(); } + render::TreeRenderObject* GetRenderObject() { return &render_object_; } + + void ForEachChild(const std::function<void(Control*)>& predicate) override; + void RemoveChild(Control* control) override; + + TreeViewItem* GetRootItem() { return &root_item_; } + + private: + render::TreeRenderObject render_object_; + TreeViewItem root_item_; +}; } // namespace cru::ui::controls |