improv(about): use ListButton

This commit is contained in:
Vukašin Vojinović 2026-04-17 13:19:23 +02:00 • committed by Michael Murphy
parent 8d7bcab258
commit c423ad1bfc
2 changed files with 23 additions and 13 deletions

View file

@ -1,8 +1,9 @@
use crate::{ use crate::{
Apply, Element, fl, Apply, Element, fl,
iced::{Alignment, Length}, iced::{Alignment, Length},
widget::{self, space}, widget::{self, list},
}; };
use std::rc::Rc;
#[derive(Debug, Default, Clone, derive_setters::Setters)] #[derive(Debug, Default, Clone, derive_setters::Setters)]
#[setters(into, strip_option)] #[setters(into, strip_option)]
@ -104,19 +105,23 @@ pub fn about<'a, Message: Clone + 'static>(
space_xxs, space_m, .. space_xxs, space_m, ..
} = crate::theme::spacing(); } = crate::theme::spacing();
let section_button = |name: &'a str, url: &'a str| -> Element<'a, Message> { let svg_accent = Rc::new(|theme: &crate::Theme| widget::svg::Style {
widget::row::with_capacity(3) color: Some(theme.cosmic().accent_text_color().into()),
.push(widget::text(name)) });
.push(space::horizontal())
let section_button = |name: &'a str, url: &'a str| -> list::ListButton<'a, Message> {
widget::row::with_capacity(2)
.push(widget::text::body(name).width(Length::Fill))
.push_maybe( .push_maybe(
(!url.is_empty()).then_some(crate::widget::icon::from_name("link-symbolic").icon()), (!url.is_empty()).then_some(
widget::icon::from_name("link-symbolic")
.icon()
.class(crate::theme::Svg::Custom(svg_accent.clone())),
),
) )
.align_y(Alignment::Center) .align_y(Alignment::Center)
.apply(widget::button::custom) .apply(list::button)
.class(crate::theme::Button::Link)
.on_press(on_url_press(url)) .on_press(on_url_press(url))
.width(Length::Fill)
.into()
}; };
let section = |list: &'a Vec<(String, String)>, title: String| { let section = |list: &'a Vec<(String, String)>, title: String| {

View file

@ -3,7 +3,7 @@
use crate::Element; use crate::Element;
use crate::widget::list_column::IntoListItem; use crate::widget::list_column::IntoListItem;
use crate::widget::{ListColumn, column, text}; use crate::widget::{ListColumn, column, list_column, text};
use std::borrow::Cow; use std::borrow::Cow;
/// A section within a settings view column. /// A section within a settings view column.
@ -11,6 +11,11 @@ pub fn section<'a, Message: Clone + 'static>() -> Section<'a, Message> {
with_column(ListColumn::default()) with_column(ListColumn::default())
} }
/// A section with a pre-defined list column of a given capacity.
pub fn with_capacity<'a, Message: Clone + 'static>(capacity: usize) -> Section<'a, Message> {
with_column(list_column::with_capacity(capacity))
}
/// A section with a pre-defined list column. /// A section with a pre-defined list column.
pub fn with_column<Message: Clone + 'static>( pub fn with_column<Message: Clone + 'static>(
children: ListColumn<'_, Message>, children: ListColumn<'_, Message>,
@ -47,7 +52,7 @@ impl<'a, Message: Clone + 'static> Section<'a, Message> {
} }
/// Add a child element to the section's list column, if `Some`. /// Add a child element to the section's list column, if `Some`.
pub fn add_maybe(self, item: Option<impl Into<Element<'a, Message>>>) -> Self { pub fn add_maybe(self, item: Option<impl IntoListItem<'a, Message>>) -> Self {
if let Some(item) = item { if let Some(item) = item {
self.add(item) self.add(item)
} else { } else {
@ -58,7 +63,7 @@ impl<'a, Message: Clone + 'static> Section<'a, Message> {
/// Extends the [`Section`] with the given children. /// Extends the [`Section`] with the given children.
pub fn extend( pub fn extend(
self, self,
children: impl IntoIterator<Item = impl Into<Element<'a, Message>>>, children: impl IntoIterator<Item = impl IntoListItem<'a, Message>>,
) -> Self { ) -> Self {
children.into_iter().fold(self, Self::add) children.into_iter().fold(self, Self::add)
} }