Skip to content
Snippets Groups Projects
Commit f03ab3da authored by MrGVSV's avatar MrGVSV
Browse files

OnEvent now takes KayakContextRef

parent 25dbfc81
No related branches found
No related tags found
No related merge requests found
...@@ -4,10 +4,7 @@ use crate::cursor::CursorEvent; ...@@ -4,10 +4,7 @@ use crate::cursor::CursorEvent;
use crate::layout_cache::Rect; use crate::layout_cache::Rect;
use crate::render_command::RenderCommand; use crate::render_command::RenderCommand;
use crate::widget_manager::WidgetManager; use crate::widget_manager::WidgetManager;
use crate::{ use crate::{BoxedWidget, Event, EventType, Index, InputEvent, InputEventCategory, KayakContext, KeyCode, KeyboardEvent, KeyboardModifiers, PointerEvents, KayakContextRef};
BoxedWidget, Event, EventType, Index, InputEvent, InputEventCategory, KayakContext, KeyCode,
KeyboardEvent, KeyboardModifiers, PointerEvents,
};
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
type EventMap = HashMap<Index, HashSet<EventType>>; type EventMap = HashMap<Index, HashSet<EventType>>;
...@@ -183,7 +180,8 @@ impl EventDispatcher { ...@@ -183,7 +180,8 @@ impl EventDispatcher {
// --- Call Event --- // // --- Call Event --- //
let mut target_widget = context.widget_manager.take(index); let mut target_widget = context.widget_manager.take(index);
target_widget.on_event(context, &mut node_event); let mut ctx = KayakContextRef::new(context, Some(index));
target_widget.on_event(&mut ctx, &mut node_event);
context.widget_manager.repossess(target_widget); context.widget_manager.repossess(target_widget);
event.default_prevented |= node_event.default_prevented; event.default_prevented |= node_event.default_prevented;
......
use crate::{Event, KayakContext}; use crate::{Event, KayakContextRef};
use std::fmt::{Debug, Formatter}; use std::fmt::{Debug, Formatter};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
/// A container for a function that handles events /// A container for a function that handles events
#[derive(Clone)] #[derive(Clone)]
pub struct OnEvent(Arc<RwLock<dyn FnMut(&mut KayakContext, &mut Event) + Send + Sync + 'static>>); pub struct OnEvent(Arc<RwLock<dyn FnMut(&mut KayakContextRef, &mut Event) + Send + Sync + 'static>>);
impl OnEvent { impl OnEvent {
/// Create a new event handler /// Create a new event handler
...@@ -12,14 +12,14 @@ impl OnEvent { ...@@ -12,14 +12,14 @@ impl OnEvent {
/// The handler should be a closure that takes the following arguments: /// The handler should be a closure that takes the following arguments:
/// 1. The current context /// 1. The current context
/// 2. The event /// 2. The event
pub fn new<F: FnMut(&mut KayakContext, &mut Event) + Send + Sync + 'static>(f: F) -> OnEvent { pub fn new<F: FnMut(&mut KayakContextRef, &mut Event) + Send + Sync + 'static>(f: F) -> OnEvent {
OnEvent(Arc::new(RwLock::new(f))) OnEvent(Arc::new(RwLock::new(f)))
} }
/// Call the event handler /// Call the event handler
/// ///
/// Returns true if the handler was successfully invoked. /// Returns true if the handler was successfully invoked.
pub fn try_call(&self, context: &mut KayakContext, event: &mut Event) -> bool { pub fn try_call(&self, context: &mut KayakContextRef, event: &mut Event) -> bool {
if let Ok(mut on_event) = self.0.write() { if let Ok(mut on_event) = self.0.write() {
on_event(context, event); on_event(context, event);
true true
......
...@@ -2,7 +2,7 @@ use as_any::AsAny; ...@@ -2,7 +2,7 @@ use as_any::AsAny;
use std::any::Any; use std::any::Any;
use crate::{ use crate::{
context::KayakContext, context_ref::KayakContextRef, styles::Style, Children, Event, Index, context_ref::KayakContextRef, styles::Style, Children, Event, Index,
OnEvent, OnEvent,
}; };
...@@ -26,7 +26,7 @@ pub trait BaseWidget: SealedWidget + std::fmt::Debug + Send + Sync { ...@@ -26,7 +26,7 @@ pub trait BaseWidget: SealedWidget + std::fmt::Debug + Send + Sync {
fn get_props_mut(&mut self) -> &mut dyn WidgetProps; fn get_props_mut(&mut self) -> &mut dyn WidgetProps;
fn render(&mut self, context: &mut KayakContextRef); fn render(&mut self, context: &mut KayakContextRef);
fn get_name(&self) -> &'static str; fn get_name(&self) -> &'static str;
fn on_event(&mut self, context: &mut KayakContext, event: &mut Event); fn on_event(&mut self, context: &mut KayakContextRef, event: &mut Event);
} }
pub trait Widget: std::fmt::Debug + Clone + Default + PartialEq + AsAny + Send + Sync { pub trait Widget: std::fmt::Debug + Clone + Default + PartialEq + AsAny + Send + Sync {
...@@ -65,7 +65,7 @@ pub trait Widget: std::fmt::Debug + Clone + Default + PartialEq + AsAny + Send + ...@@ -65,7 +65,7 @@ pub trait Widget: std::fmt::Debug + Clone + Default + PartialEq + AsAny + Send +
} }
/// Send an event to this widget /// Send an event to this widget
fn on_event(&mut self, context: &mut KayakContext, event: &mut Event) { fn on_event(&mut self, context: &mut KayakContextRef, event: &mut Event) {
if let Some(on_event) = self.get_props().get_on_event() { if let Some(on_event) = self.get_props().get_on_event() {
on_event.try_call(context, event); on_event.try_call(context, event);
} }
...@@ -117,7 +117,7 @@ where ...@@ -117,7 +117,7 @@ where
Widget::get_name(self) Widget::get_name(self)
} }
fn on_event(&mut self, context: &mut KayakContext, event: &mut Event) { fn on_event(&mut self, context: &mut KayakContextRef, event: &mut Event) {
Widget::on_event(self, context, event); Widget::on_event(self, context, event);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment