use self::dispatcher::DispatchInfo;
use crate::{
context::{define_widget_context, WidgetCtx, WidgetCtxImpl},
prelude::AppCtx,
widget_tree::WidgetId,
window::{Window, WindowId},
};
use std::rc::Rc;
pub(crate) mod dispatcher;
mod pointers;
pub use pointers::*;
use ribir_geom::Point;
mod focus;
pub use focus::*;
mod keyboard;
pub use keyboard::*;
mod character;
pub use character::*;
mod wheel;
pub use wheel::*;
mod ime_pre_edit;
pub use ime_pre_edit::*;
pub(crate) mod focus_mgr;
mod listener_impl_helper;
define_widget_context!(
CommonEvent,
target: WidgetId,
propagation: bool,
prevent_default: bool
);
impl CommonEvent {
#[inline]
pub fn target(&self) -> WidgetId { self.target }
#[inline]
pub fn current_target(&self) -> WidgetId { self.id }
#[inline]
pub fn stop_propagation(&mut self) { self.propagation = false }
#[inline]
pub fn is_propagation(&self) -> bool { self.propagation }
#[inline]
pub fn prevent_default(&mut self) { self.prevent_default = true; }
#[inline]
pub(crate) fn is_prevent_default(&self) -> bool { self.prevent_default }
#[inline]
pub fn modifiers(&self) -> ModifiersState { self.pick_info(DispatchInfo::modifiers) }
pub fn with_shift_key(&self) -> bool { self.modifiers().shift_key() }
pub fn with_alt_key(&self) -> bool { self.modifiers().alt_key() }
pub fn with_ctrl_key(&self) -> bool { self.modifiers().control_key() }
pub fn with_logo_key(&self) -> bool { self.modifiers().super_key() }
pub fn with_command_key(&self) -> bool {
#[cfg(target_os = "macos")]
return self.with_logo_key();
#[cfg(not(target_os = "macos"))]
return self.with_ctrl_key();
}
#[inline]
pub fn global_pos(&self) -> Point { self.pick_info(DispatchInfo::global_pos) }
#[inline]
pub fn position(&self) -> Point { self.map_from_global(self.global_pos()) }
#[inline]
pub fn mouse_buttons(&self) -> MouseButtons { self.pick_info(DispatchInfo::mouse_buttons) }
#[inline]
pub fn button_num(&self) -> u32 { self.mouse_buttons().bits().count_ones() }
}
pub trait EventListener {
type Event;
fn dispatch(&self, event: &mut Self::Event);
}
impl std::fmt::Debug for CommonEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CommonEvent")
.field("target", &self.id)
.field("current_target", &self.id)
.field("is_propagation", &self.propagation)
.finish()
}
}
impl CommonEvent {
pub(crate) fn new(target: WidgetId, wnd_id: WindowId) -> Self {
Self {
target,
wnd_id,
id: target,
propagation: true,
prevent_default: false,
}
}
pub(crate) fn set_current_target(&mut self, id: WidgetId) { self.id = id; }
fn pick_info<R>(&self, f: impl FnOnce(&DispatchInfo) -> R) -> R {
f(&self.current_wnd().dispatcher.borrow().info)
}
}