aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ui/render/TreeRenderObject.cpp42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/ui/render/TreeRenderObject.cpp b/src/ui/render/TreeRenderObject.cpp
index 60ead683..bea5b9de 100644
--- a/src/ui/render/TreeRenderObject.cpp
+++ b/src/ui/render/TreeRenderObject.cpp
@@ -1,5 +1,7 @@
#include "cru/ui/render/TreeRenderObject.h"
+#include "cru/platform/graphics/Painter.h"
#include "cru/ui/render/MeasureRequirement.h"
+#include "cru/ui/render/RenderObject.h"
namespace cru::ui::render {
TreeRenderObjectItem::TreeRenderObjectItem(TreeRenderObject* tree_render_object,
@@ -44,6 +46,45 @@ void TreeRenderObject::SetTabWidth(float tab_width) {
InvalidateLayout();
}
+RenderObject* TreeRenderObjectItemHitTest(TreeRenderObjectItem* item,
+ const Point& point) {
+ auto render_object = item->GetRenderObject();
+ if (render_object) {
+ auto result = render_object->HitTest(point - render_object->GetOffset());
+ if (result) return result;
+ }
+
+ for (auto child : item->GetChildren()) {
+ auto result = TreeRenderObjectItemHitTest(child, point);
+ if (result) return result;
+ }
+
+ return nullptr;
+}
+
+RenderObject* TreeRenderObject::HitTest(const Point& point) {
+ return TreeRenderObjectItemHitTest(root_item_, point);
+}
+
+void TreeRenderObjectItemDraw(TreeRenderObjectItem* item,
+ platform::graphics::IPainter* painter) {
+ auto render_object = item->GetRenderObject();
+ if (render_object) {
+ painter->PushState();
+ painter->ConcatTransform(Matrix::Translation(render_object->GetOffset()));
+ render_object->Draw(painter);
+ painter->PopState();
+ }
+
+ for (auto child : item->GetChildren()) {
+ TreeRenderObjectItemDraw(child, painter);
+ }
+}
+
+void TreeRenderObject::OnDrawCore(platform::graphics::IPainter* painter) {
+ TreeRenderObjectItemDraw(root_item_, painter);
+}
+
static Size MeasureTreeRenderObjectItem(MeasureSize max_size,
TreeRenderObjectItem* item,
float tab_width) {
@@ -88,7 +129,6 @@ Size TreeRenderObject::OnMeasureContent(const MeasureRequirement& requirement,
static void LayoutTreeRenderObjectItem(Rect rect, TreeRenderObjectItem* item,
float tab_width) {
- item->SetCachedOffset(rect.GetLeftTop());
auto render_object = item->GetRenderObject();
float item_height = 0.f;
if (render_object) {