80 lines
2.4 KiB
Rust
80 lines
2.4 KiB
Rust
// From iced_aw, license MIT
|
|
|
|
//! Change the appearance of menu bars and their menus.
|
|
use crate::Theme;
|
|
use iced_widget::core::Color;
|
|
|
|
/// The appearance of a menu bar and its menus.
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub struct Appearance {
|
|
/// The background color of the menu bar and its menus.
|
|
pub background: Color,
|
|
/// The border width of the menu bar and its menus.
|
|
pub border_width: f32,
|
|
/// The border radius of the menu bar.
|
|
pub bar_border_radius: [f32; 4],
|
|
/// The border radius of the menus.
|
|
pub menu_border_radius: [f32; 4],
|
|
/// The border [`Color`] of the menu bar and its menus.
|
|
pub border_color: Color,
|
|
/// The expand value of the menus' background
|
|
pub background_expand: [u16; 4],
|
|
/// The highlighted path [`Color`] of the the menu bar and its menus.
|
|
pub path: Color,
|
|
}
|
|
|
|
/// The style sheet of a menu bar and its menus.
|
|
pub trait StyleSheet {
|
|
/// The supported style of the [`StyleSheet`].
|
|
type Style: Default;
|
|
|
|
/// Produces the [`Appearance`] of a menu bar and its menus.
|
|
fn appearance(&self, style: &Self::Style) -> Appearance;
|
|
}
|
|
|
|
/// The style of a menu bar and its menus
|
|
#[derive(Default)]
|
|
#[allow(missing_debug_implementations)]
|
|
pub enum MenuBarStyle {
|
|
/// The default style.
|
|
#[default]
|
|
Default,
|
|
/// A [`Theme`] that uses a `Custom` palette.
|
|
Custom(Box<dyn StyleSheet<Style = Theme>>),
|
|
}
|
|
|
|
impl From<fn(&Theme) -> Appearance> for MenuBarStyle {
|
|
fn from(f: fn(&Theme) -> Appearance) -> Self {
|
|
Self::Custom(Box::new(f))
|
|
}
|
|
}
|
|
|
|
impl StyleSheet for fn(&Theme) -> Appearance {
|
|
type Style = Theme;
|
|
|
|
fn appearance(&self, style: &Self::Style) -> Appearance {
|
|
(self)(style)
|
|
}
|
|
}
|
|
|
|
impl StyleSheet for Theme {
|
|
type Style = MenuBarStyle;
|
|
|
|
fn appearance(&self, style: &Self::Style) -> Appearance {
|
|
let cosmic = self.cosmic();
|
|
let component = &cosmic.background.component;
|
|
|
|
match style {
|
|
MenuBarStyle::Default => Appearance {
|
|
background: component.base.into(),
|
|
border_width: 1.0,
|
|
bar_border_radius: cosmic.corner_radii.radius_xl,
|
|
menu_border_radius: cosmic.corner_radii.radius_s,
|
|
border_color: component.divider.into(),
|
|
background_expand: [1; 4],
|
|
path: component.hover.into(),
|
|
},
|
|
MenuBarStyle::Custom(c) => c.appearance(self),
|
|
}
|
|
}
|
|
}
|