#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}); for (const auto &character : status) { _component_matrix->set(pos, character); pos += Vector2::right(); } set_need_render(true); } void StatusLine::set_section_length(StatusLineSection section, int32_t length) noexcept { _section_lengths[section] = length; } 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(); } }