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
34impl FromStr for NumberForegroundMode {
35    type Err = String;
36
37    fn from_str(s: &str) -> Result<Self, Self::Err> {
38        match s {
39            "color" => Ok(Self::Color),
40            "bar" => Ok(Self::Bar),
41            x => Err(format!("Unknown NumberForegroundMode::{x}")),
42        }
43    }
44}
45
46impl NumberForegroundMode {
47    fn is_color(&self) -> bool {
48        *self == Self::Color
49    }
50
51    pub fn is_enabled(&self) -> bool {
52        *self != Self::Disabled
53    }
54
55    pub fn needs_gradient(&self) -> bool {
56        *self == Self::Bar
57    }
58}
59
60#[derive(
61    Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
62)]
63pub enum NumberBackgroundMode {
64    #[default]
65    #[serde(rename = "disabled")]
66    Disabled,
67
68    #[serde(rename = "color")]
69    Color,
70
71    #[serde(rename = "gradient")]
72    Gradient,
73
74    #[serde(rename = "pulse")]
75    Pulse,
76}
77
78impl NumberBackgroundMode {
79    pub fn is_disabled(&self) -> bool {
80        *self == Self::Disabled
81    }
82
83    pub fn needs_gradient(&self) -> bool {
84        *self == Self::Gradient
85    }
86}
87
88#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, TS)]
89pub struct NumberColumnStyleConfig {
90    #[serde(default = "NumberForegroundMode::default")]
91    #[serde(skip_serializing_if = "NumberForegroundMode::is_color")]
92    pub number_fg_mode: NumberForegroundMode,
93
94    #[serde(default = "NumberBackgroundMode::default")]
95    #[serde(skip_serializing_if = "NumberBackgroundMode::is_disabled")]
96    pub number_bg_mode: NumberBackgroundMode,
97
98    #[serde(skip_serializing_if = "Option::is_none")]
99    pub pos_fg_color: Option<String>,
100
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub neg_fg_color: Option<String>,
103
104    #[serde(skip_serializing_if = "Option::is_none")]
105    pub pos_bg_color: Option<String>,
106
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub neg_bg_color: Option<String>,
109
110    #[serde(skip_serializing_if = "Option::is_none")]
111    pub fg_gradient: Option<f64>,
112
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub bg_gradient: Option<f64>,
115}
116
117/// Exactly like a `ColumnStyleConfig`, except without `Option<>` fields.
118///
119/// Necessary because this struct represents the default values we should use in
120/// the GUI when they are `None` in the real config.  It is also used to decide
121/// when to omit a field when serialized a `ColumnStyleConfig` to JSON.
122#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq)]
123pub struct NumberColumnStyleDefaultConfig {
124    pub fg_gradient: f64,
125    pub bg_gradient: f64,
126    pub pos_fg_color: String,
127    pub neg_fg_color: String,
128    pub pos_bg_color: String,
129    pub neg_bg_color: String,
130    pub number_fg_mode: NumberForegroundMode,
131    pub number_bg_mode: NumberBackgroundMode,
132}