ferroui-android 0.3.0

The Android platform of FerroUI: a view in an activity, rendered through EGL or to the native window
Documentation
use super::i_node_info_provider::{INodeInfoProvider, NodeActionArguments, NodeActionError};
use super::node_info::{NodeInfo, ACTION_CLICK, CHECKED_STATE_FALSE, CHECKED_STATE_PARTIAL, CHECKED_STATE_TRUE};
use super::node_info_provider::NodeInfoProvider;
use crate::explore_by_touch_helper::IVirtualViewOwner;
use ferroui_base::Ref;
use ferroui_controls::automation::peers::AutomationPeer;
use ferroui_controls::automation::provider::{IToggleProvider, ToggleState};
use std::rc::Weak;

pub(crate) struct ToggleNodeInfoProvider {
    base: NodeInfoProvider<dyn IToggleProvider>,
}

impl ToggleNodeInfoProvider {
    pub(crate) fn new(owner: Weak<dyn IVirtualViewOwner>, peer: Ref<AutomationPeer>, virtual_view_id: i32) -> Self {
        Self { base: NodeInfoProvider::new(owner, peer, virtual_view_id, None) }
    }
}

impl INodeInfoProvider for ToggleNodeInfoProvider {
    fn virtual_view_id(&self) -> i32 {
        self.base.virtual_view_id()
    }

    fn perform_node_action(&self, action: i32, _arguments: Option<&NodeActionArguments>) -> Result<bool, NodeActionError> {
        let provider = self.base.get_provider()?;
        match action {
            ACTION_CLICK => {
                provider.toggle()?;
                Ok(true)
            }
            _ => Ok(false),
        }
    }

    fn populate_node_info(&self, node_info: &mut NodeInfo) -> Result<(), NodeActionError> {
        node_info.add_action(ACTION_CLICK);
        node_info.clickable = true;

        let provider = self.base.get_provider()?;
        node_info.checked = match provider.toggle_state() {
            ToggleState::On => CHECKED_STATE_TRUE,
            ToggleState::Indeterminate => CHECKED_STATE_PARTIAL,
            ToggleState::Off => CHECKED_STATE_FALSE,
        };
        node_info.checkable = true;
        Ok(())
    }
}