clean up and document focus system
This commit is contained in:
1 parent
749150e22d
commit
dd7784d205
2 files changed
+12
-26
No files matched your search
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user