aboutsummaryrefslogtreecommitdiff
path: root/CruUI/ui
diff options
context:
space:
mode:
Diffstat (limited to 'CruUI/ui')
-rw-r--r--CruUI/ui/control.h11
-rw-r--r--CruUI/ui/controls/button.h9
-rw-r--r--CruUI/ui/controls/linear_layout.cpp4
-rw-r--r--CruUI/ui/controls/linear_layout.h7
4 files changed, 25 insertions, 6 deletions
diff --git a/CruUI/ui/control.h b/CruUI/ui/control.h
index 2f23fd21..3810f5ac 100644
--- a/CruUI/ui/control.h
+++ b/CruUI/ui/control.h
@@ -4,6 +4,7 @@
#include <unordered_map>
#include <any>
#include <typeinfo>
+#include <utility>
#include <fmt/format.h>
#include "base.h"
@@ -348,5 +349,15 @@ namespace cru
// Return the ancestor if one control is the ancestor of the other one, otherwise nullptr.
Control* IsAncestorOrDescendant(Control* left, Control* right);
+
+ template <typename TControl, typename... Args>
+ TControl* CreateWithLayout(const LayoutLength& width, const LayoutLength& height, Args&&... args)
+ {
+ static_assert(std::is_base_of_v<Control, TControl>, "TControl is not a control class.");
+ TControl* control = TControl::Create(std::forward<Args>(args)...);
+ control->GetLayoutParams()->width = width;
+ control->GetLayoutParams()->height = height;
+ return control;
+ }
}
}
diff --git a/CruUI/ui/controls/button.h b/CruUI/ui/controls/button.h
index f9ad7726..bd3f6eb3 100644
--- a/CruUI/ui/controls/button.h
+++ b/CruUI/ui/controls/button.h
@@ -1,5 +1,7 @@
#pragma once
+#include <initializer_list>
+
#include "ui/control.h"
namespace cru::ui::controls
@@ -7,9 +9,12 @@ namespace cru::ui::controls
class Button : public Control
{
public:
- static Button* Create()
+ static Button* Create(const std::initializer_list<Control*>& children = std::initializer_list<Control*>())
{
- return new Button();
+ const auto button = new Button();
+ for (const auto control : children)
+ button->AddChild(control);
+ return button;
}
protected:
diff --git a/CruUI/ui/controls/linear_layout.cpp b/CruUI/ui/controls/linear_layout.cpp
index 116802ba..22bf26e9 100644
--- a/CruUI/ui/controls/linear_layout.cpp
+++ b/CruUI/ui/controls/linear_layout.cpp
@@ -89,7 +89,7 @@ namespace cru::ui::controls
const auto available_width = rest_available_size_for_children.width / stretch_control_list.size();
for (const auto control : stretch_control_list)
{
- control->Measure(Size(available_width, AtLeast0(rest_available_size_for_children.height)));
+ control->Measure(Size(AtLeast0(available_width), rest_available_size_for_children.height));
const auto size = control->GetDesiredSize();
rest_available_size_for_children.width -= size.width;
secondary_side_child_max_length = std::max(size.height, secondary_side_child_max_length);
@@ -100,7 +100,7 @@ namespace cru::ui::controls
const auto available_height = rest_available_size_for_children.height / stretch_control_list.size();
for (const auto control : stretch_control_list)
{
- control->Measure(Size(AtLeast0(rest_available_size_for_children.width), available_height));
+ control->Measure(Size(rest_available_size_for_children.width, AtLeast0(available_height)));
const auto size = control->GetDesiredSize();
rest_available_size_for_children.height -= size.height;
secondary_side_child_max_length = std::max(size.width, secondary_side_child_max_length);
diff --git a/CruUI/ui/controls/linear_layout.h b/CruUI/ui/controls/linear_layout.h
index ead56081..369824d4 100644
--- a/CruUI/ui/controls/linear_layout.h
+++ b/CruUI/ui/controls/linear_layout.h
@@ -13,9 +13,12 @@ namespace cru::ui::controls
Vertical
};
- static LinearLayout* Create(const Orientation orientation = Orientation::Vertical)
+ static LinearLayout* Create(const Orientation orientation = Orientation::Vertical, const std::initializer_list<Control*>& children = std::initializer_list<Control*>())
{
- return new LinearLayout(orientation);
+ const auto linear_layout = new LinearLayout(orientation);
+ for (const auto control : children)
+ linear_layout->AddChild(control);
+ return linear_layout;
}
protected: