From 2eca71e6443850330e9f7dcffd06c1b6fd9f3300 Mon Sep 17 00:00:00 2001 From: Reinis Mazeiks Date: Sat, 7 May 2022 12:17:47 +0300 Subject: [PATCH 1/6] Fix: serialize AttributeValue as a simple value --- packages/core/src/arbitrary_value.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/arbitrary_value.rs b/packages/core/src/arbitrary_value.rs index 792bf405c..27f9ac62a 100644 --- a/packages/core/src/arbitrary_value.rs +++ b/packages/core/src/arbitrary_value.rs @@ -2,6 +2,7 @@ use std::fmt::Formatter; // trying to keep values at 3 bytes #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))] +#[cfg_attr(feature = "serialize", serde(untagged))] #[derive(Clone, Debug, PartialEq)] pub enum AttributeValue<'a> { Text(&'a str), From 85aa4584ff67e9be01f98dafb05b02604c8e01ea Mon Sep 17 00:00:00 2001 From: Reinis Mazeiks Date: Sat, 7 May 2022 13:43:40 +0300 Subject: [PATCH 2/6] Fix: expose AttributeValue; update tests to pass --- packages/core/src/arbitrary_value.rs | 6 ++++++ packages/core/src/lib.rs | 8 ++++---- packages/native-core-macro/tests/update_state.rs | 5 +++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/core/src/arbitrary_value.rs b/packages/core/src/arbitrary_value.rs index 27f9ac62a..f30e0a2e8 100644 --- a/packages/core/src/arbitrary_value.rs +++ b/packages/core/src/arbitrary_value.rs @@ -1,9 +1,11 @@ use std::fmt::Formatter; +/// Possible values for an attribute // trying to keep values at 3 bytes #[cfg_attr(feature = "serialize", derive(serde::Serialize, serde::Deserialize))] #[cfg_attr(feature = "serialize", serde(untagged))] #[derive(Clone, Debug, PartialEq)] +#[allow(missing_docs)] pub enum AttributeValue<'a> { Text(&'a str), Float32(f32), @@ -26,6 +28,8 @@ pub enum AttributeValue<'a> { Any(ArbitraryAttributeValue<'a>), } +// todo +#[allow(missing_docs)] impl<'a> AttributeValue<'a> { pub fn is_truthy(&self) -> bool { match self { @@ -113,6 +117,8 @@ impl<'de, 'a> serde::Deserialize<'de> for ArbitraryAttributeValue<'a> { } } +// todo +#[allow(missing_docs)] impl<'a> AttributeValue<'a> { pub fn as_text(&self) -> Option<&'a str> { match self { diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index 708df1020..f69fe925b 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -73,10 +73,10 @@ pub(crate) mod innerlude { } pub use crate::innerlude::{ - AnyEvent, Attribute, Component, DioxusElement, DomEdit, Element, ElementId, ElementIdIterator, - EventHandler, EventPriority, IntoVNode, LazyNodes, Listener, Mutations, NodeFactory, - Properties, SchedulerMsg, Scope, ScopeId, ScopeState, TaskId, UiEvent, UserEvent, VComponent, - VElement, VFragment, VNode, VPlaceholder, VText, VirtualDom, + AnyEvent, Attribute, AttributeValue, Component, DioxusElement, DomEdit, Element, ElementId, + ElementIdIterator, EventHandler, EventPriority, IntoVNode, LazyNodes, Listener, Mutations, + NodeFactory, Properties, SchedulerMsg, Scope, ScopeId, ScopeState, TaskId, UiEvent, UserEvent, + VComponent, VElement, VFragment, VNode, VPlaceholder, VText, VirtualDom, }; /// The purpose of this module is to alleviate imports of many common types diff --git a/packages/native-core-macro/tests/update_state.rs b/packages/native-core-macro/tests/update_state.rs index dd0e09f73..5cd23732e 100644 --- a/packages/native-core-macro/tests/update_state.rs +++ b/packages/native-core-macro/tests/update_state.rs @@ -1,4 +1,5 @@ use anymap::AnyMap; +use dioxus_core::AttributeValue; use dioxus_core::VNode; use dioxus_core::*; use dioxus_core_macro::*; @@ -347,7 +348,7 @@ fn state_reduce_parent_called_minimally_on_update() { edits: vec![DomEdit::SetAttribute { root: 1, field: "width", - value: "99%", + value: AttributeValue::Text("99%"), ns: Some("style"), }], dirty_scopes: fxhash::FxHashSet::default(), @@ -416,7 +417,7 @@ fn state_reduce_child_called_minimally_on_update() { edits: vec![DomEdit::SetAttribute { root: 4, field: "width", - value: "99%", + value: AttributeValue::Text("99%"), ns: Some("style"), }], dirty_scopes: fxhash::FxHashSet::default(), From f48baae0b04a9318a0a04009e66f52228019f7c9 Mon Sep 17 00:00:00 2001 From: Reinis Mazeiks Date: Sat, 7 May 2022 13:54:59 +0300 Subject: [PATCH 3/6] CI: Update gh jobs to install libayatana --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 27116f17d..7362a8e40 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -38,7 +38,7 @@ jobs: override: true - uses: Swatinem/rust-cache@v1 - run: sudo apt-get update - - run: sudo apt install libwebkit2gtk-4.0-dev libappindicator3-dev libgtk-3-dev + - run: sudo apt install libwebkit2gtk-4.0-dev libgtk-3-dev libayatana-appindicator3-dev - uses: actions-rs/cargo@v1 with: command: check @@ -56,7 +56,7 @@ jobs: override: true - uses: Swatinem/rust-cache@v1 - run: sudo apt-get update - - run: sudo apt install libwebkit2gtk-4.0-dev libappindicator3-dev libgtk-3-dev + - run: sudo apt install libwebkit2gtk-4.0-dev libgtk-3-dev libayatana-appindicator3-dev - uses: davidB/rust-cargo-make@v1 - uses: browser-actions/setup-firefox@latest - uses: jetli/wasm-pack-action@v0.3.0 @@ -96,7 +96,7 @@ jobs: override: true - uses: Swatinem/rust-cache@v1 - run: sudo apt-get update - - run: sudo apt install libwebkit2gtk-4.0-dev libappindicator3-dev libgtk-3-dev + - run: sudo apt install libwebkit2gtk-4.0-dev libgtk-3-dev libayatana-appindicator3-dev - run: rustup component add clippy - uses: actions-rs/cargo@v1 with: @@ -117,7 +117,7 @@ jobs: # run: | # apt-get update &&\ # apt-get install build-essential &&\ - # apt install libwebkit2gtk-4.0-dev libappindicator3-dev libgtk-3-dev -y &&\ + # apt install libwebkit2gtk-4.0-dev libgtk-3-dev libayatana-appindicator3-dev -y &&\ # cargo +nightly tarpaulin --verbose --all-features --workspace --timeout 120 --out Xml # - name: Upload to codecov.io # uses: codecov/codecov-action@v2 From 83209e5e03dc85639abcd223a12b06480010afed Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 7 May 2022 09:10:17 -0500 Subject: [PATCH 4/6] check mouse state before iterating through elements --- packages/tui/src/hooks.rs | 115 ++++++++++++++++++++------------------ 1 file changed, 62 insertions(+), 53 deletions(-) diff --git a/packages/tui/src/hooks.rs b/packages/tui/src/hooks.rs index c9d1e2a8c..57ca27dcd 100644 --- a/packages/tui/src/hooks.rs +++ b/packages/tui/src/hooks.rs @@ -335,81 +335,90 @@ impl InnerInputState { { // mouseup - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("mouseup") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if released { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("mouseup") { + let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released { - try_create_event( - "mouseup", - Arc::new(prepare_mouse_data(mouse_data, node_layout)), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains { + try_create_event( + "mouseup", + Arc::new(prepare_mouse_data(mouse_data, node_layout)), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } { // click - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("click") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if mouse_data.button == 0 { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("click") { + let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released && mouse_data.button == 0 { - try_create_event( - "click", - Arc::new(prepare_mouse_data(mouse_data, node_layout)), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains && released { + try_create_event( + "click", + Arc::new(prepare_mouse_data(mouse_data, node_layout)), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } { // contextmenu - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("contextmenu") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if mouse_data.button == 2 { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("contextmenu") { + let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released && mouse_data.button == 2 { - try_create_event( - "contextmenu", - Arc::new(prepare_mouse_data(mouse_data, node_layout)), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains && released { + try_create_event( + "contextmenu", + Arc::new(prepare_mouse_data(mouse_data, node_layout)), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } { // wheel - let mut will_bubble = FxHashSet::default(); - for node in dom.get_listening_sorted("wheel") { - let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); - let currently_contains = layout_contains_point(node_layout, new_pos); + if let Some(w) = wheel_data { + if wheel_delta != 0.0 { + let mut will_bubble = FxHashSet::default(); + for node in dom.get_listening_sorted("wheel") { + let node_layout = + layout.layout(node.state.layout.node.unwrap()).unwrap(); + let currently_contains = layout_contains_point(node_layout, new_pos); - if let Some(w) = wheel_data { - if currently_contains && wheel_delta != 0.0 { - try_create_event( - "wheel", - Arc::new(w.clone()), - &mut will_bubble, - resolved_events, - node, - dom, - ); + if currently_contains { + try_create_event( + "wheel", + Arc::new(w.clone()), + &mut will_bubble, + resolved_events, + node, + dom, + ); + } } } } From 2ea587359b7a8dd7a794e10b2190afd05ed9fb82 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 7 May 2022 09:10:34 -0500 Subject: [PATCH 5/6] only re-render if the state has changed --- packages/tui/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/tui/src/lib.rs b/packages/tui/src/lib.rs index 9f6bd78ed..012d92fed 100644 --- a/packages/tui/src/lib.rs +++ b/packages/tui/src/lib.rs @@ -129,7 +129,7 @@ fn render_vdom( terminal.clear().unwrap(); } - let to_rerender: fxhash::FxHashSet = vec![0].into_iter().collect(); + let mut to_rerender: fxhash::FxHashSet = vec![0].into_iter().collect(); let mut resized = true; loop { @@ -226,7 +226,7 @@ fn render_vdom( // update the style and layout let mut any_map = AnyMap::new(); any_map.insert(stretch.clone()); - let _to_rerender = rdom.update_state(vdom, to_update, any_map).unwrap(); + to_rerender = rdom.update_state(vdom, to_update, any_map).unwrap(); } } From 6f260e8a4a6a38fd0abe74250fd2baffd8dd5657 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Sat, 7 May 2022 09:16:21 -0500 Subject: [PATCH 6/6] move released into mouse condition --- packages/tui/src/hooks.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/tui/src/hooks.rs b/packages/tui/src/hooks.rs index 57ca27dcd..9def817a8 100644 --- a/packages/tui/src/hooks.rs +++ b/packages/tui/src/hooks.rs @@ -357,13 +357,13 @@ impl InnerInputState { { // click - if mouse_data.button == 0 { + if mouse_data.button == 0 && released { let mut will_bubble = FxHashSet::default(); for node in dom.get_listening_sorted("click") { let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released { + if currently_contains { try_create_event( "click", Arc::new(prepare_mouse_data(mouse_data, node_layout)), @@ -379,13 +379,13 @@ impl InnerInputState { { // contextmenu - if mouse_data.button == 2 { + if mouse_data.button == 2 && released { let mut will_bubble = FxHashSet::default(); for node in dom.get_listening_sorted("contextmenu") { let node_layout = layout.layout(node.state.layout.node.unwrap()).unwrap(); let currently_contains = layout_contains_point(node_layout, new_pos); - if currently_contains && released { + if currently_contains { try_create_event( "contextmenu", Arc::new(prepare_mouse_data(mouse_data, node_layout)),