public inbox for yew-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic
@ 2025-12-10 10:48 Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 1/3] pwt-macros: update tests to work for newer rustc Dominik Csapak
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Dominik Csapak @ 2025-12-10 10:48 UTC (permalink / raw)
  To: yew-devel

This series changes the RenderFn type to have a generic return type, which can replace our TextRenderFn
and allows us to do more things with it.

I send this as a preparation for some cleanups I want to do, but for those
to work better, we need this way of defining RenderFn.

Sending as RFC, since I'm not fully convinced this is a good idea,
especially extending the builder_cb macro this way, but I could not come
up with something better.

The first patch in pwt is just updating the tests to new rustc output,
can be applied independently, but is necessary to let the tests
run currently.

proxmox-yew-widget-toolkit:

Dominik Csapak (3):
  pwt-macros: update tests to work for newer rustc
  pwt-macros: builder: allow multiple generic types in callback variant
  props: make RenderFn's return type generic

 pwt-macros/src/builder.rs                    | 19 ++++-
 pwt-macros/tests/builder/invalid_type.stderr |  2 +-
 pwt-macros/tests/widget/wrong_crate.stderr   |  6 +-
 src/props/mod.rs                             |  5 +-
 src/props/render_function.rs                 | 81 +++-----------------
 src/touch/material_app.rs                    | 10 +--
 src/widget/catalog_loader.rs                 |  6 +-
 src/widget/desktop_app.rs                    |  6 +-
 src/widget/meter.rs                          |  6 +-
 src/widget/theme_loader.rs                   |  6 +-
 10 files changed, 50 insertions(+), 97 deletions(-)


proxmox-yew-comp:

Dominik Csapak (1):
  rrd: replace TextRenderFn with new generic RenderFn

 src/rrd/graph.rs | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)


Summary over all repositories:
  11 files changed, 54 insertions(+), 101 deletions(-)

-- 
Generated by git-murpp 0.8.1


_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [yew-devel] [PATCH yew-widget-toolkit 1/3] pwt-macros: update tests to work for newer rustc
  2025-12-10 10:48 [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dominik Csapak
@ 2025-12-10 10:48 ` Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 2/3] pwt-macros: builder: allow multiple generic types in callback variant Dominik Csapak
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Dominik Csapak @ 2025-12-10 10:48 UTC (permalink / raw)
  To: yew-devel

we now use rustc 1.90, the error messages and file/lines changed a bit

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 pwt-macros/tests/builder/invalid_type.stderr | 2 +-
 pwt-macros/tests/widget/wrong_crate.stderr   | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/pwt-macros/tests/builder/invalid_type.stderr b/pwt-macros/tests/builder/invalid_type.stderr
index d1f86fe..665f828 100644
--- a/pwt-macros/tests/builder/invalid_type.stderr
+++ b/pwt-macros/tests/builder/invalid_type.stderr
@@ -16,4 +16,4 @@ help: the return type of this call is `{float}` due to the type of the argument
 6 | |     wrong_type: i32,
   | |______________^
 note: method defined here
- --> /usr/src/rustc-1.85.0/library/core/src/option.rs:998:12
+ --> /usr/src/rustc-1.90.0/library/core/src/option.rs:1031:18
diff --git a/pwt-macros/tests/widget/wrong_crate.stderr b/pwt-macros/tests/widget/wrong_crate.stderr
index 115e038..8a9682f 100644
--- a/pwt-macros/tests/widget/wrong_crate.stderr
+++ b/pwt-macros/tests/widget/wrong_crate.stderr
@@ -1,5 +1,7 @@
-error[E0433]: failed to resolve: use of undeclared crate or module `wrong`
+error[E0433]: failed to resolve: use of unresolved module or unlinked crate `wrong`
   --> tests/widget/wrong_crate.rs:34:14
    |
 34 | #[widget(pwt=wrong, comp=Foo, @input, @element)]
-   |              ^^^^^ use of undeclared crate or module `wrong`
+   |              ^^^^^ use of unresolved module or unlinked crate `wrong`
+   |
+   = help: if you wanted to use a crate named `wrong`, use `cargo add wrong` to add it to your `Cargo.toml`
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [yew-devel] [PATCH yew-widget-toolkit 2/3] pwt-macros: builder: allow multiple generic types in callback variant
  2025-12-10 10:48 [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 1/3] pwt-macros: update tests to work for newer rustc Dominik Csapak
@ 2025-12-10 10:48 ` Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 3/3] props: make RenderFn's return type generic Dominik Csapak
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Dominik Csapak @ 2025-12-10 10:48 UTC (permalink / raw)
  To: yew-devel

if there is a callback type with multiple generic variants, e.g.
Foo<A,B> we currently can't use it since we only expect one type
in the macro.

Extend the parser to add multiple types for the generic part.

So we can now write for example:

 #[builder_cb(IntoEventCallback, into_event_callback, A, B)]
 foo: Callback<A, B>,

This way it's compatible with the current way we write it.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 pwt-macros/src/builder.rs | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/pwt-macros/src/builder.rs b/pwt-macros/src/builder.rs
index 89f791e..ee28bbf 100644
--- a/pwt-macros/src/builder.rs
+++ b/pwt-macros/src/builder.rs
@@ -85,7 +85,7 @@ impl Parse for FieldOptions {
 struct CallbackOptions {
     into_trait: syn::Type,
     into_fn: syn::Ident,
-    inner_type: syn::Type,
+    inner_types: Vec<syn::Type>,
 }
 
 impl Parse for CallbackOptions {
@@ -105,16 +105,27 @@ impl Parse for CallbackOptions {
             .parse()
             .map_err(|err| Error::new(err.span(), format!("expected into function: {err}")))?;
 
+        let mut inner_types = Vec::new();
+
         parse_comma(&content).map_err(|err| Error::new(err.span(), "missing inner type"))?;
 
         let inner_type: syn::Type = content.parse().map_err(|err| {
             Error::new(err.span(), format!("expected inner callback type: {err}"))
         })?;
 
+        inner_types.push(inner_type);
+
+        while parse_comma(&content).is_ok() {
+            let inner_type: syn::Type = content.parse().map_err(|err| {
+                Error::new(err.span(), format!("expected inner callback type: {err}"))
+            })?;
+            inner_types.push(inner_type);
+        }
+
         Ok(Self {
             into_trait,
             into_fn,
-            inner_type,
+            inner_types,
         })
     }
 }
@@ -229,9 +240,9 @@ fn derive_builder(builder: DeriveInput) -> Result<proc_macro2::TokenStream> {
                     let options = syn::parse2::<CallbackOptions>(tokens)?;
                     let into_fn = options.into_fn;
                     let into_trait = options.into_trait;
-                    let inner_type = options.inner_type;
+                    let inner_types = options.inner_types;
                     (
-                        quote_spanned! { attr_span => impl #into_trait<#inner_type>},
+                        quote_spanned! { attr_span => impl #into_trait<#(#inner_types),*>},
                         quote_spanned! { attr_span => #field_ident.#into_fn()},
                     )
                 }
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [yew-devel] [PATCH yew-widget-toolkit 3/3] props: make RenderFn's return type generic
  2025-12-10 10:48 [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 1/3] pwt-macros: update tests to work for newer rustc Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 2/3] pwt-macros: builder: allow multiple generic types in callback variant Dominik Csapak
@ 2025-12-10 10:48 ` Dominik Csapak
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-comp 1/1] rrd: replace TextRenderFn with new generic RenderFn Dominik Csapak
  2025-12-11  9:35 ` [yew-devel] applied: [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dietmar Maurer
  4 siblings, 0 replies; 6+ messages in thread
From: Dominik Csapak @ 2025-12-10 10:48 UTC (permalink / raw)
  To: yew-devel

and use that with the type `String` instead of our TextRenderFn, that is
now obsolete.

This not only gets rid of a trait, but also allows us to have more
generic render functions in use, e.g. if some component needs a
render function that returns e.g. a `Dialog` to do something with it,
which would now be possible.

By defining the generic type `OUT` as `Html` by default, we don't break
compatibility with existing users.

This is now very similar to yew's `Callback` type, but it just gives a
reference to the function instead of an owned type.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/props/mod.rs             |  5 +--
 src/props/render_function.rs | 81 ++++++------------------------------
 src/touch/material_app.rs    | 10 ++---
 src/widget/catalog_loader.rs |  6 +--
 src/widget/desktop_app.rs    |  6 +--
 src/widget/meter.rs          |  6 +--
 src/widget/theme_loader.rs   |  6 +--
 7 files changed, 30 insertions(+), 90 deletions(-)

diff --git a/src/props/mod.rs b/src/props/mod.rs
index db5cc52..254cb4e 100644
--- a/src/props/mod.rs
+++ b/src/props/mod.rs
@@ -200,10 +200,7 @@ mod padding;
 pub use padding::CssPaddingBuilder;
 
 mod render_function;
-pub use render_function::{
-    BuilderFn, IntoOptionalBuilderFn, IntoOptionalRenderFn, IntoOptionalTextRenderFn, RenderFn,
-    TextRenderFn,
-};
+pub use render_function::{BuilderFn, IntoOptionalBuilderFn, IntoOptionalRenderFn, RenderFn};
 
 mod sorter_function;
 pub use sorter_function::{IntoSorterFn, SorterFn};
diff --git a/src/props/render_function.rs b/src/props/render_function.rs
index 8773c8b..dd5632d 100644
--- a/src/props/render_function.rs
+++ b/src/props/render_function.rs
@@ -1,4 +1,3 @@
-use std::fmt::Display;
 use std::rc::Rc;
 
 use derivative::Derivative;
@@ -10,100 +9,44 @@ use yew::Html;
 /// Wraps `Rc` around `Fn` so it can be passed as a prop.
 #[derive(Derivative)]
 #[derivative(Clone(bound = ""), PartialEq(bound = ""))]
-pub struct RenderFn<T>(
-    #[derivative(PartialEq(compare_with = "Rc::ptr_eq"))] Rc<dyn Fn(&T) -> Html>,
+pub struct RenderFn<IN, OUT = Html>(
+    #[derivative(PartialEq(compare_with = "Rc::ptr_eq"))] Rc<dyn Fn(&IN) -> OUT>,
 );
 
-impl<T> RenderFn<T> {
+impl<IN, OUT> RenderFn<IN, OUT> {
     /// Creates a new [`RenderFn`]
-    pub fn new(renderer: impl 'static + Fn(&T) -> Html) -> Self {
+    pub fn new(renderer: impl 'static + Fn(&IN) -> OUT) -> Self {
         Self(Rc::new(renderer))
     }
     /// Apply the render function
-    pub fn apply(&self, data: &T) -> Html {
+    pub fn apply(&self, data: &IN) -> OUT {
         (self.0)(data)
     }
 }
 
-impl<T, F: 'static + Fn(&T) -> Html> From<F> for RenderFn<T> {
+impl<IN, OUT, F: 'static + Fn(&IN) -> OUT> From<F> for RenderFn<IN, OUT> {
     fn from(f: F) -> Self {
         RenderFn::new(f)
     }
 }
 
 /// Helper trait to create an optional [RenderFn] property.
-pub trait IntoOptionalRenderFn<T> {
-    fn into_optional_render_fn(self) -> Option<RenderFn<T>>;
+pub trait IntoOptionalRenderFn<IN, OUT = Html> {
+    fn into_optional_render_fn(self) -> Option<RenderFn<IN, OUT>>;
 }
 
-impl<T, R: Into<RenderFn<T>>> IntoOptionalRenderFn<T> for R {
-    fn into_optional_render_fn(self) -> Option<RenderFn<T>> {
+impl<IN, OUT, R: Into<RenderFn<IN, OUT>>> IntoOptionalRenderFn<IN, OUT> for R {
+    fn into_optional_render_fn(self) -> Option<RenderFn<IN, OUT>> {
         Some(self.into())
     }
 }
 
-impl<T, R: Into<RenderFn<T>>> IntoOptionalRenderFn<T> for Option<R> {
-    fn into_optional_render_fn(self) -> Option<RenderFn<T>> {
+impl<IN, OUT, R: Into<RenderFn<IN, OUT>>> IntoOptionalRenderFn<IN, OUT> for Option<R> {
+    fn into_optional_render_fn(self) -> Option<RenderFn<IN, OUT>> {
         self.map(|me| me.into())
     }
 }
 
-/// A [TextRenderFn] function is a callback that transforms data into [String].
-///
-/// Wraps `Rc` around `Fn` so it can be passed as a prop.
-#[derive(Derivative)]
-#[derivative(Clone(bound = ""), PartialEq(bound = ""))]
-pub struct TextRenderFn<T>(
-    #[derivative(PartialEq(compare_with = "Rc::ptr_eq"))] Rc<dyn Fn(&T) -> String>,
-);
-
-impl<T> TextRenderFn<T> {
-    /// Creates a new [TextRenderFn]
-    pub fn new(renderer: impl 'static + Fn(&T) -> String) -> Self {
-        Self(Rc::new(renderer))
-    }
-    /// Apply the render function
-    pub fn apply(&self, data: &T) -> String {
-        (self.0)(data)
-    }
-}
-
-impl<T, F: 'static + Fn(&T) -> String> From<F> for TextRenderFn<T> {
-    fn from(f: F) -> Self {
-        TextRenderFn::new(f)
-    }
-}
-
-/// Helper trait to create an optional [TextRenderFn] property.
-///
-/// For types implementing [Display], you can pass 'true' to create
-/// a render function whichs uses `to_string()`.
-pub trait IntoOptionalTextRenderFn<T> {
-    fn into_optional_text_render_fn(self) -> Option<TextRenderFn<T>>;
-}
-
-impl<T, R: Into<TextRenderFn<T>>> IntoOptionalTextRenderFn<T> for R {
-    fn into_optional_text_render_fn(self) -> Option<TextRenderFn<T>> {
-        Some(self.into())
-    }
-}
-
-impl<T, R: Into<TextRenderFn<T>>> IntoOptionalTextRenderFn<T> for Option<R> {
-    fn into_optional_text_render_fn(self) -> Option<TextRenderFn<T>> {
-        self.map(|me| me.into())
-    }
-}
-
-impl<T: Display> IntoOptionalTextRenderFn<T> for bool {
-    fn into_optional_text_render_fn(self) -> Option<TextRenderFn<T>> {
-        if self {
-            Some(TextRenderFn::new(|t: &T| t.to_string()))
-        } else {
-            None
-        }
-    }
-}
-
 /// A [BuilderFn] function is a callback that returns a generic type.
 ///
 /// Wraps `Rc` around `Fn` so it can be passed as a prop.
diff --git a/src/touch/material_app.rs b/src/touch/material_app.rs
index 52e7042..26de2b3 100644
--- a/src/touch/material_app.rs
+++ b/src/touch/material_app.rs
@@ -12,7 +12,7 @@ use yew_router::{history::History, Router};
 use pwt_macros::builder;
 
 use crate::prelude::*;
-use crate::props::{IntoOptionalTextRenderFn, TextRenderFn};
+use crate::props::{IntoOptionalRenderFn, RenderFn};
 use crate::state::{NavigationContainer, SharedState, SharedStateObserver};
 use crate::touch::{PageAnimationStyle, SnackBarController, SnackBarManager};
 use crate::widget::{CatalogLoader, Container, ThemeLoader};
@@ -216,14 +216,14 @@ pub struct MaterialApp {
     pub page_animation: Option<PageAnimationStyle>,
 
     /// Returns the server side CSS URLs (see [ThemeLoader]).
-    #[builder_cb(IntoOptionalTextRenderFn, into_optional_text_render_fn, String)]
+    #[builder_cb(IntoOptionalRenderFn, into_optional_render_fn, String, String)]
     #[prop_or_default]
-    pub theme_url_builder: Option<TextRenderFn<String>>,
+    pub theme_url_builder: Option<RenderFn<String, String>>,
 
     /// Convert ISO 639-1 language code to server side catalog URLs (see [CatalogLoader]).
-    #[builder_cb(IntoOptionalTextRenderFn, into_optional_text_render_fn, String)]
+    #[builder_cb(IntoOptionalRenderFn, into_optional_render_fn, String, String)]
     #[prop_or_default]
-    pub catalog_url_builder: Option<TextRenderFn<String>>,
+    pub catalog_url_builder: Option<RenderFn<String, String>>,
 
     /// Default language (skip catalog loading for this language)
     #[builder(IntoPropValue, into_prop_value)]
diff --git a/src/widget/catalog_loader.rs b/src/widget/catalog_loader.rs
index ef53a05..e8afe90 100644
--- a/src/widget/catalog_loader.rs
+++ b/src/widget/catalog_loader.rs
@@ -4,7 +4,7 @@ use gettext::Catalog;
 use yew::html::IntoPropValue;
 use yew::virtual_dom::{VComp, VNode};
 
-use crate::props::{IntoOptionalTextRenderFn, TextRenderFn};
+use crate::props::{IntoOptionalRenderFn, RenderFn};
 use crate::state::{get_language_info, Language, LanguageObserver};
 use crate::widget::rtl_switcher::set_text_direction;
 use crate::{impl_to_html, prelude::*};
@@ -35,9 +35,9 @@ pub struct CatalogLoader {
     /// # fn test () -> Callback<String, String> {
     ///  Callback::from(|lang: String| format!("catalog-{}.mo", lang))
     /// # }
-    #[builder_cb(IntoOptionalTextRenderFn, into_optional_text_render_fn, String)]
+    #[builder_cb(IntoOptionalRenderFn, into_optional_render_fn, String, String)]
     #[prop_or_default]
-    pub url_builder: Option<TextRenderFn<String>>,
+    pub url_builder: Option<RenderFn<String, String>>,
 
     /// Default language (skip catalog loading for this language)
     #[builder(IntoPropValue, into_prop_value)]
diff --git a/src/widget/desktop_app.rs b/src/widget/desktop_app.rs
index 622b2ed..a7fe20c 100644
--- a/src/widget/desktop_app.rs
+++ b/src/widget/desktop_app.rs
@@ -7,7 +7,7 @@ use yew_router::Router;
 use gloo_history::{AnyHistory, HashHistory};
 
 use crate::prelude::*;
-use crate::props::{IntoOptionalTextRenderFn, TextRenderFn};
+use crate::props::{IntoOptionalRenderFn, RenderFn};
 use crate::state::NavigationContainer;
 use crate::widget::{CatalogLoader, ThemeLoader};
 
@@ -41,9 +41,9 @@ pub struct DesktopApp {
     pub history: Option<AnyHistory>,
 
     /// Convert ISO 639-1 language code to server side catalog URLs (see [CatalogLoader]).
-    #[builder_cb(IntoOptionalTextRenderFn, into_optional_text_render_fn, String)]
+    #[builder_cb(IntoOptionalRenderFn, into_optional_render_fn, String, String)]
     #[prop_or_default]
-    pub catalog_url_builder: Option<TextRenderFn<String>>,
+    pub catalog_url_builder: Option<RenderFn<String, String>>,
 
     /// Default language (skip catalog loading for this language)
     #[builder(IntoPropValue, into_prop_value)]
diff --git a/src/widget/meter.rs b/src/widget/meter.rs
index c547a87..cf552cb 100644
--- a/src/widget/meter.rs
+++ b/src/widget/meter.rs
@@ -7,7 +7,7 @@ use yew::virtual_dom::VTag;
 use pwt_macros::{builder, widget};
 
 use crate::props::{
-    ContainerBuilder, CssLength, IntoOptionalTextRenderFn, IntoVTag, TextRenderFn, WidgetBuilder,
+    ContainerBuilder, CssLength, IntoOptionalRenderFn, IntoVTag, RenderFn, WidgetBuilder,
     WidgetStyleBuilder,
 };
 use crate::widget::Container;
@@ -64,9 +64,9 @@ pub struct Meter {
     pub value: f32,
 
     /// Show value as text.
-    #[builder_cb(IntoOptionalTextRenderFn, into_optional_text_render_fn, f32)]
+    #[builder_cb(IntoOptionalRenderFn, into_optional_render_fn, f32, String)]
     #[prop_or_default]
-    pub render_text: Option<TextRenderFn<f32>>,
+    pub render_text: Option<RenderFn<f32, String>>,
 
     /// Determines if the meter value transitions are animated (via CSS) or not.
     /// It is equivalent to setting the class `pwt-animated`.
diff --git a/src/widget/theme_loader.rs b/src/widget/theme_loader.rs
index f7baa46..cb4831d 100644
--- a/src/widget/theme_loader.rs
+++ b/src/widget/theme_loader.rs
@@ -5,7 +5,7 @@ use yew::prelude::*;
 use yew::virtual_dom::{Key, VComp, VNode};
 
 use crate::impl_to_html;
-use crate::props::{IntoOptionalTextRenderFn, TextRenderFn};
+use crate::props::{IntoOptionalRenderFn, RenderFn};
 use crate::state::{Theme, ThemeDensity, ThemeObserver};
 
 /// Dynamically load selected theme
@@ -23,9 +23,9 @@ pub struct ThemeLoader {
     /// Returns the server side CSS URL (full path)
     ///
     /// Default is "{lc(theme_name)}-yew-style.css".
-    #[builder_cb(IntoOptionalTextRenderFn, into_optional_text_render_fn, String)]
+    #[builder_cb(IntoOptionalRenderFn, into_optional_render_fn, String, String)]
     #[prop_or_default]
-    pub theme_url_builder: Option<TextRenderFn<String>>,
+    pub theme_url_builder: Option<RenderFn<String, String>>,
 }
 
 impl ThemeLoader {
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [yew-devel] [PATCH yew-comp 1/1] rrd: replace TextRenderFn with new generic RenderFn
  2025-12-10 10:48 [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dominik Csapak
                   ` (2 preceding siblings ...)
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 3/3] props: make RenderFn's return type generic Dominik Csapak
@ 2025-12-10 10:48 ` Dominik Csapak
  2025-12-11  9:35 ` [yew-devel] applied: [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dietmar Maurer
  4 siblings, 0 replies; 6+ messages in thread
From: Dominik Csapak @ 2025-12-10 10:48 UTC (permalink / raw)
  To: yew-devel

since RenderFn now has a generic return type, we can use that instead of
TextRenderFn.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/rrd/graph.rs | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/rrd/graph.rs b/src/rrd/graph.rs
index 689164b..66871cb 100644
--- a/src/rrd/graph.rs
+++ b/src/rrd/graph.rs
@@ -9,7 +9,7 @@ use yew::virtual_dom::{VComp, VNode};
 use pwt::dom::align::{align_to, AlignOptions};
 use pwt::dom::DomSizeObserver;
 use pwt::prelude::*;
-use pwt::props::{IntoOptionalTextRenderFn, TextRenderFn};
+use pwt::props::{IntoOptionalRenderFn, RenderFn};
 use pwt::state::optional_rc_ptr_eq;
 use pwt::widget::{Button, Container, Panel};
 
@@ -52,7 +52,7 @@ pub struct RRDGraph {
     pub binary: bool,
 
     #[prop_or_default]
-    pub render_value: Option<TextRenderFn<f64>>,
+    pub render_value: Option<RenderFn<f64, String>>,
 }
 
 impl RRDGraph {
@@ -95,8 +95,8 @@ impl RRDGraph {
         self.class.push(class);
     }
 
-    pub fn render_value(mut self, renderer: impl IntoOptionalTextRenderFn<f64>) -> Self {
-        self.render_value = renderer.into_optional_text_render_fn();
+    pub fn render_value(mut self, renderer: impl IntoOptionalRenderFn<f64, String>) -> Self {
+        self.render_value = renderer.into_optional_render_fn();
         self
     }
 }
-- 
2.47.3



_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [yew-devel] applied: [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic
  2025-12-10 10:48 [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dominik Csapak
                   ` (3 preceding siblings ...)
  2025-12-10 10:48 ` [yew-devel] [PATCH yew-comp 1/1] rrd: replace TextRenderFn with new generic RenderFn Dominik Csapak
@ 2025-12-11  9:35 ` Dietmar Maurer
  4 siblings, 0 replies; 6+ messages in thread
From: Dietmar Maurer @ 2025-12-11  9:35 UTC (permalink / raw)
  To: yew-devel

applied all 4 patches


_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2025-12-11  9:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-10 10:48 [yew-devel] [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dominik Csapak
2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 1/3] pwt-macros: update tests to work for newer rustc Dominik Csapak
2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 2/3] pwt-macros: builder: allow multiple generic types in callback variant Dominik Csapak
2025-12-10 10:48 ` [yew-devel] [PATCH yew-widget-toolkit 3/3] props: make RenderFn's return type generic Dominik Csapak
2025-12-10 10:48 ` [yew-devel] [PATCH yew-comp 1/1] rrd: replace TextRenderFn with new generic RenderFn Dominik Csapak
2025-12-11  9:35 ` [yew-devel] applied: [RFC yew-comp/yew-widget-toolkit 0/4] make RenderFn's return type generic Dietmar Maurer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal