diff --git a/pages/settings/index.vue b/pages/settings/index.vue index 27e0f69..241c840 100644 --- a/pages/settings/index.vue +++ b/pages/settings/index.vue @@ -1,3 +1,60 @@ \ No newline at end of file +
+
+

General

+

+ Configure basic application settings +

+ +
+
+
+

Start with system

+

+ Drop will automatically start when you log into your computer +

+
+ + + +
+
+
+
+ + + \ No newline at end of file diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ff38943..68f58d2 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -261,6 +261,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auto-launch" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f012b8cc0c850f34117ec8252a44418f2e34a2cf501de89e29b241ae5f79471" +dependencies = [ + "dirs 4.0.0", + "thiserror 1.0.69", + "winreg 0.10.1", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -870,7 +881,16 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", ] [[package]] @@ -879,7 +899,18 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", ] [[package]] @@ -990,6 +1021,7 @@ dependencies = [ "shared_child", "tauri", "tauri-build", + "tauri-plugin-autostart", "tauri-plugin-deep-link", "tauri-plugin-dialog", "tauri-plugin-os", @@ -1047,7 +1079,7 @@ dependencies = [ "rustc_version", "toml 0.8.2", "vswhom", - "winreg", + "winreg 0.52.0", ] [[package]] @@ -4245,7 +4277,7 @@ checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" dependencies = [ "anyhow", "bytes", - "dirs", + "dirs 5.0.1", "dunce", "embed_plist", "futures-util", @@ -4295,7 +4327,7 @@ checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" dependencies = [ "anyhow", "cargo_toml", - "dirs", + "dirs 5.0.1", "glob", "heck 0.5.0", "json-patch", @@ -4367,6 +4399,20 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-autostart" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c13f843e5e5df3eed270fc42b02923cc1a6b5c7e56b0f3ac1d858ab2c8b5fb" +dependencies = [ + "auto-launch", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.9", +] + [[package]] name = "tauri-plugin-deep-link" version = "2.2.0" @@ -4871,7 +4917,7 @@ checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" dependencies = [ "core-graphics", "crossbeam-channel", - "dirs", + "dirs 5.0.1", "libappindicator", "muda", "objc2", @@ -5777,6 +5823,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] + [[package]] name = "winreg" version = "0.52.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index e8bc070..8c266b8 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -44,6 +44,7 @@ chrono = "0.4.38" tauri-plugin-os = "2" boxcar = "0.2.7" umu-wrapper-lib = "0.1.0" +tauri-plugin-autostart = "2.0.0" shared_child = "1.0.1" [dependencies.tauri] diff --git a/src-tauri/src/autostart.rs b/src-tauri/src/autostart.rs new file mode 100644 index 0000000..bd526be --- /dev/null +++ b/src-tauri/src/autostart.rs @@ -0,0 +1,69 @@ +use log::info; +use tauri::AppHandle; +use tauri_plugin_autostart::ManagerExt; +use crate::DB; + +#[tauri::command] +pub async fn toggle_autostart(app: AppHandle, enabled: bool) -> Result<(), String> { + let manager = app.autolaunch(); + if enabled { + manager.enable().map_err(|e| e.to_string())?; + info!("Enabled autostart"); + } else { + manager.disable().map_err(|e| e.to_string())?; + info!("Disabled autostart"); + } + + // Store the state in DB + let mut db_handle = DB.borrow_data_mut().map_err(|e| e.to_string())?; + db_handle.settings.autostart = enabled; + drop(db_handle); + DB.save().map_err(|e| e.to_string())?; + + Ok(()) +} + +#[tauri::command] +pub async fn get_autostart_enabled(app: AppHandle) -> Result { + // First check DB state + let db_handle = DB.borrow_data().map_err(|e| e.to_string())?; + let db_state = db_handle.settings.autostart; + drop(db_handle); + + // Get actual system state + let manager = app.autolaunch(); + let system_state = manager.is_enabled().map_err(|e| e.to_string())?; + + // If they don't match, sync to DB state + if db_state != system_state { + if db_state { + manager.enable().map_err(|e| e.to_string())?; + } else { + manager.disable().map_err(|e| e.to_string())?; + } + } + + Ok(db_state) +} + +// New function to sync state on startup +pub fn sync_autostart_on_startup(app: &AppHandle) -> Result<(), String> { + let db_handle = DB.borrow_data().map_err(|e| e.to_string())?; + let should_be_enabled = db_handle.settings.autostart; + drop(db_handle); + + let manager = app.autolaunch(); + let current_state = manager.is_enabled().map_err(|e| e.to_string())?; + + if current_state != should_be_enabled { + if should_be_enabled { + manager.enable().map_err(|e| e.to_string())?; + info!("Synced autostart: enabled"); + } else { + manager.disable().map_err(|e| e.to_string())?; + info!("Synced autostart: disabled"); + } + } + + Ok(()) +} diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs index 662d943..0ab464f 100644 --- a/src-tauri/src/db.rs +++ b/src-tauri/src/db.rs @@ -72,9 +72,24 @@ pub struct DatabaseGames { pub transient_statuses: HashMap, } -#[derive(Serialize, Clone, Deserialize)] -#[serde(rename_all = "camelCase")] +#[derive(Serialize, Deserialize, Clone)] +pub struct Settings { + pub autostart: bool, + // ... other settings ... +} + +impl Default for Settings { + fn default() -> Self { + Self { + autostart: false, + // ... other settings defaults ... + } + } +} + +#[derive(Serialize, Deserialize, Clone)] pub struct Database { + pub settings: Settings, pub auth: Option, pub base_url: String, pub games: DatabaseGames, @@ -118,13 +133,14 @@ impl DatabaseImpls for DatabaseInterface { debug!("Creating logs directory"); create_dir_all(logs_root_dir.clone()).unwrap(); - #[allow(clippy::let_and_return)] let exists = fs::exists(db_path.clone()).unwrap(); match exists { - true => PathDatabase::load_from_path(db_path).expect("Database loading failed"), + true => PathDatabase::load_from_path(db_path) + .expect("Database loading failed"), false => { let default = Database { + settings: Settings::default(), auth: None, base_url: "".to_string(), games: DatabaseGames { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 57937b7..be6101c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -9,6 +9,7 @@ mod remote; mod state; #[cfg(test)] mod tests; +mod autostart; use crate::db::DatabaseImpls; use auth::{auth_initiate, generate_authorization_header, manual_recieve_handshake, recieve_handshake, retry_connect}; @@ -46,6 +47,7 @@ use tauri::menu::{Menu, MenuItem, PredefinedMenuItem}; use tauri::tray::TrayIconBuilder; use tauri::{AppHandle, Manager, RunEvent, WindowEvent}; use tauri_plugin_deep_link::DeepLinkExt; +use crate::autostart::{get_autostart_enabled, toggle_autostart}; #[derive(Clone, Copy, Serialize)] pub enum AppStatus { @@ -178,6 +180,11 @@ fn setup(handle: AppHandle) -> AppState<'static> { drop(db_handle); info!("finished setup!"); + // Sync autostart state + if let Err(e) = autostart::sync_autostart_on_startup(&handle) { + warn!("Failed to sync autostart state: {}", e); + } + AppState { status: app_status, user, @@ -234,10 +241,16 @@ pub fn run() { uninstall_game, // Processes launch_game, - kill_game + kill_game, + toggle_autostart, + get_autostart_enabled, ]) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_autostart::init( + tauri_plugin_autostart::MacosLauncher::LaunchAgent, + Some(vec!["--minimize"]) + )) .setup(|app| { let handle = app.handle().clone(); let state = setup(handle);