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
19use crate::*;
20
21#[derive(
22    Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
23)]
24pub enum NumberForegroundMode {
25    #[serde(rename = "disabled")]
26    Disabled,
27
28    #[default]
29    #[serde(rename = "color")]
30    Color,
31
32    #[serde(rename = "bar")]
33    Bar,
34}
35
36impl FromStr for NumberForegroundMode {
37    type Err = String;
38
39    fn from_str(s: &str) -> Result<Self, Self::Err> {
40        match s {
41            "color" => Ok(Self::Color),
42            "bar" => Ok(Self::Bar),
43            x => Err(format!("Unknown NumberForegroundMode::{x}")),
44        }
45    }
46}
47
48impl NumberForegroundMode {
49    fn is_color(&self) -> bool {
50        *self == Self::Color
51    }
52
53    pub fn is_enabled(&self) -> bool {
54        *self != Self::Disabled
55    }
56
57    pub fn needs_gradient(&self) -> bool {
58        *self == Self::Bar
59    }
60}
61
62#[derive(
63    Clone, Copy, Debug, Default, Deserialize, Display, EnumIter, Eq, PartialEq, Serialize, TS,
64)]
65pub enum NumberBackgroundMode {
66    #[default]
67    #[serde(rename = "disabled")]
68    Disabled,
69
70    #[serde(rename = "color")]
71    Color,
72
73    #[serde(rename = "gradient")]
74    Gradient,
75
76    #[serde(rename = "pulse")]
77    Pulse,
78}
79
80impl NumberBackgroundMode {
81    pub fn is_disabled(&self) -> bool {
82        *self == Self::Disabled
83    }
84
85    pub fn needs_gradient(&self) -> bool {
86        *self == Self::Gradient
87    }
88}
89
90#[derive(Serialize, Deserialize, Clone, Default, Debug, PartialEq, TS)]
91pub struct NumberColumnStyleConfig {
92    #[serde(default = "NumberForegroundMode::default")]
93    #[serde(skip_serializing_if = "NumberForegroundMode::is_color")]
94    pub number_fg_mode: NumberForegroundMode,
95
96    #[serde(default = "NumberBackgroundMode::default")]
97    #[serde(skip_serializing_if = "NumberBackgroundMode::is_disabled")]
98    pub number_bg_mode: NumberBackgroundMode,
99
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub pos_fg_color: Option<String>,
102
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub neg_fg_color: Option<String>,
105
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub pos_bg_color: Option<String>,
108
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub neg_bg_color: Option<String>,
111
112    #[serde(skip_serializing_if = "Option::is_none")]
113    pub fg_gradient: Option<f64>,
114
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub bg_gradient: Option<f64>,
117}
118
119derive_wasm_abi!(NumberColumnStyleConfig, FromWasmAbi, IntoWasmAbi);
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}
137
138derive_wasm_abi!(NumberColumnStyleDefaultConfig, FromWasmAbi);