vxfw(RichText): fix softwrap of long words
The trimmed_width calculation of softwrapped long words was incorrect. Fix the calculation and add a test for the case.
This commit is contained in:
parent
d4ad04b1fe
commit
497b544c59
1 changed files with 32 additions and 1 deletions
|
@ -288,7 +288,10 @@ pub const SoftwrapIterator = struct {
|
||||||
if (cur_width + next_width > max_width) {
|
if (cur_width + next_width > max_width) {
|
||||||
// Trim the word to see if it can fit on a line by itself
|
// Trim the word to see if it can fit on a line by itself
|
||||||
const trimmed = trimWSPLeft(word);
|
const trimmed = trimWSPLeft(word);
|
||||||
const trimmed_width = next_width - trimmed.len;
|
// New width is the previous width minus the number of cells we trimmed because we
|
||||||
|
// are only trimming cells that would have been 1 wide (' ' and '\t' both measure as
|
||||||
|
// 1 wide)
|
||||||
|
const trimmed_width = next_width -| (word.len - trimmed.len);
|
||||||
if (trimmed_width > max_width) {
|
if (trimmed_width > max_width) {
|
||||||
// Won't fit on line by itself, so fit as much on this line as we can
|
// Won't fit on line by itself, so fit as much on this line as we can
|
||||||
for (word) |cell| {
|
for (word) |cell| {
|
||||||
|
@ -379,6 +382,34 @@ test RichText {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "long word wrapping" {
|
||||||
|
var rich_text: RichText = .{
|
||||||
|
.text = &.{
|
||||||
|
.{ .text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const rich_widget = rich_text.widget();
|
||||||
|
|
||||||
|
var arena = std.heap.ArenaAllocator.init(std.testing.allocator);
|
||||||
|
defer arena.deinit();
|
||||||
|
const ucd = try vaxis.Unicode.init(arena.allocator());
|
||||||
|
vxfw.DrawContext.init(&ucd, .unicode);
|
||||||
|
|
||||||
|
const len = rich_text.text[0].text.len;
|
||||||
|
const width: u16 = 8;
|
||||||
|
|
||||||
|
const ctx: vxfw.DrawContext = .{
|
||||||
|
.arena = arena.allocator(),
|
||||||
|
.min = .{},
|
||||||
|
.max = .{ .width = width, .height = null },
|
||||||
|
};
|
||||||
|
|
||||||
|
const surface = try rich_widget.draw(ctx);
|
||||||
|
// Height should be length / width
|
||||||
|
try std.testing.expectEqual(len / width, surface.size.height);
|
||||||
|
}
|
||||||
|
|
||||||
test "refAllDecls" {
|
test "refAllDecls" {
|
||||||
std.testing.refAllDecls(@This());
|
std.testing.refAllDecls(@This());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue