Revert "Use correct context path for focused element in WindowContext::bindings_for_action (#18843)" (#20367)
@JosephTLyons found that this broke display of keybindings in the recent projects modal. Release Notes: - N/A
This commit is contained in:
parent
453c41205b
commit
2c4984091c
3 changed files with 34 additions and 34 deletions
|
@ -3683,11 +3683,22 @@ impl<'a> WindowContext<'a> {
|
|||
|
||||
/// Returns all available actions for the focused element.
|
||||
pub fn available_actions(&self) -> Vec<Box<dyn Action>> {
|
||||
let node_id = self
|
||||
.window
|
||||
.focus
|
||||
.and_then(|focus_id| {
|
||||
self.window
|
||||
.rendered_frame
|
||||
.dispatch_tree
|
||||
.focusable_node_id(focus_id)
|
||||
})
|
||||
.unwrap_or_else(|| self.window.rendered_frame.dispatch_tree.root_node_id());
|
||||
|
||||
let mut actions = self
|
||||
.window
|
||||
.rendered_frame
|
||||
.dispatch_tree
|
||||
.available_actions(self.focused_node_id());
|
||||
.available_actions(node_id);
|
||||
for action_type in self.global_action_listeners.keys() {
|
||||
if let Err(ix) = actions.binary_search_by_key(action_type, |a| a.as_any().type_id()) {
|
||||
let action = self.actions.build_action_type(action_type).ok();
|
||||
|
@ -3701,9 +3712,13 @@ impl<'a> WindowContext<'a> {
|
|||
|
||||
/// Returns key bindings that invoke the given action on the currently focused element.
|
||||
pub fn bindings_for_action(&self, action: &dyn Action) -> Vec<KeyBinding> {
|
||||
let dispatch_tree = &self.window.rendered_frame.dispatch_tree;
|
||||
dispatch_tree
|
||||
.bindings_for_action(action, &dispatch_tree.context_path(self.focused_node_id()))
|
||||
self.window
|
||||
.rendered_frame
|
||||
.dispatch_tree
|
||||
.bindings_for_action(
|
||||
action,
|
||||
&self.window.rendered_frame.dispatch_tree.context_stack,
|
||||
)
|
||||
}
|
||||
|
||||
/// Returns key bindings that invoke the given action on the currently focused element.
|
||||
|
@ -3719,23 +3734,15 @@ impl<'a> WindowContext<'a> {
|
|||
) -> Vec<KeyBinding> {
|
||||
let dispatch_tree = &self.window.rendered_frame.dispatch_tree;
|
||||
|
||||
if let Some(node_id) = dispatch_tree.focusable_node_id(focus_handle.id) {
|
||||
dispatch_tree.bindings_for_action(action, &dispatch_tree.context_path(node_id))
|
||||
} else {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
|
||||
fn focused_node_id(&self) -> DispatchNodeId {
|
||||
self.window
|
||||
.focus
|
||||
.and_then(|focus_id| {
|
||||
self.window
|
||||
.rendered_frame
|
||||
.dispatch_tree
|
||||
.focusable_node_id(focus_id)
|
||||
})
|
||||
.unwrap_or_else(|| self.window.rendered_frame.dispatch_tree.root_node_id())
|
||||
let Some(node_id) = dispatch_tree.focusable_node_id(focus_handle.id) else {
|
||||
return vec![];
|
||||
};
|
||||
let context_stack: Vec<_> = dispatch_tree
|
||||
.dispatch_path(node_id)
|
||||
.into_iter()
|
||||
.filter_map(|node_id| dispatch_tree.node(node_id).context.clone())
|
||||
.collect();
|
||||
dispatch_tree.bindings_for_action(action, &context_stack)
|
||||
}
|
||||
|
||||
/// Returns a generic event listener that invokes the given listener with the view and context associated with the given view handle.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue