#include "statusline.hpp" #include "engine/data/vector2.hpp" #include "util/color.hpp" #include #include StatusLine::StatusLine(std::shared_ptr component_matrix) noexcept : _component_matrix(std::move(component_matrix)), _need_render(false) { _component_matrix->fill(' '); } auto StatusLine::get() const noexcept -> const std::shared_ptr & { return _component_matrix; } auto StatusLine::get_need_render() const noexcept -> bool { return _need_render; } void StatusLine::set_need_render(bool need_render) noexcept { _need_render = need_render; } auto StatusLine::get_foreground_color() const noexcept -> uint32_t { return static_cast(fmt::color::white); } auto StatusLine::get_background_color() const noexcept -> uint32_t { return STATUSLINE_COLOR; } void StatusLine::set_status( StatusLineSection section, const std::string_view &status, int32_t start) noexcept { _clear_section(section, start); auto section_start = _get_section_start_x(section); auto pos = Vector2({.x = section_start + start, .y = 0}); const auto column_cnt = static_cast(_component_matrix->get_column_cnt()); const auto section_length = _section_lengths[section]; const auto status_len = static_cast(status.length()); _matrix_write_string( pos, status_len <= section_length ? status : status.substr(0U, static_cast(section_length))); set_need_render(true); } void StatusLine::set_section_length(StatusLineSection section, int32_t length) noexcept { _section_lengths[section] = length; } void StatusLine::_matrix_write_string( const Vector2 &position, const std::string_view &str) noexcept { auto working_pos = position; for (const auto &character : str) { _component_matrix->set(working_pos, character); working_pos += Vector2::right(); } } auto StatusLine::_get_section_start_x(StatusLineSection section) const noexcept -> int32_t { int32_t section_start = 0; auto section_index = static_cast(section); while (section_index > 0) { const auto prev_section = static_cast(section_index - 1); section_start += static_cast(_section_lengths.at(prev_section)); section_index--; } return section_start; } void StatusLine::_clear_section(StatusLineSection section, int32_t start) noexcept { auto section_start = _get_section_start_x(section); auto pos = Vector2({.x = section_start + start, .y = 0}); auto section_length = _section_lengths[section]; for (auto index = 0; index < section_length - start; index++) { _component_matrix->set(pos, ' '); pos += Vector2::right(); } }