| 5204 | } |
| 5205 | |
| 5206 | pub fn set_pointer_state(&mut self, position: Vector2, is_down: bool) { |
| 5207 | if self.boolean_warnings.max_elements_exceeded { |
| 5208 | return; |
| 5209 | } |
| 5210 | self.pointer_info.position = position; |
| 5211 | self.pointer_over_ids.clear(); |
| 5212 | |
| 5213 | // Check which elements are under the pointer |
| 5214 | for root_index in (0..self.layout_element_tree_roots.len()).rev() { |
| 5215 | let root = self.layout_element_tree_roots[root_index]; |
| 5216 | let mut dfs: Vec<i32> = vec![root.layout_element_index]; |
| 5217 | let mut vis: Vec<bool> = vec![false]; |
| 5218 | let mut found = false; |
| 5219 | |
| 5220 | while !dfs.is_empty() { |
| 5221 | let idx = dfs.len() - 1; |
| 5222 | if vis[idx] { |
| 5223 | dfs.pop(); |
| 5224 | vis.pop(); |
| 5225 | continue; |
| 5226 | } |
| 5227 | vis[idx] = true; |
| 5228 | let current_idx = dfs[idx] as usize; |
| 5229 | let elem_id = self.layout_elements[current_idx].id; |
| 5230 | |
| 5231 | // Copy data from map to avoid borrow issues with mutable access later |
| 5232 | let map_data = self.layout_element_map.get(&elem_id).map(|item| { |
| 5233 | (item.bounding_box, item.element_id.clone(), item.on_hover_fn.is_some()) |
| 5234 | }); |
| 5235 | if let Some((raw_box, elem_id_copy, has_hover)) = map_data { |
| 5236 | let mut elem_box = raw_box; |
| 5237 | elem_box.x -= root.pointer_offset.x; |
| 5238 | elem_box.y -= root.pointer_offset.y; |
| 5239 | |
| 5240 | let clip_id = |
| 5241 | self.layout_element_clip_element_ids[current_idx] as u32; |
| 5242 | let clip_ok = clip_id == 0 |
| 5243 | || self |
| 5244 | .layout_element_map |
| 5245 | .get(&clip_id) |
| 5246 | .map(|ci| { |
| 5247 | point_is_inside_rect( |
| 5248 | position, |
| 5249 | ci.bounding_box, |
| 5250 | ) |
| 5251 | }) |
| 5252 | .unwrap_or(false); |
| 5253 | |
| 5254 | if point_is_inside_rect(position, elem_box) && clip_ok { |
| 5255 | // Call hover callbacks |
| 5256 | if has_hover { |
| 5257 | let pointer_data = self.pointer_info; |
| 5258 | if let Some(item) = self.layout_element_map.get_mut(&elem_id) { |
| 5259 | if let Some(ref mut callback) = item.on_hover_fn { |
| 5260 | callback(elem_id_copy.clone(), pointer_data); |
| 5261 | } |
| 5262 | } |
| 5263 | } |