#![allow(clippy::trivially_copy_pass_by_ref)]
use crate::{
hotkey::Hotkey,
platform::prelude::*,
settings::{Field, SettingsDescription, Value},
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(default)]
pub struct HotkeyConfig {
pub split: Option<Hotkey>,
pub reset: Option<Hotkey>,
pub undo: Option<Hotkey>,
pub skip: Option<Hotkey>,
pub pause: Option<Hotkey>,
pub undo_all_pauses: Option<Hotkey>,
pub previous_comparison: Option<Hotkey>,
pub next_comparison: Option<Hotkey>,
pub toggle_timing_method: Option<Hotkey>,
}
impl Default for HotkeyConfig {
fn default() -> Self {
use crate::hotkey::KeyCode::*;
Self {
split: Some(Numpad1.into()),
reset: Some(Numpad3.into()),
undo: Some(Numpad8.into()),
skip: Some(Numpad2.into()),
pause: Some(Numpad5.into()),
undo_all_pauses: None,
previous_comparison: Some(Numpad4.into()),
next_comparison: Some(Numpad6.into()),
toggle_timing_method: None,
}
}
}
impl HotkeyConfig {
pub fn settings_description(&self) -> SettingsDescription {
SettingsDescription::with_fields(vec![
Field::new("Start / Split".into(), self.split.into()),
Field::new("Reset".into(), self.reset.into()),
Field::new("Undo Split".into(), self.undo.into()),
Field::new("Skip Split".into(), self.skip.into()),
Field::new("Pause".into(), self.pause.into()),
Field::new("Undo All Pauses".into(), self.undo_all_pauses.into()),
Field::new(
"Previous Comparison".into(),
self.previous_comparison.into(),
),
Field::new("Next Comparison".into(), self.next_comparison.into()),
Field::new(
"Toggle Timing Method".into(),
self.toggle_timing_method.into(),
),
])
}
pub fn set_value(&mut self, index: usize, value: Value) -> Result<(), ()> {
let value: Option<Hotkey> = value.into();
if value.is_some() {
let any = [
self.split,
self.reset,
self.undo,
self.skip,
self.pause,
self.undo_all_pauses,
self.previous_comparison,
self.next_comparison,
self.toggle_timing_method,
]
.into_iter()
.enumerate()
.filter(|&(i, _)| i != index)
.any(|(_, v)| v == value);
if any {
return Err(());
}
}
match index {
0 => self.split = value,
1 => self.reset = value,
2 => self.undo = value,
3 => self.skip = value,
4 => self.pause = value,
5 => self.undo_all_pauses = value,
6 => self.previous_comparison = value,
7 => self.next_comparison = value,
8 => self.toggle_timing_method = value,
_ => panic!("Unsupported Setting Index"),
}
Ok(())
}
#[cfg(feature = "std")]
pub fn from_json<R>(reader: R) -> serde_json::Result<Self>
where
R: std::io::Read,
{
serde_json::from_reader(reader)
}
#[cfg(feature = "std")]
pub fn write_json<W>(&self, writer: W) -> serde_json::Result<()>
where
W: std::io::Write,
{
serde_json::to_writer(writer, self)
}
}