1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
use crate::button::*;
use ron::de::from_reader;
use ron::ser::{to_string_pretty, PrettyConfig};
use serde::{Deserialize, Serialize};
use std::fs::File;
use std::io::{self, Write};
use std::path::Path;
#[derive(Deserialize, Serialize)]
pub struct Config {
pub deletion_keybindings: DeletionToolKeybindings,
pub icon_keybindings: IconToolKeybindings,
pub room_keybindings: RoomToolKeybindings,
pub wall_keybindings: WallToolKeybindings,
}
pub trait ToolKeybindings {
/// Get the key which will activate the tool it is made for.
fn activation_key(&self) -> Button;
}
#[derive(Serialize, Deserialize)]
pub struct DeletionToolKeybindings {
pub activation: Button,
pub start_selection: Button,
pub do_delete: Button,
pub abort_deletion: Button,
}
#[derive(Serialize, Deserialize)]
pub struct IconToolKeybindings {
pub activation: Button,
pub next: Button,
pub previous: Button,
pub rotate_clockwise: Button,
pub rotate_counterclockwise: Button,
pub place: Button,
}
#[derive(Serialize, Deserialize)]
pub struct RoomToolKeybindings {
pub activation: Button,
pub start_draw: Button,
pub finish_draw: Button,
pub abort_draw: Button,
}
#[derive(Serialize, Deserialize)]
pub struct WallToolKeybindings {
pub activation: Button,
pub start_wall: Button,
pub finish_segment: Button,
pub abort_segment: Button,
}
impl Config {
pub fn from_file<P: AsRef<Path>>(path: P) -> io::Result<Config> {
let file = File::open(&path)?;
match from_reader(file) {
Ok(data) => Ok(data),
Err(err) => Err(io::Error::new(io::ErrorKind::InvalidData, err)),
}
}
pub fn write_file<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {
let mut file = File::create(&path)?;
let pretty_conf = PrettyConfig::new()
.with_depth_limit(4)
.with_decimal_floats(true)
.with_separate_tuple_members(true)
.with_indentor("\t".to_owned());
let string = match to_string_pretty(&self, pretty_conf) {
Ok(string) => string,
Err(err) => {
return Err(io::Error::new(io::ErrorKind::InvalidInput, err));
}
};
file.write_all(&string.as_bytes())
}
}
impl Default for Config {
fn default() -> Self {
Config {
deletion_keybindings: DeletionToolKeybindings {
activation: Button::Keyboard(KeyboardKey::D),
start_selection: Button::Mouse(MouseButton::Left),
do_delete: Button::Mouse(MouseButton::Left),
abort_deletion: Button::Mouse(MouseButton::Right),
},
icon_keybindings: IconToolKeybindings {
activation: Button::Keyboard(KeyboardKey::I),
next: Button::Keyboard(KeyboardKey::I),
previous: Button::Keyboard(KeyboardKey::J),
rotate_clockwise: Button::Mouse(MouseButton::Right),
rotate_counterclockwise: Button::Keyboard(KeyboardKey::Minus),
place: Button::Mouse(MouseButton::Left),
},
room_keybindings: RoomToolKeybindings {
activation: Button::Keyboard(KeyboardKey::R),
start_draw: Button::Mouse(MouseButton::Left),
finish_draw: Button::Mouse(MouseButton::Left),
abort_draw: Button::Mouse(MouseButton::Right),
},
wall_keybindings: WallToolKeybindings {
activation: Button::Keyboard(KeyboardKey::W),
start_wall: Button::Mouse(MouseButton::Left),
finish_segment: Button::Mouse(MouseButton::Left),
abort_segment: Button::Mouse(MouseButton::Right),
},
}
}
}
impl ToolKeybindings for DeletionToolKeybindings {
fn activation_key(&self) -> Button {
self.activation
}
}
impl ToolKeybindings for IconToolKeybindings {
fn activation_key(&self) -> Button {
self.activation
}
}
impl ToolKeybindings for RoomToolKeybindings {
fn activation_key(&self) -> Button {
self.activation
}
}
impl ToolKeybindings for WallToolKeybindings {
fn activation_key(&self) -> Button {
self.activation
}
}
|