2019-10-06 07:58:47 +00:00
|
|
|
/*
|
|
|
|
* meli - configuration module.
|
|
|
|
*
|
|
|
|
* Copyright 2019 Manos Pitsidianakis
|
|
|
|
*
|
|
|
|
* This file is part of meli.
|
|
|
|
*
|
|
|
|
* meli is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* meli is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with meli. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2020-02-04 13:52:12 +00:00
|
|
|
//! Settings for terminal display
|
|
|
|
|
2019-10-15 19:55:53 +00:00
|
|
|
use super::deserializers::non_empty_string;
|
2020-07-17 10:12:57 +00:00
|
|
|
use super::DotAddressable;
|
2020-06-01 23:47:02 +00:00
|
|
|
use super::Themes;
|
2020-07-17 10:12:57 +00:00
|
|
|
use melib::{MeliError, Result, ToggleFlag};
|
2019-10-15 19:55:53 +00:00
|
|
|
|
2019-10-06 07:58:47 +00:00
|
|
|
/// Settings for terminal display
|
|
|
|
#[derive(Debug, Deserialize, Clone, Serialize)]
|
2020-08-03 19:53:06 +00:00
|
|
|
#[serde(default, deny_unknown_fields)]
|
2019-10-06 07:58:47 +00:00
|
|
|
pub struct TerminalSettings {
|
|
|
|
/// light, dark
|
|
|
|
pub theme: String,
|
2020-06-01 23:47:02 +00:00
|
|
|
pub themes: Themes,
|
2019-10-06 08:28:12 +00:00
|
|
|
pub ascii_drawing: bool,
|
2020-01-27 18:17:46 +00:00
|
|
|
pub use_color: ToggleFlag,
|
2020-10-14 09:50:38 +00:00
|
|
|
/// Use mouse events. This will disable text selection, but you will be able to resize some
|
|
|
|
/// widgets.
|
|
|
|
/// Default: False
|
|
|
|
pub use_mouse: ToggleFlag,
|
|
|
|
/// String to show in status bar if mouse is active.
|
|
|
|
/// Default: "🖱️ "
|
|
|
|
#[serde(deserialize_with = "non_empty_string")]
|
|
|
|
pub mouse_flag: Option<String>,
|
2019-10-15 19:55:53 +00:00
|
|
|
#[serde(deserialize_with = "non_empty_string")]
|
|
|
|
pub window_title: Option<String>,
|
2020-10-09 18:21:15 +00:00
|
|
|
#[serde(deserialize_with = "non_empty_string")]
|
|
|
|
pub file_picker_command: Option<String>,
|
2020-10-14 17:07:39 +00:00
|
|
|
/// Choose between 30-something built in sequences (integers between 0-30) or define your own
|
|
|
|
/// list of strings for the progress spinner animation.
|
|
|
|
/// Default: 0
|
|
|
|
#[serde(default)]
|
|
|
|
pub progress_spinner_sequence: Option<ProgressSpinnerSequence>,
|
2019-10-06 07:58:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Default for TerminalSettings {
|
|
|
|
fn default() -> Self {
|
|
|
|
TerminalSettings {
|
|
|
|
theme: "dark".to_string(),
|
2020-06-01 23:47:02 +00:00
|
|
|
themes: Themes::default(),
|
2019-10-06 08:28:12 +00:00
|
|
|
ascii_drawing: false,
|
2020-01-27 18:17:46 +00:00
|
|
|
use_color: ToggleFlag::InternalVal(true),
|
2020-10-14 09:50:38 +00:00
|
|
|
use_mouse: ToggleFlag::InternalVal(false),
|
|
|
|
mouse_flag: Some("🖱️ ".to_string()),
|
2019-10-15 19:55:53 +00:00
|
|
|
window_title: Some("meli".to_string()),
|
2020-10-09 18:21:15 +00:00
|
|
|
file_picker_command: None,
|
2020-10-14 17:07:39 +00:00
|
|
|
progress_spinner_sequence: None,
|
2019-10-06 07:58:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-02-09 18:47:36 +00:00
|
|
|
|
|
|
|
impl TerminalSettings {
|
|
|
|
pub fn use_color(&self) -> bool {
|
|
|
|
/* Don't use color if
|
|
|
|
* - Either NO_COLOR is set and user hasn't explicitly set use_colors or
|
|
|
|
* - User has explicitly set use_colors to false
|
|
|
|
*/
|
|
|
|
!((std::env::var("NO_COLOR").is_ok()
|
|
|
|
&& (self.use_color.is_false() || self.use_color.is_internal()))
|
|
|
|
|| (self.use_color.is_false() && !self.use_color.is_internal()))
|
|
|
|
}
|
|
|
|
}
|
2020-07-17 10:12:57 +00:00
|
|
|
|
|
|
|
impl DotAddressable for TerminalSettings {
|
|
|
|
fn lookup(&self, parent_field: &str, path: &[&str]) -> Result<String> {
|
|
|
|
match path.first() {
|
|
|
|
Some(field) => {
|
|
|
|
let tail = &path[1..];
|
|
|
|
match *field {
|
|
|
|
"theme" => self.theme.lookup(field, tail),
|
|
|
|
"themes" => Err(MeliError::new("unimplemented")),
|
|
|
|
"ascii_drawing" => self.ascii_drawing.lookup(field, tail),
|
|
|
|
"use_color" => self.use_color.lookup(field, tail),
|
2020-10-14 09:50:38 +00:00
|
|
|
"use_mouse" => self.use_mouse.lookup(field, tail),
|
|
|
|
"mouse_flag" => self.mouse_flag.lookup(field, tail),
|
2020-07-17 10:12:57 +00:00
|
|
|
"window_title" => self.window_title.lookup(field, tail),
|
2020-10-09 18:21:15 +00:00
|
|
|
"file_picker_command" => self.file_picker_command.lookup(field, tail),
|
2020-10-16 19:28:00 +00:00
|
|
|
"progress_spinner_sequence" => {
|
|
|
|
self.progress_spinner_sequence.lookup(field, tail)
|
|
|
|
}
|
2020-07-17 10:12:57 +00:00
|
|
|
other => Err(MeliError::new(format!(
|
|
|
|
"{} has no field named {}",
|
|
|
|
parent_field, other
|
|
|
|
))),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None => Ok(toml::to_string(self).map_err(|err| err.to_string())?),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-14 17:07:39 +00:00
|
|
|
|
|
|
|
#[derive(Debug, Deserialize, Clone, Serialize)]
|
|
|
|
#[serde(untagged)]
|
|
|
|
pub enum ProgressSpinnerSequence {
|
|
|
|
Integer(usize),
|
|
|
|
Custom(Vec<String>),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl DotAddressable for ProgressSpinnerSequence {}
|