and mut bound to mut methods on signals

This commit is contained in:
Jonathan Kelley committed 2024-01-15 23:24:59 -08:00
1 parent f1596bf5e8
commit 8559984e9d
31 files changed
+129 -153

No files matched your search

+2 -2
View File
@@ -41,9 +41,9 @@ const RECT_STYLE: &str = r#"
"#;
fn app() -> Element {
let events = use_signal(std::collections::VecDeque::new);
let mut events = use_signal(std::collections::VecDeque::new);
let log_event = move |event: Event| {
let mut log_event = move |event: Event| {
let mut events = events.write();
if events.len() >= MAX_EVENTS {
+9 -9
View File
@@ -19,9 +19,9 @@ fn main() {
}
fn app() -> Element {
let val = use_signal(|| String::from("0"));
let mut val = use_signal(|| String::from("0"));
let input_digit = move |num: u8| {
let mut input_digit = move |num: u8| {
if val.cloned() == "0" {
val.set(String::new());
}
@@ -29,11 +29,11 @@ fn app() -> Element {
val.write().push_str(num.to_string().as_str());
};
let input_operator = move |key: &str| val.write().push_str(key);
let mut input_operator = move |key: &str| val.write().push_str(key);
let handle_key_down_event = move |evt: KeyboardEvent| match evt.key() {
let mut handle_key_down_event = move |evt: KeyboardEvent| match evt.key() {
Key::Backspace => {
if !val().is_empty() {
if !val.cloned().is_empty() {
val.write().pop();
}
}
@@ -72,16 +72,16 @@ fn app() -> Element {
class: "calculator-key key-clear",
onclick: move |_| {
val.set(String::new());
if !val().is_empty(){
if !val.cloned().is_empty(){
val.set("0".into());
}
},
if val().is_empty() { "C" } else { "AC" }
if val.cloned().is_empty() { "C" } else { "AC" }
}
button {
class: "calculator-key key-sign",
onclick: move |_| {
let temp = calc_val(val().as_str());
let temp = calc_val(val.cloned().as_str());
if temp > 0.0 {
val.set(format!("-{temp}"));
} else {
@@ -120,7 +120,7 @@ fn app() -> Element {
button { class: "calculator-key key-add", onclick: move |_| input_operator("+"), "+" }
button {
class: "calculator-key key-equals",
onclick: move |_| val.set(format!("{}", calc_val(val().as_str()))),
onclick: move |_| val.set(format!("{}", calc_val(val.cloned().as_str()))),
"="
}
}
+2 -2
View File
@@ -10,7 +10,7 @@ fn main() {
}
fn app() -> Element {
let emails_sent = use_signal(|| Vec::new() as Vec<String>);
let mut emails_sent = use_signal(|| Vec::new() as Vec<String>);
// Wait for responses to the compose channel, and then push them to the emails_sent signal.
let handle = use_coroutine(|mut rx: UnboundedReceiver<String>| async move {
@@ -42,7 +42,7 @@ fn app() -> Element {
}
fn compose(send: Rc<dyn Fn(String)>) -> Element {
let user_input = use_signal(String::new);
let mut user_input = use_signal(String::new);
rsx! {
div {
+2 -2
View File
@@ -7,8 +7,8 @@ fn main() {
}
fn app() -> Element {
let elements = use_signal(Vec::<Rc<MountedData>>::new);
let running = use_signal(|| true);
let mut elements = use_signal(Vec::<Rc<MountedData>>::new);
let mut running = use_signal(|| true);
use_future(move || async move {
let mut focused = 0;
+2 -2
View File
@@ -8,8 +8,8 @@ fn main() {
}
fn app() -> Element {
let counters = use_signal(|| vec![0, 0, 0]);
let sum = use_selector(move || counters.read().iter().copied().sum::<usize>());
let mut counters = use_signal(|| vec![0, 0, 0]);
let mut sum = use_selector(move || counters.read().iter().copied().sum::<usize>());
render! {
div {
+4 -4
View File
@@ -58,7 +58,7 @@ pub struct Client {
#[component]
fn ClientList() -> Element {
let clients = use_context::<Clients>();
let mut clients = use_context::<Clients>();
rsx! {
h2 { "List of Clients" }
@@ -75,9 +75,9 @@ fn ClientList() -> Element {
#[component]
fn ClientAdd() -> Element {
let first_name = use_signal(String::new);
let last_name = use_signal(String::new);
let description = use_signal(String::new);
let mut first_name = use_signal(String::new);
let mut last_name = use_signal(String::new);
let mut description = use_signal(String::new);
let submit_client = move |_: FormEvent| {
consume_context::<Clients>().write().push(Client {
+1 -1
View File
@@ -5,7 +5,7 @@ fn main() {
}
fn app() -> Element {
let disabled = use_signal(|| false);
let mut disabled = use_signal(|| false);
rsx! {
div {
+2 -2
View File
@@ -6,8 +6,8 @@ fn main() {
}
fn app() -> Element {
let breed = use_signal(|| "deerhound".to_string());
let breed_list = use_future(|| async move {
let mut breed = use_signal(|| "deerhound".to_string());
let mut breed_list = use_future(|| async move {
let list = reqwest::get("https://dog.ceo/api/breeds/list/all")
.await
.unwrap()
+1 -1
View File
@@ -20,7 +20,7 @@ fn main() {
const _STYLE: &str = manganis::mg!(file("./examples/assets/fileexplorer.css"));
fn app() -> Element {
let files = use_signal(Files::new);
let mut files = use_signal(Files::new);
rsx! {
div {
+2 -2
View File
@@ -8,8 +8,8 @@ fn main() {
}
fn App() -> Element {
let enable_directory_upload = use_signal(|| false);
let files_uploaded = use_signal(|| Vec::new() as Vec<String>);
let mut enable_directory_upload = use_signal(|| false);
let mut files_uploaded = use_signal(|| Vec::new() as Vec<String>);
let upload_files = move |evt: FormEvent| async move {
for file_name in evt.files().unwrap().files() {
+1 -1
View File
@@ -38,7 +38,7 @@ fn main() {
const STYLE: &str = include_str!("./assets/calculator.css");
fn app() -> Element {
let state = use_signal(Calculator::new);
let mut state = use_signal(Calculator::new);
rsx! {
style { {STYLE} }
+1 -1
View File
@@ -12,7 +12,7 @@ fn main() {
}
fn app() -> Element {
let state = use_signal(|| PlayerState { is_playing: false });
let mut state = use_signal(|| PlayerState { is_playing: false });
rsx!(
div {
+3 -3
View File
@@ -26,10 +26,10 @@ fn main() {
}
fn app() -> Element {
let div_element = use_signal(|| None as Option<Rc<MountedData>>);
let dimensions = use_signal(Rect::zero);
let mut div_element = use_signal(|| None as Option<Rc<MountedData>>);
let mut dimensions = use_signal(Rect::zero);
let read_dims = move |_| async move {
let mut read_dims = move |_| async move {
let read = div_element.read();
let client_rect = read.as_ref().map(|el| el.get_client_rect());
if let Some(client_rect) = client_rect {
+1 -1
View File
@@ -5,7 +5,7 @@ fn main() {
}
fn app() -> Element {
let header_element = use_signal(|| None);
let mut header_element = use_signal(|| None);
rsx! {
div {
+1 -1
View File
@@ -6,7 +6,7 @@ fn main() {
}
fn app() -> Element {
let toggled = use_signal(|| false);
let mut toggled = use_signal(|| false);
_ = use_global_shortcut("ctrl+s", move || toggled.toggle());
+3 -3
View File
@@ -6,9 +6,9 @@ fn main() {
}
fn app() -> Element {
let running = dioxus_signals::use_signal(|| true);
let mut count = dioxus_signals::use_signal(|| 0);
let saved_values = dioxus_signals::use_signal(|| vec![0.to_string()]);
let mut running = use_signal(|| true);
let mut count = use_signal(|| 0);
let mut saved_values = use_signal(|| vec![0.to_string()]);
// Signals can be used in async functions without an explicit clone since they're 'static and Copy
// Signals are backed by a runtime that is designed to deeply integrate with Dioxus apps
+1 -1
View File
@@ -8,7 +8,7 @@ fn main() {
}
fn app() -> Element {
let count = use_signal(|| 10);
let mut count = use_signal(|| 10);
use_future(|| async move {
let mut stream = some_stream();
+1 -1
View File
@@ -30,7 +30,7 @@ fn Dice() -> Element {
[Y, Y, Y, Y, Y, Y, N],
];
let value = use_signal(|| 5);
let mut value = use_signal(|| 5);
let active_dots = use_selector(move || &DOTS_FOR_VALUE[(value() - 1) as usize]);
rsx! {
+1 -3
View File
@@ -7,9 +7,7 @@ fn main() {
}
fn app() -> Element {
let model = use_signal(|| String::from("asd"));
println!("{model}");
let mut model = use_signal(|| String::from("asd"));
rsx! {
textarea {
+13 -9
View File
@@ -22,8 +22,8 @@ pub struct TodoItem {
}
pub fn app() -> Element {
let todos = use_signal(|| HashMap::<u32, TodoItem>::new());
let filter = use_signal(|| FilterState::All);
let mut todos = use_signal(|| HashMap::<u32, TodoItem>::new());
let mut filter = use_signal(|| FilterState::All);
let active_todo_count =
use_selector(move || todos.read().values().filter(|item| !item.checked).count());
@@ -56,17 +56,17 @@ pub fn app() -> Element {
class: "toggle-all",
r#type: "checkbox",
onchange: move |_| {
let check = *active_todo_count() != 0;
let check = active_todo_count() != 0;
for (_, item) in todos.write().iter_mut() {
item.checked = check;
}
},
checked: *active_todo_count() == 0,
checked: active_todo_count() == 0,
}
label { r#for: "toggle-all" }
}
ul { class: "todo-list",
for id in filtered_todos().iter().copied() {
for id in filtered_todos.read().iter().copied() {
TodoEntry { key: "{id}", id, todos }
}
}
@@ -81,7 +81,8 @@ pub fn app() -> Element {
#[component]
pub fn TodoHeader(todos: Signal<HashMap<u32, TodoItem>>) -> Element {
let draft = use_signal(|| "".to_string());
let mut todos = todos;
let mut draft = use_signal(|| "".to_string());
let mut todo_id = use_signal(|| 0);
let onkeydown = move |evt: KeyboardEvent| {
@@ -115,7 +116,8 @@ pub fn TodoHeader(todos: Signal<HashMap<u32, TodoItem>>) -> Element {
#[component]
pub fn TodoEntry(todos: Signal<HashMap<u32, TodoItem>>, id: u32) -> Element {
let is_editing = use_signal(|| false);
let mut todos = todos;
let mut is_editing = use_signal(|| false);
let checked = use_selector(move || todos.read().get(&id).unwrap().checked);
let contents = use_selector(move || todos.read().get(&id).unwrap().contents.clone());
@@ -166,6 +168,8 @@ pub fn ListFooter(
active_todo_count: ReadOnlySignal<usize>,
filter: Signal<FilterState>,
) -> Element {
let mut todos = todos;
let mut filter = filter;
let show_clear_completed = use_selector(move || todos.read().values().any(|todo| todo.checked));
rsx! {
@@ -173,7 +177,7 @@ pub fn ListFooter(
span { class: "todo-count",
strong { "{active_todo_count} " }
span {
match *active_todo_count() {
match active_todo_count() {
1 => "item",
_ => "items",
}
@@ -197,7 +201,7 @@ pub fn ListFooter(
}
}
}
if *show_clear_completed() {
if show_clear_completed() {
button {
class: "clear-completed",
onclick: move |_| todos.write().retain(|_, todo| !todo.checked),
+3 -3
View File
@@ -12,9 +12,9 @@ fn main() {
}
fn app() -> Element {
let fullscreen = use_signal(|| false);
let always_on_top = use_signal(|| false);
let decorations = use_signal(|| false);
let mut fullscreen = use_signal(|| false);
let mut always_on_top = use_signal(|| false);
let mut decorations = use_signal(|| false);
rsx!(
link { href:"https://unpkg.com/tailwindcss@^2/dist/tailwind.min.css", rel:"stylesheet" }
+1 -1
View File
@@ -11,7 +11,7 @@ fn main() {
}
fn app() -> Element {
let focused = use_signal(|| false);
let mut focused = use_signal(|| false);
use_wry_event_handler(move |event, _| match event {
WryEvent::WindowEvent {
+1 -1
View File
@@ -5,7 +5,7 @@ fn main() {
}
fn app() -> Element {
let level = use_signal(|| 1.0);
let mut level = use_signal(|| 1.0);
rsx! {
input {
+1 -1
View File
@@ -9,7 +9,7 @@ fn main() {
}
fn app() -> Element {
let contents = use_signal(|| String::from("<script>alert(\"hello world\")</script>"));
let mut contents = use_signal(|| String::from("<script>alert(\"hello world\")</script>"));
rsx! {
div {