argui-platform 0.2.0

Native platform integrations for Argui applications
Documentation
use argui_platform::{
    AppIcon, ApplicationId, ApplicationIdentity, IconSet, WindowBackend, WindowConfig, WindowKey,
    WindowLevel, WindowSpec,
};

#[test]
fn default_window_is_a_decorated_resizable_surface() {
    let config = WindowConfig::default();

    assert_eq!(config.title, "Argui");
    assert!(config.decorations);
    assert!(config.resizable);
    assert!(!config.transparent);
    assert_eq!(config.desktop_backdrop, None);
    assert!(!config.native_shadow);
    assert_eq!(config.level, WindowLevel::Normal);
    assert!(config.append_to_document);
    assert_eq!(config.safe_area_insets, None);
    let _attributes = config.into_attributes();
}

#[test]
fn window_safe_area_override_uses_logical_insets() {
    let insets = argui_platform::Insets::new(24.0, 0.0, 30.0, 0.0);
    let config = WindowConfig::default().with_safe_area_insets(insets);

    assert_eq!(config.safe_area_insets, Some(insets));
    let _attributes = config.into_attributes();
}

#[test]
fn desktop_materials_opt_into_window_transparency() {
    assert_eq!(
        argui_core::BackdropMaterial::default(),
        argui_core::BackdropMaterial::Glass
    );
    for material in [
        argui_core::BackdropMaterial::Glass,
        argui_core::BackdropMaterial::Sidebar,
        argui_core::BackdropMaterial::Header,
    ] {
        let attributes = WindowConfig {
            desktop_backdrop: Some(material),
            ..WindowConfig::default()
        }
        .into_attributes();
        assert!(attributes.transparent);
    }
}

#[test]
fn capabilities_expose_real_backend_limits() {
    let wayland = WindowBackend::Wayland.capabilities();
    assert!(wayland.native_drag);
    assert!(!wayland.native_shadow);
    assert!(wayland.mouse_passthrough);
    assert!(!wayland.window_level);

    for backend in [
        WindowBackend::Windows,
        WindowBackend::MacOs,
        WindowBackend::X11,
    ] {
        let capabilities = backend.capabilities();
        assert!(capabilities.native_drag);
        assert!(capabilities.minimize);
        assert!(capabilities.maximize);
        assert!(capabilities.window_level);
        assert!(capabilities.mouse_passthrough);
    }
    assert!(WindowBackend::Windows.capabilities().native_shadow);
    assert!(WindowBackend::MacOs.capabilities().native_shadow);

    for backend in [WindowBackend::Android, WindowBackend::Ios] {
        let capabilities = backend.capabilities();
        assert_eq!(capabilities.backend, backend);
        assert!(!capabilities.native_drag);
        assert!(!capabilities.native_shadow);
        assert!(!capabilities.minimize);
        assert!(!capabilities.maximize);
        assert!(!capabilities.window_level);
        assert!(!capabilities.mouse_passthrough);
    }

    assert_eq!(
        WindowBackend::Web.capabilities(),
        argui_platform::WindowCapabilities {
            backend: WindowBackend::Web,
            native_drag: false,
            native_shadow: false,
            minimize: false,
            maximize: false,
            window_level: false,
            mouse_passthrough: false,
        }
    );
}

#[test]
fn window_attributes_inherit_identity_and_accept_native_icons() {
    let identity_without_icon = ApplicationIdentity::new(
        ApplicationId::new("dev.argui.window").unwrap(),
        "Identity title",
        IconSet::new(),
    );
    let _inherited = WindowConfig {
        title: String::new(),
        ..WindowConfig::default()
    }
    .into_attributes_with_identity(&identity_without_icon);

    let icon = AppIcon::from_rgba8(2, 2, vec![255; 2 * 2 * 4]).unwrap();
    let identity_with_icon = ApplicationIdentity::new(
        ApplicationId::new("dev.argui.icon-window").unwrap(),
        "Fallback title",
        IconSet::new().with(icon),
    );
    let _explicit = WindowConfig {
        title: "Explicit title".into(),
        ..WindowConfig::default()
    }
    .into_attributes_with_identity(&identity_with_icon);

    let spec = WindowSpec::new(WindowKey::new("secondary"), WindowConfig::default());
    assert_eq!(spec.key.as_str(), "secondary");
    assert!(spec.visible);
}