FRE-606: Add Tauri desktop framework with cross-platform support

- Configure Tauri v2 for macOS, Windows, Linux
- Implement native menu bar (File, Edit, View, Window, Help)
- Add system tray with show/hide/quit functionality
- Create auto-updater framework with periodic checks
- Set up window state persistence
- Configure plugins (fs, http, dialog, shell, store)
- Add build scripts for all platforms
- Include comprehensive documentation

Files:
- src-tauri/Cargo.toml
- src-tauri/tauri.conf.json
- src-tauri/build.rs
- src-tauri/src/main.rs
- src-tauri/src/lib.rs
- src-tauri/src/menu.rs
- src-tauri/src/tray.rs
- src-tauri/src/updater.rs
- src-tauri/Cargo.lock
- src-tauri/icons/tray-icon.svg
- src-tauri/tauri.build.conf
- src-tauri/README.md
- .gitignore
- package.json (Tauri CLI scripts)
This commit is contained in:
2026-04-23 22:29:22 -04:00
parent adf453e245
commit 0fcd91cf87
12 changed files with 919 additions and 0 deletions

104
src-tauri/src/menu.rs Normal file
View File

@@ -0,0 +1,104 @@
use tauri::{
menu::{MenuBuilder, MenuItemBuilder},
AppHandle,
};
pub fn create_menu() -> Menu {
let quit = MenuItemBuilder::with_id("quit", "Quit")
.shortcut("CmdOrCtrl+Q")
.build()
.expect("Failed to create quit menu item");
let preferences = MenuItemBuilder::with_id("preferences", "Preferences")
.shortcut("CmdOrCtrl+,")
.build()
.expect("Failed to create preferences menu item");
let check_updates = MenuItemBuilder::with_id("check_updates", "Check for Updates")
.build()
.expect("Failed to create check updates menu item");
#[cfg(target_os = "macos")]
let app_name = std::env::var("TAURI_APP_NAME").unwrap_or_else(|_| "FrenoCorp".to_string());
#[cfg(target_os = "macos")]
let app_menu = MenuBuilder::new(&app_name)
.item(&quit)
.separator()
.item(&preferences)
.separator()
.item(&check_updates)
.build()
.expect("Failed to create app menu");
let file_menu = MenuBuilder::new("File")
.item(&MenuItemBuilder::with_id("new", "New").shortcut("CmdOrCtrl+N").build().unwrap())
.item(&MenuItemBuilder::with_id("open", "Open").shortcut("CmdOrCtrl+O").build().unwrap())
.separator()
.item(&MenuItemBuilder::with_id("save", "Save").shortcut("CmdOrCtrl+S").build().unwrap())
.item(&MenuItemBuilder::with_id("save_as", "Save As").shortcut("CmdOrCtrl+Shift+S").build().unwrap())
.separator()
.item(&quit)
.build()
.expect("Failed to create file menu");
let edit_menu = MenuBuilder::new("Edit")
.item(&MenuItemBuilder::with_id("undo", "Undo").shortcut("CmdOrCtrl+Z").build().unwrap())
.item(&MenuItemBuilder::with_id("redo", "Redo").shortcut("CmdOrCtrl+Shift+Z").build().unwrap())
.separator()
.item(&MenuItemBuilder::with_id("cut", "Cut").shortcut("CmdOrCtrl+X").build().unwrap())
.item(&MenuItemBuilder::with_id("copy", "Copy").shortcut("CmdOrCtrl+C").build().unwrap())
.item(&MenuItemBuilder::with_id("paste", "Paste").shortcut("CmdOrCtrl+V").build().unwrap())
.separator()
.item(&MenuItemBuilder::with_id("select_all", "Select All").shortcut("CmdOrCtrl+A").build().unwrap())
.build()
.expect("Failed to create edit menu");
let view_menu = MenuBuilder::new("View")
.item(&MenuItemBuilder::with_id("zoom_in", "Zoom In").shortcut("CmdOrCtrl+Plus").build().unwrap())
.item(&MenuItemBuilder::with_id("zoom_out", "Zoom Out").shortcut("CmdOrCtrl+Minus").build().unwrap())
.item(&MenuItemBuilder::with_id("reset_zoom", "Reset Zoom").shortcut("CmdOrCtrl+0").build().unwrap())
.separator()
.item(&MenuItemBuilder::with_id("fullscreen", "Toggle Fullscreen").shortcut("F11").build().unwrap())
.build()
.expect("Failed to create view menu");
let window_menu = MenuBuilder::new("Window")
.item(&MenuItemBuilder::with_id("minimize", "Minimize").shortcut("CmdOrCtrl+M").build().unwrap())
.item(&MenuItemBuilder::with_id("close", "Close").shortcut("CmdOrCtrl+W").build().unwrap())
.separator()
.item(&MenuItemBuilder::with_id("always_on_top", "Always on Top").build().unwrap())
.build()
.expect("Failed to create window menu");
let help_menu = MenuBuilder::new("Help")
.item(&MenuItemBuilder::with_id("documentation", "Documentation").shortcut("F1").build().unwrap())
.item(&MenuItemBuilder::with_id("about", "About").build().unwrap())
.separator()
.item(&check_updates)
.build()
.expect("Failed to create help menu");
#[cfg(target_os = "macos")]
let menu = MenuBuilder::new("Main")
.item(&app_menu)
.item(&file_menu)
.item(&edit_menu)
.item(&view_menu)
.item(&window_menu)
.item(&help_menu)
.build()
.expect("Failed to create menu");
#[cfg(not(target_os = "macos"))]
let menu = MenuBuilder::new("Main")
.item(&file_menu)
.item(&edit_menu)
.item(&view_menu)
.item(&window_menu)
.item(&help_menu)
.build()
.expect("Failed to create menu");
menu
}