operad 6.1.0

A cross-platform GUI library for Rust.
Documentation
use super::*;

#[derive(Debug, Clone)]
pub struct CanvasOptions {
    pub layout: LayoutStyle,
    pub visual: UiVisual,
    pub input: InputBehavior,
    pub action: Option<WidgetActionBinding>,
    pub action_mode: WidgetActionMode,
    pub accessibility_label: Option<String>,
}

impl Default for CanvasOptions {
    fn default() -> Self {
        Self {
            layout: LayoutStyle::new()
                .with_width_percent(1.0)
                .with_height_percent(1.0)
                .with_flex_grow(1.0),
            visual: UiVisual::TRANSPARENT,
            input: InputBehavior {
                pointer: true,
                focusable: true,
                keyboard: true,
            },
            action: None,
            action_mode: WidgetActionMode::Activate,
            accessibility_label: None,
        }
    }
}

impl CanvasOptions {
    pub fn with_layout(mut self, layout: impl Into<LayoutStyle>) -> Self {
        self.layout = layout.into();
        self
    }

    pub fn with_accessibility_label(mut self, label: impl Into<String>) -> Self {
        self.accessibility_label = Some(label.into());
        self
    }

    pub fn with_action(mut self, action: impl Into<WidgetActionBinding>) -> Self {
        self.action = Some(action.into());
        self
    }
}

pub fn canvas(
    document: &mut UiDocument,
    parent: UiNodeId,
    name: impl Into<String>,
    content: CanvasContent,
    options: CanvasOptions,
) -> UiNodeId {
    let name = name.into();
    let label = options
        .accessibility_label
        .clone()
        .unwrap_or_else(|| name.clone());
    let mut node = UiNode::canvas(name, content.key.clone(), options.layout)
        .with_input(options.input)
        .with_visual(options.visual)
        .with_accessibility(
            AccessibilityMeta::new(AccessibilityRole::Group)
                .label(label)
                .focusable(),
        );
    node.action = options.action;
    node.action_mode = options.action_mode;
    node.content = UiContent::Canvas(content);
    document.add_child(parent, node)
}