arwa/html/
html_map_element.rs

1use std::convert::TryFrom;
2
3use wasm_bindgen::JsCast;
4
5use crate::console::{Write, Writer};
6use crate::html::{GenericHtmlElement, HtmlAreaElement, HtmlElement};
7use crate::{Element, GenericElement, GenericNode, GlobalEventHandlers, InvalidCast, Node};
8
9#[derive(Clone)]
10pub struct HtmlMapElement {
11    inner: web_sys::HtmlMapElement,
12}
13
14impl HtmlMapElement {
15    pub fn areas(&self) -> MapAreas {
16        MapAreas {
17            inner: self.inner.areas(),
18        }
19    }
20}
21
22impl_html_common_traits!(HtmlMapElement);
23
24pub struct MapAreas {
25    inner: web_sys::HtmlCollection,
26}
27
28impl MapAreas {
29    pub fn get(&self, index: usize) -> Option<HtmlAreaElement> {
30        u32::try_from(index)
31            .ok()
32            .and_then(|index| self.inner.item(index))
33            .map(|area| {
34                let area: web_sys::HtmlAreaElement = area.unchecked_into();
35
36                area.into()
37            })
38    }
39
40    pub fn len(&self) -> usize {
41        self.inner.length() as usize
42    }
43
44    pub fn is_empty(&self) -> bool {
45        self.len() == 0
46    }
47
48    pub fn is_not_empty(&self) -> bool {
49        !self.is_empty()
50    }
51
52    pub fn first(&self) -> Option<HtmlAreaElement> {
53        self.get(0)
54    }
55
56    pub fn last(&self) -> Option<HtmlAreaElement> {
57        let len = self.len();
58
59        if len > 0 {
60            self.get(len - 1)
61        } else {
62            None
63        }
64    }
65
66    pub fn find_by_id(&self, id: &str) -> Option<HtmlAreaElement> {
67        self.inner.get_with_name(id).map(|area| {
68            let area: web_sys::HtmlAreaElement = area.unchecked_into();
69
70            area.into()
71        })
72    }
73
74    pub fn iter(&self) -> MapAreasIter {
75        MapAreasIter {
76            map_areas: self,
77            current: 0,
78        }
79    }
80}
81
82impl Write for MapAreas {
83    fn write(&self, writer: &mut Writer) {
84        writer.write_1(self.inner.as_ref());
85    }
86}
87
88impl IntoIterator for MapAreas {
89    type Item = HtmlAreaElement;
90    type IntoIter = MapAreasIntoIter;
91
92    fn into_iter(self) -> Self::IntoIter {
93        MapAreasIntoIter {
94            map_areas: self,
95            current: 0,
96        }
97    }
98}
99
100pub struct MapAreasIter<'a> {
101    map_areas: &'a MapAreas,
102    current: usize,
103}
104
105impl<'a> Iterator for MapAreasIter<'a> {
106    type Item = HtmlAreaElement;
107
108    fn next(&mut self) -> Option<Self::Item> {
109        let current = self.current;
110
111        self.current += 1;
112
113        self.map_areas.get(current)
114    }
115}
116
117pub struct MapAreasIntoIter {
118    map_areas: MapAreas,
119    current: usize,
120}
121
122impl Iterator for MapAreasIntoIter {
123    type Item = HtmlAreaElement;
124
125    fn next(&mut self) -> Option<Self::Item> {
126        let current = self.current;
127
128        self.current += 1;
129
130        self.map_areas.get(current)
131    }
132}