aboutsummaryrefslogtreecommitdiff
path: root/src/engine/components/statusline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/components/statusline.cpp')
-rw-r--r--src/engine/components/statusline.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/engine/components/statusline.cpp b/src/engine/components/statusline.cpp
new file mode 100644
index 0000000..ae0f3fa
--- /dev/null
+++ b/src/engine/components/statusline.cpp
@@ -0,0 +1,99 @@
+#include "statusline.hpp"
+
+#include "engine/data/vector2.hpp"
+#include "util/color.hpp"
+
+#include <fmt/color.h>
+
+#include <utility>
+
+StatusLine::StatusLine(std::shared_ptr<ComponentMatrix> component_matrix) noexcept
+ : _component_matrix(std::move(component_matrix)), _need_render(false)
+{
+ _component_matrix->fill(' ');
+}
+
+auto StatusLine::get() const noexcept -> const std::shared_ptr<ComponentMatrix> &
+{
+ 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<uint32_t>(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<int32_t>(section);
+
+ while (section_index > 0)
+ {
+ const auto prev_section = static_cast<StatusLineSection>(section_index - 1);
+
+ section_start += static_cast<int32_t>(_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();
+ }
+}