wip: bottom up dropping
This commit is contained in:
1 parent
687cda1b6d
commit
f2334c17be
21 files changed
+682
-679
No files matched your search
@@ -29,7 +29,7 @@ impl WebviewDom<'_> {
|
||||
// self.registry
|
||||
// }
|
||||
}
|
||||
impl<'bump> RealDom<'bump> for WebviewDom<'bump> {
|
||||
impl RealDom for WebviewDom<'_> {
|
||||
fn raw_node_as_any(&self) -> &mut dyn std::any::Any {
|
||||
todo!()
|
||||
// self.edits.push(PushRoot { root });
|
||||
|
||||
+104
-151
@@ -5,6 +5,7 @@ use std::sync::{Arc, RwLock};
|
||||
|
||||
use cfg::DesktopConfig;
|
||||
use dioxus_core::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
pub use wry;
|
||||
|
||||
use wry::application::event::{Event, WindowEvent};
|
||||
@@ -83,7 +84,33 @@ impl<T: Properties + 'static> WebviewRenderer<T> {
|
||||
|
||||
let window = window.build(&event_loop)?;
|
||||
|
||||
let vir = VirtualDom::new_with_props(root, props);
|
||||
let mut vir = VirtualDom::new_with_props(root, props);
|
||||
|
||||
let channel = vir.get_event_sender();
|
||||
struct WebviewBridge {}
|
||||
impl RealDom for WebviewBridge {
|
||||
fn raw_node_as_any(&self) -> &mut dyn std::any::Any {
|
||||
todo!()
|
||||
}
|
||||
|
||||
fn must_commit(&self) -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
fn commit_edits<'a>(&mut self, edits: &mut Vec<DomEdit<'a>>) {}
|
||||
|
||||
fn wait_until_ready<'s>(
|
||||
&'s mut self,
|
||||
) -> std::pin::Pin<Box<dyn std::future::Future<Output = ()> + 's>> {
|
||||
//
|
||||
Box::pin(async {
|
||||
//
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
let mut real_dom = WebviewBridge {};
|
||||
// async_std::task::spawn_local(vir.run(&mut real_dom));
|
||||
|
||||
// todo: combine these or something
|
||||
let vdom = Arc::new(RwLock::new(vir));
|
||||
@@ -91,94 +118,80 @@ impl<T: Properties + 'static> WebviewRenderer<T> {
|
||||
|
||||
let webview = WebViewBuilder::new(window)?
|
||||
.with_url(&format!("data:text/html,{}", HTML_CONTENT))?
|
||||
.with_rpc_handler(move |_window: &Window, mut req: RpcRequest| {
|
||||
match req.method.as_str() {
|
||||
"initiate" => {
|
||||
let edits = if let Some(edits) = &redits {
|
||||
serde_json::to_value(edits).unwrap()
|
||||
} else {
|
||||
let mut lock = vdom.write().unwrap();
|
||||
// let mut reg_lock = registry.write().unwrap();
|
||||
|
||||
// Create the thin wrapper around the registry to collect the edits into
|
||||
let mut real = dom::WebviewDom::new();
|
||||
let pre = pre_rendered.clone();
|
||||
|
||||
let response = match pre {
|
||||
Some(content) => {
|
||||
lock.rebuild_in_place().unwrap();
|
||||
|
||||
Response {
|
||||
edits: Vec::new(),
|
||||
pre_rendered: Some(content),
|
||||
}
|
||||
}
|
||||
None => {
|
||||
//
|
||||
let edits = {
|
||||
let mut edits = Vec::new();
|
||||
lock.rebuild(&mut real, &mut edits).unwrap();
|
||||
edits
|
||||
};
|
||||
Response {
|
||||
edits,
|
||||
pre_rendered: None,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
serde_json::to_value(&response).unwrap()
|
||||
};
|
||||
|
||||
// Return the edits into the webview runtime
|
||||
Some(RpcResponse::new_result(req.id.take(), Some(edits)))
|
||||
}
|
||||
"user_event" => {
|
||||
log::debug!("User event received");
|
||||
|
||||
// let registry = registry.clone();
|
||||
let vdom = vdom.clone();
|
||||
let response = async_std::task::block_on(async move {
|
||||
let mut lock = vdom.write().unwrap();
|
||||
// let mut reg_lock = registry.write().unwrap();
|
||||
|
||||
// a deserialized event
|
||||
let data = req.params.unwrap();
|
||||
log::debug!("Data: {:#?}", data);
|
||||
let event = trigger_from_serialized(data);
|
||||
|
||||
lock.queue_event(event);
|
||||
|
||||
// Create the thin wrapper around the registry to collect the edits into
|
||||
let mut real = dom::WebviewDom::new();
|
||||
|
||||
// Serialize the edit stream
|
||||
//
|
||||
let mut edits = Vec::new();
|
||||
lock.progress_with_event(&mut real, &mut edits)
|
||||
.await
|
||||
.expect("failed to progress");
|
||||
|
||||
let response = Response {
|
||||
edits,
|
||||
pre_rendered: None,
|
||||
};
|
||||
let response = serde_json::to_value(&response).unwrap();
|
||||
|
||||
// Give back the registry into its slot
|
||||
// *reg_lock = Some(real.consume());
|
||||
|
||||
// Return the edits into the webview runtime
|
||||
Some(RpcResponse::new_result(req.id.take(), Some(response)))
|
||||
});
|
||||
|
||||
response
|
||||
|
||||
// spawn a task to clean up the garbage
|
||||
}
|
||||
_ => todo!("this message failed"),
|
||||
}
|
||||
})
|
||||
// .with_rpc_handler(move |_window: &Window, mut req: RpcRequest| {
|
||||
// match req.method.as_str() {
|
||||
// "initiate" => {
|
||||
// let edits = if let Some(edits) = &redits {
|
||||
// serde_json::to_value(edits).unwrap()
|
||||
// } else {
|
||||
// let mut lock = vdom.write().unwrap();
|
||||
// // let mut reg_lock = registry.write().unwrap();
|
||||
// // Create the thin wrapper around the registry to collect the edits into
|
||||
// let mut real = dom::WebviewDom::new();
|
||||
// let pre = pre_rendered.clone();
|
||||
// let response = match pre {
|
||||
// Some(content) => {
|
||||
// lock.rebuild_in_place().unwrap();
|
||||
// Response {
|
||||
// edits: Vec::new(),
|
||||
// pre_rendered: Some(content),
|
||||
// }
|
||||
// }
|
||||
// None => {
|
||||
// //
|
||||
// let edits = {
|
||||
// // let mut edits = Vec::new();
|
||||
// todo!()
|
||||
// // lock.rebuild(&mut real, &mut edits).unwrap();
|
||||
// // edits
|
||||
// };
|
||||
// Response {
|
||||
// edits,
|
||||
// pre_rendered: None,
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
// serde_json::to_value(&response).unwrap()
|
||||
// };
|
||||
// // Return the edits into the webview runtime
|
||||
// Some(RpcResponse::new_result(req.id.take(), Some(edits)))
|
||||
// }
|
||||
// "user_event" => {
|
||||
// log::debug!("User event received");
|
||||
// // let registry = registry.clone();
|
||||
// let vdom = vdom.clone();
|
||||
// let response = async_std::task::block_on(async move {
|
||||
// let mut lock = vdom.write().unwrap();
|
||||
// // let mut reg_lock = registry.write().unwrap();
|
||||
// // a deserialized event
|
||||
// let data = req.params.unwrap();
|
||||
// log::debug!("Data: {:#?}", data);
|
||||
// let event = trigger_from_serialized(data);
|
||||
// // lock.queue_event(event);
|
||||
// // Create the thin wrapper around the registry to collect the edits into
|
||||
// let mut real = dom::WebviewDom::new();
|
||||
// // Serialize the edit stream
|
||||
// //
|
||||
// let mut edits = Vec::new();
|
||||
// // lock.run(&mut real, &mut edits)
|
||||
// // .await
|
||||
// // .expect("failed to progress");
|
||||
// let response = Response {
|
||||
// edits,
|
||||
// pre_rendered: None,
|
||||
// };
|
||||
// let response = serde_json::to_value(&response).unwrap();
|
||||
// // Give back the registry into its slot
|
||||
// // *reg_lock = Some(real.consume());
|
||||
// // Return the edits into the webview runtime
|
||||
// Some(RpcResponse::new_result(req.id.take(), Some(response)))
|
||||
// });
|
||||
// response
|
||||
// // spawn a task to clean up the garbage
|
||||
// }
|
||||
// _ => todo!("this message failed"),
|
||||
// }
|
||||
// })
|
||||
.build()?;
|
||||
|
||||
event_loop.run(move |event, _, control_flow| {
|
||||
@@ -194,33 +207,17 @@ impl<T: Properties + 'static> WebviewRenderer<T> {
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
|
||||
Event::MainEventsCleared => {
|
||||
webview.resize();
|
||||
// window.request_redraw();
|
||||
}
|
||||
|
||||
_ => {} // Event::WindowEvent { event, .. } => {
|
||||
// //
|
||||
// match event {
|
||||
// WindowEvent::CloseRequested => *control_flow = ControlFlow::Exit,
|
||||
// _ => {}
|
||||
// }
|
||||
// }
|
||||
// _ => {
|
||||
// // let _ = webview.resize();
|
||||
// }
|
||||
_ => {}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/// Create a new text-renderer instance from a functional component root.
|
||||
/// Automatically progresses the creation of the VNode tree to completion.
|
||||
///
|
||||
/// A VDom is automatically created. If you want more granular control of the VDom, use `from_vdom`
|
||||
// pub fn new(root: FC<T>, builder: impl FnOnce() -> WVResult<WebView<'static, ()>>) -> Self {
|
||||
// Self { root }
|
||||
// }
|
||||
|
||||
/// Create a new text renderer from an existing Virtual DOM.
|
||||
/// This will progress the existing VDom's events to completion.
|
||||
pub fn from_vdom() -> Self {
|
||||
@@ -237,47 +234,3 @@ impl<T: Properties + 'static> WebviewRenderer<T> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value;
|
||||
|
||||
// use crate::dom::WebviewRegistry;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
struct MessageParameters {
|
||||
message: String,
|
||||
}
|
||||
|
||||
fn HANDLER(window: &Window, mut req: RpcRequest) -> Option<RpcResponse> {
|
||||
let mut response = None;
|
||||
if &req.method == "fullscreen" {
|
||||
if let Some(params) = req.params.take() {
|
||||
if let Ok(mut args) = serde_json::from_value::<Vec<bool>>(params) {
|
||||
if !args.is_empty() {
|
||||
if args.swap_remove(0) {
|
||||
window.set_fullscreen(Some(Fullscreen::Borderless(None)));
|
||||
} else {
|
||||
window.set_fullscreen(None);
|
||||
}
|
||||
};
|
||||
response = Some(RpcResponse::new_result(req.id.take(), None));
|
||||
}
|
||||
}
|
||||
} else if &req.method == "send-parameters" {
|
||||
if let Some(params) = req.params.take() {
|
||||
if let Ok(mut args) = serde_json::from_value::<Vec<MessageParameters>>(params) {
|
||||
let result = if !args.is_empty() {
|
||||
let msg = args.swap_remove(0);
|
||||
Some(Value::String(format!("Hello, {}!", msg.message)))
|
||||
} else {
|
||||
// NOTE: in the real-world we should send an error response here!
|
||||
None
|
||||
};
|
||||
// Must always send a response as this is a `call()`
|
||||
response = Some(RpcResponse::new_result(req.id.take(), result));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
response
|
||||
}
|
||||
Reference in new issue
Block a user