From 2a93574d1fcc4715aada64548ef3040e2f450a13 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Sun, 8 Mar 2026 02:05:09 +0100 Subject: [PATCH] fix(v3): modal dark-themed directory picker via custom rfd command --- v2/Cargo.lock | 1 + v2/src-tauri/Cargo.toml | 1 + v2/src-tauri/src/lib.rs | 14 +++++++++++++- v2/src/lib/components/Workspace/SettingsTab.svelte | 6 +++--- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/v2/Cargo.lock b/v2/Cargo.lock index 487464f..fff5963 100644 --- a/v2/Cargo.lock +++ b/v2/Cargo.lock @@ -297,6 +297,7 @@ dependencies = [ "futures-util", "log", "notify", + "rfd", "rusqlite", "serde", "serde_json", diff --git a/v2/src-tauri/Cargo.toml b/v2/src-tauri/Cargo.toml index fe24865..0764454 100644 --- a/v2/src-tauri/Cargo.toml +++ b/v2/src-tauri/Cargo.toml @@ -28,6 +28,7 @@ dirs = "5" notify = { version = "6", features = ["macos_fsevent"] } tauri-plugin-updater = "2.10.0" tauri-plugin-dialog = "2" +rfd = { version = "0.16", default-features = false, features = ["gtk3"] } uuid = { version = "1", features = ["v4"] } tokio-tungstenite = { version = "0.21", features = ["native-tls"] } tokio = { version = "1", features = ["full"] } diff --git a/v2/src-tauri/src/lib.rs b/v2/src-tauri/src/lib.rs index 8186cae..25c9678 100644 --- a/v2/src-tauri/src/lib.rs +++ b/v2/src-tauri/src/lib.rs @@ -421,7 +421,15 @@ fn project_agent_state_load( state.session_db.load_project_agent_state(&project_id) } -// Directory picker: uses tauri-plugin-dialog (frontend API: @tauri-apps/plugin-dialog) +// Directory picker: custom rfd command with parent window for modal behavior on Linux +#[tauri::command] +async fn pick_directory(window: tauri::Window) -> Result, String> { + let dialog = rfd::AsyncFileDialog::new() + .set_title("Select Directory") + .set_parent(&window); + let folder = dialog.pick_folder().await; + Ok(folder.map(|f| f.path().to_string_lossy().into_owned())) +} // --- CLI argument commands --- @@ -501,6 +509,9 @@ async fn remote_pty_kill(state: State<'_, AppState>, machine_id: String, id: Str #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { + // Force dark GTK theme for native dialogs (file chooser, etc.) + std::env::set_var("GTK_THEME", "Adwaita:dark"); + tauri::Builder::default() .invoke_handler(tauri::generate_handler![ pty_spawn, @@ -555,6 +566,7 @@ pub fn run() { project_agent_state_save, project_agent_state_load, cli_get_group, + pick_directory, ]) .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_dialog::init()) diff --git a/v2/src/lib/components/Workspace/SettingsTab.svelte b/v2/src/lib/components/Workspace/SettingsTab.svelte index d7f7bbd..d7c76ea 100644 --- a/v2/src/lib/components/Workspace/SettingsTab.svelte +++ b/v2/src/lib/components/Workspace/SettingsTab.svelte @@ -16,7 +16,7 @@ import { getSetting, setSetting } from '../../adapters/settings-bridge'; import { getCurrentTheme, setTheme } from '../../stores/theme.svelte'; import { THEME_LIST, getPalette, type ThemeId } from '../../styles/themes'; - import { open as openDialog } from '@tauri-apps/plugin-dialog'; + import { invoke } from '@tauri-apps/api/core'; let activeGroupId = $derived(getActiveGroupId()); let activeGroup = $derived(getActiveGroup()); @@ -178,8 +178,8 @@ } async function browseDirectory(): Promise { - const selected = await openDialog({ directory: true, multiple: false }); - return typeof selected === 'string' ? selected : null; + const selected = await invoke('pick_directory'); + return selected ?? null; } // New project form