script/dom/gamepad/
gamepadbutton.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use std::cell::Cell;
6
7use dom_struct::dom_struct;
8
9use crate::dom::bindings::codegen::Bindings::GamepadButtonBinding::GamepadButtonMethods;
10use crate::dom::bindings::num::Finite;
11use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
12use crate::dom::bindings::root::DomRoot;
13use crate::dom::window::Window;
14use crate::script_runtime::CanGc;
15
16#[dom_struct]
17pub(crate) struct GamepadButton {
18    reflector_: Reflector,
19    pressed: Cell<bool>,
20    touched: Cell<bool>,
21    value: Cell<f64>,
22}
23
24impl GamepadButton {
25    pub(crate) fn new_inherited(pressed: bool, touched: bool) -> GamepadButton {
26        Self {
27            reflector_: Reflector::new(),
28            pressed: Cell::new(pressed),
29            touched: Cell::new(touched),
30            value: Cell::new(0.0),
31        }
32    }
33
34    pub(crate) fn new(
35        window: &Window,
36        pressed: bool,
37        touched: bool,
38        can_gc: CanGc,
39    ) -> DomRoot<GamepadButton> {
40        reflect_dom_object(
41            Box::new(GamepadButton::new_inherited(pressed, touched)),
42            window,
43            can_gc,
44        )
45    }
46}
47
48impl GamepadButtonMethods<crate::DomTypeHolder> for GamepadButton {
49    // https://www.w3.org/TR/gamepad/#widl-GamepadButton-pressed
50    fn Pressed(&self) -> bool {
51        self.pressed.get()
52    }
53
54    // https://www.w3.org/TR/gamepad/#widl-GamepadButton-touched
55    fn Touched(&self) -> bool {
56        self.touched.get()
57    }
58
59    // https://www.w3.org/TR/gamepad/#widl-GamepadButton-value
60    fn Value(&self) -> Finite<f64> {
61        Finite::wrap(self.value.get())
62    }
63}
64
65impl GamepadButton {
66    pub(crate) fn update(&self, pressed: bool, touched: bool, value: f64) {
67        self.pressed.set(pressed);
68        self.touched.set(touched);
69        self.value.set(value);
70    }
71}