aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-09-15 17:06:34 +0800
committer杨宇千 <crupest@outlook.com>2019-09-15 17:06:34 +0800
commit574e69fb379cd54fc3034fe45a155e770435b97d (patch)
tree96fab3a1db66fa974a135e777778e56a861745bc /include/cru/ui
parent55d98d3259e9f3e184ad6323d1d49d298bd1723b (diff)
downloadcru-574e69fb379cd54fc3034fe45a155e770435b97d.tar.gz
cru-574e69fb379cd54fc3034fe45a155e770435b97d.tar.bz2
cru-574e69fb379cd54fc3034fe45a155e770435b97d.zip
...
Diffstat (limited to 'include/cru/ui')
-rw-r--r--include/cru/ui/controls/container.hpp31
-rw-r--r--include/cru/ui/render/border_render_object.hpp55
2 files changed, 57 insertions, 29 deletions
diff --git a/include/cru/ui/controls/container.hpp b/include/cru/ui/controls/container.hpp
new file mode 100644
index 00000000..3c877067
--- /dev/null
+++ b/include/cru/ui/controls/container.hpp
@@ -0,0 +1,31 @@
+#pragma once
+#include "../content_control.hpp"
+
+namespace cru::ui::render {
+class BorderRenderObject;
+}
+
+namespace cru::ui::controls {
+class Container : public ContentControl {
+ static constexpr auto control_type = L"Container";
+
+ protected:
+ Container();
+
+ public:
+ CRU_DELETE_COPY(Container)
+ CRU_DELETE_MOVE(Container)
+
+ ~Container() override;
+
+ public:
+ std::wstring_view GetControlType() const override final {
+ return control_type;
+ }
+
+ render::RenderObject* GetRenderObject() const override;
+
+ private:
+ std::unique_ptr<render::BorderRenderObject> render_object_;
+};
+} // namespace cru::ui::controls
diff --git a/include/cru/ui/render/border_render_object.hpp b/include/cru/ui/render/border_render_object.hpp
index 69372eb8..5c147df5 100644
--- a/include/cru/ui/render/border_render_object.hpp
+++ b/include/cru/ui/render/border_render_object.hpp
@@ -33,48 +33,41 @@ struct CornerRadius {
};
struct BorderStyle {
- std::shared_ptr<platform::graph::Brush> brush;
- Thickness thickness;
- CornerRadius corner_radius;
+ std::shared_ptr<platform::graph::Brush> brush{};
+ Thickness thickness{};
+ CornerRadius corner_radius{};
};
class BorderRenderObject : public RenderObject {
public:
- explicit BorderRenderObject(std::shared_ptr<platform::graph::Brush> brush);
+ BorderRenderObject();
BorderRenderObject(const BorderRenderObject& other) = delete;
BorderRenderObject(BorderRenderObject&& other) = delete;
BorderRenderObject& operator=(const BorderRenderObject& other) = delete;
BorderRenderObject& operator=(BorderRenderObject&& other) = delete;
- ~BorderRenderObject() override = default;
+ ~BorderRenderObject() override;
- bool IsEnabled() const { return is_enabled_; }
- void SetEnabled(bool enabled) { is_enabled_ = enabled; }
+ bool IsBorderEnabled() const { return is_border_enabled_; }
+ void SetBorderEnabled(bool enabled) { is_border_enabled_ = enabled; }
- std::shared_ptr<platform::graph::Brush> GetBrush() const {
- return style_.brush;
- }
- void SetBrush(std::shared_ptr<platform::graph::Brush> new_brush) {
- style_.brush = std::move(new_brush);
+ BorderStyle* GetBorderStyle() {
+ return &border_style_;
}
- Thickness GetBorderWidth() const { return style_.thickness; }
- // Remember to call Refresh after set shape properties.
- void SetBorderWidth(const Thickness& thickness) {
- style_.thickness = thickness;
+ std::shared_ptr<platform::graph::Brush> GetForegroundBrush() {
+ return foreground_brush_;
}
- CornerRadius GetCornerRadius() const { return style_.corner_radius; }
- // Remember to call Refresh after set shape properties.
- void SetCornerRadius(const CornerRadius& new_corner_radius) {
- style_.corner_radius = new_corner_radius;
+ void SetForegroundBrush(std::shared_ptr<platform::graph::Brush> brush) {
+ foreground_brush_ = std::move(brush);
}
- BorderStyle GetStyle() const {
- return style_;
+ std::shared_ptr<platform::graph::Brush> GetBackgroundBrush() {
+ return foreground_brush_;
}
- // Remember to call Refresh after set shape properties.
- void SetStyle(BorderStyle newStyle) {
- style_ = std::move(newStyle);
+
+ void SetBackgroundBrush(std::shared_ptr<platform::graph::Brush> brush) {
+ foreground_brush_ = std::move(brush);
}
void Refresh() { RecreateGeometry(); }
@@ -101,13 +94,17 @@ class BorderRenderObject : public RenderObject {
void RecreateGeometry();
private:
- bool is_enabled_ = false;
+ bool is_border_enabled_ = false;
+ BorderStyle border_style_;
- BorderStyle style_;
+ std::shared_ptr<platform::graph::Brush> foreground_brush_;
+ std::shared_ptr<platform::graph::Brush> background_brush_;
// The ring. Used for painting.
- std::shared_ptr<platform::graph::Geometry> geometry_ = nullptr;
+ std::unique_ptr<platform::graph::Geometry> geometry_;
+ // Area including inner area of the border. Used for painting foreground and background.
+ std::unique_ptr<platform::graph::Geometry> border_inner_geometry_;
// Area including border ring and inner area. Used for hit test.
- std::shared_ptr<platform::graph::Geometry> border_outer_geometry_ = nullptr;
+ std::unique_ptr<platform::graph::Geometry> border_outer_geometry_;
};
} // namespace cru::ui::render