clean up and document focus system

This commit is contained in:
Evan Almloff committed 2022-05-04 14:28:02 -05:00
1 parent 749150e22d
commit dd7784d205
2 files changed
+12 -26

No files matched your search

+2
View File
@@ -78,6 +78,7 @@ impl PersistantElementIter {
} }
}) })
.collect(); .collect();
// if any element is removed in the chain, remove it and its children from the stack
if let Some(r) = self if let Some(r) = self
.stack .stack
.iter() .iter()
@@ -165,6 +166,7 @@ impl PersistantElementIter {
/// get the previous element /// get the previous element
pub fn prev<S: State>(&mut self, rdom: &RealDom<S>) -> ElementProduced { pub fn prev<S: State>(&mut self, rdom: &RealDom<S>) -> ElementProduced {
// recursively add the last child element to the stack
fn push_back<S: State>( fn push_back<S: State>(
stack: &mut smallvec::SmallVec<[(ElementId, NodePosition); 5]>, stack: &mut smallvec::SmallVec<[(ElementId, NodePosition); 5]>,
new_node: ElementId, new_node: ElementId,
+10 -26
View File
@@ -120,11 +120,10 @@ impl FocusState {
return false; return false;
} }
} }
// the id that started focused to track when a loop has happened
let mut loop_marker_id = self.last_focused_id; let mut loop_marker_id = self.last_focused_id;
let focus_level = &mut self.focus_level; let focus_level = &mut self.focus_level;
let mut next_focus = None; let mut next_focus = None;
let starting_focus_level = *focus_level;
let mut focus_level_changed = false;
loop { loop {
let new = if forward { let new = if forward {
@@ -175,9 +174,6 @@ impl FocusState {
if let Some(level) = closest_level { if let Some(level) = closest_level {
*focus_level = level; *focus_level = level;
if *focus_level != starting_focus_level {
focus_level_changed = true;
}
} else { } else {
if forward { if forward {
*focus_level = FocusLevel::Unfocusable; *focus_level = FocusLevel::Unfocusable;
@@ -185,11 +181,6 @@ impl FocusState {
*focus_level = FocusLevel::Focusable; *focus_level = FocusLevel::Focusable;
} }
} }
// if the focus level looped, we are done
if *focus_level == starting_focus_level && focus_level_changed {
break;
}
} }
// once we have looked at all the elements exit the loop // once we have looked at all the elements exit the loop
@@ -209,28 +200,21 @@ impl FocusState {
}; };
if after_previous_focused && current_level.focusable() { if after_previous_focused && current_level.focusable() {
if current_level == *focus_level { if current_level == *focus_level {
next_focus = Some((new_id, current_level)); next_focus = Some(new_id);
break; break;
} }
} }
} }
if let Some((id, order)) = next_focus { if let Some(id) = next_focus {
if order.focusable() { rdom[id].state.focused = true;
rdom[id].state.focused = true; if let Some(old) = self.last_focused_id.replace(id) {
if let Some(old) = self.last_focused_id.replace(id) { rdom[old].state.focused = false;
rdom[old].state.focused = false;
}
// reset the position to the currently focused element
while if forward {
self.focus_iter.next(&rdom).id()
} else {
self.focus_iter.prev(&rdom).id()
} != id
{}
self.dirty = true;
return true;
} }
// reset the position to the currently focused element
while self.focus_iter.next(&rdom).id() != id {}
self.dirty = true;
return true;
} }
false false