aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-10-18 21:28:35 +0800
committercrupest <crupest@outlook.com>2020-10-18 21:28:35 +0800
commitc072432e68d7a3d7659add0994b2f8caf387ddf2 (patch)
tree6031f93ee2997485d13669a55c080a2a624bd3da
parent5729a5aa1b443e3e25f3e14dee29636d3b31a6f8 (diff)
downloadcru-c072432e68d7a3d7659add0994b2f8caf387ddf2.tar.gz
cru-c072432e68d7a3d7659add0994b2f8caf387ddf2.tar.bz2
cru-c072432e68d7a3d7659add0994b2f8caf387ddf2.zip
...
-rw-r--r--demos/main/main.cpp5
-rw-r--r--include/cru/platform/GraphBase.hpp4
-rw-r--r--include/cru/ui/controls/FlexLayout.hpp3
-rw-r--r--src/ui/controls/FlexLayout.cpp9
-rw-r--r--src/ui/render/FlexLayoutRenderObject.cpp15
-rw-r--r--src/ui/render/RenderObject.cpp4
6 files changed, 31 insertions, 9 deletions
diff --git a/demos/main/main.cpp b/demos/main/main.cpp
index 3026baeb..10b43b0f 100644
--- a/demos/main/main.cpp
+++ b/demos/main/main.cpp
@@ -6,7 +6,6 @@
#include "cru/ui/Window.hpp"
#include "cru/ui/controls/Button.hpp"
#include "cru/ui/controls/FlexLayout.hpp"
-#include "cru/ui/controls/StackLayout.hpp"
#include "cru/ui/controls/TextBlock.hpp"
#include "cru/ui/controls/TextBox.hpp"
@@ -27,9 +26,11 @@ int main() {
const auto window = Window::CreateOverlapped();
const auto flex_layout = FlexLayout::Create();
+ flex_layout->SetFlexDirection(cru::ui::FlexDirection::Vertical);
+ flex_layout->SetContentMainAlign(cru::ui::FlexCrossAlignment::Center);
+ flex_layout->SetItemCrossAlign(cru::ui::FlexCrossAlignment::Center);
window->SetChild(flex_layout);
- flex_layout->SetFlexDirection(cru::ui::FlexDirection::Vertical);
const auto text_block = TextBlock::Create();
text_block->SetText(u"Hello World from CruUI!");
diff --git a/include/cru/platform/GraphBase.hpp b/include/cru/platform/GraphBase.hpp
index 571b36f7..6700765e 100644
--- a/include/cru/platform/GraphBase.hpp
+++ b/include/cru/platform/GraphBase.hpp
@@ -18,6 +18,10 @@ struct Point final {
constexpr Point(const float x, const float y) : x(x), y(y) {}
explicit constexpr Point(const Size& size);
+ std::u16string ToDebugString() const {
+ return fmt::format(u"({}, {})", ToUtf16String(x), ToUtf16String(y));
+ }
+
float x = 0;
float y = 0;
};
diff --git a/include/cru/ui/controls/FlexLayout.hpp b/include/cru/ui/controls/FlexLayout.hpp
index 87162569..0ffedba5 100644
--- a/include/cru/ui/controls/FlexLayout.hpp
+++ b/include/cru/ui/controls/FlexLayout.hpp
@@ -28,6 +28,9 @@ class FlexLayout : public LayoutControl {
FlexDirection GetFlexDirection() const;
void SetFlexDirection(FlexDirection direction);
+ FlexCrossAlignment GetItemCrossAlign() const;
+ void SetItemCrossAlign(FlexCrossAlignment alignment);
+
FlexChildLayoutData GetChildLayoutData(Control* control);
void SetChildLayoutData(Control* control, FlexChildLayoutData data);
diff --git a/src/ui/controls/FlexLayout.cpp b/src/ui/controls/FlexLayout.cpp
index b7f350dc..05f6999f 100644
--- a/src/ui/controls/FlexLayout.cpp
+++ b/src/ui/controls/FlexLayout.cpp
@@ -60,6 +60,15 @@ void FlexLayout::SetFlexDirection(FlexDirection direction) {
render_object_->SetFlexDirection(direction);
}
+FlexCrossAlignment FlexLayout::GetItemCrossAlign() const {
+ return render_object_->GetItemCrossAlign();
+}
+
+void FlexLayout::SetItemCrossAlign(FlexCrossAlignment alignment) {
+ if (alignment == GetItemCrossAlign()) return;
+ render_object_->SetItemCrossAlign(alignment);
+}
+
void FlexLayout::OnAddChild(Control* child, const Index position) {
render_object_->AddChild(child->GetRenderObject(), position);
}
diff --git a/src/ui/render/FlexLayoutRenderObject.cpp b/src/ui/render/FlexLayoutRenderObject.cpp
index 1c39cc8f..36a2dcea 100644
--- a/src/ui/render/FlexLayoutRenderObject.cpp
+++ b/src/ui/render/FlexLayoutRenderObject.cpp
@@ -391,10 +391,11 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) {
const auto cross_align =
GetChildLayoutDataList()[i].cross_alignment.value_or(
GetItemCrossAlign());
- child->Layout(
- Point{content_rect.top + current_main_offset,
- CalculateAnchorByAlignment(cross_align, content_rect.left,
- content_rect.width, size.width)});
+ child->Layout(Point{
+ CalculateAnchorByAlignment(cross_align, content_rect.left,
+ content_rect.width, size.width),
+ content_rect.top + current_main_offset,
+ });
current_main_offset += size.height;
}
} else {
@@ -406,9 +407,9 @@ void FlexLayoutRenderObject::OnLayoutContent(const Rect& content_rect) {
GetChildLayoutDataList()[i].cross_alignment.value_or(
GetItemCrossAlign());
child->Layout(
- Point{content_rect.GetBottom() - current_main_offset,
- CalculateAnchorByAlignment(cross_align, content_rect.left,
- content_rect.width, size.width)});
+ Point{CalculateAnchorByAlignment(cross_align, content_rect.left,
+ content_rect.width, size.width),
+ content_rect.GetBottom() - current_main_offset});
current_main_offset += size.height;
}
}
diff --git a/src/ui/render/RenderObject.cpp b/src/ui/render/RenderObject.cpp
index bc2228d3..57116f93 100644
--- a/src/ui/render/RenderObject.cpp
+++ b/src/ui/render/RenderObject.cpp
@@ -88,6 +88,10 @@ void RenderObject::Measure(const MeasureRequirement& requirement,
}
void RenderObject::Layout(const Point& offset) {
+#if CRUUI_DEBUG_LAYOUT
+ log::Debug(u"{} Layout :\noffset: {}", this->GetDebugPathInTree(),
+ offset.ToDebugString());
+#endif
offset_ = offset;
OnLayoutCore();
}