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:
parent
c162a1f24a
commit
8d7bcab258
1 changed files with 63 additions and 38 deletions
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue