use serde::{Deserialize, Serialize};
use std::fs;
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppConfig {
pub auto_tiling_on_startup: bool,
pub show_date_in_clock: bool,
#[serde(default = "default_theme")]
pub theme: String,
#[serde(default = "default_background_char_index")]
pub background_char_index: usize,
}
fn default_theme() -> String {
"classic".to_string()
}
fn default_background_char_index() -> usize {
0 }
impl Default for AppConfig {
fn default() -> Self {
Self {
auto_tiling_on_startup: true,
show_date_in_clock: true,
theme: default_theme(),
background_char_index: default_background_char_index(),
}
}
}
impl AppConfig {
fn config_path() -> Option<PathBuf> {
let config_dir = dirs::config_dir()?;
let app_config_dir = config_dir.join("term39");
Some(app_config_dir.join("config.toml"))
}
pub fn load() -> Self {
let path = match Self::config_path() {
Some(p) => p,
None => return Self::default(),
};
if !path.exists() {
let default_config = Self::default();
let _ = default_config.save();
return default_config;
}
match fs::read_to_string(&path) {
Ok(contents) => toml::from_str(&contents).unwrap_or_default(),
Err(_) => Self::default(),
}
}
pub fn save(&self) -> Result<(), Box<dyn std::error::Error>> {
let path = Self::config_path().ok_or("Could not determine config path")?;
if let Some(parent) = path.parent() {
fs::create_dir_all(parent)?;
}
let toml_string = toml::to_string_pretty(self)?;
fs::write(path, toml_string)?;
Ok(())
}
pub fn toggle_auto_tiling_on_startup(&mut self) {
self.auto_tiling_on_startup = !self.auto_tiling_on_startup;
let _ = self.save();
}
pub fn toggle_show_date_in_clock(&mut self) {
self.show_date_in_clock = !self.show_date_in_clock;
let _ = self.save();
}
#[allow(dead_code)]
pub fn set_theme(&mut self, theme_name: String) {
self.theme = theme_name;
let _ = self.save();
}
pub const BACKGROUND_CHARS: [char; 5] = [
'░', ' ', '▒', '▓', '█', ];
pub const BACKGROUND_CHAR_NAMES: [&'static str; 5] = [
"Light Shade",
"Empty",
"Medium Shade",
"Dark Shade",
"Full Block",
];
pub fn get_background_char(&self) -> char {
Self::BACKGROUND_CHARS
.get(self.background_char_index)
.copied()
.unwrap_or(Self::BACKGROUND_CHARS[0])
}
pub fn get_background_char_name(&self) -> &'static str {
Self::BACKGROUND_CHAR_NAMES
.get(self.background_char_index)
.unwrap_or(&Self::BACKGROUND_CHAR_NAMES[0])
}
pub fn cycle_background_char(&mut self) {
self.background_char_index =
(self.background_char_index + 1) % Self::BACKGROUND_CHARS.len();
let _ = self.save();
}
}