feat: use ellipsizing for item names

This commit is contained in:
Hojjat 2026-02-19 10:01:06 -07:00 committed by Jacob Kauffmann
parent f9d4ca4867
commit 059f0227f9

View file

@ -2223,6 +2223,28 @@ impl Item {
name.replace('.', ".\u{200B}").replace('_', "_\u{200B}") name.replace('.', ".\u{200B}").replace('_', "_\u{200B}")
} }
/// Text widget for a filename in grid/icon view: word-or-glyph wrapping, middle-ellipsized to 3 lines.
fn grid_display_name<'a>(
name: impl Into<Cow<'a, str>> + 'a,
) -> widget::Text<'a, cosmic::Theme, cosmic::Renderer> {
widget::text::body(name)
.wrapping(text::Wrapping::WordOrGlyph)
.ellipsize(text::Ellipsize::Middle(
text::EllipsizeHeightLimit::Lines(3),
))
}
/// Text widget for a filename in list view: word-or-glyph wrapping, middle-ellipsized to 1 line.
fn list_display_name<'a>(
name: impl Into<Cow<'a, str>> + 'a,
) -> widget::Text<'a, cosmic::Theme, cosmic::Renderer> {
widget::text::body(name)
.wrapping(text::Wrapping::WordOrGlyph)
.ellipsize(text::Ellipsize::Middle(
text::EllipsizeHeightLimit::Lines(1),
))
}
pub fn path_opt(&self) -> Option<&PathBuf> { pub fn path_opt(&self) -> Option<&PathBuf> {
self.location_opt.as_ref()?.path_opt() self.location_opt.as_ref()?.path_opt()
} }
@ -4706,6 +4728,7 @@ impl Tab {
vertical_alignment: Vertical::Top, vertical_alignment: Vertical::Top,
shaping: text::Shaping::default(), shaping: text::Shaping::default(),
wrapping: text::Wrapping::None, wrapping: text::Wrapping::None,
ellipsize: text::Ellipsize::End(text::EllipsizeHeightLimit::Lines(1)),
}; };
graphics::text::Paragraph::with_text(text) graphics::text::Paragraph::with_text(text)
.min_bounds() .min_bounds()
@ -4919,7 +4942,11 @@ impl Tab {
let (name_width, name_text) = if children.is_empty() { let (name_width, name_text) = if children.is_empty() {
( (
text_width_heading(&name), text_width_heading(&name),
widget::text::heading(name).wrapping(text::Wrapping::None), widget::text::heading(name)
.wrapping(text::Wrapping::None)
.ellipsize(text::Ellipsize::End(
text::EllipsizeHeightLimit::Lines(1),
)),
) )
} else { } else {
children.push( children.push(
@ -5218,7 +5245,7 @@ impl Tab {
)) ))
.into(), .into(),
widget::tooltip( widget::tooltip(
widget::button::custom(widget::text::body(&item.display_name)) widget::button::custom(Item::grid_display_name(&item.display_name))
.id(item.button_id.clone()) .id(item.button_id.clone())
.padding([0, space_xxxs]) .padding([0, space_xxxs])
.class(button_style( .class(button_style(
@ -5383,18 +5410,20 @@ impl Tab {
false, false,
false, false,
)), )),
widget::button::custom(widget::text::body(item.display_name.clone())) widget::button::custom(
.id(item.button_id.clone()) Item::grid_display_name(item.display_name.clone()),
.on_press(Message::Click(Some(*i))) )
.padding([0, space_xxxs]) .id(item.button_id.clone())
.class(button_style( .on_press(Message::Click(Some(*i)))
item.selected, .padding([0, space_xxxs])
item.highlighted, .class(button_style(
item.cut, item.selected,
true, item.highlighted,
true, item.cut,
false, true,
)), true,
false,
)),
]; ];
let column = let column =
@ -5593,7 +5622,7 @@ impl Tab {
.size(icon_size) .size(icon_size)
.into(), .into(),
widget::column::with_children([ widget::column::with_children([
widget::text::body(item.display_name.clone()).into(), Item::list_display_name(item.display_name.clone()).into(),
//TODO: translate? //TODO: translate?
widget::text::caption(format!("{modified_text} - {size_text}")) widget::text::caption(format!("{modified_text} - {size_text}"))
.into(), .into(),
@ -5610,7 +5639,7 @@ impl Tab {
.size(icon_size) .size(icon_size)
.into(), .into(),
widget::column::with_children([ widget::column::with_children([
widget::text::body(item.display_name.clone()).into(), Item::list_display_name(item.display_name.clone()).into(),
widget::text::caption(match item.path_opt() { widget::text::caption(match item.path_opt() {
Some(path) => path.display().to_string(), Some(path) => path.display().to_string(),
None => String::new(), None => String::new(),
@ -5635,7 +5664,7 @@ impl Tab {
.content_fit(ContentFit::Contain) .content_fit(ContentFit::Contain)
.size(icon_size) .size(icon_size)
.into(), .into(),
widget::text::body(item.display_name.clone()) Item::list_display_name(item.display_name.clone())
.width(Length::Fill) .width(Length::Fill)
.into(), .into(),
widget::text::body(modified_text.clone()) widget::text::body(modified_text.clone())
@ -5702,7 +5731,7 @@ impl Tab {
.size(icon_size) .size(icon_size)
.into(), .into(),
widget::column::with_children([ widget::column::with_children([
widget::text::body(item.display_name.clone()).into(), Item::list_display_name(item.display_name.clone()).into(),
//TODO: translate? //TODO: translate?
widget::text::body(format!("{modified_text} - {size_text}")) widget::text::body(format!("{modified_text} - {size_text}"))
.into(), .into(),
@ -5719,7 +5748,7 @@ impl Tab {
.size(icon_size) .size(icon_size)
.into(), .into(),
widget::column::with_children([ widget::column::with_children([
widget::text::body(item.display_name.clone()).into(), Item::list_display_name(item.display_name.clone()).into(),
widget::text::caption(match item.path_opt() { widget::text::caption(match item.path_opt() {
Some(path) => path.display().to_string(), Some(path) => path.display().to_string(),
None => String::new(), None => String::new(),
@ -5744,7 +5773,7 @@ impl Tab {
.content_fit(ContentFit::Contain) .content_fit(ContentFit::Contain)
.size(icon_size) .size(icon_size)
.into(), .into(),
widget::text::body(item.display_name.clone()) Item::list_display_name(item.display_name.clone())
.width(Length::Fill) .width(Length::Fill)
.into(), .into(),
widget::text(modified_text) widget::text(modified_text)