diff options
Diffstat (limited to 'include/cru/ui')
| -rw-r--r-- | include/cru/ui/controls/ControlHost.h | 7 | ||||
| -rw-r--r-- | include/cru/ui/render/BorderRenderObject.h | 2 | ||||
| -rw-r--r-- | include/cru/ui/render/CanvasRenderObject.h | 3 | ||||
| -rw-r--r-- | include/cru/ui/render/GeometryRenderObject.h | 2 | ||||
| -rw-r--r-- | include/cru/ui/render/LayoutRenderObject.h | 20 | ||||
| -rw-r--r-- | include/cru/ui/render/RenderObject.h | 42 | ||||
| -rw-r--r-- | include/cru/ui/render/ScrollRenderObject.h | 3 | ||||
| -rw-r--r-- | include/cru/ui/render/TextRenderObject.h | 3 | ||||
| -rw-r--r-- | include/cru/ui/render/TreeRenderObject.h | 3 |
9 files changed, 38 insertions, 47 deletions
diff --git a/include/cru/ui/controls/ControlHost.h b/include/cru/ui/controls/ControlHost.h index 5d0b7947..e6eb472d 100644 --- a/include/cru/ui/controls/ControlHost.h +++ b/include/cru/ui/controls/ControlHost.h @@ -23,6 +23,9 @@ class CRU_UI_API ControlHost : public Object { void ScheduleRepaint(); void ScheduleRelayout(); + Rect GetPaintInvalidArea(); + void AddPaintInvalidArea(const Rect& area); + void Repaint(); void Relayout(); void RelayoutWithSize(const Size& available_size = Size::Infinite(), @@ -56,7 +59,7 @@ class CRU_UI_API ControlHost : public Object { std::unique_ptr<platform::gui::INativeWindow> CreateNativeWindow(); void OnNativeDestroy(std::nullptr_t); - void OnNativePaint(std::nullptr_t); + void OnNativePaint1(const cru::platform::gui::NativePaintEventArgs& args); void OnNativeResize(const Size& size); void OnNativeFocus(cru::platform::gui::FocusChangeType focus); void OnNativeMouseEnterLeave(cru::platform::gui::MouseEnterLeaveType enter); @@ -190,6 +193,8 @@ class CRU_UI_API ControlHost : public Object { bool layout_prefer_to_fill_window_; + Rect paint_invalid_area_; + platform::gui::TimerAutoCanceler relayout_schedule_canceler_; }; } // namespace cru::ui::controls diff --git a/include/cru/ui/render/BorderRenderObject.h b/include/cru/ui/render/BorderRenderObject.h index 73fc85c1..c011cda0 100644 --- a/include/cru/ui/render/BorderRenderObject.h +++ b/include/cru/ui/render/BorderRenderObject.h @@ -43,7 +43,6 @@ class CRU_UI_API BorderRenderObject : public SingleChildRenderObject { void ApplyBorderStyle(const style::ApplyBorderStyleInfo& style); RenderObject* HitTest(const Point& point) override; - void Draw(platform::graphics::IPainter* painter) override; Thickness GetTotalSpaceThickness() override; Thickness GetInnerSpaceThickness() override; @@ -53,6 +52,7 @@ class CRU_UI_API BorderRenderObject : public SingleChildRenderObject { protected: Size OnMeasureContent(const MeasureRequirement& requirement) override; void OnLayoutContent(const Rect& content_rect) override; + void OnDraw(RenderObjectDrawContext& context) override; void OnResize(const Size& new_size) override; diff --git a/include/cru/ui/render/CanvasRenderObject.h b/include/cru/ui/render/CanvasRenderObject.h index 2e44fcc2..b2da3207 100644 --- a/include/cru/ui/render/CanvasRenderObject.h +++ b/include/cru/ui/render/CanvasRenderObject.h @@ -33,12 +33,11 @@ class CRU_UI_API CanvasRenderObject : public RenderObject { public: RenderObject* HitTest(const Point& point) override; - void Draw(platform::graphics::IPainter* painter) override; - CRU_DEFINE_EVENT(Paint, const CanvasPaintEventArgs&) protected: Size OnMeasureContent(const MeasureRequirement& requirement) override; void OnLayoutContent(const Rect& content_rect) override; + void OnDraw(RenderObjectDrawContext& context) override; }; } // namespace cru::ui::render diff --git a/include/cru/ui/render/GeometryRenderObject.h b/include/cru/ui/render/GeometryRenderObject.h index 1994daf3..455af6b8 100644 --- a/include/cru/ui/render/GeometryRenderObject.h +++ b/include/cru/ui/render/GeometryRenderObject.h @@ -15,7 +15,6 @@ class GeometryRenderObject : public RenderObject { GeometryRenderObject(); public: - void Draw(platform::graphics::IPainter* painter) override; RenderObject* HitTest(const Point& point) override; std::shared_ptr<platform::graphics::IGeometry> GetGeometry(); @@ -37,6 +36,7 @@ class GeometryRenderObject : public RenderObject { protected: Size OnMeasureContent(const MeasureRequirement& requirement) override; void OnLayoutContent(const Rect& content_rect) override; + void OnDraw(RenderObjectDrawContext& context) override; private: std::shared_ptr<platform::graphics::IGeometry> geometry_ = nullptr; diff --git a/include/cru/ui/render/LayoutRenderObject.h b/include/cru/ui/render/LayoutRenderObject.h index 5cb70680..99dd8057 100644 --- a/include/cru/ui/render/LayoutRenderObject.h +++ b/include/cru/ui/render/LayoutRenderObject.h @@ -1,8 +1,6 @@ #pragma once #include "RenderObject.h" -#include "cru/platform/graphics/Painter.h" - namespace cru::ui::render { template <typename TChildLayoutData> class LayoutRenderObject : public RenderObject { @@ -81,16 +79,6 @@ class LayoutRenderObject : public RenderObject { InvalidateLayout(); } - void Draw(platform::graphics::IPainter* painter) override { - for (const auto& child : children_) { - painter->PushState(); - painter->ConcatTransform( - Matrix::Translation(child.render_object->GetOffset())); - child.render_object->Draw(painter); - painter->PopState(); - } - } - RenderObject* HitTest(const Point& point) override { const auto child_count = GetChildCount(); for (auto i = child_count - 1; i >= 0; --i) { @@ -104,6 +92,14 @@ class LayoutRenderObject : public RenderObject { return GetPaddingRect().IsPointInside(point) ? this : nullptr; } + protected: + void OnDraw(RenderObjectDrawContext& context) override { + auto painter = context.painter; + for (const auto& child : children_) { + context.DrawChild(child.render_object); + } + } + private: std::vector<ChildData> children_; }; diff --git a/include/cru/ui/render/RenderObject.h b/include/cru/ui/render/RenderObject.h index e696aefe..85cb7990 100644 --- a/include/cru/ui/render/RenderObject.h +++ b/include/cru/ui/render/RenderObject.h @@ -1,33 +1,24 @@ #pragma once #include "../Base.h" - #include "MeasureRequirement.h" #include <cru/base/Event.h> #include <cru/platform/graphics/Painter.h> + #include <string> namespace cru::ui::render { -struct BoxConstraint { - static const BoxConstraint kNotLimit; - - Size max; - Size min; +class RenderObject; - constexpr bool Validate() const { - return max.width >= min.width && max.height >= min.height && - min.width >= 0 && min.height >= 0; - } - - constexpr bool Satisfy(const Size& size) const { - return size.width <= max.width && size.height <= max.height && - size.width >= min.width && size.height >= min.height; - } +struct CRU_UI_API RenderObjectDrawContext { + /** + * Coordinates are related to the render object to be painted. So parent + * render object should adjust this before passing to children. + */ + Rect paint_invalid_area; + platform::graphics::IPainter* painter; - constexpr Size Coerce(const Size& size) const { - return Size{std::min(std::max(size.width, min.width), max.width), - std::min(std::max(size.height, min.height), max.height)}; - } + void DrawChild(RenderObject* render_object); }; /** @@ -37,11 +28,11 @@ struct BoxConstraint { * To write a custom RenderObject, override following methods: * * public: - * void Draw(platform::graphics::IPainter* painter) override; * RenderObject* HitTest(const Point& point) override; * protected: * Size OnMeasureContent(const MeasureRequirement& requirement) override; * void OnLayoutContent(const Rect& content_rect) override; + * void OnDraw(RenderObjectDrawContext& context) override; */ class CRU_UI_API RenderObject : public Object { private: @@ -124,10 +115,12 @@ class CRU_UI_API RenderObject : public Object { virtual Rect GetPaddingRect(); virtual Rect GetContentRect(); - virtual void Draw(platform::graphics::IPainter* painter) = 0; + virtual Rect GetRenderRect(); - // Param point must be relative the lefttop of render object including margin. - // Add offset before pass point to children. + void Draw(RenderObjectDrawContext& context); + + // Param point must be relative the lefttop of render object including + // margin. Add offset before pass point to children. virtual RenderObject* HitTest(const Point& point) = 0; public: @@ -160,13 +153,14 @@ class CRU_UI_API RenderObject : public Object { // Override this function to measure content and children(Call Measure on // them). Do not consider margin or padding in this method because they are // already considered in OnMeasureCore. Returned size must obey requirement. - // Caller should guarantee preferred_size is corerced into required range. virtual Size OnMeasureContent(const MeasureRequirement& requirement) = 0; // Layout all content and children(Call Layout on them). // Lefttop of content_rect should be added when calculated children's offset. virtual void OnLayoutContent(const Rect& content_rect) = 0; + virtual void OnDraw(RenderObjectDrawContext& context) = 0; + virtual void OnAttachedControlChanged(controls::Control* old_control, controls::Control* new_control) {} diff --git a/include/cru/ui/render/ScrollRenderObject.h b/include/cru/ui/render/ScrollRenderObject.h index ae11f361..ed67331d 100644 --- a/include/cru/ui/render/ScrollRenderObject.h +++ b/include/cru/ui/render/ScrollRenderObject.h @@ -62,8 +62,6 @@ class CRU_UI_API ScrollRenderObject : public SingleChildRenderObject { bool VerticalCanScrollUp(); bool VerticalCanScrollDown(); - void Draw(platform::graphics::IPainter* painter) override; - protected: // Logic: // If available size is bigger than child's preferred size, then child's @@ -71,6 +69,7 @@ class CRU_UI_API ScrollRenderObject : public SingleChildRenderObject { // If not, all available size is taken while forming a scroll area. Size OnMeasureContent(const MeasureRequirement& requirement) override; void OnLayoutContent(const Rect& content_rect) override; + void OnDraw(RenderObjectDrawContext& context) override; void OnAttachedControlChanged(controls::Control* old_control, controls::Control* new_control) override; diff --git a/include/cru/ui/render/TextRenderObject.h b/include/cru/ui/render/TextRenderObject.h index 0d17853b..eefb3264 100644 --- a/include/cru/ui/render/TextRenderObject.h +++ b/include/cru/ui/render/TextRenderObject.h @@ -88,12 +88,11 @@ class CRU_UI_API TextRenderObject : public RenderObject { RenderObject* HitTest(const Point& point) override; - void Draw(platform::graphics::IPainter* painter) override; - protected: // See remarks of this class. Size OnMeasureContent(const MeasureRequirement& requirement) override; void OnLayoutContent(const Rect& content_rect) override; + void OnDraw(RenderObjectDrawContext& context) override; private: std::shared_ptr<platform::graphics::IBrush> brush_; diff --git a/include/cru/ui/render/TreeRenderObject.h b/include/cru/ui/render/TreeRenderObject.h index 599e0f65..425eee23 100644 --- a/include/cru/ui/render/TreeRenderObject.h +++ b/include/cru/ui/render/TreeRenderObject.h @@ -62,11 +62,10 @@ class CRU_UI_API TreeRenderObject : public RenderObject { RenderObject* HitTest(const Point& point) override; - void Draw(platform::graphics::IPainter* painter) override; - protected: Size OnMeasureContent(const MeasureRequirement& requirement) override; void OnLayoutContent(const Rect& content_rect) override; + void OnDraw(RenderObjectDrawContext& context) override; private: float tab_width_ = 12.f; |
