aboutsummaryrefslogtreecommitdiff
path: root/src/game/components
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-06-23 17:05:43 +0200
committerHampusM <hampus@hampusmat.com>2022-06-23 18:24:48 +0200
commita570e494bca43c30d7ec91d293051c0c818509b5 (patch)
tree4eea8c16d1434893ca51b721c5498ece65c836aa /src/game/components
parentec5c7cbccc533bacab661e991e7011584d3bb47f (diff)
feat: add statusline mode styling
Diffstat (limited to 'src/game/components')
-rw-r--r--src/game/components/statusline.cpp77
-rw-r--r--src/game/components/statusline.hpp7
2 files changed, 75 insertions, 9 deletions
diff --git a/src/game/components/statusline.cpp b/src/game/components/statusline.cpp
index 5b59a53..1892f86 100644
--- a/src/game/components/statusline.cpp
+++ b/src/game/components/statusline.cpp
@@ -3,15 +3,17 @@
#include "engine/data/bounds.hpp"
#include "engine/data/vector2.hpp"
#include "util/color.hpp"
+#include "util/ranges.hpp"
#include <fmt/color.h>
+#include <optional>
#include <utility>
StatusLine::StatusLine(std::shared_ptr<ComponentMatrix> component_matrix) noexcept
: _component_matrix(std::move(component_matrix)), _need_render(false)
{
- _component_matrix->fill(' ');
+ _component_matrix->fill(ComponentElement({.value = ' '}));
}
auto StatusLine::get() const noexcept -> const std::shared_ptr<ComponentMatrix> &
@@ -39,11 +41,16 @@ auto StatusLine::get_background_color() const noexcept -> uint32_t
return STATUSLINE_COLOR;
}
-void StatusLine::set_status(
+void StatusLine::set_section_status(
StatusLineSection section,
const std::string_view &status,
int32_t start) noexcept
{
+ if (status.length() == 0U)
+ {
+ return;
+ }
+
_clear_section(section, start);
auto section_start = _get_section_start_x(section);
@@ -56,11 +63,60 @@ void StatusLine::set_status(
const auto status_len = static_cast<int32_t>(status.length());
+ const auto section_style =
+ _section_styles.contains(section) ? _section_styles.at(section) : Style();
+
+ auto is_style_applied = false;
+
+ if (section_style.padding_left > 0U)
+ {
+ auto padding_remaining = section_style.padding_left;
+
+ _component_matrix->set(pos, {.value = ' ', .style = section_style});
+ padding_remaining--;
+
+ for (auto index : IotaView(0U, padding_remaining))
+ {
+ pos += Vector2::right();
+
+ _component_matrix->set(pos, {.value = ' '});
+ }
+
+ is_style_applied = true;
+ }
+
+ pos += Vector2::right();
+
+ auto status_offset_start = 0U;
+
+ // Apply the section style to the first status character if it hasn't
+ // already been applied
+ if (!is_style_applied)
+ {
+ _component_matrix->set(pos, {.value = status[0], .style = section_style});
+ status_offset_start++;
+ pos += Vector2::right();
+
+ is_style_applied = true;
+ }
+
+ const auto final_status_length =
+ status_len <= section_length ? status_len : section_length;
+
_matrix_write_string(
pos,
- status_len <= section_length
- ? status
- : status.substr(0U, static_cast<uint32_t>(section_length)));
+ status.substr(status_offset_start, static_cast<uint32_t>(final_status_length)));
+
+ pos = pos.to_direction(Vector2::right(), final_status_length);
+
+ for (auto index : IotaView(0U, section_style.padding_right))
+ {
+ _component_matrix->set(pos, {.value = ' '});
+
+ pos += Vector2::right();
+ }
+
+ _component_matrix->set(pos, {.value = ' ', .style = {.reset_before = true}});
set_need_render(true);
}
@@ -70,6 +126,11 @@ void StatusLine::set_section_length(StatusLineSection section, int32_t length) n
_section_lengths[section] = length;
}
+void StatusLine::set_section_style(StatusLineSection section, const Style &style) noexcept
+{
+ _section_styles[section] = style;
+}
+
void StatusLine::_matrix_write_string(
const Vector2 &position,
const std::string_view &str) noexcept
@@ -78,7 +139,7 @@ void StatusLine::_matrix_write_string(
for (const auto &character : str)
{
- _component_matrix->set(working_pos, character);
+ _component_matrix->set(working_pos, {.value = character});
working_pos += Vector2::right();
}
@@ -110,9 +171,9 @@ void StatusLine::_clear_section(StatusLineSection section, int32_t start) noexce
auto section_length = _section_lengths[section];
- for (auto index = 0; index < section_length - start; index++)
+ for (auto index : IotaView(0, section_length - start))
{
- _component_matrix->set(pos, ' ');
+ _component_matrix->set(pos, ComponentElement({.value = ' '}));
pos += Vector2::right();
}
diff --git a/src/game/components/statusline.hpp b/src/game/components/statusline.hpp
index 8c1969b..e009174 100644
--- a/src/game/components/statusline.hpp
+++ b/src/game/components/statusline.hpp
@@ -3,6 +3,7 @@
#include "interfaces/matrix.hpp"
#include "interfaces/statusline.hpp"
+#include "engine/data/style.hpp"
#include "engine/data/vector2.hpp"
#include <memory>
@@ -26,16 +27,20 @@ public:
auto get_background_color() const noexcept -> uint32_t override;
- void set_status(
+ void set_section_status(
StatusLineSection section,
const std::string_view &status,
int32_t start) noexcept override;
void set_section_length(StatusLineSection section, int32_t length) noexcept override;
+ void
+ set_section_style(StatusLineSection section, const Style &style) noexcept override;
+
private:
std::shared_ptr<ComponentMatrix> _component_matrix;
std::unordered_map<StatusLineSection, int32_t> _section_lengths;
+ std::unordered_map<StatusLineSection, Style> _section_styles;
bool _need_render;
void