use crate::event::{Event, EventResult, Key, Modifiers};
use crate::geometry::Point;
use crate::widget::tree::{
activate_action_at, active_modal_path, cancel_action_path, default_action_path, dispatch_event,
dispatch_unconsumed_key,
};
use crate::widget::App;
impl App {
pub fn on_key_down(&mut self, key: Key, mods: Modifiers) {
if key == Key::Tab && (mods.ctrl || mods.meta) {
self.advance_focus(!mods.shift);
return;
}
let event = Event::KeyDown {
key: key.clone(),
modifiers: mods,
};
let modal = active_modal_path(self.root.as_ref());
let result = if let Some(path) = modal.clone() {
let target = match self.focus.clone() {
Some(focus) if focus.starts_with(&path) => focus,
_ => path,
};
dispatch_event(&mut self.root, &target, &event, Point::ORIGIN)
} else if let Some(path) = self.focus.clone() {
dispatch_event(&mut self.root, &path, &event, Point::ORIGIN)
} else {
EventResult::Ignored
};
if !result.is_consumed() {
if key == Key::Tab {
self.advance_focus(!mods.shift);
return;
}
let result = dispatch_unconsumed_key(self.root.as_mut(), &key, mods);
if !result.is_consumed() {
let result = match modal {
Some(_) => EventResult::Ignored,
None => self.dispatch_root_action(&key),
};
if !result.is_consumed() {
if let Some(ref mut handler) = self.global_key_handler {
handler(key, mods);
}
}
}
}
}
fn dispatch_root_action(&mut self, key: &Key) -> EventResult {
let path = match key {
Key::Enter => default_action_path(self.root.as_ref(), true),
Key::Escape => cancel_action_path(self.root.as_ref(), true),
_ => None,
};
match path {
Some(path) => activate_action_at(self.root.as_mut(), &path),
None => EventResult::Ignored,
}
}
pub fn on_key_up(&mut self, key: Key, mods: Modifiers) {
let event = Event::KeyUp {
key,
modifiers: mods,
};
if let Some(path) = self.focus.clone() {
dispatch_event(&mut self.root, &path, &event, Point::ORIGIN);
}
}
}