From 3d308ab572a39ada2501ddc1b822e50e1f8a8363 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Mon, 10 Apr 2023 20:04:36 +0100 Subject: [PATCH] feat(custom): support dynamic string in image source Resolves #94. --- docs/modules/Custom.md | 8 ++++---- src/modules/custom/image.rs | 31 ++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/docs/modules/Custom.md b/docs/modules/Custom.md index 6596b16..0a8d774 100644 --- a/docs/modules/Custom.md +++ b/docs/modules/Custom.md @@ -61,10 +61,10 @@ An image or icon from disk or http. > Type `image` -| Name | Type | Default | Description | -|--------|-----------|---------|-------------------------------------------------------------| -| `src` | `image` | `null` | Image source. See [here](images) for information on images. | -| `size` | `integer` | `null` | Width/height of the image. Aspect ratio is preserved. | +| Name | Type | Default | Description | +|--------|-----------|---------|---------------------------------------------------------------------------------------------| +| `src` | `image` | `null` | Image source. See [here](images) for information on images. Embedded scripts are supported. | +| `size` | `integer` | `null` | Width/height of the image. Aspect ratio is preserved. | #### Slider diff --git a/src/modules/custom/image.rs b/src/modules/custom/image.rs index 715bad0..6e98d15 100644 --- a/src/modules/custom/image.rs +++ b/src/modules/custom/image.rs @@ -1,5 +1,6 @@ use super::{CustomWidget, CustomWidgetContext}; use crate::build; +use crate::dynamic_string::DynamicString; use crate::image::ImageProvider; use gtk::prelude::*; use gtk::Image; @@ -10,8 +11,13 @@ use tracing::error; pub struct ImageWidget { name: Option, class: Option, - src: Option, - size: Option, + src: String, + #[serde(default = "default_size")] + size: i32, +} + +const fn default_size() -> i32 { + 32 } impl CustomWidget for ImageWidget { @@ -20,13 +26,20 @@ impl CustomWidget for ImageWidget { fn into_widget(self, context: CustomWidgetContext) -> Self::Widget { let gtk_image = build!(self, Self::Widget); - if let Some(src) = self.src { - let size = self.size.unwrap_or(32); - if let Err(err) = ImageProvider::parse(&src, context.icon_theme, size) - .and_then(|image| image.load_into_image(gtk_image.clone())) - { - error!("{err:?}"); - } + { + let gtk_image = gtk_image.clone(); + let icon_theme = context.icon_theme.clone(); + + DynamicString::new(&self.src, move |src| { + let res = ImageProvider::parse(&src, &icon_theme, self.size) + .and_then(|image| image.load_into_image(gtk_image.clone())); + + if let Err(err) = res { + error!("{err:?}"); + } + + Continue(true) + }); } gtk_image