mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
feat: truncate long items in the file list
This commit is contained in:
parent
cea2628a19
commit
f248187fc7
4 changed files with 38 additions and 12 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue