improv: make popover styling consistent

Makes all popovers use the same styling, with hover highlights.
This commit is contained in:
Vukašin Vojinović 2025-11-12 21:34:47 +01:00 committed by Jacob Kauffmann
parent a73f8c85db
commit 7a1a3115d8
11 changed files with 98 additions and 133 deletions

View file

@ -400,7 +400,7 @@ impl cosmic::Application for SettingsApp {
crate::pages::Message::AccessibilityShortcuts(message) => { crate::pages::Message::AccessibilityShortcuts(message) => {
if let Some(page) = self if let Some(page) = self
.pages .pages
.page_mut::<input::keyboard::shortcuts::accessibility::Page>() .page_mut::<input::keyboard::shortcuts::accessibility::Page>()
{ {
return page.update(message).map(Into::into); return page.update(message).map(Into::into);
} }

View file

@ -238,7 +238,7 @@ impl page::Page<crate::pages::Message> for Page {
let control = widget::column::with_capacity(2) let control = widget::column::with_capacity(2)
.push(description) .push(description)
.push(pin) .push(pin)
.spacing(theme::active().cosmic().space_xxs()); .spacing(theme::spacing().space_xxs);
let confirm_button = let confirm_button =
widget::button::suggested(fl!("confirm")).on_press(Message::PinConfirm); widget::button::suggested(fl!("confirm")).on_press(Message::PinConfirm);
@ -783,12 +783,11 @@ fn status() -> Section<crate::pages::Message> {
} }
fn popup_button(message: Option<Message>, text: &str) -> Element<'_, Message> { fn popup_button(message: Option<Message>, text: &str) -> Element<'_, Message> {
let theme = theme::active(); let spacing = theme::spacing();
let theme = theme.cosmic();
widget::text::body(text) widget::text::body(text)
.align_y(Alignment::Center) .align_y(Alignment::Center)
.apply(widget::button::custom) .apply(widget::button::custom)
.padding([theme.space_xxxs(), theme.space_xs()]) .padding([spacing.space_xxxs, spacing.space_xs])
.width(Length::Fill) .width(Length::Fill)
.class(theme::Button::MenuItem) .class(theme::Button::MenuItem)
.on_press_maybe(message) .on_press_maybe(message)
@ -839,24 +838,23 @@ fn connected_devices() -> Section<crate::pages::Message> {
) )
.position(widget::popover::Position::Bottom) .position(widget::popover::Position::Bottom)
.on_close(Message::PopupDevice(None)) .on_close(Message::PopupDevice(None))
.popup({ .popup(
widget::container( widget::column()
widget::column() .push_maybe(device.is_connected().then(|| {
.push_maybe(device.is_connected().then(|| { popup_button(
popup_button( Some(Message::DisconnectDevice(path.clone())),
Some(Message::DisconnectDevice(path.clone())), &descriptions[device_disconnect],
&descriptions[device_disconnect], )
) }))
})) .push(popup_button(
.push(popup_button( Some(Message::ForgetDevice(path.clone())),
Some(Message::ForgetDevice(path.clone())), &descriptions[device_forget],
&descriptions[device_forget], ))
)), .width(Length::Fixed(200.0))
) .apply(widget::container)
.width(Length::Fixed(200.0)) .padding(theme::spacing().space_xxs)
.padding(theme::active().cosmic().space_xxxs()) .class(theme::Container::Dropdown),
.class(theme::Container::Dialog) )
})
.into() .into()
} else { } else {
widget::button::icon(widget::icon::from_name("view-more-symbolic")) widget::button::icon(widget::icon::from_name("view-more-symbolic"))
@ -983,7 +981,7 @@ fn multiple_adapter() -> Section<crate::pages::Message> {
.size(20) .size(20)
.into(), .into(),
widget::horizontal_space() widget::horizontal_space()
.width(theme::active().cosmic().space_xxs()) .width(theme::spacing().space_xxs)
.into(), .into(),
text(&adapter.alias).wrapping(Wrapping::Word).into(), text(&adapter.alias).wrapping(Wrapping::Word).into(),
widget::horizontal_space().into(), widget::horizontal_space().into(),

View file

@ -441,7 +441,7 @@ impl Content {
}) })
), ),
// Icon theme previews // Icon theme previews
widget::column::with_children(vec![ widget::column::with_children([
text::heading(&*ICON_THEME).into(), text::heading(&*ICON_THEME).into(),
flex_row( flex_row(
self.icon_themes self.icon_themes

View file

@ -35,7 +35,7 @@ pub fn button(
cosmic::widget::column() cosmic::widget::column()
.push( .push(
cosmic::widget::button::custom_image_button( cosmic::widget::button::custom_image_button(
cosmic::widget::column::with_children(vec![ cosmic::widget::column::with_children([
cosmic::widget::row() cosmic::widget::row()
.extend( .extend(
handles handles

View file

@ -439,8 +439,8 @@ pub fn lists<
return Element::from(text::body(fl!("unknown"))); return Element::from(text::body(fl!("unknown")));
}; };
column::with_children(vec![ column::with_children([
column::with_children(vec![ column::with_children([
text::body(fl!("start-segment")).into(), text::body(fl!("start-segment")).into(),
AppletReorderList::new( AppletReorderList::new(
config config
@ -471,7 +471,7 @@ pub fn lists<
]) ])
.spacing(space_xxs) .spacing(space_xxs)
.into(), .into(),
column::with_children(vec![ column::with_children([
text::body(fl!("center-segment")).into(), text::body(fl!("center-segment")).into(),
AppletReorderList::new( AppletReorderList::new(
config config
@ -501,7 +501,7 @@ pub fn lists<
]) ])
.spacing(space_xxs) .spacing(space_xxs)
.into(), .into(),
column::with_children(vec![ column::with_children([
text::body(fl!("end-segment")).into(), text::body(fl!("end-segment")).into(),
AppletReorderList::new( AppletReorderList::new(
config config

View file

@ -9,8 +9,7 @@ use cosmic::{
Apply, Element, Task, Apply, Element, Task,
app::{ContextDrawer, context_drawer}, app::{ContextDrawer, context_drawer},
cosmic_config::{self, ConfigSet}, cosmic_config::{self, ConfigSet},
iced::{Alignment, Color, Length}, iced::{Alignment, Length},
iced_core::Border,
theme, theme,
widget::{self, ListColumn, button, container, icon, radio, row, settings}, widget::{self, ListColumn, button, container, icon, radio, row, settings},
}; };
@ -166,23 +165,19 @@ fn popover_menu_row(
label: String, label: String,
message: impl Fn(DefaultKey) -> SourceContext + 'static, message: impl Fn(DefaultKey) -> SourceContext + 'static,
) -> cosmic::Element<'static, Message> { ) -> cosmic::Element<'static, Message> {
let spacing = theme::spacing();
widget::text::body(label) widget::text::body(label)
.apply(widget::container) .align_y(Alignment::Center)
.class(cosmic::theme::Container::custom(|theme| {
widget::container::Style {
background: None,
..container::Catalog::style(theme, &cosmic::theme::Container::List)
}
}))
.apply(button::custom) .apply(button::custom)
.on_press(()) .padding([spacing.space_xxxs, spacing.space_xs])
.class(theme::Button::Transparent) .width(Length::Fill)
.class(theme::Button::MenuItem)
.on_press(Message::SourceContext(message(id)))
.apply(Element::from) .apply(Element::from)
.map(move |()| Message::SourceContext(message(id)))
} }
fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> { fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> {
widget::column::with_children(vec![ widget::column::with_children([
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "move-up"), fl!("keyboard-sources", "move-up"),
@ -193,7 +188,10 @@ fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> {
fl!("keyboard-sources", "move-down"), fl!("keyboard-sources", "move-down"),
SourceContext::MoveDown, SourceContext::MoveDown,
), ),
cosmic::widget::divider::horizontal::default().into(), widget::divider::horizontal::default()
.apply(widget::container)
.padding(8)
.into(),
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "settings"), fl!("keyboard-sources", "settings"),
@ -206,25 +204,10 @@ fn popover_menu(id: DefaultKey) -> cosmic::Element<'static, Message> {
), ),
popover_menu_row(id, fl!("keyboard-sources", "remove"), SourceContext::Remove), popover_menu_row(id, fl!("keyboard-sources", "remove"), SourceContext::Remove),
]) ])
.padding([2, 8]) .width(Length::Fixed(200.0))
.width(Length::Shrink) .apply(widget::container)
.height(Length::Shrink) .padding(theme::spacing().space_xxs)
.apply(cosmic::widget::container) .class(theme::Container::Dropdown)
.class(cosmic::theme::Container::custom(|theme| {
let cosmic = theme.cosmic();
let background = &cosmic.background;
container::Style {
icon_color: Some(background.on.into()),
text_color: Some(background.on.into()),
background: Some(Color::from(background.base).into()),
border: Border {
color: background.component.divider.into(),
width: 1.0,
radius: cosmic.corner_radii.radius_s.into(),
},
shadow: Default::default(),
}
}))
.into() .into()
} }
@ -236,7 +219,8 @@ fn popover_button(id: DefaultKey, expanded: bool) -> cosmic::Element<'static, Me
.on_press(on_press); .on_press(on_press);
if expanded { if expanded {
cosmic::widget::popover(button) widget::popover(button)
.position(widget::popover::Position::Bottom)
.popup(popover_menu(id)) .popup(popover_menu(id))
.on_close(Message::ExpandInputSourcePopover(None)) .on_close(Message::ExpandInputSourcePopover(None))
.into() .into()
@ -713,7 +697,7 @@ fn input_sources() -> Section<crate::pages::Message> {
.on_press(Message::ShowInputSourcesContext); .on_press(Message::ShowInputSourcesContext);
widget::column::with_capacity(2) widget::column::with_capacity(2)
.spacing(cosmic::theme::spacing().space_xxs) .spacing(theme::spacing().space_xxs)
.push(section) .push(section)
.push( .push(
widget::container(add_input_source) widget::container(add_input_source)
@ -816,7 +800,7 @@ fn keyboard_typing_assist() -> Section<crate::pages::Message> {
row::with_capacity(3) row::with_capacity(3)
.align_y(Alignment::Center) .align_y(Alignment::Center)
.spacing(cosmic::theme::spacing().space_s) .spacing(theme::spacing().space_s)
.push(widget::text::body(&descriptions[short])) .push(widget::text::body(&descriptions[short]))
.push(delay_slider) .push(delay_slider)
.push(widget::text::body(&descriptions[long])) .push(widget::text::body(&descriptions[long]))
@ -836,7 +820,7 @@ fn keyboard_typing_assist() -> Section<crate::pages::Message> {
row::with_capacity(3) row::with_capacity(3)
.align_y(Alignment::Center) .align_y(Alignment::Center)
.spacing(cosmic::theme::spacing().space_s) .spacing(theme::spacing().space_s)
.push(widget::text::body(&descriptions[slow])) .push(widget::text::body(&descriptions[slow]))
.push(rate_slider) .push(rate_slider)
.push(widget::text::body(&descriptions[fast])) .push(widget::text::body(&descriptions[fast]))

View file

@ -16,13 +16,13 @@ pub mod tiling;
use cosmic::app::ContextDrawer; use cosmic::app::ContextDrawer;
use cosmic::iced::Length; use cosmic::iced::Length;
use cosmic::widget::{self, icon, settings, text}; use cosmic::widget::{self, icon, settings, text};
use cosmic::{theme, Apply, Element, Task}; use cosmic::{Apply, Element, Task, theme};
use cosmic_config::ConfigGet; use cosmic_config::ConfigGet;
use cosmic_settings_config::Binding;
use cosmic_settings_config::shortcuts::action::{ use cosmic_settings_config::shortcuts::action::{
Direction, FocusDirection, Orientation, ResizeDirection, Direction, FocusDirection, Orientation, ResizeDirection,
}; };
use cosmic_settings_config::shortcuts::{self, Action, Shortcuts}; use cosmic_settings_config::shortcuts::{self, Action, Shortcuts};
use cosmic_settings_config::Binding;
use cosmic_settings_page::Section; use cosmic_settings_page::Section;
use cosmic_settings_page::{self as page, section}; use cosmic_settings_page::{self as page, section};
use itertools::Itertools; use itertools::Itertools;

View file

@ -826,8 +826,7 @@ fn devices_view() -> Section<crate::pages::Message> {
return cosmic::widget::column().into(); return cosmic::widget::column().into();
}; };
let theme = cosmic::theme::active(); let spacing = cosmic::theme::spacing();
let spacing = &theme.cosmic().spacing;
let mut view = widget::column::with_capacity(4); let mut view = widget::column::with_capacity(4);
@ -883,7 +882,7 @@ fn devices_view() -> Section<crate::pages::Message> {
widget::popover(view_more_button.on_press(Message::ViewMore(None))) widget::popover(view_more_button.on_press(Message::ViewMore(None)))
.position(widget::popover::Position::Bottom) .position(widget::popover::Position::Bottom)
.on_close(Message::ViewMore(None)) .on_close(Message::ViewMore(None))
.popup({ .popup(
widget::column() widget::column()
.push_maybe(is_connected.then(|| { .push_maybe(is_connected.then(|| {
popup_button( popup_button(
@ -901,9 +900,9 @@ fn devices_view() -> Section<crate::pages::Message> {
)) ))
.width(Length::Fixed(200.0)) .width(Length::Fixed(200.0))
.apply(widget::container) .apply(widget::container)
.padding(1) .padding(cosmic::theme::spacing().space_xxs)
.class(cosmic::style::Container::Dropdown) .class(cosmic::theme::Container::Dropdown),
}) )
.apply(|e| Some(Element::from(e))) .apply(|e| Some(Element::from(e)))
} else { } else {
view_more_button view_more_button
@ -937,12 +936,11 @@ fn devices_view() -> Section<crate::pages::Message> {
} }
fn popup_button(message: Message, text: &str) -> Element<'_, Message> { fn popup_button(message: Message, text: &str) -> Element<'_, Message> {
let theme = cosmic::theme::active(); let spacing = cosmic::theme::spacing();
let theme = theme.cosmic();
widget::text::body(text) widget::text::body(text)
.align_y(Alignment::Center) .align_y(Alignment::Center)
.apply(widget::button::custom) .apply(widget::button::custom)
.padding([theme.space_xxxs(), theme.space_xs()]) .padding([spacing.space_xxxs, spacing.space_xs])
.width(Length::Fill) .width(Length::Fill)
.class(cosmic::theme::Button::MenuItem) .class(cosmic::theme::Button::MenuItem)
.on_press(message) .on_press(message)

View file

@ -225,9 +225,7 @@ impl page::Page<crate::pages::Message> for Page {
fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> { fn context_drawer(&self) -> Option<ContextDrawer<'_, crate::pages::Message>> {
let drawer = self.qr_drawer.as_ref()?; let drawer = self.qr_drawer.as_ref()?;
let spacing = cosmic::theme::spacing();
let theme = cosmic::theme::active();
let spacing = &theme.cosmic().spacing;
let qr_section = if let Some(ref qr_data) = self.qr_code_data { let qr_section = if let Some(ref qr_data) = self.qr_code_data {
widget::container(widget::qr_code(qr_data).cell_size(5)).center_x(Length::Fill) widget::container(widget::qr_code(qr_data).cell_size(5)).center_x(Length::Fill)
@ -749,8 +747,7 @@ fn devices_view() -> Section<crate::pages::Message> {
return cosmic::widget::column().into(); return cosmic::widget::column().into();
}; };
let theme = cosmic::theme::active(); let spacing = cosmic::theme::spacing();
let spacing = &theme.cosmic().spacing;
let wifi_enable = widget::settings::item::builder(&section.descriptions[wifi_txt]) let wifi_enable = widget::settings::item::builder(&section.descriptions[wifi_txt])
.control(widget::toggler(state.wifi_enabled).on_toggle(Message::WiFiEnable)); .control(widget::toggler(state.wifi_enabled).on_toggle(Message::WiFiEnable));
@ -851,7 +848,7 @@ fn devices_view() -> Section<crate::pages::Message> {
widget::popover(view_more_button.on_press(Message::ViewMore(None))) widget::popover(view_more_button.on_press(Message::ViewMore(None)))
.position(widget::popover::Position::Bottom) .position(widget::popover::Position::Bottom)
.on_close(Message::ViewMore(None)) .on_close(Message::ViewMore(None))
.popup({ .popup(
widget::column() widget::column()
.push_maybe(is_connected.then(|| { .push_maybe(is_connected.then(|| {
popup_button( popup_button(
@ -875,10 +872,11 @@ fn devices_view() -> Section<crate::pages::Message> {
&section.descriptions[forget_txt], &section.descriptions[forget_txt],
) )
})) }))
.width(Length::Fixed(170.0)) .width(Length::Fixed(200.0))
.apply(widget::container) .apply(widget::container)
.class(cosmic::style::Container::Dialog) .padding(cosmic::theme::spacing().space_xxs)
}) .class(cosmic::theme::Container::Dropdown),
)
.apply(|e| Some(Element::from(e))) .apply(|e| Some(Element::from(e)))
} else if is_known { } else if is_known {
view_more_button view_more_button
@ -938,12 +936,11 @@ fn is_connected(state: &NetworkManagerState, network: &AccessPoint) -> bool {
} }
fn popup_button(message: Message, text: &str) -> Element<'_, Message> { fn popup_button(message: Message, text: &str) -> Element<'_, Message> {
let theme = cosmic::theme::active(); let spacing = cosmic::theme::spacing();
let theme = theme.cosmic();
widget::text::body(text) widget::text::body(text)
.align_y(Alignment::Center) .align_y(Alignment::Center)
.apply(widget::button::custom) .apply(widget::button::custom)
.padding([theme.space_xxxs(), theme.space_xs()]) .padding([spacing.space_xxxs, spacing.space_xs])
.width(Length::Fill) .width(Length::Fill)
.class(cosmic::theme::Button::MenuItem) .class(cosmic::theme::Button::MenuItem)
.on_press(message) .on_press(message)

View file

@ -449,7 +449,7 @@ impl Page {
fn device_view<'a>( fn device_view<'a>(
&'a self, &'a self,
spacing: &cosmic::cosmic_theme::Spacing, spacing: cosmic::cosmic_theme::Spacing,
nm_state: &'a NmState, nm_state: &'a NmState,
connect_txt: &'a str, connect_txt: &'a str,
connected_txt: &'a str, connected_txt: &'a str,
@ -509,7 +509,7 @@ impl Page {
widget::popover(view_more_button.on_press(Message::ViewMore(None))) widget::popover(view_more_button.on_press(Message::ViewMore(None)))
.position(widget::popover::Position::Bottom) .position(widget::popover::Position::Bottom)
.on_close(Message::ViewMore(None)) .on_close(Message::ViewMore(None))
.popup({ .popup(
widget::column() widget::column()
.push_maybe(is_connected.then(|| { .push_maybe(is_connected.then(|| {
popup_button( popup_button(
@ -529,9 +529,9 @@ impl Page {
})) }))
.width(Length::Fixed(200.0)) .width(Length::Fixed(200.0))
.apply(widget::container) .apply(widget::container)
.padding(spacing.space_xxxs) .padding(cosmic::theme::spacing().space_xxs)
.class(cosmic::style::Container::Dialog) .class(cosmic::theme::Container::Dropdown),
}) )
.apply(|e| Some(Element::from(e))) .apply(|e| Some(Element::from(e)))
} else { } else {
view_more_button view_more_button
@ -576,8 +576,7 @@ fn devices_view() -> Section<crate::pages::Message> {
return cosmic::widget::column().into(); return cosmic::widget::column().into();
}; };
let theme = cosmic::theme::active(); let spacing = cosmic::theme::spacing();
let spacing = &theme.cosmic().spacing;
let mut view = widget::column::with_capacity(4); let mut view = widget::column::with_capacity(4);
@ -611,12 +610,11 @@ fn devices_view() -> Section<crate::pages::Message> {
} }
fn popup_button(message: Message, text: &str) -> Element<'_, Message> { fn popup_button(message: Message, text: &str) -> Element<'_, Message> {
let theme = cosmic::theme::active(); let spacing = cosmic::theme::spacing();
let theme = theme.cosmic();
widget::text::body(text) widget::text::body(text)
.align_y(Alignment::Center) .align_y(Alignment::Center)
.apply(widget::button::custom) .apply(widget::button::custom)
.padding([theme.space_xxxs(), theme.space_xs()]) .padding([spacing.space_xxxs, spacing.space_xs])
.width(Length::Fill) .width(Length::Fill)
.class(cosmic::theme::Button::MenuItem) .class(cosmic::theme::Button::MenuItem)
.on_press(message) .on_press(message)

View file

@ -6,10 +6,10 @@ use std::rc::Rc;
use std::sync::Arc; use std::sync::Arc;
use cosmic::app::{ContextDrawer, context_drawer}; use cosmic::app::{ContextDrawer, context_drawer};
use cosmic::iced::{Alignment, Border, Color, Length}; use cosmic::iced::{Alignment, Length};
use cosmic::iced_core::text::Wrapping; use cosmic::iced_core::text::Wrapping;
use cosmic::widget::{self, button, container}; use cosmic::widget::{self, button};
use cosmic::{Apply, Element, theme}; use cosmic::{Apply, Element};
use cosmic_config::{ConfigGet, ConfigSet}; use cosmic_config::{ConfigGet, ConfigSet};
use cosmic_settings_page::Section; use cosmic_settings_page::Section;
use cosmic_settings_page::{self as page, section}; use cosmic_settings_page::{self as page, section};
@ -817,6 +817,7 @@ fn popover_button(id: usize, expanded: bool) -> Element<'static, Message> {
if expanded { if expanded {
widget::popover(button) widget::popover(button)
.position(widget::popover::Position::Bottom)
.popup(popover_menu(id)) .popup(popover_menu(id))
.on_close(Message::ExpandLanguagePopover(None)) .on_close(Message::ExpandLanguagePopover(None))
.into() .into()
@ -826,38 +827,31 @@ fn popover_button(id: usize, expanded: bool) -> Element<'static, Message> {
} }
fn popover_menu(id: usize) -> Element<'static, Message> { fn popover_menu(id: usize) -> Element<'static, Message> {
widget::column::with_children(vec![ widget::column::with_children([
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "move-up"), fl!("keyboard-sources", "move-up"),
SourceContext::MoveUp, SourceContext::MoveUp,
), ),
cosmic::widget::divider::horizontal::default().into(), widget::divider::horizontal::default()
.apply(widget::container)
.padding([0, 8])
.into(),
popover_menu_row( popover_menu_row(
id, id,
fl!("keyboard-sources", "move-down"), fl!("keyboard-sources", "move-down"),
SourceContext::MoveDown, SourceContext::MoveDown,
), ),
cosmic::widget::divider::horizontal::default().into(), widget::divider::horizontal::default()
.apply(widget::container)
.padding([0, 8])
.into(),
popover_menu_row(id, fl!("keyboard-sources", "remove"), SourceContext::Remove), popover_menu_row(id, fl!("keyboard-sources", "remove"), SourceContext::Remove),
]) ])
.padding(8) .width(Length::Fixed(200.0))
.width(Length::Shrink) .apply(widget::container)
.height(Length::Shrink) .padding(cosmic::theme::spacing().space_xxs)
.apply(cosmic::widget::container) .class(cosmic::theme::Container::Dropdown)
.class(cosmic::theme::Container::custom(|theme| {
let cosmic = theme.cosmic();
container::Style {
icon_color: Some(theme.cosmic().background.on.into()),
text_color: Some(theme.cosmic().background.on.into()),
background: Some(Color::from(theme.cosmic().background.base).into()),
border: Border {
radius: cosmic.corner_radii.radius_m.into(),
..Default::default()
},
shadow: Default::default(),
}
}))
.into() .into()
} }
@ -866,19 +860,15 @@ fn popover_menu_row(
label: String, label: String,
message: impl Fn(usize) -> SourceContext + 'static, message: impl Fn(usize) -> SourceContext + 'static,
) -> cosmic::Element<'static, Message> { ) -> cosmic::Element<'static, Message> {
let spacing = cosmic::theme::spacing();
widget::text::body(label) widget::text::body(label)
.apply(widget::container) .align_y(Alignment::Center)
.class(cosmic::theme::Container::custom(|theme| {
widget::container::Style {
background: None,
..widget::container::Catalog::style(theme, &cosmic::theme::Container::List)
}
}))
.apply(button::custom) .apply(button::custom)
.on_press(()) .padding([spacing.space_xxxs, spacing.space_xs])
.class(theme::Button::Transparent) .width(Length::Fill)
.class(cosmic::theme::Button::MenuItem)
.on_press(Message::SourceContext(message(id)))
.apply(Element::from) .apply(Element::from)
.map(move |()| Message::SourceContext(message(id)))
} }
pub async fn set_locale( pub async fn set_locale(