From 3359b00178357cb68d14e807c6deef3182532307 Mon Sep 17 00:00:00 2001 From: HampusM Date: Tue, 8 Mar 2022 16:40:27 +0100 Subject: refactor: make cursor controller track cursor pos itself --- src/engine/user/cursor.cpp | 54 ++++++++++++++++++++++++++++++++++------------ src/engine/user/cursor.hpp | 13 +++++++---- 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 #include -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(amount)); + } + else if (direction == Vector2::down()) + { + _position.set_y(_position.get_y() - static_cast(amount)); + } + else if (direction == Vector2::left()) + { + _position.set_x(_position.get_x() - static_cast(amount)); + } + else if (direction == Vector2::right()) + { + _position.set_x(_position.get_x() + static_cast(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 direction_for class CursorController : public AutoWirable { 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; }; -- cgit v1.2.3-18-g5258