aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/Base.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/cru/ui/Base.hpp')
-rw-r--r--include/cru/ui/Base.hpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/include/cru/ui/Base.hpp b/include/cru/ui/Base.hpp
new file mode 100644
index 00000000..b9ce0c88
--- /dev/null
+++ b/include/cru/ui/Base.hpp
@@ -0,0 +1,281 @@
+#pragma once
+#include "cru/common/Base.hpp"
+#include "cru/platform/graph/Base.hpp"
+#include "cru/platform/native/Base.hpp"
+
+#include <functional>
+#include <memory>
+#include <optional>
+#include <vector>
+
+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::native::MouseButton;
+
+namespace mouse_buttons {
+using cru::platform::native::mouse_buttons::left;
+using cru::platform::native::mouse_buttons::middle;
+using cru::platform::native::mouse_buttons::right;
+} // namespace mouse_buttons
+
+namespace colors {
+using cru::platform::colors::aliceblue;
+using cru::platform::colors::antiquewhite;
+using cru::platform::colors::aqua;
+using cru::platform::colors::aquamarine;
+using cru::platform::colors::azure;
+using cru::platform::colors::beige;
+using cru::platform::colors::bisque;
+using cru::platform::colors::black;
+using cru::platform::colors::blanchedalmond;
+using cru::platform::colors::blue;
+using cru::platform::colors::blueviolet;
+using cru::platform::colors::brown;
+using cru::platform::colors::burlywood;
+using cru::platform::colors::cadetblue;
+using cru::platform::colors::chartreuse;
+using cru::platform::colors::chocolate;
+using cru::platform::colors::coral;
+using cru::platform::colors::cornflowerblue;
+using cru::platform::colors::cornsilk;
+using cru::platform::colors::crimson;
+using cru::platform::colors::cyan;
+using cru::platform::colors::darkblue;
+using cru::platform::colors::darkcyan;
+using cru::platform::colors::darkgoldenrod;
+using cru::platform::colors::darkgray;
+using cru::platform::colors::darkgreen;
+using cru::platform::colors::darkgrey;
+using cru::platform::colors::darkkhaki;
+using cru::platform::colors::darkmagenta;
+using cru::platform::colors::darkolivegreen;
+using cru::platform::colors::darkorange;
+using cru::platform::colors::darkorchid;
+using cru::platform::colors::darkred;
+using cru::platform::colors::darksalmon;
+using cru::platform::colors::darkseagreen;
+using cru::platform::colors::darkslateblue;
+using cru::platform::colors::darkslategray;
+using cru::platform::colors::darkslategrey;
+using cru::platform::colors::darkturquoise;
+using cru::platform::colors::darkviolet;
+using cru::platform::colors::deeppink;
+using cru::platform::colors::deepskyblue;
+using cru::platform::colors::dimgray;
+using cru::platform::colors::dimgrey;
+using cru::platform::colors::dodgerblue;
+using cru::platform::colors::firebrick;
+using cru::platform::colors::floralwhite;
+using cru::platform::colors::forestgreen;
+using cru::platform::colors::fuchsia;
+using cru::platform::colors::gainsboro;
+using cru::platform::colors::ghostwhite;
+using cru::platform::colors::gold;
+using cru::platform::colors::goldenrod;
+using cru::platform::colors::gray;
+using cru::platform::colors::green;
+using cru::platform::colors::greenyellow;
+using cru::platform::colors::grey;
+using cru::platform::colors::honeydew;
+using cru::platform::colors::hotpink;
+using cru::platform::colors::indianred;
+using cru::platform::colors::indigo;
+using cru::platform::colors::ivory;
+using cru::platform::colors::khaki;
+using cru::platform::colors::lavender;
+using cru::platform::colors::lavenderblush;
+using cru::platform::colors::lawngreen;
+using cru::platform::colors::lemonchiffon;
+using cru::platform::colors::lightblue;
+using cru::platform::colors::lightcoral;
+using cru::platform::colors::lightcyan;
+using cru::platform::colors::lightgoldenrodyellow;
+using cru::platform::colors::lightgray;
+using cru::platform::colors::lightgreen;
+using cru::platform::colors::lightgrey;
+using cru::platform::colors::lightpink;
+using cru::platform::colors::lightsalmon;
+using cru::platform::colors::lightseagreen;
+using cru::platform::colors::lightskyblue;
+using cru::platform::colors::lightslategray;
+using cru::platform::colors::lightslategrey;
+using cru::platform::colors::lightsteelblue;
+using cru::platform::colors::lightyellow;
+using cru::platform::colors::lime;
+using cru::platform::colors::limegreen;
+using cru::platform::colors::linen;
+using cru::platform::colors::magenta;
+using cru::platform::colors::maroon;
+using cru::platform::colors::mediumaquamarine;
+using cru::platform::colors::mediumblue;
+using cru::platform::colors::mediumorchid;
+using cru::platform::colors::mediumpurple;
+using cru::platform::colors::mediumseagreen;
+using cru::platform::colors::mediumslateblue;
+using cru::platform::colors::mediumspringgreen;
+using cru::platform::colors::mediumturquoise;
+using cru::platform::colors::mediumvioletred;
+using cru::platform::colors::midnightblue;
+using cru::platform::colors::mintcream;
+using cru::platform::colors::mistyrose;
+using cru::platform::colors::moccasin;
+using cru::platform::colors::navajowhite;
+using cru::platform::colors::navy;
+using cru::platform::colors::oldlace;
+using cru::platform::colors::olive;
+using cru::platform::colors::olivedrab;
+using cru::platform::colors::orange;
+using cru::platform::colors::orangered;
+using cru::platform::colors::orchid;
+using cru::platform::colors::palegoldenrod;
+using cru::platform::colors::palegreen;
+using cru::platform::colors::paleturquoise;
+using cru::platform::colors::palevioletred;
+using cru::platform::colors::papayawhip;
+using cru::platform::colors::peachpuff;
+using cru::platform::colors::peru;
+using cru::platform::colors::pink;
+using cru::platform::colors::plum;
+using cru::platform::colors::powderblue;
+using cru::platform::colors::purple;
+using cru::platform::colors::rebeccapurple;
+using cru::platform::colors::red;
+using cru::platform::colors::rosybrown;
+using cru::platform::colors::royalblue;
+using cru::platform::colors::saddlebrown;
+using cru::platform::colors::salmon;
+using cru::platform::colors::sandybrown;
+using cru::platform::colors::seagreen;
+using cru::platform::colors::seashell;
+using cru::platform::colors::sienna;
+using cru::platform::colors::silver;
+using cru::platform::colors::skyblue;
+using cru::platform::colors::slateblue;
+using cru::platform::colors::slategray;
+using cru::platform::colors::slategrey;
+using cru::platform::colors::snow;
+using cru::platform::colors::springgreen;
+using cru::platform::colors::steelblue;
+using cru::platform::colors::tan;
+using cru::platform::colors::teal;
+using cru::platform::colors::thistle;
+using cru::platform::colors::tomato;
+using cru::platform::colors::transparent;
+using cru::platform::colors::turquoise;
+using cru::platform::colors::violet;
+using cru::platform::colors::wheat;
+using cru::platform::colors::white;
+using cru::platform::colors::whitesmoke;
+using cru::platform::colors::yellow;
+using cru::platform::colors::yellowgreen;
+} // namespace colors
+
+//-------------------- region: forward declaration --------------------
+class Window;
+class Control;
+class ClickDetector;
+class UiHost;
+
+//-------------------- region: basic types --------------------
+namespace internal {
+constexpr int align_start = 0;
+constexpr int align_end = align_start + 1;
+constexpr int align_center = align_end + 1;
+} // namespace internal
+
+enum class Alignment {
+ Start = internal::align_start,
+ End = internal::align_end,
+ Center = internal::align_center,
+};
+
+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) {}
+
+ 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);
+}
+
+struct BorderStyle {
+ std::shared_ptr<platform::graph::IBrush> border_brush;
+ Thickness border_thickness;
+ CornerRadius border_radius;
+ std::shared_ptr<platform::graph::IBrush> foreground_brush;
+ std::shared_ptr<platform::graph::IBrush> background_brush;
+};
+
+class CanvasPaintEventArgs {
+ public:
+ CanvasPaintEventArgs(platform::graph::IPainter* painter,
+ const Rect& paint_rect)
+ : painter_(painter), paint_rect_(paint_rect) {}
+ CRU_DEFAULT_COPY(CanvasPaintEventArgs)
+ CRU_DEFAULT_MOVE(CanvasPaintEventArgs)
+ ~CanvasPaintEventArgs() = default;
+
+ platform::graph::IPainter* GetPainter() const { return painter_; }
+ Rect GetPaintRect() const { return paint_rect_; }
+
+ private:
+ platform::graph::IPainter* painter_;
+ Rect paint_rect_;
+};
+
+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 {
+ Alignment horizontal = Alignment::Start;
+ Alignment vertical = Alignment::Start;
+};
+} // namespace cru::ui