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}