mirror of
https://github.com/storytold/gridcraft.git
synced 2026-11-10 04:19:48 -06:00
The web shell queues the page's calls as control requests (the channel the desktop control server uses) and answers them on the next frame. A call the page gave up on is released, so the app skips it instead of running it late. The API is installed in every mode; opening, saving, the file name and the unsaved flag stay with the host messages.
44 lines
2.0 KiB
Rust
44 lines
2.0 KiB
Rust
//! GridCraft in the browser.
|
|
//!
|
|
//! Runs the same [`gridcraft_ui_egui::SheetApp`] as the desktop app through eframe's web runner
|
|
//! (wgpu: WebGPU where available, WebGL2 otherwise). Build with `trunk build --release` from
|
|
//! this directory (output in `dist/web`).
|
|
//!
|
|
//! Differences from the desktop app: no TCP control channel; Open uses the browser file picker
|
|
//! (bytes arrive asynchronously through `Services::inbox`); Save downloads the file; dropped
|
|
//! files are read asynchronously.
|
|
//!
|
|
//! URL query flags: `?webgl` forces WebGL2; `?sample=sales|budget|grades` opens a sample;
|
|
//! `?host=parent` (inside an `<iframe>`) talks to a same-origin parent page instead: it sends the
|
|
//! workbook to open and stores what GridCraft saves (`host`). A page can host GridCraft in its
|
|
//! own document (no iframe) with `data-host="page"` on the canvas, talking over DOM `CustomEvent`s
|
|
//! on the canvas. `&author=` names the user for notes and comments in either host mode.
|
|
//! `window.gridcraft` (`craft-web-api`) is the page command API in every mode: `request`,
|
|
//! `execute`, `commands`, `docInspect`, `uiInspect` and `screenshot` over the control methods
|
|
//! (`api`).
|
|
//! `?chrome=none|notitlebar|nofiletab` leaves the title bar and/or the File tab undrawn for a host
|
|
//! that embeds the sheet in its own window (see `Chrome`). Preferences (theme, interface size,
|
|
//! editing options…) are kept in `localStorage` (`prefs`).
|
|
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
|
|
|
|
#[cfg(any(target_arch = "wasm32", test))]
|
|
mod api;
|
|
#[cfg(target_arch = "wasm32")]
|
|
mod host;
|
|
#[cfg(any(target_arch = "wasm32", test))]
|
|
mod hostmode;
|
|
#[cfg(any(target_arch = "wasm32", test))]
|
|
mod prefs;
|
|
#[cfg(target_arch = "wasm32")]
|
|
mod web;
|
|
|
|
#[cfg(target_arch = "wasm32")]
|
|
fn main() {
|
|
web::start();
|
|
}
|
|
|
|
#[cfg(not(target_arch = "wasm32"))]
|
|
fn main() {
|
|
eprintln!("gridcraft-web only runs in the browser: build it with `trunk build --release` in apps/gridcraft-web");
|
|
}
|