use std::sync::Arc;
use atomic::Atomic;
use zng_app::{
event::{event, event_args},
widget::info::{WidgetInfo, WidgetInfoBuilder, WidgetPath},
};
use zng_layout::unit::PxRect;
use zng_state_map::{StateId, static_id};
use zng_txt::Txt;
event_args! {
pub struct ImeArgs {
pub target: WidgetPath,
pub txt: Txt,
pub preview_caret: Option<(usize, usize)>,
..
fn is_in_target(&self, id: WidgetId) -> bool {
self.target.contains(id)
}
}
}
impl ImeArgs {
pub fn commit(&self) -> bool {
self.preview_caret.is_none()
}
}
event! {
pub static IME_EVENT: ImeArgs;
}
pub trait WidgetInfoImeArea {
fn ime_area(&self) -> Option<PxRect>;
}
pub trait WidgetInfoBuilderImeArea {
fn set_ime_area(&mut self, area: Arc<Atomic<PxRect>>);
}
static_id! {
static ref IME_AREA_ID: StateId<Arc<Atomic<PxRect>>>;
}
impl WidgetInfoImeArea for WidgetInfo {
fn ime_area(&self) -> Option<PxRect> {
Some(self.meta().get(*IME_AREA_ID)?.load(std::sync::atomic::Ordering::Relaxed))
}
}
impl WidgetInfoBuilderImeArea for WidgetInfoBuilder {
fn set_ime_area(&mut self, area: Arc<Atomic<PxRect>>) {
self.set_meta(*IME_AREA_ID, area);
}
}