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() return self:empty()
end end
local entities, linemodes = {}, {} local left, right = {}, {}
for _, f in ipairs(files) do for _, f in ipairs(files) do
entities[#entities + 1] = Entity:new(f):redraw() left[#left + 1] = Entity:new(f):redraw()
linemodes[#linemodes + 1] = Linemode:new(f):redraw() right[#right + 1] = Linemode:new(f):redraw()
left[#left]:truncate { max = math.max(0, self._area.w - right[#right]:width()) }
end end
return { return {
ui.List(entities):area(self._area), ui.List(left):area(self._area),
ui.Text(linemodes):area(self._area):align(ui.Text.RIGHT), ui.Text(right):area(self._area):align(ui.Text.RIGHT),
} }
end end

View file

@ -17,13 +17,13 @@ function Parent:redraw()
return {} return {}
end end
local entities = {} local items = {}
for _, f in ipairs(self._folder.window) do 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 end
return { return {
ui.List(entities):area(self._area), ui.List(items):area(self._area),
} }
end 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)) return ya.preview_widget(job, ui.Line(s):area(job.area):align(ui.Line.CENTER))
end end
local entities = {} local items = {}
for _, f in ipairs(folder.window) do 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 end
ya.preview_widget(job, { ya.preview_widget(job, {
ui.List(entities):area(job.area), ui.List(items):area(job.area),
table.unpack(Marker:new(job.area, folder):redraw()), table.unpack(Marker:new(job.area, folder):redraw()),
}) })
end end

View file

@ -1,4 +1,4 @@
use std::mem; use std::{borrow::Cow, mem};
use ansi_to_tui::IntoText; use ansi_to_tui::IntoText;
use mlua::{AnyUserData, ExternalError, ExternalResult, IntoLua, Lua, MetaMethod, Table, UserData, UserDataMethods, Value}; 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, ()| { methods.add_method("visible", |_, me, ()| {
Ok(me.inner.iter().flat_map(|s| s.content.chars()).any(|c| c.width().unwrap_or(0) > 0)) 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)
});
} }
} }