use serde::{Deserialize, Serialize};
use crate::i18n::{self, LanguageSettings};
use crate::theme::{self, ThemeSettings};
#[derive(Clone, Default, PartialEq, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct Look {
pub theme: ThemeSettings,
pub language: LanguageSettings,
}
pub fn apply(ctx: &egui::Context, look: &Look) {
install(ctx, look);
crate::store::update(ctx, |state| state.look = Some(look.clone()));
}
pub fn current(ctx: &egui::Context) -> Option<Look> {
crate::store::state(ctx).look
}
pub(crate) fn install(ctx: &egui::Context, look: &Look) {
theme::install(ctx, &look.theme);
i18n::install(ctx, &look.language);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::store::{self, Store};
fn look() -> Look {
Look {
theme: ThemeSettings {
contrast: theme::Contrast::High,
..Default::default()
},
language: LanguageSettings {
language: i18n::Language::Explicit("ja".into()),
},
}
}
#[test]
fn apply_installs_and_saves() {
let dir = tempfile::tempdir().unwrap();
let store = Store::at(dir.path().join(store::FILE_NAME));
let ctx = egui::Context::default();
store::attach(&ctx, store.clone());
apply(&ctx, &look());
assert_eq!(current(&ctx), Some(look()));
assert_eq!(i18n::current(&ctx).to_string(), "ja");
assert_eq!(store.load().and_then(|s| s.look), Some(look()));
}
#[test]
fn without_a_store_apply_only_installs() {
let ctx = egui::Context::default();
apply(&ctx, &look());
assert_eq!(current(&ctx), Some(look()));
assert_eq!(i18n::current(&ctx).to_string(), "ja");
}
}