Jelajahi Sumber

Merge pull request #242 from oovm/desktop-icon

Add default desktop icon
Jonathan Kelley 3 tahun lalu
induk
melakukan
64f8e58c04

+ 1 - 0
packages/desktop/Cargo.toml

@@ -41,3 +41,4 @@ tokio_runtime = ["tokio"]
 
 [dev-dependencies]
 dioxus-hooks = { path = "../hooks" }
+image = "0.24.0"

+ 44 - 4
packages/desktop/src/cfg.rs

@@ -1,3 +1,4 @@
+use wry::application::window::Icon;
 use wry::{
     application::{
         event_loop::EventLoop,
@@ -13,12 +14,12 @@ pub(crate) type DynEventHandlerFn = dyn Fn(&mut EventLoop<()>, &mut WebView);
 pub struct DesktopConfig {
     pub window: WindowBuilder,
     pub file_drop_handler: Option<Box<dyn Fn(&Window, FileDropEvent) -> bool>>,
-    pub protocos: Vec<WryProtocl>,
+    pub protocols: Vec<WryProtocol>,
     pub(crate) pre_rendered: Option<String>,
     pub(crate) event_handler: Option<Box<DynEventHandlerFn>>,
 }
 
-pub type WryProtocl = (
+pub type WryProtocol = (
     String,
     Box<dyn Fn(&HttpRequest) -> WryResult<HttpResponse> + 'static>,
 );
@@ -31,7 +32,7 @@ impl DesktopConfig {
         Self {
             event_handler: None,
             window,
-            protocos: Vec::new(),
+            protocols: Vec::new(),
             file_drop_handler: None,
             pre_rendered: None,
         }
@@ -75,7 +76,21 @@ impl DesktopConfig {
     where
         F: Fn(&HttpRequest) -> WryResult<HttpResponse> + 'static,
     {
-        self.protocos.push((name, Box::new(handler)));
+        self.protocols.push((name, Box::new(handler)));
+        self
+    }
+
+    pub fn with_icon(&mut self, icon: Icon) -> &mut Self {
+        self.window.window.window_icon = Some(icon);
+        self
+    }
+}
+
+impl DesktopConfig {
+    pub(crate) fn with_default_icon(mut self) -> Self {
+        let bin: &[u8] = include_bytes!("default_icon.bin");
+        let rgba = Icon::from_rgba(bin.to_owned(), 460, 460).expect("image parse failed");
+        self.window.window.window_icon = Some(rgba);
         self
     }
 }
@@ -85,3 +100,28 @@ impl Default for DesktopConfig {
         Self::new()
     }
 }
+
+// dirty trick, avoid introducing `image` at runtime
+// TODO: use serde when `Icon` impl serde
+#[test]
+#[ignore]
+fn prepare_default_icon() {
+    use image::io::Reader as ImageReader;
+    use image::ImageFormat;
+    use std::fs::File;
+    use std::io::Cursor;
+    use std::io::Write;
+    use std::path::PathBuf;
+    let png: &[u8] = include_bytes!("default_icon.png");
+    let mut reader = ImageReader::new(Cursor::new(png));
+    reader.set_format(ImageFormat::Png);
+    let icon = reader.decode().unwrap();
+    let bin = PathBuf::from(file!())
+        .parent()
+        .unwrap()
+        .join("default_icon.bin");
+    println!("{:?}", bin);
+    let mut file = File::create(bin).unwrap();
+    file.write_all(icon.as_bytes()).unwrap();
+    println!("({}, {})", icon.width(), icon.height())
+}

TEMPAT SAMPAH
packages/desktop/src/default_icon.bin


TEMPAT SAMPAH
packages/desktop/src/default_icon.png


+ 5 - 53
packages/desktop/src/lib.rs

@@ -1,54 +1,6 @@
-//! Dioxus Desktop Renderer
-//!
-//! Render the Dioxus VirtualDom using the platform's native WebView implementation.
-//!
-//! # Desktop
-//!
-//! One of Dioxus' killer features is the ability to quickly build a native desktop app that looks and feels the same across platforms. Apps built with Dioxus are typically <5mb in size and use existing system resources, so they won't hog extreme amounts of RAM or memory.
-//!
-//! Dioxus Desktop is built off Tauri. Right now there aren't any Dioxus abstractions over keyboard shortcuts, menubar, handling, etc, so you'll want to leverage Tauri - mostly [Wry](http://github.com/tauri-apps/wry/) and [Tao](http://github.com/tauri-apps/tao)) directly. The next major release of Dioxus-Desktop will include components and hooks for notifications, global shortcuts, menubar, etc.
-//!
-//!
-//! ## Getting Set up
-//!
-//! Getting Set up with Dioxus-Desktop is quite easy. Make sure you have Rust and Cargo installed, and then create a new project:
-//!
-//! ```shell
-//! $ cargo new --bin demo
-//! $ cd app
-//! ```
-//!
-//! Add Dioxus with the `desktop` feature:
-//!
-//! ```shell
-//! $ cargo add dioxus --features desktop
-//! ```
-//!
-//! Edit your `main.rs`:
-//!
-//! ```rust
-//! // main.rs
-//! use dioxus::prelude::*;
-//!
-//! fn main() {
-//!     dioxus::desktop::launch(app);
-//! }
-//!
-//! fn app(cx: Scope) -> Element {
-//!     cx.render(rsx!{
-//!         div {
-//!             "hello world!"
-//!         }
-//!     })
-//! }
-//! ```
-//!
-//!
-//! To configure the webview, menubar, and other important desktop-specific features, checkout out some of the launch configuration in the [API reference](https://docs.rs/dioxus-desktop/).
-//!
-//! ## Future Steps
-//!
-//! Make sure to read the [Dioxus Guide](https://dioxuslabs.com/guide) if you already haven't!
+#![doc = include_str!("readme.md")]
+#![doc(html_logo_url = "https://avatars.githubusercontent.com/u/79236386")]
+#![doc(html_favicon_url = "https://avatars.githubusercontent.com/u/79236386")]
 
 pub mod cfg;
 pub mod desktop_context;
@@ -152,7 +104,7 @@ pub fn launch_with_props<P: 'static + Send>(
     props: P,
     builder: impl FnOnce(&mut DesktopConfig) -> &mut DesktopConfig,
 ) {
-    let mut cfg = DesktopConfig::default();
+    let mut cfg = DesktopConfig::default().with_default_icon();
     builder(&mut cfg);
 
     let event_loop = EventLoop::with_user_event();
@@ -261,7 +213,7 @@ pub fn launch_with_props<P: 'static + Send>(
                             .unwrap_or_default()
                     });
 
-                for (name, handler) in cfg.protocos.drain(..) {
+                for (name, handler) in cfg.protocols.drain(..) {
                     webview = webview.with_custom_protocol(name, handler)
                 }
 

+ 51 - 0
packages/desktop/src/readme.md

@@ -0,0 +1,51 @@
+Dioxus Desktop Renderer
+
+Render the Dioxus VirtualDom using the platform's native WebView implementation.
+
+# Desktop
+
+One of Dioxus' killer features is the ability to quickly build a native desktop app that looks and feels the same across platforms. Apps built with Dioxus are typically <5mb in size and use existing system resources, so they won't hog extreme amounts of RAM or memory.
+
+Dioxus Desktop is built off Tauri. Right now there aren't any Dioxus abstractions over keyboard shortcuts, menubar, handling, etc, so you'll want to leverage Tauri - mostly [Wry](http://github.com/tauri-apps/wry/) and [Tao](http://github.com/tauri-apps/tao)) directly. The next major release of Dioxus-Desktop will include components and hooks for notifications, global shortcuts, menubar, etc.
+
+
+## Getting Set up
+
+Getting Set up with Dioxus-Desktop is quite easy. Make sure you have Rust and Cargo installed, and then create a new project:
+
+```shell
+$ cargo new --bin demo
+$ cd app
+```
+
+Add Dioxus with the `desktop` feature:
+
+```shell
+$ cargo add dioxus --features desktop
+```
+
+Edit your `main.rs`:
+
+```rust
+// main.rs
+use dioxus::prelude::*;
+
+fn main() {
+    dioxus::desktop::launch(app);
+}
+
+fn app(cx: Scope) -> Element {
+    cx.render(rsx!{
+        div {
+            "hello world!"
+        }
+    })
+}
+```
+
+
+To configure the webview, menubar, and other important desktop-specific features, checkout out some of the launch configuration in the [API reference](https://docs.rs/dioxus-desktop/).
+
+## Future Steps
+
+Make sure to read the [Dioxus Guide](https://dioxuslabs.com/guide) if you already haven't!