diff options
author | crupest <crupest@outlook.com> | 2022-01-29 22:09:29 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-01-29 22:09:29 +0800 |
commit | 592f3f3f25f00232234399f4c5f51318a3fa49d2 (patch) | |
tree | 9ff928062aab8598bbbd00aa243d234e80aa6406 | |
parent | a2c2089c8d97b4910d4287c14c82e20d33366c24 (diff) | |
download | cru-592f3f3f25f00232234399f4c5f51318a3fa49d2.tar.gz cru-592f3f3f25f00232234399f4c5f51318a3fa49d2.tar.bz2 cru-592f3f3f25f00232234399f4c5f51318a3fa49d2.zip |
...
-rw-r--r-- | include/cru/ui/Base.hpp | 6 | ||||
-rw-r--r-- | include/cru/ui/controls/StackLayout.hpp | 4 | ||||
-rw-r--r-- | include/cru/ui/render/StackLayoutRenderObject.hpp | 14 | ||||
-rw-r--r-- | src/theme_builder/components/MainWindow.cpp | 16 | ||||
-rw-r--r-- | src/theme_builder/components/MainWindow.hpp | 6 | ||||
-rw-r--r-- | src/ui/controls/RootControl.cpp | 3 | ||||
-rw-r--r-- | src/ui/controls/StackLayout.cpp | 9 | ||||
-rw-r--r-- | src/ui/render/StackLayoutRenderObject.cpp | 46 |
8 files changed, 98 insertions, 6 deletions
diff --git a/include/cru/ui/Base.hpp b/include/cru/ui/Base.hpp index db360c07..e99c956f 100644 --- a/include/cru/ui/Base.hpp +++ b/include/cru/ui/Base.hpp @@ -62,12 +62,14 @@ namespace internal { constexpr int align_start = 0; constexpr int align_end = align_start + 1; constexpr int align_center = align_end + 1; +constexpr int align_stretch = align_center + 1; } // namespace internal enum class Alignment { Start = internal::align_start, End = internal::align_end, Center = internal::align_center, + Stretch = internal::align_stretch }; struct CornerRadius { @@ -144,7 +146,7 @@ struct FlexChildLayoutData { }; struct StackChildLayoutData { - Alignment horizontal = Alignment::Start; - Alignment vertical = Alignment::Start; + std::optional<Alignment> horizontal; + std::optional<Alignment> vertical; }; } // namespace cru::ui diff --git a/include/cru/ui/controls/StackLayout.hpp b/include/cru/ui/controls/StackLayout.hpp index 657cadc6..5d90dfda 100644 --- a/include/cru/ui/controls/StackLayout.hpp +++ b/include/cru/ui/controls/StackLayout.hpp @@ -1,5 +1,6 @@ #pragma once #include "LayoutControl.hpp" +#include "cru/ui/Base.hpp" namespace cru::ui::controls { class CRU_UI_API StackLayout : public LayoutControl { @@ -21,6 +22,9 @@ class CRU_UI_API StackLayout : public LayoutControl { render::RenderObject* GetRenderObject() const override; + const StackChildLayoutData& GetChildLayoutData(Index position); + void SetChildLayoutData(Index position, StackChildLayoutData data); + private: std::shared_ptr<render::StackLayoutRenderObject> render_object_; }; diff --git a/include/cru/ui/render/StackLayoutRenderObject.hpp b/include/cru/ui/render/StackLayoutRenderObject.hpp index b7b1502c..2f832e55 100644 --- a/include/cru/ui/render/StackLayoutRenderObject.hpp +++ b/include/cru/ui/render/StackLayoutRenderObject.hpp @@ -1,5 +1,6 @@ #pragma once #include "LayoutRenderObject.hpp" +#include "cru/ui/Base.hpp" namespace cru::ui::render { // Measure Logic: @@ -35,9 +36,22 @@ class CRU_UI_API StackLayoutRenderObject return u"StackLayoutRenderObject"; } + Alignment GetDefaultHorizontalAlignment() const { + return default_vertical_alignment_; + } + void SetDefaultHorizontalAlignment(Alignment alignment); + Alignment GetDefaultVerticalAlignment() { + return default_horizontal_alignment_; + } + void SetDefaultVertialAlignment(Alignment alignment); + protected: Size OnMeasureContent(const MeasureRequirement& requirement, const MeasureSize& preferred_size) override; void OnLayoutContent(const Rect& content_rect) override; + + private: + Alignment default_horizontal_alignment_ = Alignment::Start; + Alignment default_vertical_alignment_ = Alignment::Start; }; } // namespace cru::ui::render diff --git a/src/theme_builder/components/MainWindow.cpp b/src/theme_builder/components/MainWindow.cpp index 3d521d44..d52193f1 100644 --- a/src/theme_builder/components/MainWindow.cpp +++ b/src/theme_builder/components/MainWindow.cpp @@ -1,4 +1,7 @@ #include "MainWindow.hpp" +#include "cru/ui/Base.hpp" +#include "cru/ui/controls/StackLayout.hpp" +#include "cru/ui/controls/TextBlock.hpp" namespace cru::theme_builder { using namespace cru::ui; @@ -8,6 +11,19 @@ using namespace cru::platform::gui; MainWindow::MainWindow() { window_ = Window::Create(); window_->GetNativeWindow()->SetTitle(u"CruUI Theme Builder"); + + main_layout_ = FlexLayout::Create(); + main_layout_->SetFlexDirection(FlexDirection::Horizontal); + window_->AddChild(main_layout_, 0); + + preview_layout_ = StackLayout::Create(); + main_layout_->AddChild(preview_layout_, 0); + + preview_button_ = Button::Create(); + preview_button_->SetChild(TextBlock::Create(u"Preview")); + preview_layout_->AddChild(preview_button_, 0); + preview_layout_->SetChildLayoutData( + 0, StackChildLayoutData{Alignment::Center, Alignment::Center}); } MainWindow::~MainWindow() { delete window_; } diff --git a/src/theme_builder/components/MainWindow.hpp b/src/theme_builder/components/MainWindow.hpp index fd7f7996..ef37b7a2 100644 --- a/src/theme_builder/components/MainWindow.hpp +++ b/src/theme_builder/components/MainWindow.hpp @@ -1,5 +1,8 @@ #pragma once #include "cru/ui/components/Component.hpp" +#include "cru/ui/controls/Button.hpp" +#include "cru/ui/controls/FlexLayout.hpp" +#include "cru/ui/controls/StackLayout.hpp" #include "cru/ui/controls/Window.hpp" namespace cru::theme_builder { @@ -18,5 +21,8 @@ class MainWindow : public ui::components::Component { private: ui::controls::Window* window_; + ui::controls::FlexLayout* main_layout_; + ui::controls::StackLayout* preview_layout_; + ui::controls::Button* preview_button_; }; } // namespace cru::theme_builder diff --git a/src/ui/controls/RootControl.cpp b/src/ui/controls/RootControl.cpp index 7edf4a1d..a7366155 100644 --- a/src/ui/controls/RootControl.cpp +++ b/src/ui/controls/RootControl.cpp @@ -3,6 +3,7 @@ #include "cru/common/Base.hpp" #include "cru/platform/gui/Base.hpp" #include "cru/platform/gui/Window.hpp" +#include "cru/ui/Base.hpp" #include "cru/ui/host/WindowHost.hpp" #include "cru/ui/render/Base.hpp" #include "cru/ui/render/StackLayoutRenderObject.hpp" @@ -15,6 +16,8 @@ RootControl::RootControl(Control* attached_control) : attached_control_(attached_control) { render_object_ = std::make_unique<render::StackLayoutRenderObject>(); render_object_->SetAttachedControl(this); + render_object_->SetDefaultHorizontalAlignment(Alignment::Stretch); + render_object_->SetDefaultVertialAlignment(Alignment::Stretch); SetContainerRenderObject(render_object_.get()); window_host_ = std::make_unique<host::WindowHost>(this); } diff --git a/src/ui/controls/StackLayout.cpp b/src/ui/controls/StackLayout.cpp index 89968571..667e6755 100644 --- a/src/ui/controls/StackLayout.cpp +++ b/src/ui/controls/StackLayout.cpp @@ -17,4 +17,13 @@ StackLayout::~StackLayout() = default; render::RenderObject* StackLayout::GetRenderObject() const { return render_object_.get(); } + +const StackChildLayoutData& StackLayout::GetChildLayoutData(Index position) { + return render_object_->GetChildLayoutData(position); +} + +void StackLayout::SetChildLayoutData(Index position, + StackChildLayoutData data) { + render_object_->SetChildLayoutData(position, std::move(data)); +} } // namespace cru::ui::controls diff --git a/src/ui/render/StackLayoutRenderObject.cpp b/src/ui/render/StackLayoutRenderObject.cpp index 753612af..1b6cc9fc 100644 --- a/src/ui/render/StackLayoutRenderObject.cpp +++ b/src/ui/render/StackLayoutRenderObject.cpp @@ -7,6 +7,17 @@ #include <algorithm> namespace cru::ui::render { +void StackLayoutRenderObject::SetDefaultHorizontalAlignment( + Alignment alignment) { + default_horizontal_alignment_ = alignment; + InvalidateLayout(); +} + +void StackLayoutRenderObject::SetDefaultVertialAlignment(Alignment alignment) { + default_vertical_alignment_ = alignment; + InvalidateLayout(); +} + Size StackLayoutRenderObject::OnMeasureContent( const MeasureRequirement& requirement, const MeasureSize& preferred_size) { Size child_max_size; @@ -22,6 +33,31 @@ Size StackLayoutRenderObject::OnMeasureContent( child_max_size = Max(preferred_size.GetSizeOr0(), child_max_size); child_max_size = Max(requirement.min.GetSizeOr0(), child_max_size); + for (Index i = 0; i < GetChildren().size(); ++i) { + auto child_layout_data = GetChildLayoutData(i); + auto horizontal_stretch = + child_layout_data.horizontal.value_or(default_horizontal_alignment_) == + Alignment::Stretch; + auto vertical_stretch = + child_layout_data.vertical.value_or(default_vertical_alignment_) == + Alignment::Stretch; + if (horizontal_stretch || vertical_stretch) { + auto child = GetChildren()[i]; + auto child_size = child->GetSize(); + MeasureRequirement child_requirement(child_size, child_size); + if (horizontal_stretch) { + child_requirement.min.width = child_requirement.max.width = + child_max_size.width; + } + + if (vertical_stretch) { + child_requirement.min.height = child_requirement.max.height = + child_max_size.height; + } + child->Measure(child_requirement, MeasureSize::NotSpecified()); + } + } + return child_max_size; } @@ -34,10 +70,12 @@ void StackLayoutRenderObject::OnLayoutContent(const Rect& content_rect) { const auto& layout_data = GetChildLayoutData(i); const auto& size = child->GetSize(); child->Layout(Point{ - CalculateAnchorByAlignment(layout_data.horizontal, content_rect.left, - content_rect.width, size.width), - CalculateAnchorByAlignment(layout_data.vertical, content_rect.top, - content_rect.height, size.height)}); + CalculateAnchorByAlignment( + layout_data.horizontal.value_or(default_horizontal_alignment_), + content_rect.left, content_rect.width, size.width), + CalculateAnchorByAlignment( + layout_data.vertical.value_or(default_vertical_alignment_), + content_rect.top, content_rect.height, size.height)}); } } } // namespace cru::ui::render |