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()
|
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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue