fix(list_column): add back divider_padding

Also matches previous behavior of both paddings being applied to subsequent items, rather than globally.
This commit is contained in:
Vukašin Vojinović 2026-04-17 00:45:33 +02:00 committed by Michael Murphy
parent c162a1f24a
commit 8d7bcab258

View file

@ -64,11 +64,19 @@ impl<'a, Message> IntoListItem<'a, Message> for ListButton<'a, Message> {
} }
} }
// Snapshots the padding values at the moment an item is added
struct ListEntry<'a, Message> {
item: ListItem<'a, Message>,
item_padding: Padding,
divider_padding: u16,
}
#[must_use] #[must_use]
pub struct ListColumn<'a, Message> { pub struct ListColumn<'a, Message> {
list_item_padding: Padding, list_item_padding: Padding,
divider_padding: u16,
style: theme::Container<'a>, style: theme::Container<'a>,
children: Vec<ListItem<'a, Message>>, children: Vec<ListEntry<'a, Message>>,
} }
#[inline] #[inline]
@ -83,6 +91,7 @@ pub fn with_capacity<'a, Message: 'static>(capacity: usize) -> ListColumn<'a, Me
ListColumn { ListColumn {
list_item_padding: [space_xxs, space_m].into(), list_item_padding: [space_xxs, space_m].into(),
divider_padding: 0,
style: theme::Container::List, style: theme::Container::List,
children: Vec::with_capacity(capacity), children: Vec::with_capacity(capacity),
} }
@ -100,10 +109,14 @@ impl<'a, Message: Clone + 'static> ListColumn<'a, Message> {
Self::default() Self::default()
} }
/// Adds an element to the list column. /// Adds a [`ListItem`] to the [`ListColumn`].
#[allow(clippy::should_implement_trait)] #[allow(clippy::should_implement_trait)]
pub fn add(mut self, item: impl IntoListItem<'a, Message>) -> Self { pub fn add(mut self, item: impl IntoListItem<'a, Message>) -> Self {
self.children.push(item.into_list_item()); self.children.push(ListEntry {
item: item.into_list_item(),
item_padding: self.list_item_padding,
divider_padding: self.divider_padding,
});
self self
} }
@ -119,53 +132,65 @@ impl<'a, Message: Clone + 'static> ListColumn<'a, Message> {
self self
} }
#[inline]
pub fn divider_padding(mut self, padding: u16) -> Self {
self.divider_padding = padding;
self
}
#[must_use] #[must_use]
pub fn into_element(self) -> Element<'a, Message> { pub fn into_element(self) -> Element<'a, Message> {
let padding = self.list_item_padding;
let count = self.children.len(); let count = self.children.len();
let last_index = count.saturating_sub(1); let last_index = count.saturating_sub(1);
let radius_s = theme::active().cosmic().radius_s(); let radius_s = theme::active().cosmic().radius_s();
let mut col = column::with_capacity((2 * count).saturating_sub(1));
// Ensure minimum height of 32 // Ensure minimum height of 32
let content_row = |content| { let content_row = |content| {
row![container(content), vertical().height(32)].align_y(iced::Alignment::Center) row![container(content), vertical().height(32)].align_y(iced::Alignment::Center)
}; };
self.children for (
.into_iter() i,
.enumerate() ListEntry {
.fold( item,
column::with_capacity((2 * count).saturating_sub(1)), item_padding,
|mut col, (i, item)| { divider_padding,
if i > 0 { },
col = col.push(divider::horizontal::default()); ) in self.children.into_iter().enumerate()
} {
if i > 0 {
col = col
.push(container(divider::horizontal::default()).padding([0, divider_padding]));
}
match item { col = match item {
ListItem::Element(content) => { ListItem::Element(content) => col.push(
col.push(content_row(content).padding(padding).width(Length::Fill)) content_row(content)
} .padding(item_padding)
ListItem::Button(ListButton { .width(Length::Fill),
content, ),
on_press, ListItem::Button(ListButton {
selected, content,
}) => col.push( on_press,
content_row(content) selected,
.apply(button::custom) }) => col.push(
.padding(padding) content_row(content)
.width(Length::Fill) .apply(button::custom)
.on_press_maybe(on_press) .padding(item_padding)
.selected(selected) .width(Length::Fill)
.class(theme::Button::ListItem(get_radius( .on_press_maybe(on_press)
radius_s, .selected(selected)
i == 0, .class(theme::Button::ListItem(get_radius(
i == last_index, radius_s,
))), i == 0,
), i == last_index,
} ))),
}, ),
) };
.width(Length::Fill) }
col.width(Length::Fill)
.apply(container) .apply(container)
.class(self.style) .class(self.style)
.into() .into()