From 55f3f0857f8aa703e2cbce2877940d304685bada Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Mon, 15 Apr 2019 11:51:26 -0600 Subject: [PATCH 1/4] Add support for keybinding Former-commit-id: 1edbf3bebb8d1651a1b912cedcd3513dfb287fa1 --- voxygen/Cargo.toml | 6 ++++- voxygen/Settings.toml | 17 ++++++++++++ voxygen/src/main.rs | 12 +++++++-- voxygen/src/settings.rs | 40 +++++++++++++++++++++++++++++ voxygen/src/window.rs | 57 ++++++++++++++++++++++------------------- 5 files changed, 102 insertions(+), 30 deletions(-) create mode 100644 voxygen/Settings.toml create mode 100644 voxygen/src/settings.rs diff --git a/voxygen/Cargo.toml b/voxygen/Cargo.toml index 9af01232bb..0db23602aa 100644 --- a/voxygen/Cargo.toml +++ b/voxygen/Cargo.toml @@ -18,7 +18,7 @@ gfx = "0.17" gfx_device_gl = { version = "0.15", optional = true } gfx_window_glutin = "0.28" glutin = "0.19" -winit = "0.18" +winit = {version = "0.18", features = ["serde"]} conrod_core = { git = "https://gitlab.com/veloren/conrod.git" } conrod_winit = { git = "https://gitlab.com/veloren/conrod.git" } @@ -36,3 +36,7 @@ log = "0.4" pretty_env_logger = "0.3" dot_vox = "1.0" image = "0.21" +config = "0.9" +serde = "1.0" +serde_derive = "1.0" +toml = "0.4" diff --git a/voxygen/Settings.toml b/voxygen/Settings.toml new file mode 100644 index 0000000000..238f3fd281 --- /dev/null +++ b/voxygen/Settings.toml @@ -0,0 +1,17 @@ +[controls] +toggle_cursor = "tab" +escape = "escape" +enter = "return" +move_forward = "w" +move_left = "a" +move_back = "s" +move_right = "d" +map = "m" +bag = "b" +quest_log = "l" +character_window = "c" +social = "o" +spellbook = "p" +settings = "n" +help = "f1" +interface = "f2" diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index b2bdcf65aa..309f35b5d6 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -12,6 +12,10 @@ pub mod scene; pub mod session; pub mod ui; pub mod window; +pub mod settings; + +// Rust complains that the Settings struct is undeclared without this +use settings::Settings; // Reexports pub use crate::error::Error; @@ -31,6 +35,7 @@ use crate::{ /// A type used to store state that is shared between all play states pub struct GlobalState { + settings: Settings, window: Window, } @@ -72,9 +77,12 @@ fn main() { pretty_env_logger::init(); // Set up the global state + let settings = Settings::load().expect("Failed to load configuration file."); + let window = Window::new(&settings).expect("Failed to create window"); + let mut global_state = GlobalState { - window: Window::new() - .expect("Failed to create window"), + settings, + window, }; // Set up the initial play state diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs new file mode 100644 index 0000000000..1e37a48fd5 --- /dev/null +++ b/voxygen/src/settings.rs @@ -0,0 +1,40 @@ +use config::{ + Config, + ConfigError, +}; +use serde_derive::{Serialize, Deserialize}; + +use glutin::VirtualKeyCode; + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Settings { + pub controls: ControlSettings, +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct ControlSettings { + pub toggle_cursor: VirtualKeyCode, + pub escape: VirtualKeyCode, + pub enter: VirtualKeyCode, + pub move_forward: VirtualKeyCode, + pub move_left: VirtualKeyCode, + pub move_back: VirtualKeyCode, + pub move_right: VirtualKeyCode, + pub map: VirtualKeyCode, + pub bag: VirtualKeyCode, + pub quest_log: VirtualKeyCode, + pub character_window: VirtualKeyCode, + pub social: VirtualKeyCode, + pub spellbook: VirtualKeyCode, + pub settings: VirtualKeyCode, + pub help: VirtualKeyCode, + pub interface: VirtualKeyCode, +} + +impl Settings { + pub fn load() -> Result { + let mut config = Config::new(); + config.merge(config::File::with_name("Settings"))?; + config.try_into() + } +} diff --git a/voxygen/src/window.rs b/voxygen/src/window.rs index 39009e4b16..59913c0069 100644 --- a/voxygen/src/window.rs +++ b/voxygen/src/window.rs @@ -1,6 +1,6 @@ use crate::{ render::{Renderer, TgtColorFmt, TgtDepthFmt}, - ui, Error, + ui, Error, settings::Settings, }; use std::collections::HashMap; use vek::*; @@ -15,7 +15,7 @@ pub struct Window { } impl Window { - pub fn new() -> Result { + pub fn new(settings: &Settings) -> Result { let events_loop = glutin::EventsLoop::new(); let win_builder = glutin::WindowBuilder::new() @@ -36,22 +36,22 @@ impl Window { .map_err(|err| Error::BackendError(Box::new(err)))?; let mut key_map = HashMap::new(); - key_map.insert(glutin::VirtualKeyCode::Tab, Key::ToggleCursor); - key_map.insert(glutin::VirtualKeyCode::Escape, Key::Escape); - key_map.insert(glutin::VirtualKeyCode::Return, Key::Enter); - key_map.insert(glutin::VirtualKeyCode::W, Key::MoveForward); - key_map.insert(glutin::VirtualKeyCode::A, Key::MoveLeft); - key_map.insert(glutin::VirtualKeyCode::S, Key::MoveBack); - key_map.insert(glutin::VirtualKeyCode::D, Key::MoveRight); - key_map.insert(glutin::VirtualKeyCode::M, Key::Map); - key_map.insert(glutin::VirtualKeyCode::B, Key::Bag); - key_map.insert(glutin::VirtualKeyCode::L, Key::QuestLog); - key_map.insert(glutin::VirtualKeyCode::C, Key::CharacterWindow); - key_map.insert(glutin::VirtualKeyCode::O, Key::Social); - key_map.insert(glutin::VirtualKeyCode::P, Key::Spellbook); - key_map.insert(glutin::VirtualKeyCode::N, Key::Settings); - key_map.insert(glutin::VirtualKeyCode::F1, Key::Help); - key_map.insert(glutin::VirtualKeyCode::F2, Key::Interface); + key_map.insert(settings.controls.toggle_cursor, Key::ToggleCursor); + key_map.insert(settings.controls.escape, Key::Escape); + key_map.insert(settings.controls.enter, Key::Enter); + key_map.insert(settings.controls.move_forward, Key::MoveForward); + key_map.insert(settings.controls.move_left, Key::MoveLeft); + key_map.insert(settings.controls.move_back, Key::MoveBack); + key_map.insert(settings.controls.move_right, Key::MoveRight); + key_map.insert(settings.controls.map, Key::Map); + key_map.insert(settings.controls.bag, Key::Bag); + key_map.insert(settings.controls.quest_log, Key::QuestLog); + key_map.insert(settings.controls.character_window, Key::CharacterWindow); + key_map.insert(settings.controls.social, Key::Social); + key_map.insert(settings.controls.spellbook, Key::Spellbook); + key_map.insert(settings.controls.settings, Key::Settings); + key_map.insert(settings.controls.help, Key::Help); + key_map.insert(settings.controls.interface, Key::Interface); let tmp = Ok(Self { events_loop, @@ -113,18 +113,21 @@ impl Window { }, _ => {} }, - glutin::WindowEvent::MouseWheel { - delta: glutin::MouseScrollDelta::LineDelta(_x, y), - .. - } => events.push(Event::Zoom(y as f32)), - _ => {}, + _ => {} }, glutin::Event::DeviceEvent { event, .. } => match event { - glutin::DeviceEvent::MouseMotion { delta: (dx, dy), .. } if cursor_grabbed => - events.push(Event::CursorPan(Vec2::new(dx as f32, dy as f32))), - _ => {}, + glutin::DeviceEvent::MouseMotion { + delta: (dx, dy), .. + } if cursor_grabbed => { + events.push(Event::CursorPan(Vec2::new(dx as f32, dy as f32))) + } + glutin::DeviceEvent::MouseWheel { + delta: glutin::MouseScrollDelta::LineDelta(_x, y), + .. + } if cursor_grabbed => events.push(Event::Zoom(y as f32)), + _ => {} }, - _ => {}, + _ => {} } }); events From 9592eb67c5f1e6889097fdc41422e49aa812c3ad Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Tue, 16 Apr 2019 02:56:47 -0600 Subject: [PATCH 2/4] Add default keybindings Former-commit-id: c8886a2eb3326ba62e31ef84b93a29ee59f378b3 --- Cargo.lock | 128 ++++++++++++++++++++++++++++++++++++++++ voxygen/src/main.rs | 9 +-- voxygen/src/settings.rs | 24 ++++++++ 3 files changed, 157 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b178e912b6..2e2c673031 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -183,6 +183,21 @@ name = "color_quant" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "config" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde-hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "conrod_core" version = "0.63.0" @@ -733,6 +748,11 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "itoa" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "jpeg-decoder" version = "0.1.15" @@ -761,6 +781,11 @@ name = "khronos_api" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazy_static" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "lazy_static" version = "1.3.0" @@ -793,6 +818,15 @@ dependencies = [ "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "linked-hash-map" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "linked-hash-map" version = "0.5.2" @@ -944,6 +978,15 @@ dependencies = [ "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "nom" +version = "4.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nonzero_signed" version = "1.0.3" @@ -1454,6 +1497,11 @@ dependencies = [ "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rust-ini" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rustc-demangle" version = "0.1.14" @@ -1491,6 +1539,11 @@ dependencies = [ "stb_truetype 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ryu" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "same-file" version = "1.0.4" @@ -1522,6 +1575,11 @@ name = "semver-parser" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "serde" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "serde" version = "1.0.90" @@ -1530,6 +1588,18 @@ dependencies = [ "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde-hjson" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "serde_derive" version = "1.0.90" @@ -1540,6 +1610,24 @@ dependencies = [ "syn 0.15.31 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_json" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_test" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "shared_library" version = "0.1.9" @@ -1736,6 +1824,14 @@ dependencies = [ "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "toml" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tuple_utils" version = "0.2.0" @@ -1832,6 +1928,7 @@ dependencies = [ name = "veloren-voxygen" version = "0.2.0" dependencies = [ + "config 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "conrod_core 0.63.0 (git+https://gitlab.com/veloren/conrod.git)", "conrod_winit 0.63.0 (git+https://gitlab.com/veloren/conrod.git)", "dot_vox 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1845,7 +1942,10 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "pretty_env_logger 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "specs 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "vek 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)", "veloren-client 0.2.0", "veloren-common 0.2.0", @@ -1861,6 +1961,11 @@ dependencies = [ "veloren-common 0.2.0", ] +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "void" version = "1.0.2" @@ -1992,6 +2097,7 @@ dependencies = [ "objc 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "smithay-client-toolkit 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "wayland-client 0.21.12 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2035,6 +2141,14 @@ name = "xml-rs" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "yaml-rust" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" @@ -2060,6 +2174,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum cocoa 0.18.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cf79daa4e11e5def06e55306aa3601b87de6b5149671529318da048f67cdd77b" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" +"checksum config 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e82d07fac0a5eeaa9d959b5194d01bb66e414665f547416958d2b430f8f4852" "checksum conrod_core 0.63.0 (git+https://gitlab.com/veloren/conrod.git)" = "" "checksum conrod_derive 0.63.0 (git+https://gitlab.com/veloren/conrod.git)" = "" "checksum conrod_winit 0.63.0 (git+https://gitlab.com/veloren/conrod.git)" = "" @@ -2119,15 +2234,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum inflate 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" "checksum instant 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d6706e8fb9de9be6143801a75747fa2209855b13d74ee994e30d86b38afdf77f" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554" "checksum khronos_api 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" "checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" "checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2" "checksum line_drawing 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5cc7ad3d82c845bdb5dde34ffdcc7a5fb4d2996e1e1ee0f19c33bc80e15196b9" +"checksum linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd" "checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83" "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" @@ -2146,6 +2264,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" "checksum noise 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9a3a34d4f8a31f95919b7ead9f5b60afb9bda0cae98b9219432ffaa6f00b0141" "checksum nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05aec50c70fd288702bcd93284a8444607f3292dbdf2a30de5ea5dcdbe72287b" +"checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum nonzero_signed 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "02783a0482333b0d3f5f5411b8fb60454a596696da041da0470ac9ef3e6e37d8" "checksum num 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf4825417e1e1406b3782a8ce92f4d53f26ec055e3622e1881ca8e9f5f9e08db" "checksum num-bigint 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "57450397855d951f1a41305e54851b1a7b8f5d2e349543a02a2effe25459f718" @@ -2203,17 +2322,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "559008764a17de49a3146b234641644ed37d118d1ef641a0bb573d146edc6ce0" "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96" +"checksum rust-ini 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" "checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" "checksum rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7540fc8b0c49f096ee9c961cda096467dce8084bec6bdca2fc83895fd9b28cb8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rusttype 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "25951e85bb2647960969f72c559392245a5bd07446a589390bf427dda31cdc4a" +"checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" "checksum same-file 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f20c4be53a8a1ff4c1f1b2bd14570d2f634628709752f0702ecdd2b3f9a5267" "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +"checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" "checksum serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "aa5f7c20820475babd2c077c3ab5f8c77a31c15e16ea38687b4c02d3e48680f4" +"checksum serde-hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b833c5ad67d52ced5f5938b2980f32a9c1c5ef047f0b4fb3127e7a423c76153" "checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79" +"checksum serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)" = "5a23aa71d4a4d43fdbfaac00eff68ba8a06a51759a89ac3304323e800c4dd40d" +"checksum serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" "checksum shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" "checksum shred 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c75ec29e8d2959ad96a1087fe4cadb926c6fc17cbae9812314fa8efe720aa2a" "checksum shred-derive 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fcf34e5e5302d3024aba7afc291f6d1ca7573ed035d3c0796976ba3f10691a1" @@ -2235,11 +2360,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" "checksum tiff 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1e4834f28a0330cb9f3f2c87d2649dca723cb33802e2bdcf18da32759fbec7ce" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" +"checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" "checksum tuple_utils 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cbfecd7bb8f0a3e96b3b31c46af2677a55a588767c0091f484601424fcb20e7e" "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" "checksum vek 0.9.7 (registry+https://github.com/rust-lang/crates.io-index)" = "41a272c9a959b8d3acd4fdbb83bb20d815976e3ab68b3fa9e0c9519b5dd18478" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d9d7ed3431229a144296213105a390676cc49c9b6a72bd19f3176c98e129fa1" "checksum wayland-client 0.21.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e77d1e6887f07ea2e5d79a3d7d03a875e62d3746334a909b5035d779d849a523" @@ -2260,3 +2387,4 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2" "checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5" +"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d" diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 309f35b5d6..41e5bd041a 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -14,9 +14,6 @@ pub mod ui; pub mod window; pub mod settings; -// Rust complains that the Settings struct is undeclared without this -use settings::Settings; - // Reexports pub use crate::error::Error; @@ -31,6 +28,7 @@ use pretty_env_logger; use crate::{ menu::main::MainMenuState, window::Window, + settings::Settings }; /// A type used to store state that is shared between all play states @@ -77,7 +75,10 @@ fn main() { pretty_env_logger::init(); // Set up the global state - let settings = Settings::load().expect("Failed to load configuration file."); + let settings = match Settings::load() { + Ok(settings) => settings, + Err(err) => Settings::default(), + }; let window = Window::new(&settings).expect("Failed to create window"); let mut global_state = GlobalState { diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 1e37a48fd5..3678b879f4 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -6,11 +6,13 @@ use serde_derive::{Serialize, Deserialize}; use glutin::VirtualKeyCode; +/// Settings contains everything that can be configured in the Settings.toml file #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Settings { pub controls: ControlSettings, } +/// ControlSettings contains keybindings #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ControlSettings { pub toggle_cursor: VirtualKeyCode, @@ -32,6 +34,28 @@ pub struct ControlSettings { } impl Settings { + pub fn default() -> Self { + Settings { + controls: ControlSettings { + toggle_cursor: VirtualKeyCode::Tab, + escape: VirtualKeyCode::Escape, + enter: VirtualKeyCode::Return, + move_forward: VirtualKeyCode::W, + move_left: VirtualKeyCode::A, + move_back: VirtualKeyCode::S, + move_right: VirtualKeyCode::D, + map: VirtualKeyCode::M, + bag: VirtualKeyCode::B, + quest_log: VirtualKeyCode::L, + character_window: VirtualKeyCode::C, + social: VirtualKeyCode::O, + spellbook: VirtualKeyCode::P, + settings: VirtualKeyCode::N, + help: VirtualKeyCode::F2, + interface: VirtualKeyCode::F2, + }, + } + } pub fn load() -> Result { let mut config = Config::new(); config.merge(config::File::with_name("Settings"))?; From 515039c62db2680a3fdf8aff1b0d7c71c370c75c Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Tue, 16 Apr 2019 10:06:23 -0600 Subject: [PATCH 3/4] Add auto generation of settings.toml if it does not already exist Former-commit-id: 941b81a8faeff89096256666c56ae472d9b569d5 --- .gitignore | 1 + voxygen/Settings.toml | 17 ----------------- voxygen/src/main.rs | 6 +++++- voxygen/src/settings.rs | 14 ++++++++++++-- 4 files changed, 18 insertions(+), 20 deletions(-) delete mode 100644 voxygen/Settings.toml diff --git a/.gitignore b/.gitignore index fbac64f787..96ef2e499f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ # Veloren **/server_conf.toml **/keybinds.toml +**/settings.toml assets/voxygen *.rar diff --git a/voxygen/Settings.toml b/voxygen/Settings.toml deleted file mode 100644 index 238f3fd281..0000000000 --- a/voxygen/Settings.toml +++ /dev/null @@ -1,17 +0,0 @@ -[controls] -toggle_cursor = "tab" -escape = "escape" -enter = "return" -move_forward = "w" -move_left = "a" -move_back = "s" -move_right = "d" -map = "m" -bag = "b" -quest_log = "l" -character_window = "c" -social = "o" -spellbook = "p" -settings = "n" -help = "f1" -interface = "f2" diff --git a/voxygen/src/main.rs b/voxygen/src/main.rs index 41e5bd041a..b31bef5e61 100644 --- a/voxygen/src/main.rs +++ b/voxygen/src/main.rs @@ -77,7 +77,11 @@ fn main() { // Set up the global state let settings = match Settings::load() { Ok(settings) => settings, - Err(err) => Settings::default(), + Err(err) => { + let settings = Settings::default(); + settings.save_to_file(); + settings + }, }; let window = Window::new(&settings).expect("Failed to create window"); diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 3678b879f4..d72e5c5da4 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -3,8 +3,10 @@ use config::{ ConfigError, }; use serde_derive::{Serialize, Deserialize}; - use glutin::VirtualKeyCode; +use toml; +use std::fs::File; +use std::io::prelude::*; /// Settings contains everything that can be configured in the Settings.toml file #[derive(Clone, Debug, Serialize, Deserialize)] @@ -56,9 +58,17 @@ impl Settings { }, } } + pub fn load() -> Result { let mut config = Config::new(); - config.merge(config::File::with_name("Settings"))?; + config.merge(config::File::with_name("settings"))?; config.try_into() } + + pub fn save_to_file(&self) -> std::io::Result<()> { + let mut config_file = File::create("settings.toml")?; + let s: &str = &toml::to_string_pretty(self).unwrap(); + config_file.write_all(s.as_bytes()).unwrap(); + Ok(()) + } } From 780e034674b20728a7680baba1429cfb8009c6ac Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Tue, 16 Apr 2019 11:41:39 -0600 Subject: [PATCH 4/4] Add better defaults support Former-commit-id: fa77acae3ee2b99cbf37a8fec71ee1913e889d82 --- voxygen/src/settings.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index d72e5c5da4..52f772af2e 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -7,9 +7,11 @@ use glutin::VirtualKeyCode; use toml; use std::fs::File; use std::io::prelude::*; +use std::default::Default; /// Settings contains everything that can be configured in the Settings.toml file #[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(default)] pub struct Settings { pub controls: ControlSettings, } @@ -35,8 +37,8 @@ pub struct ControlSettings { pub interface: VirtualKeyCode, } -impl Settings { - pub fn default() -> Self { +impl Default for Settings { + fn default() -> Self { Settings { controls: ControlSettings { toggle_cursor: VirtualKeyCode::Tab, @@ -53,14 +55,18 @@ impl Settings { social: VirtualKeyCode::O, spellbook: VirtualKeyCode::P, settings: VirtualKeyCode::N, - help: VirtualKeyCode::F2, + help: VirtualKeyCode::F1, interface: VirtualKeyCode::F2, }, } } +} + +impl Settings { pub fn load() -> Result { let mut config = Config::new(); + config.merge(Config::try_from(&Settings::default())?); config.merge(config::File::with_name("settings"))?; config.try_into() }