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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ build/
.cache
zig-out/
.zig-cache
iris.log
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
---
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
rev: v6.0.0
hooks:
- id: check-case-conflict
- id: check-merge-conflict
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v19.1.7
rev: v21.1.1
hooks:
- id: clang-format
types_or: [c++, c, cuda]
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
### v4.0.8
### main/HEAD
* Add new Cursor::move overload to accept two integers
* Handle bug in border rendering crashing with no lines of text

### v4.0.7
* Added unit testing in `tests/` directory
Expand Down
3 changes: 2 additions & 1 deletion examples/borders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,14 @@ int main() {
rawterm::Cursor cur;
cur.reset();

std::vector<std::string> text = {"Hello world", "foo", "bar", "some text again and again"};
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);

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);
Expand Down
7 changes: 4 additions & 3 deletions examples/red_blue_panes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,10 @@ int main() {
}

auto pane_mgr = rawterm::PaneManager(rawterm::get_term_size());
pane_mgr.set_content(std::vector(
lryics_2.begin(),
lryics_2.begin() + std::min(term_size.vertical, static_cast<int>(lryics_2.size()))));
pane_mgr.set_content(
std::vector(
lryics_2.begin(),
lryics_2.begin() + std::min(term_size.vertical, static_cast<int>(lryics_2.size()))));

pane_mgr.set_pane_background(rawterm::Colors::aqua);

Expand Down
62 changes: 33 additions & 29 deletions rawterm/extras/border.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,14 @@ namespace rawterm {
[[nodiscard]] std::vector<std::string> render(const std::vector<std::string>* text) const {
auto trunc_title = truncated_title();
std::vector<std::string> render = {""};
std::size_t longest_txt =
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 = 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);

if (longest_txt > size.width()) {
longest_txt = size.width() - 2;
Expand All @@ -92,30 +94,32 @@ namespace rawterm {
}

// Drawing text
for (const auto& line : *text) {
std::string rendered_line = "";
if (border_char.has_value()) {
rendered_line.push_back(border_char.value());
} else {
rendered_line += VERTICAL_BAR;
if (!text->empty()) {
for (const auto& line : *text) {
std::string rendered_line = "";
if (border_char.has_value()) {
rendered_line.push_back(border_char.value());
} else {
rendered_line += VERTICAL_BAR;
}

std::string drawable_text = line;
if (line.size() > static_cast<std::size_t>(longest_txt)) {
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;
rendered_line += std::string(border_padding, ' ') + drawable_text +
std::string(border_padding + line_buffer, ' ');

if (border_char.has_value()) {
rendered_line.push_back(border_char.value());
} else {
rendered_line += VERTICAL_BAR;
}

render.push_back(rendered_line);
}

std::string drawable_text = line;
if (line.size() > static_cast<std::size_t>(longest_txt)) {
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;
rendered_line += std::string(border_padding, ' ') + drawable_text +
std::string(border_padding + line_buffer, ' ');

if (border_char.has_value()) {
rendered_line.push_back(border_char.value());
} else {
rendered_line += VERTICAL_BAR;
}

render.push_back(rendered_line);
}

// Bottom line
Expand Down
7 changes: 7 additions & 0 deletions tests/border_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ boost::ut::suite<"Border"> border_suite = [] {
expect(rendered.at(1).size() == 14);
};

"render without passed text"_test = [&b] {
std::vector<std::string> expected = {"┌────────┐", "└────────┘"};
std::vector<std::string> given = {};
auto rendered = b.render(&given);
expect(rendered == expected);
};

"Set title"_test = [&b, &b2] {
b.set_title("Super long title please");
expect(b.border_title == "Super long title please");
Expand Down
22 changes: 13 additions & 9 deletions tests/include/ut.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2118,8 +2118,9 @@ namespace boost::inline ext::ut::inline v2_1_1 {

if (filter_(level_, path_)) {
if (not level_++) {
reporter_.on(events::test_begin {
.type = test.type, .name = test.name, .location = test.location});
reporter_.on(
events::test_begin {
.type = test.type, .name = test.name, .location = test.location});
} else {
reporter_.on(events::test_run {.type = test.type, .name = test.name});
}
Expand All @@ -2146,13 +2147,14 @@ namespace boost::inline ext::ut::inline v2_1_1 {
}
#endif

if (not--level_) {
if (not --level_) {
reporter_.on(events::test_end {.type = test.type, .name = test.name});
} else { // N.B. prev. only root-level tests were signalled on
// finish
if constexpr (requires {
reporter_.on(events::test_finish {
.type = test.type, .name = test.name});
reporter_.on(
events::test_finish {
.type = test.type, .name = test.name});
}) {
reporter_.on(events::test_finish {.type = test.type, .name = test.name});
}
Expand All @@ -2172,14 +2174,16 @@ namespace boost::inline ext::ut::inline v2_1_1 {
}

if (static_cast<bool>(assertion.expr)) {
reporter_.on(events::assertion_pass<TExpr> {
.expr = assertion.expr, .location = assertion.location});
reporter_.on(
events::assertion_pass<TExpr> {
.expr = assertion.expr, .location = assertion.location});
return true;
}

++fails_;
reporter_.on(events::assertion_fail<TExpr> {
.expr = assertion.expr, .location = assertion.location});
reporter_.on(
events::assertion_fail<TExpr> {
.expr = assertion.expr, .location = assertion.location});
return false;
}

Expand Down
Loading