openpine_vm/visuals/
fill.rs

1use openpine_compiler::instructions::Color;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    series::Series,
6    visuals::{GraphId, PlotDisplay, SeriesGraphId},
7};
8
9/// Gradient definition for [`FillColor::Gradient`].
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Gradient {
12    /// The value at which `color1` is fully applied.
13    pub top_value: f64,
14    /// The value at which `color2` is fully applied.
15    pub bottom_value: f64,
16    /// Color used at [`Self::top_value`].
17    pub color1: Color,
18    /// Color used at [`Self::bottom_value`].
19    pub color2: Color,
20}
21
22/// Fill color definition.
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub enum FillColor {
25    /// A single solid color.
26    Solid(Color),
27    /// A vertical gradient defined by [`Gradient`].
28    Gradient(Gradient),
29}
30
31/// Anchor used to define the source/target of a [`Fill`].
32#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
33pub enum FillAnchor {
34    /// Anchor to a per-series graph (typically a plot).
35    Plot(SeriesGraphId),
36    /// Anchor to a horizontal line.
37    Hline(GraphId),
38}
39
40/// A fill between two anchors (e.g. plot-to-plot or plot-to-hline).
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct Fill {
43    /// Starting anchor.
44    pub from: FillAnchor,
45    /// Ending anchor.
46    pub to: FillAnchor,
47    /// Per-bar fill colors (or `None` to skip drawing on a bar).
48    pub colors: Series<Option<FillColor>>,
49    /// Optional legend/title string.
50    pub title: Option<String>,
51    /// Whether the fill is user-editable.
52    pub editable: bool,
53    /// Maximum number of most recent bars to display.
54    pub show_last: Option<usize>,
55    /// Whether to draw fills across gaps.
56    pub fillgaps: bool,
57    /// Display flags controlling where the fill is shown.
58    pub display: PlotDisplay,
59}
60
61impl Fill {
62    pub(crate) fn append_new(&mut self) {
63        self.colors.append_new();
64    }
65}