arwa/html/
html_map_element.rs1use 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}