lgui 0.2.0

A reactive Rust GUI library with native and portable rendering backends
Documentation
#[cfg(feature = "renderer-skia")]
use lgui_render_api::GraphicsPreference;

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RendererKind {
    #[cfg(all(feature = "renderer-gdi", target_os = "windows"))]
    Gdi,
    #[cfg(all(feature = "renderer-d2d", target_os = "windows"))]
    D2d,
    #[cfg(feature = "renderer-skia")]
    Skia(GraphicsPreference),
}

impl Default for RendererKind {
    fn default() -> Self {
        #[cfg(all(feature = "renderer-gdi", target_os = "windows"))]
        {
            return Self::Gdi;
        }
        #[cfg(all(
            not(all(feature = "renderer-gdi", target_os = "windows")),
            feature = "renderer-d2d",
            target_os = "windows"
        ))]
        {
            return Self::D2d;
        }
        #[cfg(all(
            not(all(feature = "renderer-gdi", target_os = "windows")),
            not(all(feature = "renderer-d2d", target_os = "windows")),
            feature = "renderer-skia"
        ))]
        {
            Self::Skia(GraphicsPreference::Auto)
        }
    }
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RendererProbeError(String);

impl std::fmt::Display for RendererProbeError {
    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        formatter.write_str(&self.0)
    }
}

impl std::error::Error for RendererProbeError {}

impl RendererKind {
    pub const fn as_str(self) -> &'static str {
        match self {
            #[cfg(all(feature = "renderer-gdi", target_os = "windows"))]
            Self::Gdi => "gdi",
            #[cfg(all(feature = "renderer-d2d", target_os = "windows"))]
            Self::D2d => "d2d",
            #[cfg(feature = "renderer-skia")]
            Self::Skia(_) => "skia",
        }
    }

    pub fn probe(self) -> Result<(), RendererProbeError> {
        match self {
            #[cfg(all(feature = "renderer-gdi", target_os = "windows"))]
            Self::Gdi => Ok(()),
            #[cfg(all(feature = "renderer-d2d", target_os = "windows"))]
            Self::D2d => lgui_render_d2d::probe_d2d_support()
                .map_err(|error| RendererProbeError(error.to_string())),
            #[cfg(feature = "renderer-skia")]
            Self::Skia(preference) => {
                lgui_render_skia::probe_skia_support(preference).map_err(RendererProbeError)
            }
        }
    }
}