From 1f88103dcaa14f81c07976f4d69eaac45a05a617 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Mon, 29 Jan 2024 15:57:23 -0600 Subject: [PATCH] only implement T -> Readonlysignal --- examples/signals.rs | 6 ++---- packages/core-macro/src/props/mod.rs | 10 +++++----- packages/signals/src/props.rs | 12 ++++++------ packages/signals/src/read_only_signal.rs | 13 +++++++++++++ 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/examples/signals.rs b/examples/signals.rs index da7880e20..364d27253 100644 --- a/examples/signals.rs +++ b/examples/signals.rs @@ -59,15 +59,13 @@ fn app() -> Element { } // You can pass a value directly to any prop that accepts a signal - Child { count: 0 } + Child { count: doubled_count() } } } #[component] -fn Child(mut count: Signal) -> Element { +fn Child(mut count: ReadOnlySignal) -> Element { rsx! { h1 { "{count}" } - button { onclick: move |_| count += 1, "Up high!" } - button { onclick: move |_| count -= 1, "Down low!" } } } diff --git a/packages/core-macro/src/props/mod.rs b/packages/core-macro/src/props/mod.rs index 7fe01bbcf..7808239d7 100644 --- a/packages/core-macro/src/props/mod.rs +++ b/packages/core-macro/src/props/mod.rs @@ -584,7 +584,7 @@ mod struct_info { } fn memoize_impl(&self) -> Result { - // First check if there are any Signal fields, if there are not, we can just use the partialEq impl + // First check if there are any ReadOnlySignal fields, if there are not, we can just use the partialEq impl let has_signal_fields = self.has_signal_fields(); if has_signal_fields { @@ -647,7 +647,7 @@ mod struct_info { (&old_value).compare(&&new_value) }; if !field_eq { - (#signal_fields).set(new.#signal_fields.take()); + (#signal_fields).__set(new.#signal_fields.__take()); } // Move the old value back self.#signal_fields = #signal_fields; @@ -1564,9 +1564,9 @@ fn looks_like_signal_type(ty: &Type) -> bool { segments: Punctuated::from_iter(path_segments_without_generics), }; - path_without_generics == parse_quote!(dioxus_core::prelude::Signal) - || path_without_generics == parse_quote!(prelude::Signal) - || path_without_generics == parse_quote!(Signal) + path_without_generics == parse_quote!(dioxus_core::prelude::ReadOnlySignal) + || path_without_generics == parse_quote!(prelude::ReadOnlySignal) + || path_without_generics == parse_quote!(ReadOnlySignal) } _ => false, } diff --git a/packages/signals/src/props.rs b/packages/signals/src/props.rs index 7aac5d679..59a29e537 100644 --- a/packages/signals/src/props.rs +++ b/packages/signals/src/props.rs @@ -1,28 +1,28 @@ -use crate::Signal; +use crate::{ReadOnlySignal, Signal}; use dioxus_core::prelude::*; #[doc(hidden)] pub struct SignalFromMarker(std::marker::PhantomData); -impl SuperFrom> for Signal +impl SuperFrom> for ReadOnlySignal where O: SuperFrom, { fn super_from(input: T) -> Self { - Signal::new(O::super_from(input)) + ReadOnlySignal::new(Signal::new(O::super_from(input))) } } #[test] #[allow(unused)] fn into_signal_compiles() { - fn takes_signal_string(_: impl SuperInto, M>) {} + fn takes_signal_string(_: impl SuperInto, M>) {} - fn takes_option_signal_string(_: impl SuperInto>, M>) {} + fn takes_option_signal_string(_: impl SuperInto>, M>) {} fn don_t_run() { takes_signal_string("hello world"); - takes_signal_string(Signal::new(String::from("hello world"))); + takes_signal_string(ReadOnlySignal::new(String::from("hello world"))); takes_option_signal_string("hello world"); } } diff --git a/packages/signals/src/read_only_signal.rs b/packages/signals/src/read_only_signal.rs index 68109367b..b5124336f 100644 --- a/packages/signals/src/read_only_signal.rs +++ b/packages/signals/src/read_only_signal.rs @@ -39,6 +39,19 @@ impl>> ReadOnlySignal { pub fn id(&self) -> generational_box::GenerationalBoxId { self.inner.id() } + + #[doc(hidden)] + /// This should only be used by the `rsx!` macro. + pub fn __set(&mut self, value: T) { + use crate::write::Writable; + self.inner.set(value); + } + + #[doc(hidden)] + /// This should only be used by the `rsx!` macro. + pub fn __take(&self) -> T { + self.inner.take() + } } impl>> Readable for ReadOnlySignal {