aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/Base.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui/Base.h')
-rw-r--r--include/cru/ui/Base.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/include/cru/ui/Base.h b/include/cru/ui/Base.h
new file mode 100644
index 00000000..44f76907
--- /dev/null
+++ b/include/cru/ui/Base.h
@@ -0,0 +1,152 @@
+#pragma once
+#include "cru/common/Base.h"
+#include "cru/platform/graphics/Base.h"
+#include "cru/platform/gui/Base.h"
+
+#include <functional>
+#include <memory>
+#include <optional>
+#include <vector>
+
+#ifdef CRU_PLATFORM_WINDOWS
+#ifdef CRU_UI_EXPORT_API
+#define CRU_UI_API __declspec(dllexport)
+#else
+#define CRU_UI_API __declspec(dllimport)
+#endif
+#else
+#define CRU_UI_API
+#endif
+
+namespace cru::ui {
+//-------------------- region: import --------------------
+using cru::platform::Color;
+using cru::platform::Ellipse;
+using cru::platform::Matrix;
+using cru::platform::Point;
+using cru::platform::Rect;
+using cru::platform::RoundedRect;
+using cru::platform::Size;
+using cru::platform::TextRange;
+using cru::platform::Thickness;
+using cru::platform::gui::MouseButton;
+
+namespace mouse_buttons = cru::platform::gui::mouse_buttons;
+
+namespace colors = cru::platform::colors;
+
+//-------------------- region: forward declaration --------------------
+
+namespace controls {
+class Window;
+class Control;
+} // namespace controls
+
+namespace host {
+class WindowHost;
+}
+
+namespace render {
+class RenderObject;
+}
+
+namespace style {
+class StyleRuleSet;
+class StyleRuleSetBind;
+} // namespace style
+
+//-------------------- region: basic types --------------------
+enum class Direction { Horizontal, Vertical };
+
+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 {
+ constexpr CornerRadius()
+ : left_top(), right_top(), left_bottom(), right_bottom() {}
+ constexpr CornerRadius(const float& value)
+ : CornerRadius(Point{value, value}) {}
+ constexpr CornerRadius(const Point& value)
+ : left_top(value),
+ right_top(value),
+ left_bottom(value),
+ right_bottom(value) {}
+ constexpr CornerRadius(Point left_top, Point right_top, Point left_bottom,
+ Point right_bottom)
+ : left_top(left_top),
+ right_top(right_top),
+ left_bottom(left_bottom),
+ right_bottom(right_bottom) {}
+
+ CornerRadius& SetAll(const Point& point) {
+ left_top = right_top = left_bottom = right_bottom = point;
+ return *this;
+ }
+
+ Point left_top;
+ Point right_top;
+ Point left_bottom;
+ Point right_bottom;
+};
+
+inline bool operator==(const CornerRadius& left, const CornerRadius& right) {
+ return left.left_top == right.left_top &&
+ left.left_bottom == right.left_bottom &&
+ left.right_top == right.right_top &&
+ left.right_bottom == right.right_bottom;
+}
+
+inline bool operator!=(const CornerRadius& left, const CornerRadius& right) {
+ return !(left == right);
+}
+
+class CanvasPaintEventArgs {
+ public:
+ CanvasPaintEventArgs(platform::graphics::IPainter* painter,
+ const Size& paint_size)
+ : painter_(painter), paint_size_(paint_size) {}
+ CRU_DEFAULT_COPY(CanvasPaintEventArgs)
+ CRU_DEFAULT_MOVE(CanvasPaintEventArgs)
+ ~CanvasPaintEventArgs() = default;
+
+ platform::graphics::IPainter* GetPainter() const { return painter_; }
+ Size GetPaintSize() const { return paint_size_; }
+
+ private:
+ platform::graphics::IPainter* painter_;
+ Size paint_size_;
+};
+
+enum class FlexDirection {
+ Horizontal,
+ HorizontalReverse,
+ Vertical,
+ VertivalReverse
+};
+
+using FlexMainAlignment = Alignment;
+using FlexCrossAlignment = Alignment;
+
+struct FlexChildLayoutData {
+ float expand_factor = 0;
+ float shrink_factor = 1;
+ // nullopt stands for looking at parent's setting
+ std::optional<FlexCrossAlignment> cross_alignment = std::nullopt;
+};
+
+struct StackChildLayoutData {
+ std::optional<Alignment> horizontal;
+ std::optional<Alignment> vertical;
+};
+} // namespace cru::ui