term_model/config/
visual_bell.rs

1use std::time::Duration;
2
3use serde::Deserialize;
4
5use crate::config::failure_default;
6use crate::term::color::Rgb;
7
8#[serde(default)]
9#[derive(Deserialize, Clone, Debug, PartialEq, Eq)]
10pub struct VisualBellConfig {
11    /// Visual bell animation function
12    #[serde(deserialize_with = "failure_default")]
13    pub animation: VisualBellAnimation,
14
15    /// Visual bell duration in milliseconds
16    #[serde(deserialize_with = "failure_default")]
17    pub duration: u16,
18
19    /// Visual bell flash color
20    #[serde(deserialize_with = "failure_default")]
21    pub color: Rgb,
22}
23
24impl Default for VisualBellConfig {
25    fn default() -> VisualBellConfig {
26        VisualBellConfig {
27            animation: Default::default(),
28            duration: Default::default(),
29            color: default_visual_bell_color(),
30        }
31    }
32}
33
34impl VisualBellConfig {
35    /// Visual bell duration in milliseconds
36    #[inline]
37    pub fn duration(&self) -> Duration {
38        Duration::from_millis(u64::from(self.duration))
39    }
40}
41
42/// `VisualBellAnimations` are modeled after a subset of CSS transitions and Robert
43/// Penner's Easing Functions.
44#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Eq)]
45pub enum VisualBellAnimation {
46    Ease,         // CSS
47    EaseOut,      // CSS
48    EaseOutSine,  // Penner
49    EaseOutQuad,  // Penner
50    EaseOutCubic, // Penner
51    EaseOutQuart, // Penner
52    EaseOutQuint, // Penner
53    EaseOutExpo,  // Penner
54    EaseOutCirc,  // Penner
55    Linear,
56}
57
58impl Default for VisualBellAnimation {
59    fn default() -> Self {
60        VisualBellAnimation::EaseOutExpo
61    }
62}
63
64fn default_visual_bell_color() -> Rgb {
65    Rgb { r: 255, g: 255, b: 255 }
66}