1use dom_struct::dom_struct;
6
7use crate::dom::bindings::codegen::Bindings::GamepadButtonListBinding::GamepadButtonListMethods;
8use crate::dom::bindings::reflector::{Reflector, reflect_dom_object};
9use crate::dom::bindings::root::{Dom, DomRoot, DomSlice};
10use crate::dom::gamepad::gamepadbutton::GamepadButton;
11use crate::dom::window::Window;
12use crate::script_runtime::CanGc;
13
14#[dom_struct]
16pub(crate) struct GamepadButtonList {
17 reflector_: Reflector,
18 list: Vec<Dom<GamepadButton>>,
19}
20
21impl GamepadButtonList {
22 #[cfg_attr(crown, allow(crown::unrooted_must_root))]
23 fn new_inherited(list: &[&GamepadButton]) -> GamepadButtonList {
24 GamepadButtonList {
25 reflector_: Reflector::new(),
26 list: list.iter().map(|button| Dom::from_ref(*button)).collect(),
27 }
28 }
29
30 pub(crate) fn new(
31 window: &Window,
32 list: &[&GamepadButton],
33 can_gc: CanGc,
34 ) -> DomRoot<GamepadButtonList> {
35 reflect_dom_object(
36 Box::new(GamepadButtonList::new_inherited(list)),
37 window,
38 can_gc,
39 )
40 }
41}
42
43impl GamepadButtonListMethods<crate::DomTypeHolder> for GamepadButtonList {
44 fn Length(&self) -> u32 {
46 self.list.len() as u32
47 }
48
49 fn Item(&self, index: u32) -> Option<DomRoot<GamepadButton>> {
51 self.list
52 .get(index as usize)
53 .map(|button| DomRoot::from_ref(&**button))
54 }
55
56 fn IndexedGetter(&self, index: u32) -> Option<DomRoot<GamepadButton>> {
58 self.Item(index)
59 }
60}
61
62impl GamepadButtonList {
63 pub(crate) fn init_buttons(window: &Window, can_gc: CanGc) -> DomRoot<GamepadButtonList> {
66 let standard_buttons = &[
67 GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), GamepadButton::new(window, false, false, can_gc), ];
85 rooted_vec!(let buttons <- standard_buttons.iter().map(DomRoot::as_traced));
86 Self::new(window, buttons.r(), can_gc)
87 }
88}