gooey/interface/controller/controls/
mod.rs1use derive_builder::Builder;
17use sorted_vec::SortedSet;
18use serde::{Deserialize, Serialize};
19use crate::{interface, Tree};
20use crate::tree::NodeId;
21
22#[macro_use] mod macro_def;
23
24pub mod axis;
25pub mod button;
26pub mod motion;
27pub mod pointer;
28pub mod system;
29pub mod text;
30pub mod wheel;
31
32pub use self::axis::Axis;
33pub use self::button::Button;
34pub use self::motion::Motion;
35pub use self::pointer::Pointer;
36pub use self::system::System;
37pub use self::text::Text;
38pub use self::wheel::Wheel;
39
40pub use ControlsBuilder as Builder;
41
42#[derive(Clone, Debug, Default, Builder)]
44#[builder(pattern="owned", build_fn(skip), setter(strip_option))]
45pub struct Controls {
46 #[builder(default)]
47 pub buttons : SortedSet <Button>,
48 #[builder(default)]
49 pub any_button : Option <Button>,
50 #[builder(default)]
51 pub system : Option <System>,
52 #[builder(default)]
53 pub text : Option <Text>,
54 #[builder(default)]
55 pub motion : Option <Motion>,
56 #[builder(default)]
57 pub pointer : Option <Pointer>
58 }
60
61pub trait Id <C : Control> : Clone + Eq + PartialEq + Into <Fun <C::Payload>>
69 + Into <C> + std::convert::TryFrom <C, Error = C> + std::fmt::Debug
70 + serde::Serialize + serde::de::DeserializeOwned
71{ }
72
73#[derive(Clone)]
78pub struct Fun <P> (pub fn (
79 &P,
80 &Tree <interface::Element>,
81 &NodeId,
82 &mut Vec <(NodeId, interface::Action)>
83));
84
85pub type ReprType = u16;
87pub trait Control : Clone + Sized + From <ReprType> + AsRef <ReprType>
90 + std::fmt::Debug
91{
92 type Payload;
93 type Builtin : Id <Self>;
94 fn fun <E : Id <Self>> (self) -> Fun <Self::Payload> {
95 use std::convert::TryFrom;
96 match Self::Builtin::try_from (self) {
97 Ok (builtin) => builtin.into(),
98 Err (control) => match E::try_from (control) {
99 Ok (extended) => extended.into(),
100 Err (_control) => unreachable!()
101 }
102 }
103 }
104}
105
106#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
108pub enum Nil {}
109impl <P> From <Nil> for Fun <P> {
110 fn from (_ : Nil) -> Self {
111 unreachable!()
112 }
113}
114
115impl <P> std::fmt::Debug for Fun <P> {
116 fn fmt (&self, f : &mut std::fmt::Formatter) -> Result <(), std::fmt::Error> {
117 write!(f, "Fun({:p})", &self.0)
118 }
119}
120
121impl ControlsBuilder {
122 pub fn new() -> Self {
123 ControlsBuilder {
124 buttons: None,
125 any_button: None,
126 system: None,
127 text: None,
128 motion: None,
129 pointer: None
130 }
131 }
132
133 pub fn build (self) -> Controls {
134 Controls {
135 buttons: self.buttons.unwrap_or_default(),
136 any_button: self.any_button.unwrap_or_default(),
137 system: self.system.unwrap_or_default(),
138 text: self.text.unwrap_or_default(),
139 motion: self.motion.unwrap_or_default(),
140 pointer: self.pointer.unwrap_or_default()
141 }
142 }
143}