use iced_nodegraph_sdf::Pattern;
use iced_widget::core::{Color, Theme};
use super::defaults::default_edge_style;
use super::roles::Roles;
use super::{ColorQuad, EdgeCurve, EdgeStatus, ramp};
#[derive(Debug, Clone, PartialEq)]
pub struct EdgeStyle {
pub stroke_color: ColorQuad,
pub pattern: Pattern,
pub stroke_outline_width: f32,
pub stroke_outline_color: ColorQuad,
pub border_color: ColorQuad,
pub border_width: f32,
pub border_gap: f32,
pub border_outline_width: f32,
pub border_outline_color: ColorQuad,
pub border_background: ColorQuad,
pub shadow_color: ColorQuad,
pub shadow_expand: f32,
pub shadow_blur: f32,
pub shadow_offset: (f32, f32),
pub glow_color: ColorQuad,
pub glow_width: f32,
pub curve: EdgeCurve,
}
impl EdgeStyle {
pub fn data_flow(theme: &Theme, status: EdgeStatus) -> Self {
let roles = Roles::of(theme);
let hue = roles.legible(theme.extended_palette().primary.base.color);
Self::stroked(theme, status, hue, Pattern::solid(2.5))
}
pub fn error(theme: &Theme, status: EdgeStatus) -> Self {
let hue = Roles::of(theme).danger;
let mut s = Self::stroked(
theme,
status,
hue,
Pattern::dashed(2.0, 6.0, 4.0).flow(30.0),
);
s.border_color = hue.into();
s.border_width = 1.0;
s.border_gap = 0.5;
s
}
pub fn disabled(theme: &Theme, status: EdgeStatus) -> Self {
let roles = Roles::of(theme);
let hue = ramp::blend(roles.canvas, roles.wire, 0.5);
Self::stroked(theme, status, hue, Pattern::dashed(1.5, 12.0, 6.0))
}
pub fn highlighted(theme: &Theme, status: EdgeStatus) -> Self {
let roles = Roles::of(theme);
let hue = roles.legible(theme.extended_palette().warning.base.color);
let mut s = Self::stroked(theme, status, hue, Pattern::solid(3.0));
s.border_color = Color {
a: 0.3,
..roles.terminal
}
.into();
s.border_width = 2.0;
s.border_gap = 1.0;
s
}
pub fn debug(theme: &Theme, status: EdgeStatus) -> Self {
let hue = Roles::of(theme).wire;
let mut s = Self::stroked(theme, status, hue, Pattern::dotted(8.0, 2.0));
s.curve = EdgeCurve::Line;
s
}
fn stroked(theme: &Theme, status: EdgeStatus, hue: Color, pattern: Pattern) -> Self {
let base = default_edge_style(theme, status);
let (stroke_color, glow_color) = match status {
EdgeStatus::Idle => (
ColorQuad::solid(hue),
ColorQuad::solid(Color { a: 0.45, ..hue }),
),
EdgeStatus::PendingCut => (base.stroke_color, base.glow_color),
};
Self {
stroke_color,
pattern,
glow_color,
glow_width: pattern.thickness * 3.0,
..base
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use iced_widget::core::Theme;
#[test]
fn sdf_layers_preserves_stroke_pattern() {
let mut s = EdgeStyle::data_flow(&Theme::Dark, EdgeStatus::Idle);
s.pattern = Pattern::dashed(2.0, 12.0, 6.0);
let layers = s.sdf_layers();
let stroke = &layers[0]; let pat = stroke.style.pattern.expect("stroke lost its pattern");
assert!(
matches!(
pat.pattern_type,
iced_nodegraph_sdf::PatternType::Dashed { .. }
),
"stroke pattern is not Dashed: {:?}",
pat.pattern_type
);
}
}