openpencil/desktop/src/lib.rs
Danila Poyarkov 2ab99ac4fe Windows build support: conditional macOS app menu, devtools feature
- Gate OpenPencil app submenu (About/Services/Hide/Quit) behind
  #[cfg(target_os = "macos")] — Windows/Linux don't have it
- Enable tauri "devtools" feature in Cargo.toml (required for
  open_devtools/close_devtools on non-macOS)
2026-02-28 12:58:34 +03:00

250 lines
9.1 KiB
Rust

use tauri::{
menu::{MenuBuilder, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder},
Emitter, Manager,
};
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
.plugin(tauri_plugin_opener::init())
.on_menu_event(|app, event| {
#[cfg(debug_assertions)]
if event.id().0.as_str() == "dev-tools" {
if let Some(window) = app.get_webview_window("main") {
if window.is_devtools_open() {
window.close_devtools();
} else {
window.open_devtools();
}
}
return;
}
let _ = app.emit("menu-event", event.id().0.as_str());
})
.setup(|app| {
#[cfg(target_os = "macos")]
let app_menu = SubmenuBuilder::new(app, "OpenPencil")
.item(&PredefinedMenuItem::about(app, Some("About OpenPencil"), None)?)
.separator()
.item(&PredefinedMenuItem::services(app, None)?)
.separator()
.item(&PredefinedMenuItem::hide(app, None)?)
.item(&PredefinedMenuItem::hide_others(app, None)?)
.item(&PredefinedMenuItem::show_all(app, None)?)
.separator()
.item(&PredefinedMenuItem::quit(app, None)?)
.build()?;
let file_menu = SubmenuBuilder::new(app, "File")
.item(
&MenuItemBuilder::new("New File")
.id("new")
.accelerator("CmdOrCtrl+N")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Open…")
.id("open")
.accelerator("CmdOrCtrl+O")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Save")
.id("save")
.accelerator("CmdOrCtrl+S")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Save As…")
.id("save-as")
.accelerator("CmdOrCtrl+Shift+S")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Export…")
.id("export")
.accelerator("CmdOrCtrl+Shift+E")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Close Window")
.id("close")
.accelerator("CmdOrCtrl+W")
.build(app)?,
)
.build()?;
let edit_menu = SubmenuBuilder::new(app, "Edit")
.item(&PredefinedMenuItem::undo(app, None)?)
.item(&PredefinedMenuItem::redo(app, None)?)
.separator()
.item(&PredefinedMenuItem::cut(app, None)?)
.item(&PredefinedMenuItem::copy(app, None)?)
.item(&PredefinedMenuItem::paste(app, None)?)
.item(
&MenuItemBuilder::new("Paste in Place")
.id("paste-in-place")
.accelerator("CmdOrCtrl+Shift+V")
.build(app)?,
)
.item(&PredefinedMenuItem::select_all(app, None)?)
.separator()
.item(
&MenuItemBuilder::new("Duplicate")
.id("duplicate")
.accelerator("CmdOrCtrl+D")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Delete")
.id("delete")
.accelerator("Backspace")
.build(app)?,
)
.build()?;
let view_menu = SubmenuBuilder::new(app, "View")
.item(
&MenuItemBuilder::new("Zoom In")
.id("zoom-in")
.accelerator("CmdOrCtrl+=")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Zoom Out")
.id("zoom-out")
.accelerator("CmdOrCtrl+-")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Zoom to Fit")
.id("zoom-fit")
.accelerator("CmdOrCtrl+1")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Zoom to 100%")
.id("zoom-100")
.accelerator("CmdOrCtrl+0")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Toggle Rulers")
.id("toggle-rulers")
.accelerator("Shift+R")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Toggle Grid")
.id("toggle-grid")
.accelerator("CmdOrCtrl+'")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Toggle UI")
.id("toggle-ui")
.accelerator("CmdOrCtrl+\\")
.build(app)?,
)
.item(&PredefinedMenuItem::fullscreen(app, None)?)
.separator()
.item(
&MenuItemBuilder::new("Developer Tools")
.id("dev-tools")
.accelerator("CmdOrCtrl+Alt+I")
.build(app)?,
)
.build()?;
let object_menu = SubmenuBuilder::new(app, "Object")
.item(
&MenuItemBuilder::new("Group Selection")
.id("group")
.accelerator("CmdOrCtrl+G")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Ungroup Selection")
.id("ungroup")
.accelerator("CmdOrCtrl+Shift+G")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Frame Selection")
.id("frame-selection")
.accelerator("CmdOrCtrl+Alt+G")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Bring to Front")
.id("bring-front")
.accelerator("CmdOrCtrl+]")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Send to Back")
.id("send-back")
.accelerator("CmdOrCtrl+[")
.build(app)?,
)
.separator()
.item(
&MenuItemBuilder::new("Flip Horizontal")
.id("flip-h")
.accelerator("Shift+H")
.build(app)?,
)
.item(
&MenuItemBuilder::new("Flip Vertical")
.id("flip-v")
.accelerator("Shift+V")
.build(app)?,
)
.build()?;
let window_menu = SubmenuBuilder::new(app, "Window")
.item(&PredefinedMenuItem::minimize(app, None)?)
.item(&PredefinedMenuItem::maximize(app, None)?)
.separator()
.item(&PredefinedMenuItem::close_window(app, None)?)
.build()?;
let help_menu = SubmenuBuilder::new(app, "Help")
.item(
&MenuItemBuilder::new("Keyboard Shortcuts")
.id("shortcuts")
.accelerator("CmdOrCtrl+/")
.build(app)?,
)
.build()?;
let mut builder = MenuBuilder::new(app);
#[cfg(target_os = "macos")]
{
builder = builder.item(&app_menu);
}
let menu = builder
.items(&[
&file_menu,
&edit_menu,
&view_menu,
&object_menu,
&window_menu,
&help_menu,
])
.build()?;
app.set_menu(menu)?;
Ok(())
})
.run(tauri::generate_context!())
.expect("error while running tauri application");
}