aboutsummaryrefslogtreecommitdiff
path: root/src/ui/ui_base.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-11-07 21:40:04 +0800
committercrupest <crupest@outlook.com>2018-11-07 21:40:04 +0800
commitefdce672123284847bd7fb6f12ac1ec96f28f3ef (patch)
tree298e6313e9a48c5867b2355242b78d3cd23fdc61 /src/ui/ui_base.hpp
parent634dab6ad2c9e4675beacfb77ac02b2d43cab132 (diff)
downloadcru-efdce672123284847bd7fb6f12ac1ec96f28f3ef.tar.gz
cru-efdce672123284847bd7fb6f12ac1ec96f28f3ef.tar.bz2
cru-efdce672123284847bd7fb6f12ac1ec96f28f3ef.zip
Make all header *.hpp .
Diffstat (limited to 'src/ui/ui_base.hpp')
-rw-r--r--src/ui/ui_base.hpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/ui/ui_base.hpp b/src/ui/ui_base.hpp
new file mode 100644
index 00000000..8daa43d7
--- /dev/null
+++ b/src/ui/ui_base.hpp
@@ -0,0 +1,157 @@
+#pragma once
+
+#include <optional>
+
+
+namespace cru::ui
+{
+ struct Point
+ {
+ constexpr static Point Zero()
+ {
+ return Point(0, 0);
+ }
+
+ constexpr Point() = default;
+ constexpr Point(const float x, const float y) : x(x), y(y) { }
+
+ float x = 0;
+ float y = 0;
+ };
+
+ constexpr bool operator==(const Point& left, const Point& right)
+ {
+ return left.x == right.x && left.y == right.y;
+ }
+
+ constexpr bool operator!=(const Point& left, const Point& right)
+ {
+ return !(left == right);
+ }
+
+ struct Size
+ {
+ constexpr static Size Zero()
+ {
+ return Size(0, 0);
+ }
+
+ constexpr Size() = default;
+ constexpr Size(const float width, const float height) : width(width), height(height) { }
+
+ float width = 0;
+ float height = 0;
+ };
+
+ constexpr Size operator + (const Size& left, const Size& right)
+ {
+ return Size(left.width + right.width, left.height + right.height);
+ }
+
+ constexpr Size operator - (const Size& left, const Size& right)
+ {
+ return Size(left.width - right.width, left.height - right.height);
+ }
+
+ constexpr bool operator==(const Size& left, const Size& right)
+ {
+ return left.width == right.width && left.height == right.height;
+ }
+
+ constexpr bool operator!=(const Size& left, const Size& right)
+ {
+ return !(left == right);
+ }
+
+ struct Rect
+ {
+ constexpr Rect() = default;
+ constexpr Rect(const float left, const float top, const float width, const float height)
+ : left(left), top(top), width(width), height(height) { }
+ constexpr Rect(const Point& lefttop, const Size& size)
+ : left(lefttop.x), top(lefttop.y), width(size.width), height(size.height) { }
+
+ constexpr static Rect FromVertices(const float left, const float top, const float right, const float bottom)
+ {
+ return Rect(left, top, right - left, bottom - top);
+ }
+
+ constexpr float GetRight() const
+ {
+ return left + width;
+ }
+
+ constexpr float GetBottom() const
+ {
+ return top + height;
+ }
+
+ constexpr Point GetLeftTop() const
+ {
+ return Point(left, top);
+ }
+
+ constexpr Point GetRightBottom() const
+ {
+ return Point(left + width, top + height);
+ }
+
+ constexpr Size GetSize() const
+ {
+ return Size(width, height);
+ }
+
+ constexpr bool IsPointInside(const Point& point) const
+ {
+ return
+ point.x >= left &&
+ point.x < GetRight() &&
+ point.y >= top &&
+ point.y < GetBottom();
+ }
+
+ float left = 0.0f;
+ float top = 0.0f;
+ float width = 0.0f;
+ float height = 0.0f;
+ };
+
+ enum class MouseButton
+ {
+ Left,
+ Right,
+ Middle
+ };
+
+ struct TextRange
+ {
+ constexpr static std::optional<TextRange> FromTwoSides(unsigned first, unsigned second)
+ {
+ if (first > second)
+ return std::make_optional<TextRange>(second, first - second);
+ if (first < second)
+ return std::make_optional<TextRange>(first, second - first);
+ return std::nullopt;
+ }
+
+ constexpr static std::pair<unsigned, unsigned> ToTwoSides(std::optional<TextRange> text_range, unsigned default_position = 0)
+ {
+ if (text_range.has_value())
+ return std::make_pair(text_range.value().position, text_range.value().position + text_range.value().count);
+ return std::make_pair(default_position, default_position);
+ }
+
+ constexpr TextRange() = default;
+ constexpr TextRange(const unsigned position, const unsigned count)
+ : position(position), count(count)
+ {
+
+ }
+
+ unsigned position = 0;
+ unsigned count = 0;
+ };
+
+ bool IsKeyDown(int virtual_code);
+ bool IsKeyToggled(int virtual_code);
+}