diff --git a/CHANGELOG.md b/CHANGELOG.md index 13e451c..d61e014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ * Add new Cursor::move overload to accept two integers * Handle bug in border rendering crashing with no lines of text * Removed zig build system +* borders now accept spans instead of enforcing vectors ### v4.0.7 * Added unit testing in `tests/` directory diff --git a/examples/borders.cpp b/examples/borders.cpp index d91b8a5..3b433a4 100644 --- a/examples/borders.cpp +++ b/examples/borders.cpp @@ -19,14 +19,14 @@ int main() { std::vector text = {}; rawterm::Region region = rawterm::Region(rawterm::Pos(3, 3), rawterm::Pos(10, 25)); auto border = rawterm::Border(region).set_padding(1).set_title("Hello world"); - border.draw(cur, &text); + border.draw(cur, text); rawterm::Region region2 = rawterm::Region(rawterm::Pos(13, 3), rawterm::Pos(20, 40)); text = {"Hello world", "foo", "bar", "some text again and again"}; auto color = rawterm::Color(109, 192, 35); auto border2 = rawterm::Border(region2, '#').set_title("This is my title").set_color(color); - border2.draw(cur, &text); + border2.draw(cur, text); std::ignore = rawterm::wait_for_input(); rawterm::Cursor::cursor_show(); diff --git a/rawterm/extras/border.h b/rawterm/extras/border.h index cb3d343..f42ad54 100644 --- a/rawterm/extras/border.h +++ b/rawterm/extras/border.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include namespace rawterm { struct Border { @@ -63,17 +65,21 @@ namespace rawterm { "..."; } - [[nodiscard]] std::vector render(const std::vector* text) const { + [[nodiscard]] std::vector render(std::span text) const { auto trunc_title = truncated_title(); std::vector render = {""}; - std::size_t longest_txt = text->empty() - ? 0 - : std::max_element( - text->begin(), text->end(), - [](const std::string& a, const std::string& b) { - return a.size() < b.size(); - })->size() + - std::size_t(border_padding); + + std::size_t longest_txt = 0; + if (text.size()) { + longest_txt = std::max_element( + text.begin(), text.end(), + [](const std::string& a, const std::string& b) { + return a.size() < b.size(); + }) + ->size(); + } + + longest_txt += std::size_t(border_padding); if (longest_txt > size.width()) { longest_txt = size.width() - 2; @@ -94,8 +100,8 @@ namespace rawterm { } // Drawing text - if (!text->empty()) { - for (const auto& line : *text) { + if (!text.empty()) { + for (const auto& line : text) { std::string rendered_line = ""; if (border_char.has_value()) { rendered_line.push_back(border_char.value()); @@ -108,7 +114,7 @@ namespace rawterm { drawable_text = line.substr(0, static_cast(longest_txt)); } const std::size_t line_buffer = - size.width() - drawable_text.size() - border_padding - 2; + size.width() - raw_size(drawable_text) - border_padding - 2; rendered_line += std::string(border_padding, ' ') + drawable_text + std::string(border_padding + line_buffer, ' '); @@ -139,7 +145,7 @@ namespace rawterm { return render; }; - void draw(Cursor& cur, const std::vector* text) const { + void draw(Cursor& cur, std::span text) const { // Disable if rawterm_debug if (detail::is_debug()) { return; diff --git a/tests/border_test.cpp b/tests/border_test.cpp index acaa82b..af90e61 100644 --- a/tests/border_test.cpp +++ b/tests/border_test.cpp @@ -19,7 +19,7 @@ boost::ut::suite<"Border"> border_suite = [] { std::vector expected = {"┌─────────┐", "│Lorem i│", "│consect│", "│Morbi i│", "│placera│", "└─────────┘"}; - auto rendered = b.render(&text); + auto rendered = b.render(text); expect(rendered == expected); // either end is a box drawing char, which is 3 bytes expect(rendered.at(1).size() == 13); @@ -35,7 +35,7 @@ boost::ut::suite<"Border"> border_suite = [] { std::vector expected = {"┌────────┐", "│ Lorem i│", "│ consect│", "│ Morbi i│", "│ placera│", "└────────┘"}; - auto rendered = b.render(&text); + auto rendered = b.render(text); expect(rendered == expected); // either end is a box drawing char, which is 3 bytes @@ -45,7 +45,7 @@ boost::ut::suite<"Border"> border_suite = [] { "render without passed text"_test = [&b] { std::vector expected = {"┌────────┐", "└────────┘"}; std::vector given = {}; - auto rendered = b.render(&given); + auto rendered = b.render(given); expect(rendered == expected); }; @@ -63,14 +63,14 @@ boost::ut::suite<"Border"> border_suite = [] { }; "render with padding and title"_test = [&b, &text] { - auto rendered = b.render(&text); + auto rendered = b.render(text); std::string expected = "┌Super...┐"; expect(rendered.at(0) == expected); }; "render with title"_test = [&b2, &text] { - auto rendered = b2.render(&text); + auto rendered = b2.render(text); std::string expected = "#Test#####"; expect(rendered.at(0) == expected); @@ -87,7 +87,7 @@ boost::ut::suite<"Border"> border_suite = [] { }; "render with padding, title, color"_test = [&b, &text] { - auto rendered = b.render(&text); + auto rendered = b.render(text); std::string expected = "┌Super...┐"; expect(rendered.at(0) == expected) << rendered.at(0); diff --git a/tests/menu_test.cpp b/tests/menu_test.cpp index 399ca1f..64be131 100644 --- a/tests/menu_test.cpp +++ b/tests/menu_test.cpp @@ -60,7 +60,7 @@ boost::ut::suite<"Menu"> menu_suite = [] { "vertical render"_test = [&menu, &options] { std::string render = menu.render(); - const int nl_count = std::count(render.begin(), render.end(), '\n'); - expect(nl_count == options.size() + 1); + const long nl_count = std::count(render.begin(), render.end(), '\n'); + expect(nl_count == long(options.size()) + 1); }; };