use std::marker::PhantomData;
use super::Clipboard;
use crate::render::Position;
pub trait EventContext<Message> {
fn invalidate_render(&mut self);
fn invalidate_layout(&mut self);
fn emit_message(&mut self, message: Message);
fn clipboard(&self) -> &dyn Clipboard;
fn clipboard_mut(&mut self) -> &mut dyn Clipboard;
fn cursor_position(&self) -> Position;
fn set_cursor_position(&mut self, value: Position);
fn keyboard_focus(&self) -> bool;
fn set_keyboard_focus(&mut self, value: bool);
fn mouse_focus(&self) -> bool;
fn set_mouse_focus(&mut self, value: bool);
}
pub struct WrappedEventContext<'a, Message, E>
where
E: EventContext<Message> + ?Sized,
{
context: &'a mut E,
phantom_message: PhantomData<Message>,
mouse_focus: bool,
keyboard_focus: bool,
}
impl<'a, Message, E> WrappedEventContext<'a, Message, E>
where
E: EventContext<Message> + ?Sized,
{
pub fn new(context: &'a mut E, mouse_focus: bool, keyboard_focus: bool) -> Self {
Self {
context,
phantom_message: PhantomData,
mouse_focus,
keyboard_focus,
}
}
}
impl<'a, Message, E> EventContext<Message> for WrappedEventContext<'a, Message, E>
where
E: EventContext<Message> + ?Sized,
{
fn invalidate_render(&mut self) {
self.context.invalidate_render()
}
fn invalidate_layout(&mut self) {
self.context.invalidate_layout()
}
fn emit_message(&mut self, message: Message) {
self.context.emit_message(message)
}
fn cursor_position(&self) -> Position {
self.context.cursor_position()
}
fn set_cursor_position(&mut self, value: Position) {
self.context.set_cursor_position(value)
}
fn keyboard_focus(&self) -> bool {
self.keyboard_focus
}
fn set_keyboard_focus(&mut self, value: bool) {
self.keyboard_focus = value;
}
fn mouse_focus(&self) -> bool {
self.mouse_focus
}
fn set_mouse_focus(&mut self, value: bool) {
self.mouse_focus = value;
}
fn clipboard(&self) -> &dyn Clipboard {
self.context.clipboard()
}
fn clipboard_mut(&mut self) -> &mut dyn Clipboard {
self.context.clipboard_mut()
}
}