diff --git a/examples/window_zoom.rs b/examples/window_zoom.rs new file mode 100644 index 000000000..cfb831550 --- /dev/null +++ b/examples/window_zoom.rs @@ -0,0 +1,23 @@ +use dioxus::desktop::use_window; +use dioxus::prelude::*; + +fn main() { + dioxus::desktop::launch(app); +} + +fn app(cx: Scope) -> Element { + let window = use_window(&cx); + + let level = use_state(&cx, || 1.0); + cx.render(rsx! { + input { + r#type: "number", + value: "{level}", + oninput: |e| { + let num = e.value.parse::().unwrap_or(1.0); + level.set(num); + window.set_zoom_level(num); + } + } + }) +} diff --git a/packages/desktop/src/desktop_context.rs b/packages/desktop/src/desktop_context.rs index 0b37910b0..3d4bf0b26 100644 --- a/packages/desktop/src/desktop_context.rs +++ b/packages/desktop/src/desktop_context.rs @@ -115,6 +115,16 @@ impl DesktopContext { let _ = self.proxy.send_event(SetDecorations(decoration)); } + /// set window zoom level + pub fn set_zoom_level(&self, scale_factor: f64) { + let _ = self.proxy.send_event(SetZoomLevel(scale_factor)); + } + + /// launch print modal + pub fn print(&self) { + let _ = self.proxy.send_event(Print); + } + /// opens DevTool window pub fn devtool(&self) { let _ = self.proxy.send_event(DevTool); @@ -148,6 +158,9 @@ pub enum UserWindowEvent { SetTitle(String), SetDecorations(bool), + SetZoomLevel(f64), + + Print, DevTool, Eval(String), @@ -191,11 +204,22 @@ pub(super) fn handler( SetTitle(content) => window.set_title(&content), SetDecorations(state) => window.set_decorations(state), - DevTool => {} + SetZoomLevel(scale_factor) => webview.zoom(scale_factor), - Eval(code) => webview - .evaluate_script(code.as_str()) - .expect("eval shouldn't panic"), + Print => { + if let Err(e) = webview.print() { + // we can't panic this error. + log::warn!("Open print modal failed: {e}"); + } + } + DevTool => webview.open_devtools(), + + Eval(code) => { + if let Err(e) = webview.evaluate_script(code.as_str()) { + // we can't panic this error. + log::warn!("Eval script error: {e}"); + } + } } }