ori_core/context/
event.rsuse std::ops::{Deref, DerefMut};
use crate::{
layout::{Affine, Point, Rect, Size},
view::{ViewFlags, ViewState},
};
use super::{BaseCx, BuildCx, LayoutCx, RebuildCx};
pub struct EventCx<'a, 'b> {
pub(crate) base: &'a mut BaseCx<'b>,
pub(crate) view_state: &'a mut ViewState,
pub(crate) rebuild: &'a mut bool,
pub(crate) transform: Affine,
}
impl<'b> Deref for EventCx<'_, 'b> {
type Target = BaseCx<'b>;
fn deref(&self) -> &Self::Target {
self.base
}
}
impl DerefMut for EventCx<'_, '_> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.base
}
}
impl<'a, 'b> EventCx<'a, 'b> {
pub fn new(
base: &'a mut BaseCx<'b>,
view_state: &'a mut ViewState,
rebuild: &'a mut bool,
) -> Self {
let transform = view_state.transform;
Self {
base,
view_state,
rebuild,
transform,
}
}
pub fn child(&mut self) -> EventCx<'_, 'b> {
EventCx {
base: self.base,
view_state: self.view_state,
rebuild: self.rebuild,
transform: self.transform,
}
}
pub fn as_build_cx(&mut self) -> BuildCx<'_, 'b> {
BuildCx::new(self.base, self.view_state)
}
pub fn as_rebuild_cx(&mut self) -> RebuildCx<'_, 'b> {
RebuildCx::new(self.base, self.view_state)
}
pub fn as_layout_cx(&mut self) -> LayoutCx<'_, 'b> {
LayoutCx::new(self.base, self.view_state)
}
pub fn size(&self) -> Size {
self.view_state.size
}
pub fn rect(&self) -> Rect {
Rect::min_size(Point::ZERO, self.size())
}
pub fn transform(&self) -> Affine {
self.transform
}
pub fn local(&self, point: Point) -> Point {
self.transform.inverse() * point
}
pub fn rebuild(&mut self) {
*self.rebuild = true;
}
pub fn was_hovered(&self) -> bool {
self.view_state.prev_flags.contains(ViewFlags::HOVERED)
}
pub fn was_focused(&self) -> bool {
self.view_state.prev_flags.contains(ViewFlags::FOCUSED)
}
pub fn was_active(&self) -> bool {
self.view_state.prev_flags.contains(ViewFlags::ACTIVE)
}
pub fn had_hovered(&self) -> bool {
let flags = self.view_state.prev_flags & (ViewFlags::HOVERED | ViewFlags::HAS_HOVERED);
flags != ViewFlags::empty()
}
pub fn had_focused(&self) -> bool {
let flags = self.view_state.prev_flags & (ViewFlags::FOCUSED | ViewFlags::HAS_FOCUSED);
flags != ViewFlags::empty()
}
pub fn had_active(&self) -> bool {
let flags = self.view_state.prev_flags & (ViewFlags::ACTIVE | ViewFlags::HAS_ACTIVE);
flags != ViewFlags::empty()
}
pub fn hovered_changed(&self) -> bool {
self.was_hovered() != self.is_hovered()
}
pub fn focused_changed(&self) -> bool {
self.was_focused() != self.is_focused()
}
pub fn active_changed(&self) -> bool {
self.was_active() != self.is_active()
}
pub fn has_hovered_changed(&self) -> bool {
self.had_hovered() != self.has_hovered()
}
pub fn has_focused_changed(&self) -> bool {
self.had_focused() != self.has_focused()
}
pub fn has_active_changed(&self) -> bool {
self.had_active() != self.has_active()
}
}