A few more stylistic changes

This commit is contained in:
Jonathan Kelley committed 2024-01-04 20:41:48 -08:00
1 parent 4d95bc1374
commit 42e25c407f
6 files changed
+26 -37

No files matched your search

+20 -23
View File
@@ -1,7 +1,6 @@
use crate::{ use crate::{
cfg::{Config, WindowCloseBehaviour}, cfg::{Config, WindowCloseBehaviour},
desktop_context::WindowEventHandlers, desktop_context::WindowEventHandlers,
edits::WebviewQueue,
element::DesktopElement, element::DesktopElement,
file_upload::FileDialogRequest, file_upload::FileDialogRequest,
ipc::IpcMessage, ipc::IpcMessage,
@@ -13,13 +12,19 @@ use crate::{
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use dioxus_core::{Component, ElementId, VirtualDom}; use dioxus_core::{Component, ElementId, VirtualDom};
use dioxus_html::{native_bind::NativeFileEngine, FormData, HtmlEvent, MountedData}; use dioxus_html::{native_bind::NativeFileEngine, FormData, HtmlEvent, MountedData};
use std::{cell::Cell, collections::HashMap, rc::Rc, sync::Arc}; use std::{
cell::{Cell, RefCell},
collections::HashMap,
rc::Rc,
sync::Arc,
};
use tao::{ use tao::{
event::Event, event::Event,
event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy, EventLoopWindowTarget}, event_loop::{ControlFlow, EventLoop, EventLoopBuilder, EventLoopProxy, EventLoopWindowTarget},
window::WindowId, window::WindowId,
}; };
/// The single top-level object that manages all the running windows, assets, shortcuts, etc
pub(crate) struct App<P> { pub(crate) struct App<P> {
// move the props into a cell so we can pop it out later to create the first window // move the props into a cell so we can pop it out later to create the first window
// iOS panics if we create a window before the event loop is started, so we toss them into a cell // iOS panics if we create a window before the event loop is started, so we toss them into a cell
@@ -33,17 +38,16 @@ pub(crate) struct App<P> {
pub(crate) webviews: HashMap<WindowId, WebviewInstance>, pub(crate) webviews: HashMap<WindowId, WebviewInstance>,
pub(crate) window_behavior: WindowCloseBehaviour, pub(crate) window_behavior: WindowCloseBehaviour,
/// This bit of state is shared between all the windows, providing a way for us to communicate with
/// running instances.
///
/// Todo: everything in this struct is wrapped in Rc<>, but we really only need the one top-level refcell
pub(crate) shared: SharedContext, pub(crate) shared: SharedContext,
} }
/// A bundle of state shared between all the windows, providing a way for us to communicate with running webview.
///
/// Todo: everything in this struct is wrapped in Rc<>, but we really only need the one top-level refcell
#[derive(Clone)] #[derive(Clone)]
pub struct SharedContext { pub struct SharedContext {
pub(crate) event_handlers: WindowEventHandlers, pub(crate) event_handlers: WindowEventHandlers,
pub(crate) pending_webviews: WebviewQueue, pub(crate) pending_webviews: Rc<RefCell<Vec<WebviewInstance>>>,
pub(crate) shortcut_manager: ShortcutRegistry, pub(crate) shortcut_manager: ShortcutRegistry,
pub(crate) global_hotkey_channel: Receiver<GlobalHotKeyEvent>, pub(crate) global_hotkey_channel: Receiver<GlobalHotKeyEvent>,
pub(crate) proxy: EventLoopProxy<UserWindowEvent>, pub(crate) proxy: EventLoopProxy<UserWindowEvent>,
@@ -64,7 +68,7 @@ impl<P: 'static> App<P> {
cfg: Cell::new(Some(cfg)), cfg: Cell::new(Some(cfg)),
shared: SharedContext { shared: SharedContext {
event_handlers: WindowEventHandlers::default(), event_handlers: WindowEventHandlers::default(),
pending_webviews: WebviewQueue::default(), pending_webviews: Default::default(),
shortcut_manager: ShortcutRegistry::new(), shortcut_manager: ShortcutRegistry::new(),
global_hotkey_channel: GlobalHotKeyEvent::receiver().clone(), global_hotkey_channel: GlobalHotKeyEvent::receiver().clone(),
proxy: event_loop.create_proxy(), proxy: event_loop.create_proxy(),
@@ -78,22 +82,16 @@ impl<P: 'static> App<P> {
(event_loop, app) (event_loop, app)
} }
pub fn tick( pub fn tick(&mut self, window_event: &Event<'_, UserWindowEvent>) {
&mut self,
window_event: &Event<'_, UserWindowEvent>,
event_loop: &EventLoopWindowTarget<UserWindowEvent>,
) {
self.control_flow = ControlFlow::Wait; self.control_flow = ControlFlow::Wait;
self.shared self.shared
.event_handlers .event_handlers
.apply_event(window_event, event_loop); .apply_event(window_event, &self.shared.target);
_ = self if let Ok(event) = self.shared.global_hotkey_channel.try_recv() {
.shared self.shared.shortcut_manager.call_handlers(event);
.global_hotkey_channel }
.try_recv()
.map(|event| self.shared.shortcut_manager.call_handlers(event));
} }
#[cfg(all(feature = "hot-reload", debug_assertions))] #[cfg(all(feature = "hot-reload", debug_assertions))]
@@ -136,7 +134,6 @@ impl<P: 'static> App<P> {
let Some(webview) = self.webviews.get(&id) else { let Some(webview) = self.webviews.get(&id) else {
return; return;
}; };
hide_app_window(&webview.desktop_context.webview); hide_app_window(&webview.desktop_context.webview);
} }
@@ -164,14 +161,14 @@ impl<P: 'static> App<P> {
self.is_visible_before_start = cfg.window.window.visible; self.is_visible_before_start = cfg.window.window.visible;
let handler = WebviewInstance::new( let webview = WebviewInstance::new(
cfg, cfg,
VirtualDom::new_with_props(self.root, props), VirtualDom::new_with_props(self.root, props),
self.shared.clone(), self.shared.clone(),
); );
let id = handler.desktop_context.window.id(); let id = webview.desktop_context.window.id();
self.webviews.insert(id, handler); self.webviews.insert(id, webview);
_ = self _ = self
.shared .shared
-2
View File
@@ -8,8 +8,6 @@ use wry::{
FileDropEvent, FileDropEvent,
}; };
// pub(crate) type DynEventHandlerFn = dyn Fn(&mut EventLoop<()>, &mut WebView);
/// The behaviour of the application when the last window is closed. /// The behaviour of the application when the last window is closed.
#[derive(Copy, Clone, Eq, PartialEq)] #[derive(Copy, Clone, Eq, PartialEq)]
pub enum WindowCloseBehaviour { pub enum WindowCloseBehaviour {
+1 -7
View File
@@ -1,12 +1,8 @@
use crate::webview::WebviewInstance; use dioxus_core::{BorrowedAttributeValue, Mutations, Template, TemplateAttribute, TemplateNode};
use dioxus_core::Mutations;
use dioxus_core::{BorrowedAttributeValue, Template, TemplateAttribute, TemplateNode};
use dioxus_html::event_bubbles; use dioxus_html::event_bubbles;
use dioxus_interpreter_js::binary_protocol::Channel; use dioxus_interpreter_js::binary_protocol::Channel;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use std::{ use std::{
cell::RefCell,
rc::Rc,
sync::atomic::AtomicU16, sync::atomic::AtomicU16,
sync::Arc, sync::Arc,
sync::{atomic::Ordering, Mutex}, sync::{atomic::Ordering, Mutex},
@@ -14,8 +10,6 @@ use std::{
use wry::RequestAsyncResponder; use wry::RequestAsyncResponder;
pub(crate) type WebviewQueue = Rc<RefCell<Vec<WebviewInstance>>>;
/// This handles communication between the requests that the webview makes and the interpreter. The interpreter /// This handles communication between the requests that the webview makes and the interpreter. The interpreter
/// constantly makes long running requests to the webview to get any edits that should be made to the DOM almost like /// constantly makes long running requests to the webview to get any edits that should be made to the DOM almost like
/// server side events. /// server side events.
+1 -2
View File
@@ -1,10 +1,9 @@
use std::rc::Rc;
use crate::{ use crate::{
assets::*, ipc::UserWindowEvent, shortcut::IntoAccelerator, window, DesktopContext, assets::*, ipc::UserWindowEvent, shortcut::IntoAccelerator, window, DesktopContext,
ShortcutHandle, ShortcutRegistryError, WryEventHandler, ShortcutHandle, ShortcutRegistryError, WryEventHandler,
}; };
use dioxus_core::ScopeState; use dioxus_core::ScopeState;
use std::rc::Rc;
use tao::{event::Event, event_loop::EventLoopWindowTarget}; use tao::{event::Event, event_loop::EventLoopWindowTarget};
/// Get an imperative handle to the current window /// Get an imperative handle to the current window
+2 -2
View File
@@ -97,8 +97,8 @@ pub fn launch_with_props<P: 'static>(root: Component<P>, props: P, cfg: Config)
pub fn launch_with_props_blocking<P: 'static>(root: Component<P>, props: P, cfg: Config) { pub fn launch_with_props_blocking<P: 'static>(root: Component<P>, props: P, cfg: Config) {
let (event_loop, mut app) = App::new(cfg, props, root); let (event_loop, mut app) = App::new(cfg, props, root);
event_loop.run(move |window_event, event_loop, control_flow| { event_loop.run(move |window_event, _, control_flow| {
app.tick(&window_event, event_loop); app.tick(&window_event);
match window_event { match window_event {
Event::NewEvents(StartCause::Init) => app.handle_start_cause_init(), Event::NewEvents(StartCause::Init) => app.handle_start_cause_init(),
+2 -1
View File
@@ -7,7 +7,8 @@ use tao::{event_loop::EventLoopProxy, window::WindowId};
/// ///
/// This lets the VirtualDom "come up for air" and process events while the main thread is blocked by the WebView. /// This lets the VirtualDom "come up for air" and process events while the main thread is blocked by the WebView.
/// ///
/// All other IO lives in the Tokio runtime, /// All IO and multithreading lives on other threads. Thanks to tokio's work stealing approach, the main thread can never
/// claim a task while it's blocked by the event loop.
pub fn tao_waker(proxy: EventLoopProxy<UserWindowEvent>, id: WindowId) -> std::task::Waker { pub fn tao_waker(proxy: EventLoopProxy<UserWindowEvent>, id: WindowId) -> std::task::Waker {
struct DomHandle { struct DomHandle {
proxy: EventLoopProxy<UserWindowEvent>, proxy: EventLoopProxy<UserWindowEvent>,