fix dioxus-tui events
This commit is contained in:
1 parent
0ab7a02777
commit
d06e64e5ad
19 files changed
+221
-21
No files matched your search
@@ -1,7 +1,6 @@
|
||||
use std::{
|
||||
any::Any,
|
||||
fmt::{Display, Formatter},
|
||||
rc::Rc,
|
||||
};
|
||||
|
||||
use dioxus_core::{ElementId, Mutations, VirtualDom};
|
||||
@@ -30,7 +29,7 @@ pub(crate) fn find_mount_events(mutations: &Mutations) -> Vec<ElementId> {
|
||||
// We need to queue the mounted events to give rink time to rendere and resolve the layout of elements after they are created
|
||||
pub(crate) fn create_mounted_events(
|
||||
vdom: &VirtualDom,
|
||||
events: &mut Vec<(ElementId, &'static str, Rc<dyn Any>, bool)>,
|
||||
events: &mut Vec<(ElementId, &'static str, Box<dyn Any>, bool)>,
|
||||
mount_events: impl Iterator<Item = (ElementId, NodeId)>,
|
||||
) {
|
||||
let query: Query = vdom
|
||||
@@ -42,11 +41,12 @@ pub(crate) fn create_mounted_events(
|
||||
query: query.clone(),
|
||||
id: node_id,
|
||||
};
|
||||
events.push((id, "mounted", Rc::new(MountedData::new(element)), false));
|
||||
events.push((id, "mounted", Box::new(MountedData::new(element)), false));
|
||||
}
|
||||
}
|
||||
|
||||
struct TuiElement {
|
||||
#[derive(Clone)]
|
||||
pub(crate) struct TuiElement {
|
||||
query: Query,
|
||||
id: NodeId,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
use core::panic;
|
||||
|
||||
use dioxus_html::*;
|
||||
|
||||
use crate::element::TuiElement;
|
||||
|
||||
fn downcast(event: &PlatformEventData) -> plasmo::EventData {
|
||||
event
|
||||
.downcast::<plasmo::EventData>()
|
||||
.expect("event should be of type EventData")
|
||||
.clone()
|
||||
}
|
||||
|
||||
pub(crate) struct SerializedHtmlEventConverter;
|
||||
|
||||
impl HtmlEventConverter for SerializedHtmlEventConverter {
|
||||
fn convert_animation_data(&self, _: &PlatformEventData) -> AnimationData {
|
||||
panic!("animation events not supported")
|
||||
}
|
||||
|
||||
fn convert_clipboard_data(&self, _: &PlatformEventData) -> ClipboardData {
|
||||
panic!("clipboard events not supported")
|
||||
}
|
||||
|
||||
fn convert_composition_data(&self, _: &PlatformEventData) -> CompositionData {
|
||||
panic!("composition events not supported")
|
||||
}
|
||||
|
||||
fn convert_drag_data(&self, _: &PlatformEventData) -> DragData {
|
||||
panic!("drag events not supported")
|
||||
}
|
||||
|
||||
fn convert_focus_data(&self, event: &PlatformEventData) -> FocusData {
|
||||
if let plasmo::EventData::Focus(event) = downcast(event) {
|
||||
FocusData::new(event)
|
||||
} else {
|
||||
panic!("event should be of type Focus")
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_form_data(&self, event: &PlatformEventData) -> FormData {
|
||||
if let plasmo::EventData::Form(event) = downcast(event) {
|
||||
FormData::new(event)
|
||||
} else {
|
||||
panic!("event should be of type Form")
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_image_data(&self, _: &PlatformEventData) -> ImageData {
|
||||
panic!("image events not supported")
|
||||
}
|
||||
|
||||
fn convert_keyboard_data(&self, event: &PlatformEventData) -> KeyboardData {
|
||||
if let plasmo::EventData::Keyboard(event) = downcast(event) {
|
||||
KeyboardData::new(event)
|
||||
} else {
|
||||
panic!("event should be of type Keyboard")
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_media_data(&self, _: &PlatformEventData) -> MediaData {
|
||||
panic!("media events not supported")
|
||||
}
|
||||
|
||||
fn convert_mounted_data(&self, event: &PlatformEventData) -> MountedData {
|
||||
event.downcast::<TuiElement>().cloned().unwrap().into()
|
||||
}
|
||||
|
||||
fn convert_mouse_data(&self, event: &PlatformEventData) -> MouseData {
|
||||
if let plasmo::EventData::Mouse(event) = downcast(event) {
|
||||
MouseData::new(event)
|
||||
} else {
|
||||
panic!("event should be of type Mouse")
|
||||
}
|
||||
}
|
||||
|
||||
fn convert_pointer_data(&self, _: &PlatformEventData) -> PointerData {
|
||||
panic!("pointer events not supported")
|
||||
}
|
||||
|
||||
fn convert_scroll_data(&self, _: &PlatformEventData) -> ScrollData {
|
||||
panic!("scroll events not supported")
|
||||
}
|
||||
|
||||
fn convert_selection_data(&self, _: &PlatformEventData) -> SelectionData {
|
||||
panic!("selection events not supported")
|
||||
}
|
||||
|
||||
fn convert_toggle_data(&self, _: &PlatformEventData) -> ToggleData {
|
||||
panic!("toggle events not supported")
|
||||
}
|
||||
|
||||
fn convert_touch_data(&self, _: &PlatformEventData) -> TouchData {
|
||||
panic!("touch events not supported")
|
||||
}
|
||||
|
||||
fn convert_transition_data(&self, _: &PlatformEventData) -> TransitionData {
|
||||
panic!("transition events not supported")
|
||||
}
|
||||
|
||||
fn convert_wheel_data(&self, event: &PlatformEventData) -> WheelData {
|
||||
if let plasmo::EventData::Wheel(event) = downcast(event) {
|
||||
WheelData::new(event)
|
||||
} else {
|
||||
panic!("event should be of type Wheel")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
mod element;
|
||||
mod events;
|
||||
|
||||
use std::{
|
||||
any::Any,
|
||||
@@ -8,6 +9,7 @@ use std::{
|
||||
};
|
||||
|
||||
use dioxus_core::{Component, ElementId, VirtualDom};
|
||||
use dioxus_html::PlatformEventData;
|
||||
use dioxus_native_core::dioxus::{DioxusState, NodeImmutableDioxusExt};
|
||||
use dioxus_native_core::prelude::*;
|
||||
|
||||
@@ -24,6 +26,8 @@ pub fn launch_cfg(app: Component<()>, cfg: Config) {
|
||||
}
|
||||
|
||||
pub fn launch_cfg_with_props<Props: 'static>(app: Component<Props>, props: Props, cfg: Config) {
|
||||
dioxus_html::set_event_converter(Box::new(events::SerializedHtmlEventConverter));
|
||||
|
||||
render(cfg, |rdom, taffy, event_tx| {
|
||||
let dioxus_state = {
|
||||
let mut rdom = rdom.write().unwrap();
|
||||
@@ -81,7 +85,7 @@ struct DioxusRenderer {
|
||||
vdom: VirtualDom,
|
||||
dioxus_state: Rc<RwLock<DioxusState>>,
|
||||
// Events that are queued up to be sent to the vdom next time the vdom is polled
|
||||
queued_events: Vec<(ElementId, &'static str, Rc<dyn Any>, bool)>,
|
||||
queued_events: Vec<(ElementId, &'static str, Box<dyn Any>, bool)>,
|
||||
#[cfg(all(feature = "hot-reload", debug_assertions))]
|
||||
hot_reload_rx: tokio::sync::mpsc::UnboundedReceiver<dioxus_hot_reload::HotReloadMsg>,
|
||||
}
|
||||
@@ -122,15 +126,19 @@ impl Driver for DioxusRenderer {
|
||||
let id = { rdom.read().unwrap().get(id).unwrap().mounted_id() };
|
||||
if let Some(id) = id {
|
||||
let inner_value = value.deref().clone();
|
||||
let boxed_event = Box::new(inner_value);
|
||||
let platform_event = PlatformEventData::new(boxed_event);
|
||||
self.vdom
|
||||
.handle_event(event, inner_value.into_any(), id, bubbles);
|
||||
.handle_event(event, Rc::new(platform_event), id, bubbles);
|
||||
}
|
||||
}
|
||||
|
||||
fn poll_async(&mut self) -> std::pin::Pin<Box<dyn futures::Future<Output = ()> + '_>> {
|
||||
// Add any queued events
|
||||
for (id, event, value, bubbles) in self.queued_events.drain(..) {
|
||||
self.vdom.handle_event(event, value, id, bubbles);
|
||||
let platform_event = PlatformEventData::new(value);
|
||||
self.vdom
|
||||
.handle_event(event, Rc::new(platform_event), id, bubbles);
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "hot-reload", debug_assertions))]
|
||||
|
||||
Reference in new issue
Block a user