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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
//! System config types.
use std::{fmt, time::Duration};
use serde::{Deserialize, Serialize};
use zng_txt::Txt;
use zng_unit::{Dip, DipSize};
/// System settings needed for implementing double/triple clicks.
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Deserialize)]
pub struct MultiClickConfig {
/// Maximum time interval between clicks.
///
/// Only repeated clicks within this time interval can count as double-clicks.
pub time: Duration,
/// Maximum (x, y) distance in pixels.
///
/// Only repeated clicks that are within this distance of the first click can count as double-clicks.
pub area: DipSize,
}
impl Default for MultiClickConfig {
/// `500ms` and `4, 4`.
fn default() -> Self {
Self {
time: Duration::from_millis(500),
area: DipSize::splat(Dip::new(4)),
}
}
}
/// System settings needed to implementing touch gestures.
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Deserialize)]
pub struct TouchConfig {
/// Maximum (x, y) distance between a touch start and end that generates a touch click.
///
/// Area can be disregarded if the touch is not ambiguous. This usually defines the initial lag
/// for a single finger drag gesture.
pub tap_area: DipSize,
/// Maximum (x, y) distance that a subsequent touch click is linked with the previous one as a double click.
///
/// Area can be disregarded if the touch is not ambiguous.
pub double_tap_area: DipSize,
/// Maximum time between start and end in the `tap_area` that generates a touch click.
///
/// Time can be disregarded if the touch is not ambiguous. This usually defines the *long press* delay.
pub tap_max_time: Duration,
/// Maximum time between taps that generates a double click.
pub double_tap_max_time: Duration,
/// Minimum velocity that can be considered a fling gesture, in dip per seconds.
pub min_fling_velocity: Dip,
/// Fling velocity ceiling, in dip per seconds.
pub max_fling_velocity: Dip,
}
impl Default for TouchConfig {
fn default() -> Self {
Self {
tap_area: DipSize::splat(Dip::new(8)),
double_tap_area: DipSize::splat(Dip::new(28)),
tap_max_time: Duration::from_millis(500),
double_tap_max_time: Duration::from_millis(500),
min_fling_velocity: Dip::new(50),
max_fling_velocity: Dip::new(8000),
}
}
}
/// System settings that define the key pressed repeat.
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Deserialize)]
pub struct KeyRepeatConfig {
/// Delay before repeat starts.
pub start_delay: Duration,
/// Delay before each repeat event after the first.
pub interval: Duration,
}
impl Default for KeyRepeatConfig {
/// 600ms, 100ms.
fn default() -> Self {
Self {
start_delay: Duration::from_millis(600),
interval: Duration::from_millis(100),
}
}
}
/// System settings that control animations.
#[derive(Debug, Clone, Copy, Serialize, PartialEq, Eq, Deserialize)]
pub struct AnimationsConfig {
/// If animation are enabled.
///
/// People with photo-sensitive epilepsy usually disable animations system wide.
pub enabled: bool,
/// Interval of the caret blink animation.
pub caret_blink_interval: Duration,
/// Duration after which the blink animation stops.
pub caret_blink_timeout: Duration,
}
impl Default for AnimationsConfig {
/// true, 530ms, 5s.
fn default() -> Self {
Self {
enabled: true,
caret_blink_interval: Duration::from_millis(530),
caret_blink_timeout: Duration::from_secs(5),
}
}
}
/// System settings that define the locale.
#[derive(Debug, Clone, Serialize, PartialEq, Eq, Deserialize, Default)]
pub struct LocaleConfig {
/// BCP-47 language tags, if the locale can be obtained.
pub langs: Vec<Txt>,
}
/// Text anti-aliasing.
#[derive(Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FontAntiAliasing {
/// Uses the operating system configuration.
#[default]
Default,
/// Sub-pixel anti-aliasing if a fast implementation is available, otherwise uses `Alpha`.
Subpixel,
/// Alpha blending anti-aliasing.
Alpha,
/// Disable anti-aliasing.
Mono,
}
impl fmt::Debug for FontAntiAliasing {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
write!(f, "FontAntiAliasing::")?;
}
match self {
FontAntiAliasing::Default => write!(f, "Default"),
FontAntiAliasing::Subpixel => write!(f, "Subpixel"),
FontAntiAliasing::Alpha => write!(f, "Alpha"),
FontAntiAliasing::Mono => write!(f, "Mono"),
}
}
}
/// Color scheme preference.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ColorScheme {
/// Dark text, light background.
Light,
/// Light text, dark background.
Dark,
}
impl Default for ColorScheme {
/// Light.
fn default() -> Self {
ColorScheme::Light
}
}
#[cfg(feature = "var")]
zng_var::impl_from_and_into_var! {
fn from(some: ColorScheme) -> Option<ColorScheme>;
}