use iced::{Color, Theme};
use iced_nodegraph_sdf::Pattern;
use super::{
EdgeCurve, EdgeStatus, EdgeStyle, NodeStatus, NodeStyle, PinShape, PinStatus, PinStyle,
SelectionStyle,
};
pub fn default_node_style(theme: &Theme, status: NodeStatus) -> NodeStyle {
let palette = theme.extended_palette();
let fill = palette.background.weak.color;
let border = palette.background.strong.color;
let (opacity, shadow_color, shadow_distance) = if palette.is_dark {
(0.75, Color::from_rgba(0.0, 0.0, 0.0, 0.3), 4.0)
} else {
(0.85, Color::from_rgba(0.0, 0.0, 0.0, 0.22), 6.0)
};
let base = NodeStyle {
fill_color: fill.into(),
corner_radius: 5.0,
opacity,
border_color: border.into(),
border_pattern: Pattern::solid(1.0),
border_outline_width: 0.0,
border_outline_color: Color::TRANSPARENT.into(),
shadow_color,
shadow_distance,
shadow_offset: (2.0, 2.0),
};
match status {
NodeStatus::Idle => base,
NodeStatus::Selected => {
let sel = SelectionStyle::from_theme(theme);
NodeStyle {
border_color: sel.selected_border_color.into(),
border_pattern: Pattern::solid(sel.selected_border_width),
..base
}
}
}
}
pub fn default_pin_style(theme: &Theme, _status: PinStatus) -> PinStyle {
let palette = theme.extended_palette();
PinStyle {
color: palette.primary.base.color.into(),
radius: 6.0,
shape: PinShape::Circle,
border_color: Color::TRANSPARENT.into(),
border_width: 0.0,
}
}
pub fn default_edge_style(theme: &Theme, status: EdgeStatus) -> EdgeStyle {
let palette = theme.extended_palette();
let none = Color::TRANSPARENT;
let base = EdgeStyle {
stroke_color: palette.secondary.base.color.into(),
pattern: Pattern::solid(2.0),
stroke_outline_width: 0.0,
stroke_outline_color: none.into(),
border_color: none.into(),
border_width: 0.0,
border_gap: 0.5,
border_outline_width: 0.0,
border_outline_color: none.into(),
border_background: none.into(),
shadow_color: none.into(),
shadow_expand: 0.0,
shadow_blur: 0.0,
shadow_offset: (0.0, 0.0),
curve: EdgeCurve::BezierCubic,
};
match status {
EdgeStatus::Idle => base,
EdgeStatus::PendingCut => {
let sel = SelectionStyle::from_theme(theme);
EdgeStyle {
stroke_color: sel.edge_cutting_color.into(),
..base
}
}
}
}
#[cfg(test)]
mod tests {
use super::super::ColorQuad;
use super::*;
#[test]
fn selected_node_sets_border() {
let t = Theme::Dark;
let sel = SelectionStyle::from_theme(&t);
let o = default_node_style(&t, NodeStatus::Selected);
assert_eq!(o.border_color, sel.selected_border_color.into());
assert_eq!(o.border_pattern.thickness, sel.selected_border_width);
}
#[test]
fn pending_cut_tints_stroke() {
let t = Theme::Dark;
let sel = SelectionStyle::from_theme(&t);
let o = default_edge_style(&t, EdgeStatus::PendingCut);
assert_eq!(o.stroke_color, ColorQuad::solid(sel.edge_cutting_color));
}
}