2019-05-25 14:39:27 +00:00
|
|
|
use crate::window::KeyMouse;
|
2019-04-25 16:24:00 +00:00
|
|
|
use config::{Config, ConfigError};
|
|
|
|
use directories::ProjectDirs;
|
2019-05-25 14:39:27 +00:00
|
|
|
use glutin::{MouseButton, VirtualKeyCode};
|
2019-04-25 16:24:00 +00:00
|
|
|
use serde_derive::{Deserialize, Serialize};
|
2019-05-20 21:32:16 +00:00
|
|
|
use std::{fs, io::prelude::*, path::PathBuf};
|
2019-04-16 16:06:23 +00:00
|
|
|
use toml;
|
2019-04-15 17:51:26 +00:00
|
|
|
|
2019-05-17 09:22:32 +00:00
|
|
|
/// `Settings` contains everything that can be configured in the Settings.toml file.
|
2019-04-15 17:51:26 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
2019-04-16 17:41:39 +00:00
|
|
|
#[serde(default)]
|
2019-04-15 17:51:26 +00:00
|
|
|
pub struct Settings {
|
|
|
|
pub controls: ControlSettings,
|
2019-04-18 17:40:29 +00:00
|
|
|
pub networking: NetworkingSettings,
|
2019-04-25 11:49:36 +00:00
|
|
|
pub log: Log,
|
2019-05-20 17:40:35 +00:00
|
|
|
pub graphics: GraphicsSettings,
|
2019-05-20 16:54:54 +00:00
|
|
|
pub audio: AudioSettings,
|
2019-04-15 17:51:26 +00:00
|
|
|
}
|
|
|
|
|
2019-05-17 09:22:32 +00:00
|
|
|
/// `ControlSettings` contains keybindings.
|
2019-04-15 17:51:26 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
pub struct ControlSettings {
|
2019-05-25 14:39:27 +00:00
|
|
|
pub toggle_cursor: KeyMouse,
|
|
|
|
pub escape: KeyMouse,
|
|
|
|
pub enter: KeyMouse,
|
|
|
|
pub move_forward: KeyMouse,
|
|
|
|
pub move_left: KeyMouse,
|
|
|
|
pub move_back: KeyMouse,
|
|
|
|
pub move_right: KeyMouse,
|
|
|
|
pub jump: KeyMouse,
|
|
|
|
pub glide: KeyMouse,
|
|
|
|
pub map: KeyMouse,
|
|
|
|
pub bag: KeyMouse,
|
|
|
|
pub quest_log: KeyMouse,
|
|
|
|
pub character_window: KeyMouse,
|
|
|
|
pub social: KeyMouse,
|
|
|
|
pub spellbook: KeyMouse,
|
|
|
|
pub settings: KeyMouse,
|
|
|
|
pub help: KeyMouse,
|
|
|
|
pub toggle_interface: KeyMouse,
|
|
|
|
pub toggle_debug: KeyMouse,
|
|
|
|
pub fullscreen: KeyMouse,
|
|
|
|
pub screenshot: KeyMouse,
|
2019-05-21 04:55:20 +00:00
|
|
|
pub toggle_ingame_ui: VirtualKeyCode,
|
2019-05-25 02:30:56 +00:00
|
|
|
pub pan_sensitivity: f32,
|
|
|
|
pub zoom_sensitivity: f32,
|
2019-05-25 14:39:27 +00:00
|
|
|
pub attack: KeyMouse,
|
2019-04-15 17:51:26 +00:00
|
|
|
}
|
|
|
|
|
2019-04-18 17:40:29 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
pub struct NetworkingSettings {
|
|
|
|
pub username: String,
|
|
|
|
pub servers: Vec<String>,
|
|
|
|
pub default_server: usize,
|
|
|
|
}
|
|
|
|
|
2019-04-25 11:49:36 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
pub struct Log {
|
|
|
|
pub file: PathBuf,
|
|
|
|
}
|
|
|
|
|
2019-05-20 17:40:35 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
pub struct GraphicsSettings {
|
|
|
|
pub view_distance: u32,
|
|
|
|
}
|
|
|
|
|
2019-05-20 16:54:54 +00:00
|
|
|
/// AudioSettings controls the volume of different audio subsystems and which
|
2019-05-22 11:29:38 +00:00
|
|
|
/// device is used.
|
2019-05-20 16:54:54 +00:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
|
|
|
pub struct AudioSettings {
|
|
|
|
pub music_volume: f32,
|
|
|
|
pub sfx_volume: f32,
|
|
|
|
|
2019-05-22 11:29:38 +00:00
|
|
|
/// Audio Device that Voxygen will use to play audio.
|
|
|
|
pub audio_device: Option<String>,
|
2019-05-20 16:54:54 +00:00
|
|
|
}
|
|
|
|
|
2019-04-16 17:41:39 +00:00
|
|
|
impl Default for Settings {
|
|
|
|
fn default() -> Self {
|
2019-04-16 08:56:47 +00:00
|
|
|
Settings {
|
|
|
|
controls: ControlSettings {
|
2019-05-25 14:39:27 +00:00
|
|
|
toggle_cursor: KeyMouse::Key(VirtualKeyCode::Tab),
|
|
|
|
escape: KeyMouse::Key(VirtualKeyCode::Escape),
|
|
|
|
enter: KeyMouse::Key(VirtualKeyCode::Return),
|
|
|
|
move_forward: KeyMouse::Key(VirtualKeyCode::W),
|
|
|
|
move_left: KeyMouse::Key(VirtualKeyCode::A),
|
|
|
|
move_back: KeyMouse::Key(VirtualKeyCode::S),
|
|
|
|
move_right: KeyMouse::Key(VirtualKeyCode::D),
|
|
|
|
jump: KeyMouse::Key(VirtualKeyCode::Space),
|
|
|
|
glide: KeyMouse::Key(VirtualKeyCode::LShift),
|
|
|
|
map: KeyMouse::Key(VirtualKeyCode::M),
|
|
|
|
bag: KeyMouse::Key(VirtualKeyCode::B),
|
|
|
|
quest_log: KeyMouse::Key(VirtualKeyCode::L),
|
|
|
|
character_window: KeyMouse::Key(VirtualKeyCode::C),
|
|
|
|
social: KeyMouse::Key(VirtualKeyCode::O),
|
|
|
|
spellbook: KeyMouse::Key(VirtualKeyCode::P),
|
|
|
|
settings: KeyMouse::Key(VirtualKeyCode::N),
|
|
|
|
help: KeyMouse::Key(VirtualKeyCode::F1),
|
|
|
|
toggle_interface: KeyMouse::Key(VirtualKeyCode::F2),
|
|
|
|
toggle_debug: KeyMouse::Key(VirtualKeyCode::F3),
|
|
|
|
fullscreen: KeyMouse::Key(VirtualKeyCode::F11),
|
|
|
|
screenshot: KeyMouse::Key(VirtualKeyCode::F4),
|
2019-05-21 04:55:20 +00:00
|
|
|
toggle_ingame_ui: VirtualKeyCode::F6,
|
2019-05-25 02:30:56 +00:00
|
|
|
pan_sensitivity: 1.0,
|
|
|
|
zoom_sensitivity: 1.0,
|
2019-05-25 14:39:27 +00:00
|
|
|
attack: KeyMouse::Mouse(MouseButton::Left),
|
2019-04-16 08:56:47 +00:00
|
|
|
},
|
2019-04-18 17:40:29 +00:00
|
|
|
networking: NetworkingSettings {
|
|
|
|
username: "Username".to_string(),
|
2019-04-25 16:24:00 +00:00
|
|
|
servers: vec!["server.veloren.net".to_string()],
|
2019-04-18 17:40:29 +00:00
|
|
|
default_server: 0,
|
|
|
|
},
|
2019-04-25 11:49:36 +00:00
|
|
|
log: Log {
|
|
|
|
file: "voxygen.log".into(),
|
|
|
|
},
|
2019-05-20 17:40:35 +00:00
|
|
|
graphics: GraphicsSettings { view_distance: 5 },
|
2019-05-20 16:54:54 +00:00
|
|
|
audio: AudioSettings {
|
|
|
|
music_volume: 0.5,
|
|
|
|
sfx_volume: 0.5,
|
2019-05-22 11:29:38 +00:00
|
|
|
audio_device: None,
|
2019-05-20 16:54:54 +00:00
|
|
|
},
|
2019-04-16 08:56:47 +00:00
|
|
|
}
|
|
|
|
}
|
2019-04-16 17:41:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Settings {
|
2019-05-17 07:55:51 +00:00
|
|
|
pub fn load() -> Self {
|
|
|
|
let default_settings = Settings::default();
|
2019-04-25 16:24:00 +00:00
|
|
|
|
|
|
|
let path = Settings::get_settings_path();
|
|
|
|
|
2019-05-17 07:55:51 +00:00
|
|
|
let mut config = Config::new();
|
|
|
|
|
|
|
|
config
|
|
|
|
.merge(
|
|
|
|
Config::try_from(&default_settings)
|
2019-05-17 09:22:32 +00:00
|
|
|
.expect("Default settings struct could not be converted to Config!"),
|
2019-05-17 07:55:51 +00:00
|
|
|
)
|
|
|
|
.unwrap();
|
2019-04-25 16:24:00 +00:00
|
|
|
|
2019-05-17 09:22:32 +00:00
|
|
|
// TODO: Log errors here.
|
|
|
|
// If merge or try_into fail, use the default settings.
|
2019-05-17 07:55:51 +00:00
|
|
|
match config.merge::<config::File<_>>(path.into()) {
|
|
|
|
Ok(_) => match config.try_into() {
|
|
|
|
Ok(settings) => settings,
|
|
|
|
Err(_) => default_settings,
|
|
|
|
},
|
|
|
|
Err(_) => {
|
2019-05-17 09:22:32 +00:00
|
|
|
// Maybe the file didn't exist.
|
|
|
|
// TODO: Handle this result.
|
2019-05-17 07:55:51 +00:00
|
|
|
default_settings.save_to_file();
|
|
|
|
default_settings
|
|
|
|
}
|
|
|
|
}
|
2019-04-15 17:51:26 +00:00
|
|
|
}
|
2019-04-16 16:06:23 +00:00
|
|
|
|
|
|
|
pub fn save_to_file(&self) -> std::io::Result<()> {
|
2019-04-25 16:24:00 +00:00
|
|
|
let path = Settings::get_settings_path();
|
|
|
|
|
2019-05-20 21:32:16 +00:00
|
|
|
if let Some(dir) = path.parent() {
|
|
|
|
fs::create_dir_all(dir)?;
|
|
|
|
}
|
|
|
|
|
|
|
|
let mut config_file = fs::File::create(path)?;
|
2019-04-16 16:06:23 +00:00
|
|
|
let s: &str = &toml::to_string_pretty(self).unwrap();
|
|
|
|
config_file.write_all(s.as_bytes()).unwrap();
|
|
|
|
Ok(())
|
|
|
|
}
|
2019-04-25 16:24:00 +00:00
|
|
|
|
|
|
|
fn get_settings_path() -> PathBuf {
|
|
|
|
let proj_dirs =
|
2019-05-17 09:22:32 +00:00
|
|
|
ProjectDirs::from("net", "veloren", "voxygen").expect("No home directory defined!");
|
2019-04-25 16:24:00 +00:00
|
|
|
let path = proj_dirs.config_dir();
|
|
|
|
path.join("settings");
|
|
|
|
let path = path.with_extension("toml");
|
|
|
|
path
|
|
|
|
}
|
2019-04-15 17:51:26 +00:00
|
|
|
}
|