Skip to main content

perspective_viewer/config/
number_column_style.rs

1// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
3// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
4// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
5// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
6// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
8// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9// ┃ This file is part of the Perspective library, distributed under the terms ┃
10// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
13use std::str::FromStr;
14
15use serde::{Deserialize, Serialize};
16use strum::{Display, EnumIter};
17use ts_rs::TS;
18
19#[derive(
20    Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
21)]
22pub enum NumberForegroundMode {
23    #[serde(rename = "disabled")]
24    Disabled,
25
26    #[default]
27    #[serde(rename = "color")]
28    Color,
29
30    #[serde(rename = "bar")]
31    Bar,
32
33    #[serde(rename = "label-bar")]
34    LabelBar,
35}
36
37impl FromStr for NumberForegroundMode {
38    type Err = String;
39
40    fn from_str(s: &str) -> Result<Self, Self::Err> {
41        match s {
42            "color" => Ok(Self::Color),
43            "bar" => Ok(Self::Bar),
44            "label-bar" => Ok(Self::LabelBar),
45            x => Err(format!("Unknown NumberForegroundMode::{x}")),
46        }
47    }
48}
49
50impl NumberForegroundMode {
51    fn is_color(&self) -> bool {
52        *self == Self::Color
53    }
54
55    pub fn is_enabled(&self) -> bool {
56        *self != Self::Disabled
57    }
58
59    pub fn needs_gradient(&self) -> bool {
60        *self == Self::Bar || *self == Self::LabelBar
61    }
62}
63
64#[derive(
65    Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
66)]
67pub enum NumberBackgroundMode {
68    #[default]
69    #[serde(rename = "disabled")]
70    Disabled,
71
72    #[serde(rename = "color")]
73    Color,
74
75    #[serde(rename = "gradient")]
76    Gradient,
77
78    #[serde(rename = "pulse")]
79    Pulse,
80}
81
82impl NumberBackgroundMode {
83    pub fn is_disabled(&self) -> bool {
84        *self == Self::Disabled
85    }
86
87    pub fn needs_gradient(&self) -> bool {
88        *self == Self::Gradient
89    }
90}
91
92#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, TS)]
93pub struct NumberColumnStyleConfig {
94    #[serde(default = "NumberForegroundMode::default")]
95    #[serde(skip_serializing_if = "NumberForegroundMode::is_color")]
96    pub number_fg_mode: NumberForegroundMode,
97
98    #[serde(default = "NumberBackgroundMode::default")]
99    #[serde(skip_serializing_if = "NumberBackgroundMode::is_disabled")]
100    pub number_bg_mode: NumberBackgroundMode,
101
102    #[serde(skip_serializing_if = "Option::is_none")]
103    pub pos_fg_color: Option<String>,
104
105    #[serde(skip_serializing_if = "Option::is_none")]
106    pub neg_fg_color: Option<String>,
107
108    #[serde(skip_serializing_if = "Option::is_none")]
109    pub pos_bg_color: Option<String>,
110
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub neg_bg_color: Option<String>,
113
114    #[serde(skip_serializing_if = "Option::is_none")]
115    pub fg_gradient: Option<f64>,
116
117    #[serde(skip_serializing_if = "Option::is_none")]
118    pub bg_gradient: Option<f64>,
119}
120
121/// Exactly like a `ColumnStyleConfig`, except without `Option<>` fields.
122///
123/// Necessary because this struct represents the default values we should use in
124/// the GUI when they are `None` in the real config.  It is also used to decide
125/// when to omit a field when serialized a `ColumnStyleConfig` to JSON.
126#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq)]
127pub struct NumberColumnStyleDefaultConfig {
128    pub fg_gradient: f64,
129    pub bg_gradient: f64,
130    pub pos_fg_color: String,
131    pub neg_fg_color: String,
132    pub pos_bg_color: String,
133    pub neg_bg_color: String,
134    pub number_fg_mode: NumberForegroundMode,
135    pub number_bg_mode: NumberBackgroundMode,
136}