1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//! Provides the Current Comparison Component and relevant types for using it.
//! The Current Comparison Component is a component that shows the name of the
//! comparison that is currently selected to be compared against.
use super::key_value;
use crate::{
platform::prelude::*,
settings::{Color, Field, Gradient, SettingsDescription, Value},
Timer,
};
use serde::{Deserialize, Serialize};
/// The Current Comparison Component is a component that shows the name of the
/// comparison that is currently selected to be compared against.
#[derive(Default, Clone)]
pub struct Component {
settings: Settings,
}
/// The Settings for this component.
#[derive(Clone, Serialize, Deserialize)]
#[serde(default)]
pub struct Settings {
/// The background shown behind the component.
pub background: Gradient,
/// Specifies whether to display the name of the component and its value in
/// two separate rows.
pub display_two_rows: bool,
/// The color of the label. If `None` is specified, the color is taken from
/// the layout.
pub label_color: Option<Color>,
/// The color of the value. If `None` is specified, the color is taken from
/// the layout.
pub value_color: Option<Color>,
}
impl Default for Settings {
fn default() -> Self {
Self {
background: key_value::DEFAULT_GRADIENT,
display_two_rows: false,
label_color: None,
value_color: None,
}
}
}
impl Component {
/// Creates a new Current Comparison Component.
pub fn new() -> Self {
Default::default()
}
/// Creates a new Current Comparison Component with the given settings.
pub const fn with_settings(settings: Settings) -> Self {
Self { settings }
}
/// Accesses the settings of the component.
pub const fn settings(&self) -> &Settings {
&self.settings
}
/// Grants mutable access to the settings of the component.
pub fn settings_mut(&mut self) -> &mut Settings {
&mut self.settings
}
/// Accesses the name of the component.
pub const fn name(&self) -> &'static str {
"Current Comparison"
}
/// Updates the component's state based on the timer provided.
pub fn update_state(&self, state: &mut key_value::State, timer: &Timer) {
state.background = self.settings.background;
state.key_color = self.settings.label_color;
state.value_color = self.settings.value_color;
state.semantic_color = Default::default();
state.key.clear();
state.key.push_str("Comparing Against");
state.value.clear();
state.value.push_str(timer.current_comparison());
state.key_abbreviations.clear();
state.key_abbreviations.push("Comparison".into());
state.display_two_rows = self.settings.display_two_rows;
state.updates_frequently = false;
}
/// Calculates the component's state based on the timer provided.
pub fn state(&self, timer: &Timer) -> key_value::State {
let mut state = Default::default();
self.update_state(&mut state, timer);
state
}
/// Accesses a generic description of the settings available for this
/// component and their current values.
pub fn settings_description(&self) -> SettingsDescription {
SettingsDescription::with_fields(vec![
Field::new("Background".into(), self.settings.background.into()),
Field::new(
"Display 2 Rows".into(),
self.settings.display_two_rows.into(),
),
Field::new("Label Color".into(), self.settings.label_color.into()),
Field::new("Value Color".into(), self.settings.value_color.into()),
])
}
/// Sets a setting's value by its index to the given value.
///
/// # Panics
///
/// This panics if the type of the value to be set is not compatible with
/// the type of the setting's value. A panic can also occur if the index of
/// the setting provided is out of bounds.
pub fn set_value(&mut self, index: usize, value: Value) {
match index {
0 => self.settings.background = value.into(),
1 => self.settings.display_two_rows = value.into(),
2 => self.settings.label_color = value.into(),
3 => self.settings.value_color = value.into(),
_ => panic!("Unsupported Setting Index"),
}
}
}