From 52ab37c1ebe74a64771a18571ad0c6bcc7e600e5 Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy Date: Mon, 25 Nov 2024 06:50:59 +0100 Subject: [PATCH] feat(icon): add draw method for renderer --- src/widget/icon/mod.rs | 45 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/widget/icon/mod.rs b/src/widget/icon/mod.rs index 5fe630fa..eb91fc00 100644 --- a/src/widget/icon/mod.rs +++ b/src/widget/icon/mod.rs @@ -15,7 +15,7 @@ pub use handle::{from_path, from_raster_bytes, from_raster_pixels, from_svg_byte use crate::Element; use derive_setters::Setters; use iced::widget::{Image, Svg}; -use iced::{ContentFit, Length}; +use iced::{ContentFit, Length, Rectangle}; /// Create an [`Icon`] from a pre-existing [`Handle`] pub fn icon(handle: Handle) -> Icon { @@ -125,3 +125,46 @@ impl<'a, Message: 'a> From for Element<'a, Message> { icon.view::() } } + +/// Draw an icon in the given bounds via the runtime's renderer. +pub fn draw(renderer: &mut crate::Renderer, handle: &Handle, icon_bounds: Rectangle) { + enum IcedHandle { + Svg(iced_core::svg::Handle), + Image(iced_core::image::Handle), + } + + let iced_handle = match handle.clone().data { + Data::Name(named) => named.path().map(|path| { + if path.extension().is_some_and(|ext| ext == OsStr::new("svg")) { + IcedHandle::Svg(iced_core::svg::Handle::from_path(path)) + } else { + IcedHandle::Image(iced_core::image::Handle::from_path(path)) + } + }), + + Data::Image(handle) => Some(IcedHandle::Image(handle)), + Data::Svg(handle) => Some(IcedHandle::Svg(handle)), + }; + + match iced_handle { + Some(IcedHandle::Svg(handle)) => iced_core::svg::Renderer::draw_svg( + renderer, + iced_core::svg::Svg::new(handle), + icon_bounds, + ), + + Some(IcedHandle::Image(handle)) => { + iced_core::image::Renderer::draw_image( + renderer, + handle, + iced_core::image::FilterMethod::Linear, + icon_bounds, + iced_core::Radians::from(0), + 1.0, + [0.0; 4], + ); + } + + None => {} + } +}