use crate::mark::Mark;
use crate::render::line_renderer::PathInterpolation;
use crate::visual::color::SingleColor;
#[derive(Clone)]
pub struct MarkLine {
pub(crate) color: SingleColor,
pub(crate) stroke_width: f64,
pub(crate) dash: Vec<f64>,
pub(crate) opacity: f64,
pub(crate) interpolation: PathInterpolation,
pub(crate) loess: bool,
pub(crate) loess_bandwidth: f64,
}
impl MarkLine {
pub(crate) fn new() -> Self {
Self {
color: SingleColor::new("black"),
stroke_width: 1.0,
dash: vec![],
opacity: 1.0,
interpolation: PathInterpolation::Linear,
loess: false,
loess_bandwidth: 0.75,
}
}
pub fn with_color(mut self, color: impl Into<SingleColor>) -> Self {
self.color = color.into();
self
}
pub fn with_stroke_width(mut self, width: f64) -> Self {
self.stroke_width = width;
self
}
pub fn with_dash(mut self, dash: impl Into<Vec<f64>>) -> Self {
self.dash = dash.into();
self
}
pub fn with_opacity(mut self, opacity: f64) -> Self {
self.opacity = opacity.clamp(0.0, 1.0);
self
}
pub fn with_interpolation(mut self, interpolation: impl Into<PathInterpolation>) -> Self {
self.interpolation = interpolation.into();
self
}
pub fn with_loess(mut self, use_loess: bool) -> Self {
self.loess = use_loess;
self
}
pub fn with_loess_bandwidth(mut self, bandwidth: f64) -> Self {
self.loess_bandwidth = bandwidth.clamp(0.0, 1.0);
self
}
}
impl Default for MarkLine {
fn default() -> Self {
Self::new()
}
}
impl Mark for MarkLine {
fn mark_type(&self) -> &'static str {
"line"
}
}