aboutsummaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/CMakeLists.txt2
-rw-r--r--src/ui/controls/button.cpp15
-rw-r--r--src/ui/controls/container.cpp13
-rw-r--r--src/ui/controls/flex_layout.cpp4
-rw-r--r--src/ui/render/border_render_object.cpp61
5 files changed, 65 insertions, 30 deletions
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index ac69c644..18d1ca16 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -11,6 +11,7 @@ add_library(cru_ui STATIC
ui_manager.cpp
window.cpp
controls/button.cpp
+ controls/container.cpp
controls/flex_layout.cpp
controls/text_block.cpp
render/border_render_object.cpp
@@ -29,6 +30,7 @@ target_sources(cru_ui PUBLIC
${CRU_UI_INCLUDE_DIR}/ui_manager.hpp
${CRU_UI_INCLUDE_DIR}/window.hpp
${CRU_UI_INCLUDE_DIR}/controls/button.hpp
+ ${CRU_UI_INCLUDE_DIR}/controls/container.hpp
${CRU_UI_INCLUDE_DIR}/controls/flex_layout.hpp
${CRU_UI_INCLUDE_DIR}/controls/text_block.hpp
${CRU_UI_INCLUDE_DIR}/event/ui_event.hpp
diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp
index 5e32e064..1a1f4286 100644
--- a/src/ui/controls/button.cpp
+++ b/src/ui/controls/button.cpp
@@ -37,11 +37,10 @@ Button::Button() : click_detector_(this) {
border_style_.press_cancel.corner_radius =
render::CornerRadius{Point{10, 5}};
- render_object_.reset(
- new render::BorderRenderObject(border_style_.normal.brush));
+ render_object_.reset(new render::BorderRenderObject);
render_object_->SetAttachedControl(this);
- render_object_->SetEnabled(true);
- render_object_->SetStyle(border_style_.normal);
+ render_object_->SetBorderEnabled(true);
+ (*render_object_->GetBorderStyle()) = border_style_.normal;
MouseEnterEvent()->Direct()->AddHandler([this](event::MouseEventArgs& args) {
if (click_detector_.GetPressingButton() & trigger_button_) {
@@ -85,19 +84,19 @@ void Button::OnChildChanged(Control* old_child, Control* new_child) {
void Button::OnStateChange(ButtonState oldState, ButtonState newState) {
switch (newState) {
case ButtonState::Normal:
- render_object_->SetStyle(border_style_.normal);
+ (*render_object_->GetBorderStyle()) = border_style_.normal;
SetCursor(GetSystemCursor(SystemCursor::Arrow));
break;
case ButtonState::Hover:
- render_object_->SetStyle(border_style_.hover);
+ (*render_object_->GetBorderStyle()) = border_style_.hover;
SetCursor(GetSystemCursor(SystemCursor::Hand));
break;
case ButtonState::Press:
- render_object_->SetStyle(border_style_.press);
+ (*render_object_->GetBorderStyle()) = border_style_.press;
SetCursor(GetSystemCursor(SystemCursor::Hand));
break;
case ButtonState::PressCancel:
- render_object_->SetStyle(border_style_.press_cancel);
+ (*render_object_->GetBorderStyle()) = border_style_.press_cancel;
SetCursor(GetSystemCursor(SystemCursor::Arrow));
break;
}
diff --git a/src/ui/controls/container.cpp b/src/ui/controls/container.cpp
new file mode 100644
index 00000000..7ebee4b4
--- /dev/null
+++ b/src/ui/controls/container.cpp
@@ -0,0 +1,13 @@
+#include "cru/ui/controls/container.hpp"
+
+#include "cru/platform/graph/graph_factory.hpp"
+#include "cru/ui/render/border_render_object.hpp"
+
+namespace cru::ui::controls {
+Container::Container() {
+ render_object_.reset(new render::BorderRenderObject);
+ render_object_->SetBorderEnabled(false);
+}
+
+Container::~Container() {}
+} // namespace cru::ui::controls
diff --git a/src/ui/controls/flex_layout.cpp b/src/ui/controls/flex_layout.cpp
index bb8e3c14..a8200a12 100644
--- a/src/ui/controls/flex_layout.cpp
+++ b/src/ui/controls/flex_layout.cpp
@@ -22,7 +22,7 @@ FlexChildLayoutData FlexLayout::GetChildLayoutData(Control* control) {
if (find_result == render_objects.cend()) {
throw std::logic_error("Control is not a child of FlexLayout.");
}
- int position = find_result - render_objects.cbegin();
+ int position = static_cast<int>(find_result - render_objects.cbegin());
return *(render_object_->GetChildLayoutData(position));
}
@@ -35,7 +35,7 @@ void FlexLayout::SetChildLayoutData(Control* control,
if (find_result == render_objects.cend()) {
throw std::logic_error("Control is not a child of FlexLayout.");
}
- int position = find_result - render_objects.cbegin();
+ int position = static_cast<int>(find_result - render_objects.cbegin());
const auto d = render_object_->GetChildLayoutData(position);
*d = data;
if (const auto window = GetWindow()) window->InvalidateLayout();
diff --git a/src/ui/render/border_render_object.cpp b/src/ui/render/border_render_object.cpp
index 20bc2a50..68e74740 100644
--- a/src/ui/render/border_render_object.cpp
+++ b/src/ui/render/border_render_object.cpp
@@ -9,21 +9,30 @@
#include <cassert>
namespace cru::ui::render {
-BorderRenderObject::BorderRenderObject(
- std::shared_ptr<platform::graph::Brush> brush) {
- assert(brush);
- this->style_.brush = std::move(brush);
- RecreateGeometry();
-}
+BorderRenderObject::BorderRenderObject() { RecreateGeometry(); }
+
+BorderRenderObject::~BorderRenderObject() {}
void BorderRenderObject::Draw(platform::graph::Painter* painter) {
- painter->FillGeometry(geometry_.get(), style_.brush.get());
+ if (background_brush_ != nullptr)
+ painter->FillGeometry(border_inner_geometry_.get(),
+ background_brush_.get());
+ if (is_border_enabled_) {
+ if (border_style_.brush == nullptr) {
+ log::Warn(L"Border is enabled but brush is null");
+ } else {
+ painter->FillGeometry(geometry_.get(), border_style_.brush.get());
+ }
+ }
if (const auto child = GetChild()) {
auto offset = child->GetOffset();
platform::graph::util::WithTransform(
painter, platform::Matrix::Translation(offset.x, offset.y),
[child](auto p) { child->Draw(p); });
}
+ if (foreground_brush_ != nullptr)
+ painter->FillGeometry(border_inner_geometry_.get(),
+ foreground_brush_.get());
}
RenderObject* BorderRenderObject::HitTest(const Point& point) {
@@ -36,7 +45,7 @@ RenderObject* BorderRenderObject::HitTest(const Point& point) {
}
}
- if (is_enabled_) {
+ if (is_border_enabled_) {
const auto contains =
border_outer_geometry_->FillContains(Point{point.x, point.y});
return contains ? this : nullptr;
@@ -68,9 +77,11 @@ void BorderRenderObject::OnMeasureCore(const Size& available_size) {
margin.GetHorizontalTotal() + padding.GetHorizontalTotal(),
margin.GetVerticalTotal() + padding.GetVerticalTotal()};
- if (is_enabled_) {
- margin_border_padding_size.width += style_.thickness.GetHorizontalTotal();
- margin_border_padding_size.height += style_.thickness.GetVerticalTotal();
+ if (is_border_enabled_) {
+ margin_border_padding_size.width +=
+ border_style_.thickness.GetHorizontalTotal();
+ margin_border_padding_size.height +=
+ border_style_.thickness.GetVerticalTotal();
}
auto coerced_margin_border_padding_size = margin_border_padding_size;
@@ -103,9 +114,11 @@ void BorderRenderObject::OnLayoutCore(const Rect& rect) {
margin.GetHorizontalTotal() + padding.GetHorizontalTotal(),
margin.GetVerticalTotal() + padding.GetVerticalTotal()};
- if (is_enabled_) {
- margin_border_padding_size.width += style_.thickness.GetHorizontalTotal();
- margin_border_padding_size.height += style_.thickness.GetVerticalTotal();
+ if (is_border_enabled_) {
+ margin_border_padding_size.width +=
+ border_style_.thickness.GetHorizontalTotal();
+ margin_border_padding_size.height +=
+ border_style_.thickness.GetVerticalTotal();
}
const auto content_available_size =
@@ -126,8 +139,10 @@ void BorderRenderObject::OnLayoutCore(const Rect& rect) {
}
OnLayoutContent(Rect{
- margin.left + (is_enabled_ ? style_.thickness.left : 0) + padding.left,
- margin.top + (is_enabled_ ? style_.thickness.top : 0) + padding.top,
+ margin.left + (is_border_enabled_ ? border_style_.thickness.left : 0) +
+ padding.left,
+ margin.top + (is_border_enabled_ ? border_style_.thickness.top : 0) +
+ padding.top,
coerced_content_available_size.width,
coerced_content_available_size.height});
}
@@ -183,14 +198,20 @@ void BorderRenderObject::RecreateGeometry() {
const auto graph_factory = platform::graph::GraphFactory::GetInstance();
std::unique_ptr<platform::graph::GeometryBuilder> builder{
graph_factory->CreateGeometryBuilder()};
- f(builder.get(), outer_rect, style_.corner_radius);
+ f(builder.get(), outer_rect, border_style_.corner_radius);
border_outer_geometry_.reset(builder->Build());
builder.reset();
- const Rect inner_rect = outer_rect.Shrink(style_.thickness);
+ const Rect inner_rect = outer_rect.Shrink(border_style_.thickness);
+
+ builder.reset(graph_factory->CreateGeometryBuilder());
+ f(builder.get(), inner_rect, border_style_.corner_radius);
+ border_inner_geometry_.reset(builder->Build());
+ builder.reset();
+
builder.reset(graph_factory->CreateGeometryBuilder());
- f(builder.get(), outer_rect, style_.corner_radius);
- f(builder.get(), inner_rect, style_.corner_radius);
+ f(builder.get(), outer_rect, border_style_.corner_radius);
+ f(builder.get(), inner_rect, border_style_.corner_radius);
geometry_.reset(builder->Build());
builder.reset();
}