use zng_txt::Txt;
use zng_view_api::access::AccessCmd;
pub use zng_view_api::access::ScrollCmd;
use crate::{
event::{event, event_args},
update::EventUpdate,
widget::WidgetId,
window::WindowId,
};
pub(super) fn on_access_init(window_id: WindowId) -> EventUpdate {
let args = AccessInitedArgs::now(window_id);
ACCESS_INITED_EVENT.new_update(args)
}
pub(super) fn on_access_deinit(window_id: WindowId) -> EventUpdate {
let args = AccessDeinitedArgs::now(window_id);
ACCESS_DEINITED_EVENT.new_update(args)
}
pub(super) fn on_access_command(window_id: WindowId, widget_id: WidgetId, command: AccessCmd) -> Option<EventUpdate> {
match command {
AccessCmd::Click(primary) => {
let args = AccessClickArgs::now(window_id, widget_id, primary);
Some(ACCESS_CLICK_EVENT.new_update(args))
}
AccessCmd::Focus(focus) => {
let args = AccessFocusArgs::now(window_id, widget_id, focus);
Some(ACCESS_FOCUS_EVENT.new_update(args))
}
AccessCmd::FocusNavOrigin => {
let args = AccessFocusNavOriginArgs::now(window_id, widget_id);
Some(ACCESS_FOCUS_NAV_ORIGIN_EVENT.new_update(args))
}
AccessCmd::SetExpanded(expanded) => {
let args = AccessExpanderArgs::now(window_id, widget_id, expanded);
Some(ACCESS_EXPANDER_EVENT.new_update(args))
}
AccessCmd::Increment(inc) => {
let args = AccessIncrementArgs::now(window_id, widget_id, inc);
Some(ACCESS_INCREMENT_EVENT.new_update(args))
}
AccessCmd::SetToolTipVis(vis) => {
let args = AccessToolTipArgs::now(window_id, widget_id, vis);
Some(ACCESS_TOOLTIP_EVENT.new_update(args))
}
AccessCmd::ReplaceSelectedText(s) => {
let args = AccessTextArgs::now(window_id, widget_id, s, true);
Some(ACCESS_TEXT_EVENT.new_update(args))
}
AccessCmd::Scroll(s) => {
let args = AccessScrollArgs::now(window_id, widget_id, s);
Some(ACCESS_SCROLL_EVENT.new_update(args))
}
AccessCmd::SelectText {
start: (start_wgt, start_idx),
caret: (caret_wgt, caret_idx),
} => {
let start_wgt = WidgetId::from_raw(start_wgt.0);
let caret_wgt = WidgetId::from_raw(caret_wgt.0);
let args = AccessSelectionArgs::now(window_id, (start_wgt, start_idx), (caret_wgt, caret_idx));
Some(ACCESS_SELECTION_EVENT.new_update(args))
}
AccessCmd::SetString(s) => {
let args = AccessTextArgs::now(window_id, widget_id, s, false);
Some(ACCESS_TEXT_EVENT.new_update(args))
}
AccessCmd::SetNumber(n) => {
let args = AccessNumberArgs::now(window_id, widget_id, n);
Some(ACCESS_NUMBER_EVENT.new_update(args))
}
a => {
tracing::warn!("access command `{a:?}` not implemented");
None
}
}
}
event_args! {
pub struct AccessInitedArgs {
pub window_id: WindowId,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_all()
}
}
pub struct AccessDeinitedArgs {
pub window_id: WindowId,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_all()
}
}
pub struct AccessClickArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub is_primary: bool,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id);
}
}
pub struct AccessFocusArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub focus: bool,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessFocusNavOriginArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessExpanderArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub expanded: bool,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessIncrementArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub delta: i32,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessToolTipArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub visible: bool,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessScrollArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub command: ScrollCmd,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessTextArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub txt: Txt,
pub selection_only: bool,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessNumberArgs {
pub window_id: WindowId,
pub widget_id: WidgetId,
pub num: f64,
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.widget_id)
}
}
pub struct AccessSelectionArgs {
pub window_id: WindowId,
pub start: (WidgetId, usize),
pub caret: (WidgetId, usize),
..
fn delivery_list(&self, list: &mut UpdateDeliveryList) {
list.search_widget(self.start.0);
list.search_widget(self.caret.0);
}
}
}
impl AccessClickArgs {
pub fn is_context(&self) -> bool {
!self.is_primary
}
}
event! {
pub static ACCESS_INITED_EVENT: AccessInitedArgs;
pub static ACCESS_DEINITED_EVENT: AccessDeinitedArgs;
pub static ACCESS_CLICK_EVENT: AccessClickArgs;
pub static ACCESS_FOCUS_EVENT: AccessFocusArgs;
pub static ACCESS_FOCUS_NAV_ORIGIN_EVENT: AccessFocusNavOriginArgs;
pub static ACCESS_EXPANDER_EVENT: AccessExpanderArgs;
pub static ACCESS_INCREMENT_EVENT: AccessIncrementArgs;
pub static ACCESS_TOOLTIP_EVENT: AccessToolTipArgs;
pub static ACCESS_SCROLL_EVENT: AccessScrollArgs;
pub static ACCESS_TEXT_EVENT: AccessTextArgs;
pub static ACCESS_NUMBER_EVENT: AccessNumberArgs;
pub static ACCESS_SELECTION_EVENT: AccessSelectionArgs;
}
pub struct ACCESS;
impl ACCESS {
pub fn click(&self, window_id: impl Into<WindowId>, widget_id: impl Into<WidgetId>, is_primary: bool) {
let win = window_id.into();
let wgt = widget_id.into();
ACCESS_CLICK_EVENT.notify(AccessClickArgs::now(win, wgt, is_primary));
}
pub fn show_tooltip(&self, window_id: impl Into<WindowId>, widget_id: impl Into<WidgetId>) {
let win = window_id.into();
let wgt = widget_id.into();
ACCESS_TOOLTIP_EVENT.notify(AccessToolTipArgs::now(win, wgt, true));
}
pub fn hide_tooltip(&self, window_id: impl Into<WindowId>, widget_id: impl Into<WidgetId>) {
let win = window_id.into();
let wgt = widget_id.into();
ACCESS_TOOLTIP_EVENT.notify(AccessToolTipArgs::now(win, wgt, false));
}
}