aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/controls
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-02-10 22:06:50 +0800
committercrupest <crupest@outlook.com>2022-02-10 22:06:50 +0800
commitf65d0502a9f0fc44be0dd79a5f3f31697bb3aad0 (patch)
treec24a3a25284c94d52af5264dda996bfdd311857b /include/cru/ui/controls
parenta236a2a146bfcc4eb5c93a85cd99ac330e83a7f5 (diff)
downloadcru-f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0.tar.gz
cru-f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0.tar.bz2
cru-f65d0502a9f0fc44be0dd79a5f3f31697bb3aad0.zip
...
Diffstat (limited to 'include/cru/ui/controls')
-rw-r--r--include/cru/ui/controls/Control.h4
-rw-r--r--include/cru/ui/controls/TreeView.h41
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