diff --git a/.changes/window-state-optional-flags.md b/.changes/window-state-optional-flags.md new file mode 100644 index 00000000..76c6465a --- /dev/null +++ b/.changes/window-state-optional-flags.md @@ -0,0 +1,6 @@ +--- +'window-state': 'minor' +'window-state-js': 'minor' +--- + +Making `flags` optional in the `saveWindowState`, `restoreState`, `restoreStateCurrent` JavaScripts APIs, leaving it empty will make it use plugin's default flags diff --git a/plugins/window-state/guest-js/index.ts b/plugins/window-state/guest-js/index.ts index f922f3f0..1cbd5733 100644 --- a/plugins/window-state/guest-js/index.ts +++ b/plugins/window-state/guest-js/index.ts @@ -18,7 +18,7 @@ export enum StateFlags { /** * Save the state of all open windows to disk. */ -async function saveWindowState(flags: StateFlags): Promise { +async function saveWindowState(flags?: StateFlags): Promise { await invoke('plugin:window-state|save_window_state', { flags }) } @@ -27,7 +27,7 @@ async function saveWindowState(flags: StateFlags): Promise { */ async function restoreState( label: WindowLabel, - flags: StateFlags + flags?: StateFlags ): Promise { await invoke('plugin:window-state|restore_state', { label, flags }) } @@ -35,7 +35,7 @@ async function restoreState( /** * Restore the state for the current window from disk. */ -async function restoreStateCurrent(flags: StateFlags): Promise { +async function restoreStateCurrent(flags?: StateFlags): Promise { await restoreState(getCurrentWindow().label, flags) } /** diff --git a/plugins/window-state/src/cmd.rs b/plugins/window-state/src/cmd.rs index 99d41a82..8b376aa9 100644 --- a/plugins/window-state/src/cmd.rs +++ b/plugins/window-state/src/cmd.rs @@ -5,13 +5,25 @@ use crate::{AppHandleExt, StateFlags, WindowExt}; use tauri::{command, AppHandle, Manager, Runtime}; +fn get_state_flags( + app: &AppHandle, + flags: Option, +) -> std::result::Result { + let flags = if let Some(flags) = flags { + StateFlags::from_bits(flags).ok_or_else(|| format!("Invalid state flags bits: {flags}"))? + } else { + let plugin_state = app.state::(); + plugin_state.state_flags + }; + Ok(flags) +} + #[command] pub async fn save_window_state( app: AppHandle, - flags: u32, + flags: Option, ) -> std::result::Result<(), String> { - let flags = StateFlags::from_bits(flags) - .ok_or_else(|| format!("Invalid state flags bits: {}", flags))?; + let flags = get_state_flags(&app, flags)?; app.save_window_state(flags).map_err(|e| e.to_string())?; Ok(()) } @@ -20,12 +32,11 @@ pub async fn save_window_state( pub async fn restore_state( app: AppHandle, label: String, - flags: u32, + flags: Option, ) -> std::result::Result<(), String> { - let flags = StateFlags::from_bits(flags) - .ok_or_else(|| format!("Invalid state flags bits: {}", flags))?; + let flags = get_state_flags(&app, flags)?; app.get_webview_window(&label) - .ok_or_else(|| format!("Couldn't find window with label: {}", label))? + .ok_or_else(|| format!("Couldn't find window with label: {label}"))? .restore_state(flags) .map_err(|e| e.to_string())?; Ok(()) diff --git a/plugins/window-state/src/lib.rs b/plugins/window-state/src/lib.rs index 50345b64..42c0fdf6 100644 --- a/plugins/window-state/src/lib.rs +++ b/plugins/window-state/src/lib.rs @@ -60,12 +60,14 @@ bitflags! { } impl Default for StateFlags { + /// Default to [`all`](Self::all) fn default() -> Self { Self::all() } } struct PluginState { + pub(crate) state_flags: StateFlags, filename: String, map_label: Option>, } @@ -381,7 +383,7 @@ impl Builder { } pub fn build(self) -> TauriPlugin { - let flags = self.state_flags; + let state_flags = self.state_flags; let filename = self.filename.unwrap_or_else(|| DEFAULT_FILENAME.into()); let map_label = self.map_label; @@ -391,11 +393,12 @@ impl Builder { cmd::restore_state, cmd::filename ]) - .setup(|app, _api| { + .setup(move |app, _api| { let cache = load_saved_window_states(app, &filename).unwrap_or_default(); app.manage(WindowStateCache(Arc::new(Mutex::new(cache)))); app.manage(RestoringWindowState(Mutex::new(()))); app.manage(PluginState { + state_flags, filename, map_label, }); @@ -423,14 +426,13 @@ impl Builder { } if !self.skip_initial_state.contains(label) { - let _ = window.restore_state(self.state_flags); + let _ = window.restore_state(state_flags); } let cache = window.state::(); let cache = cache.0.clone(); let label = label.to_string(); let window_clone = window.clone(); - let flags = self.state_flags; // insert a default state if this window should be tracked and // the disk cache doesn't have a state for it @@ -446,11 +448,11 @@ impl Builder { WindowEvent::CloseRequested { .. } => { let mut c = cache.lock().unwrap(); if let Some(state) = c.get_mut(&label) { - let _ = window_clone.update_state(state, flags); + let _ = window_clone.update_state(state, state_flags); } } - WindowEvent::Moved(position) if flags.contains(StateFlags::POSITION) => { + WindowEvent::Moved(position) if state_flags.contains(StateFlags::POSITION) => { if window_clone .state::() .0 @@ -468,7 +470,7 @@ impl Builder { } } } - WindowEvent::Resized(size) if flags.contains(StateFlags::SIZE) => { + WindowEvent::Resized(size) if state_flags.contains(StateFlags::SIZE) => { if window_clone .state::() .0 @@ -499,7 +501,7 @@ impl Builder { }) .on_event(move |app, event| { if let RunEvent::Exit = event { - let _ = app.save_window_state(flags); + let _ = app.save_window_state(state_flags); } }) .build()