aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/engine/user/cursor.cpp54
-rw-r--r--src/engine/user/cursor.hpp13
2 files changed, 49 insertions, 18 deletions
diff --git a/src/engine/user/cursor.cpp b/src/engine/user/cursor.cpp
index 391a91a..39fef23 100644
--- a/src/engine/user/cursor.cpp
+++ b/src/engine/user/cursor.cpp
@@ -5,33 +5,46 @@
#include <cstdlib>
#include <iostream>
-void CursorController::move(const Vector2 &direction, const uint32_t &amount)
+CursorController::CursorController() : _position(_request_position()) {}
+
+void CursorController::move(const Vector2 &direction, const uint32_t &amount) noexcept
{
auto format = direction_format_map.at(direction);
fmt::print(fmt::runtime(format.data()), fmt::arg("esc", ESC),
fmt::arg("amount", amount));
std::cout.flush();
-}
-void CursorController::move_to(const Vector2 &pos)
-{
- fmt::print(MOVE_CURSOR_TO, fmt::arg("esc", ESC), fmt::arg("row", pos.get_y()),
- fmt::arg("column", pos.get_x()));
- std::cout.flush();
+ if (direction == Vector2::up())
+ {
+ _position.set_y(_position.get_y() + static_cast<int>(amount));
+ }
+ else if (direction == Vector2::down())
+ {
+ _position.set_y(_position.get_y() - static_cast<int>(amount));
+ }
+ else if (direction == Vector2::left())
+ {
+ _position.set_x(_position.get_x() - static_cast<int>(amount));
+ }
+ else if (direction == Vector2::right())
+ {
+ _position.set_x(_position.get_x() + static_cast<int>(amount));
+ }
}
-Vector2 CursorController::where()
+void CursorController::move_to(const Vector2 &position) noexcept
{
- fmt::print(REQUEST_CURSOR_POSITION, fmt::arg("esc", ESC));
+ fmt::print(MOVE_CURSOR_TO, fmt::arg("esc", ESC), fmt::arg("row", position.get_y()),
+ fmt::arg("column", position.get_x()));
std::cout.flush();
- Vector2Options vector2_options = {};
-
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
- scanf("\033[%u;%uR", &vector2_options.y, &vector2_options.x);
+ _position = position;
+}
- return Vector2(vector2_options);
+Vector2 CursorController::where() const noexcept
+{
+ return _position;
}
void CursorController::hide()
@@ -45,3 +58,16 @@ void CursorController::show()
fmt::print(CURSOR_VISIBLE, fmt::arg("esc", ESC));
std::cout.flush();
}
+
+Vector2 CursorController::_request_position() noexcept
+{
+ fmt::print(REQUEST_CURSOR_POSITION, fmt::arg("esc", ESC));
+ std::cout.flush();
+
+ Vector2Options vector2_options = {};
+
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
+ scanf("\033[%u;%uR", &vector2_options.y, &vector2_options.x);
+
+ return Vector2(vector2_options);
+}
diff --git a/src/engine/user/cursor.hpp b/src/engine/user/cursor.hpp
index 84117c1..50dd028 100644
--- a/src/engine/user/cursor.hpp
+++ b/src/engine/user/cursor.hpp
@@ -31,15 +31,20 @@ const std::unordered_map<Vector2, std::string_view, Vector2Hasher> direction_for
class CursorController : public AutoWirable<CursorController, CursorController>
{
public:
- CursorController() = default;
+ CursorController();
- static void move(const Vector2 &direction, const uint32_t &amount);
+ void move(const Vector2 &direction, const uint32_t &amount) noexcept;
- static void move_to(const Vector2 &pos);
+ void move_to(const Vector2 &position) noexcept;
static void hide();
static void show();
- [[nodiscard]] static Vector2 where();
+ [[nodiscard]] Vector2 where() const noexcept;
+
+private:
+ Vector2 _position;
+
+ [[nodiscard]] static Vector2 _request_position() noexcept;
};