diff options
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/engine.cpp | 14 | ||||
| -rw-r--r-- | src/engine/graphics/scene.cpp | 31 | ||||
| -rw-r--r-- | src/engine/graphics/scene.hpp | 22 | 
3 files changed, 50 insertions, 17 deletions
| diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 0227d5c..6050348 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -21,7 +21,7 @@ CLIGameEngine::CLIGameEngine(IGameFactory game_factory, ISceneFactory scene_fact  void CLIGameEngine::start() noexcept  { -	auto scene = _scene_factory(); +	auto scene = _scene_factory(_cursor_controller, _window);  	scene->enter();  	_input_handler->enter_raw_mode(); @@ -43,10 +43,14 @@ void CLIGameEngine::start() noexcept  	const std::unordered_map<char, Callback> input_config = {  		{'q', InputActions::exit_success}, -		{'k', InputActions::move_cursor(Vector2::up(), _cursor_controller, _window)}, -		{'j', InputActions::move_cursor(Vector2::down(), _cursor_controller, _window)}, -		{'h', InputActions::move_cursor(Vector2::left(), _cursor_controller, _window)}, -		{'l', InputActions::move_cursor(Vector2::right(), _cursor_controller, _window)}}; +		{'k', +		 InputActions::move_cursor(Vector2::up(), _cursor_controller, scene, _window)}, +		{'j', +		 InputActions::move_cursor(Vector2::down(), _cursor_controller, scene, _window)}, +		{'h', +		 InputActions::move_cursor(Vector2::left(), _cursor_controller, scene, _window)}, +		{'l', InputActions::move_cursor(Vector2::right(), _cursor_controller, scene, +										_window)}};  	_configure_input(input_config); diff --git a/src/engine/graphics/scene.cpp b/src/engine/graphics/scene.cpp index a8e7b88..c4a398c 100644 --- a/src/engine/graphics/scene.cpp +++ b/src/engine/graphics/scene.cpp @@ -4,13 +4,19 @@  #include <fmt/core.h>  #include <iostream> - -Scene::Scene(IMatrixFactory<std::string_view> matrix_factory) -	: _is_shown(false), _matrix_factory(matrix_factory) +#include <utility> + +Scene::Scene(IMatrixFactory<std::string_view> matrix_factory, +			 std::shared_ptr<ICursorController> cursor_controller, +			 std::shared_ptr<IWindow> window) noexcept +	: _is_shown(false), +	  _matrix_factory(matrix_factory), +	  _cursor_controller(std::move(cursor_controller)), +	  _window(std::move(window))  {  } -void Scene::enter() +void Scene::enter() noexcept  {  	if (_is_shown)  	{ @@ -23,7 +29,7 @@ void Scene::enter()  	_is_shown = true;  } -void Scene::leave() +void Scene::leave() noexcept  {  	if (!_is_shown)  	{ @@ -35,3 +41,18 @@ void Scene::leave()  	_is_shown = false;  } + +void Scene::write_status(const std::string_view &str) noexcept +{ +	const auto previous_position = _cursor_controller->where(); + +	const auto window_size = _window->size(); + +	_cursor_controller->move_to( +		Vector2({.x = 1, .y = static_cast<Vector2::Value>(window_size.get_height())})); + +	fmt::print(ERASE_ENTIRE_LINE, fmt::arg("esc", ESC)); +	fmt::print(fmt::runtime(str.data())); + +	_cursor_controller->move_to(previous_position); +} diff --git a/src/engine/graphics/scene.hpp b/src/engine/graphics/scene.hpp index c4c217f..3d05cd9 100644 --- a/src/engine/graphics/scene.hpp +++ b/src/engine/graphics/scene.hpp @@ -1,29 +1,37 @@  #pragma once -#include "DI/auto_wirable.hpp" +#include "interfaces/cursor.hpp"  #include "interfaces/matrix.hpp"  #include "interfaces/scene.hpp" +#include "interfaces/window.hpp"  #include <fmt/core.h> +#include <memory>  #include <string_view>  constexpr fmt::string_view ENABLE_ALT_BUFFER = "{esc}[?1049h";  constexpr fmt::string_view DISABLE_ALT_BUFFER = "{esc}[?1049l"; -class Scene : public IScene, -			  public AutoWirable<IScene, Scene, IMatrixFactory<std::string_view>> +constexpr fmt::string_view ERASE_ENTIRE_LINE = "{esc}[2K"; + +class Scene : public IScene  {  public: -	explicit Scene(IMatrixFactory<std::string_view> matrix_factory); +	explicit Scene(IMatrixFactory<std::string_view> matrix_factory, +				   std::shared_ptr<ICursorController> cursor_controller, +				   std::shared_ptr<IWindow> window) noexcept; -	void enter() override; +	void enter() noexcept override; -	void leave() override; +	void leave() noexcept override; -	// void do_in_statusbar(const std::function<void()> &routine); +	void write_status(const std::string_view &str) noexcept override;  private:  	bool _is_shown;  	IMatrixFactory<std::string_view> _matrix_factory; + +	std::shared_ptr<ICursorController> _cursor_controller; +	std::shared_ptr<IWindow> _window;  }; | 
