feat: truncate long items in the file list

This commit is contained in:
sxyazi 2025-05-14 01:40:59 +08:00
parent cea2628a19
commit f248187fc7
No known key found for this signature in database
4 changed files with 38 additions and 12 deletions

View file

@ -32,15 +32,16 @@ function Current:redraw()
return self:empty()
end
local entities, linemodes = {}, {}
local left, right = {}, {}
for _, f in ipairs(files) do
entities[#entities + 1] = Entity:new(f):redraw()
linemodes[#linemodes + 1] = Linemode:new(f):redraw()
left[#left + 1] = Entity:new(f):redraw()
right[#right + 1] = Linemode:new(f):redraw()
left[#left]:truncate { max = math.max(0, self._area.w - right[#right]:width()) }
end
return {
ui.List(entities):area(self._area),
ui.Text(linemodes):area(self._area):align(ui.Text.RIGHT),
ui.List(left):area(self._area),
ui.Text(right):area(self._area):align(ui.Text.RIGHT),
}
end

View file

@ -17,13 +17,13 @@ function Parent:redraw()
return {}
end
local entities = {}
local items = {}
for _, f in ipairs(self._folder.window) do
entities[#entities + 1] = Entity:new(f):redraw()
items[#items + 1] = Entity:new(f):redraw():truncate { max = self._area.w }
end
return {
ui.List(entities):area(self._area),
ui.List(items):area(self._area),
}
end

View file

@ -19,13 +19,13 @@ function M:peek(job)
return ya.preview_widget(job, ui.Line(s):area(job.area):align(ui.Line.CENTER))
end
local entities = {}
local items = {}
for _, f in ipairs(folder.window) do
entities[#entities + 1] = Entity:new(f):redraw()
items[#items + 1] = Entity:new(f):redraw():truncate { max = job.area.w }
end
ya.preview_widget(job, {
ui.List(entities):area(job.area),
ui.List(items):area(job.area),
table.unpack(Marker:new(job.area, folder):redraw()),
})
end

View file

@ -1,4 +1,4 @@
use std::mem;
use std::{borrow::Cow, mem};
use ansi_to_tui::IntoText;
use mlua::{AnyUserData, ExternalError, ExternalResult, IntoLua, Lua, MetaMethod, Table, UserData, UserDataMethods, Value};
@ -131,5 +131,30 @@ impl UserData for Line {
methods.add_method("visible", |_, me, ()| {
Ok(me.inner.iter().flat_map(|s| s.content.chars()).any(|c| c.width().unwrap_or(0) > 0))
});
methods.add_function_mut("truncate", |_, (ud, t): (AnyUserData, Table)| {
let mut me = ud.borrow_mut::<Self>()?;
let max = t.raw_get("max")?;
let mut width = 0;
'outer: for (x, span) in me.inner.iter_mut().enumerate() {
for (y, c) in span.content.char_indices() {
width += c.width().unwrap_or(0);
if width < max {
continue;
} else if width == max && span.content[y..].chars().nth(1).is_none() {
continue;
}
match &mut span.content {
Cow::Borrowed(s) => span.content = Cow::Borrowed(&s[..y]),
Cow::Owned(s) => s.truncate(y),
}
me.inner.spans.truncate(x + 1);
me.inner.spans.push(ratatui::text::Span::raw(""));
break 'outer;
}
}
Ok(ud)
});
}
}