diff options
| author | HampusM <hampus@hampusmat.com> | 2022-03-20 20:37:43 +0100 | 
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2022-06-13 17:56:57 +0200 | 
| commit | 1972939ebde39a3e90a50b021b2322d028f344de (patch) | |
| tree | 9ee0a7c78f082bec084189906f28dc679a20d339 /src/engine/user/cursor.cpp | |
| parent | e6644d6b235005de9ba1b9884472fa5f5d8d6074 (diff) | |
refactor: move updating status from the move cursor command
Diffstat (limited to 'src/engine/user/cursor.cpp')
| -rw-r--r-- | src/engine/user/cursor.cpp | 36 | 
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); +	} +} | 
