Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions examples/borders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@ int main() {
std::vector<std::string> 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();
Expand Down
32 changes: 19 additions & 13 deletions rawterm/extras/border.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@

#include <algorithm>
#include <optional>
#include <span>
#include <string>
#include <vector>

#include <rawterm/color.h>
#include <rawterm/core.h>
#include <rawterm/cursor.h>
#include <rawterm/screen.h>
#include <rawterm/text.h>

namespace rawterm {
struct Border {
Expand Down Expand Up @@ -63,17 +65,21 @@ namespace rawterm {
"...";
}

[[nodiscard]] std::vector<std::string> render(const std::vector<std::string>* text) const {
[[nodiscard]] std::vector<std::string> render(std::span<std::string> text) const {
auto trunc_title = truncated_title();
std::vector<std::string> 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;
Expand All @@ -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());
Expand All @@ -108,7 +114,7 @@ namespace rawterm {
drawable_text = line.substr(0, static_cast<std::size_t>(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, ' ');

Expand Down Expand Up @@ -139,7 +145,7 @@ namespace rawterm {
return render;
};

void draw(Cursor& cur, const std::vector<std::string>* text) const {
void draw(Cursor& cur, std::span<std::string> text) const {
// Disable if rawterm_debug
if (detail::is_debug()) {
return;
Expand Down
12 changes: 6 additions & 6 deletions tests/border_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ boost::ut::suite<"Border"> border_suite = [] {
std::vector<std::string> 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);
Expand All @@ -35,7 +35,7 @@ boost::ut::suite<"Border"> border_suite = [] {
std::vector<std::string> 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
Expand All @@ -45,7 +45,7 @@ boost::ut::suite<"Border"> border_suite = [] {
"render without passed text"_test = [&b] {
std::vector<std::string> expected = {"┌────────┐", "└────────┘"};
std::vector<std::string> given = {};
auto rendered = b.render(&given);
auto rendered = b.render(given);
expect(rendered == expected);
};

Expand All @@ -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);
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions tests/menu_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
};
Loading