aboutsummaryrefslogtreecommitdiff
path: root/src/engine/user/cursor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/user/cursor.cpp')
-rw-r--r--src/engine/user/cursor.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/engine/user/cursor.cpp b/src/engine/user/cursor.cpp
index b02a9bc..2a72663 100644
--- a/src/engine/user/cursor.cpp
+++ b/src/engine/user/cursor.cpp
@@ -16,15 +16,22 @@ void CursorController::move(const Vector2 &direction, const uint32_t &amount) no
std::cout.flush();
_position = _position.to_direction(direction, static_cast<Vector2::Value>(amount));
+
+ notify_subscribers(CursorEvent::POSITION_CHANGE, _position);
}
-void CursorController::move_to(const Vector2 &position) noexcept
+void CursorController::move_to(const Vector2 &position, bool silent) noexcept
{
fmt::print(MOVE_CURSOR_TO, fmt::arg("esc", ESC), fmt::arg("row", position.get_y()),
fmt::arg("column", position.get_x()));
std::cout.flush();
_position = position;
+
+ if (!silent)
+ {
+ notify_subscribers(CursorEvent::POSITION_CHANGE, position);
+ }
}
Vector2 CursorController::where() const noexcept
@@ -43,6 +50,8 @@ void CursorController::ensure_position() noexcept
scanf("\033[%u;%uR", &vector2_options.y, &vector2_options.x);
_position = Vector2(vector2_options);
+
+ notify_subscribers(CursorEvent::POSITION_CHANGE, _position);
}
void CursorController::hide() noexcept
@@ -56,3 +65,28 @@ void CursorController::show() noexcept
fmt::print(CURSOR_VISIBLE, fmt::arg("esc", ESC));
std::cout.flush();
}
+
+void CursorController::subscribe(const Event &event,
+ const Subscriber &subscriber) noexcept
+{
+ if (_subscribers.count(event) == 0)
+ {
+ _subscribers.insert({event, std::vector<Subscriber>()});
+ }
+
+ _subscribers.at(event).push_back(subscriber);
+}
+
+void CursorController::notify_subscribers(const Event &event,
+ const Context &context) const noexcept
+{
+ if (_subscribers.count(event) == 0)
+ {
+ return;
+ }
+
+ for (const auto &subscriber : _subscribers.at(event))
+ {
+ subscriber->update(context);
+ }
+}