fix: Donate button (Start tab gate + web window.open)

- Add DONATE to the Start-tab command allowlist; it was blocked there
  with "No drawing open" while REPORT/CHANGELOG/ABOUT were allowed, so
  the Donate button did nothing on the welcome screen.
- Implement sys::open_url on wasm via web_sys window.open(_blank) — it
  was a no-op stub, so Donate, Release Notes and Send Feedback opened
  nothing on the web. The click is a user gesture, so the pop-up blocker
  allows it.

Native + web build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-06-17 00:27:33 +03:00
commit 93d136c5db
4 changed files with 12 additions and 6 deletions

1
Cargo.lock generated
View file

@ -39,6 +39,7 @@ dependencies = [
"truck-shapeops",
"ttf-parser",
"ureq",
"web-sys",
"windows-sys 0.61.2",
"winresource",
]

View file

@ -82,6 +82,8 @@ ureq = { version = "3", default-features = false, features = ["rustls"] }
[target.'cfg(target_arch = "wasm32")'.dependencies]
console_error_panic_hook = "0.1"
# Opening external URLs (Donate / feedback / release notes) via window.open.
web-sys = { version = "0.3", features = ["Window"] }
# Browsers without WebGPU (e.g. Firefox by default) need wgpu's WebGL2 backend;
# `webgl` enables it. `fira-sans` embeds the default UI font — the web has no
# system fonts, so without it all iced text (ribbon labels, command line) is

View file

@ -36,7 +36,7 @@ impl OpenCADStudio {
&& !matches!(
cmd,
"NEW" | "OPEN" | "EXIT" | "QUIT" | "REPORT" | "CHANGELOG" | "ABOUT"
| "PLUGINS" | "PLUGINMANAGER"
| "PLUGINS" | "PLUGINMANAGER" | "DONATE"
)
{
self.command_line

View file

@ -1,17 +1,20 @@
// Small platform shims for things the desktop build does natively but the web
// (wasm) build must handle differently or skip.
/// Open a URL in the user's browser. On the desktop this launches the default
/// handler; on the web the app already *is* in a browser, so for now this is a
/// no-op (a real implementation would call `window.open`).
/// Open a URL in the user's browser. The desktop launches the default handler;
/// the web opens a new tab (the button click is a user gesture, so it isn't
/// caught by the pop-up blocker). Focus of the opened page is left to the
/// OS / browser.
#[cfg(not(target_arch = "wasm32"))]
pub fn open_url(url: &str) {
let _ = open::that(url);
}
#[cfg(target_arch = "wasm32")]
pub fn open_url(_url: &str) {
// TODO(web): web_sys::window().open_with_url(_url)
pub fn open_url(url: &str) {
if let Some(window) = web_sys::window() {
let _ = window.open_with_url_and_target(url, "_blank");
}
}
/// Turn an `rfd` file handle into a `PathBuf` the rest of the app keys on.