mirror of
https://github.com/FliegendeWurst/cursive.git
synced 2024-11-23 17:35:00 +00:00
Add Cursive::on_event
This commit is contained in:
parent
b21224cf1c
commit
be977c705f
@ -633,7 +633,7 @@ impl Cursive {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Handles a key event when it was ignored by the current view
|
// Handles a key event when it was ignored by the current view
|
||||||
fn on_event(&mut self, event: Event) {
|
fn on_ignored_event(&mut self, event: Event) {
|
||||||
let cb_list = match self.global_callbacks.get(&event) {
|
let cb_list = match self.global_callbacks.get(&event) {
|
||||||
None => return,
|
None => return,
|
||||||
Some(cb_list) => cb_list.clone(),
|
Some(cb_list) => cb_list.clone(),
|
||||||
@ -644,6 +644,52 @@ impl Cursive {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Processes an event.
|
||||||
|
///
|
||||||
|
/// * If the menubar is active, it will be handled the event.
|
||||||
|
/// * The view tree will be handled the event.
|
||||||
|
/// * If ignored, global_callbacks will be checked for this event.
|
||||||
|
pub fn on_event(&mut self, event: Event) {
|
||||||
|
if event == Event::Exit {
|
||||||
|
self.quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if event == Event::WindowResize {
|
||||||
|
self.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Event::Mouse {
|
||||||
|
event, position, ..
|
||||||
|
} = event
|
||||||
|
{
|
||||||
|
if event.grabs_focus()
|
||||||
|
&& !self.menubar.autohide
|
||||||
|
&& !self.menubar.has_submenu()
|
||||||
|
&& position.y == 0
|
||||||
|
{
|
||||||
|
self.select_menubar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Event dispatch order:
|
||||||
|
// * Focused element:
|
||||||
|
// * Menubar (if active)
|
||||||
|
// * Current screen (top layer)
|
||||||
|
// * Global callbacks
|
||||||
|
if self.menubar.receive_events() {
|
||||||
|
self.menubar.on_event(event).process(self);
|
||||||
|
} else {
|
||||||
|
let offset = if self.menubar.autohide { 0 } else { 1 };
|
||||||
|
match self.screen_mut().on_event(event.relativized((0, offset))) {
|
||||||
|
// If the event was ignored,
|
||||||
|
// it is our turn to play with it.
|
||||||
|
EventResult::Ignored => self.on_ignored_event(event),
|
||||||
|
EventResult::Consumed(None) => (),
|
||||||
|
EventResult::Consumed(Some(cb)) => cb(self),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the size of the screen, in characters.
|
/// Returns the size of the screen, in characters.
|
||||||
pub fn screen_size(&self) -> Vec2 {
|
pub fn screen_size(&self) -> Vec2 {
|
||||||
self.backend.screen_size()
|
self.backend.screen_size()
|
||||||
@ -753,47 +799,7 @@ impl Cursive {
|
|||||||
fn handle_interruption(&mut self, interruption: Interruption) {
|
fn handle_interruption(&mut self, interruption: Interruption) {
|
||||||
match interruption {
|
match interruption {
|
||||||
Interruption::Event(event) => {
|
Interruption::Event(event) => {
|
||||||
if event == Event::Exit {
|
self.on_event(event);
|
||||||
self.quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
if event == Event::WindowResize {
|
|
||||||
self.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Event::Mouse {
|
|
||||||
event, position, ..
|
|
||||||
} = event
|
|
||||||
{
|
|
||||||
if event.grabs_focus()
|
|
||||||
&& !self.menubar.autohide
|
|
||||||
&& !self.menubar.has_submenu()
|
|
||||||
&& position.y == 0
|
|
||||||
{
|
|
||||||
self.select_menubar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Event dispatch order:
|
|
||||||
// * Focused element:
|
|
||||||
// * Menubar (if active)
|
|
||||||
// * Current screen (top layer)
|
|
||||||
// * Global callbacks
|
|
||||||
if self.menubar.receive_events() {
|
|
||||||
self.menubar.on_event(event).process(self);
|
|
||||||
} else {
|
|
||||||
let offset = if self.menubar.autohide { 0 } else { 1 };
|
|
||||||
match self
|
|
||||||
.screen_mut()
|
|
||||||
.on_event(event.relativized((0, offset)))
|
|
||||||
{
|
|
||||||
// If the event was ignored,
|
|
||||||
// it is our turn to play with it.
|
|
||||||
EventResult::Ignored => self.on_event(event),
|
|
||||||
EventResult::Consumed(None) => (),
|
|
||||||
EventResult::Consumed(Some(cb)) => cb(self),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Interruption::Callback(cb) => {
|
Interruption::Callback(cb) => {
|
||||||
cb.call_box(self);
|
cb.call_box(self);
|
||||||
|
Loading…
Reference in New Issue
Block a user