Skip to content

Commit 0378692

Browse files
committed
Merge branch 'navigation_v2'
2 parents 798d471 + 246c125 commit 0378692

3 files changed

Lines changed: 106 additions & 2 deletions

File tree

src-tauri/src/commands/settings_commands.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ pub async fn save_app_settings(
2626

2727
// Also persist user-facing option into ~/.commander/settings.json
2828
let _ = set_show_recent_projects_welcome_screen(settings.show_welcome_recent_projects);
29+
let _ = set_code_auto_collapse_sidebar(settings.code_settings.auto_collapse_sidebar);
2930

3031
Ok(())
3132
}
@@ -59,14 +60,19 @@ pub async fn load_app_settings(app: tauri::AppHandle) -> Result<AppSettings, Str
5960
let show = get_show_recent_projects_welcome_screen().unwrap_or(true);
6061
let mut merged = settings.clone();
6162
merged.show_welcome_recent_projects = show;
63+
if let Some(auto) = get_code_auto_collapse_sidebar()? {
64+
merged.code_settings.auto_collapse_sidebar = auto;
65+
}
6266
Ok(merged)
6367
}
6468
None => {
6569
// Return default settings
6670
let mut d = AppSettings::default();
6771
d.normalize();
68-
let show = get_show_recent_projects_welcome_screen().unwrap_or(true);
69-
d.show_welcome_recent_projects = show;
72+
d.show_welcome_recent_projects = get_show_recent_projects_welcome_screen().unwrap_or(true);
73+
if let Some(auto) = get_code_auto_collapse_sidebar()? {
74+
d.code_settings.auto_collapse_sidebar = auto;
75+
}
7076
Ok(d)
7177
}
7278
}
@@ -205,6 +211,23 @@ fn set_show_recent_projects_welcome_screen(enabled: bool) -> Result<(), String>
205211
save_user_settings_json(root)
206212
}
207213

214+
fn get_code_auto_collapse_sidebar() -> Result<Option<bool>, String> {
215+
let root = load_user_settings_json()?;
216+
Ok(root
217+
.get("code")
218+
.and_then(|code| code.get("auto_collapse_sidebar"))
219+
.and_then(|value| value.as_bool()))
220+
}
221+
222+
fn set_code_auto_collapse_sidebar(enabled: bool) -> Result<(), String> {
223+
let mut root = load_user_settings_json()?;
224+
if !root.get("code").map(|c| c.is_object()).unwrap_or(false) {
225+
root["code"] = serde_json::json!({});
226+
}
227+
root["code"]["auto_collapse_sidebar"] = serde_json::json!(enabled);
228+
save_user_settings_json(root)
229+
}
230+
208231
#[tauri::command]
209232
pub async fn load_agent_settings(app: tauri::AppHandle) -> Result<HashMap<String, bool>, String> {
210233
let store = app
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
// Integration tests
22
pub mod new_project_persistence;
3+
pub mod settings_code_auto_collapse;
34
pub mod store_persistence;
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Skip on macOS to match other integration tests that require non-main-thread access.
2+
#[cfg(all(test, not(target_os = "macos")))]
3+
mod tests {
4+
use serial_test::serial;
5+
use tempfile::TempDir;
6+
use std::fs;
7+
use std::path::PathBuf;
8+
9+
use crate::commands::settings_commands::{load_app_settings, save_app_settings};
10+
use crate::models::AppSettings;
11+
12+
fn build_test_app() -> (tauri::App, TempDir) {
13+
let td = TempDir::new().expect("tempdir");
14+
std::env::set_var("HOME", td.path());
15+
let app = tauri::Builder::default()
16+
.plugin(tauri_plugin_store::Builder::new().build())
17+
.build(tauri::generate_context!())
18+
.expect("failed to build test app");
19+
(app, td)
20+
}
21+
22+
fn settings_file_path(home: &TempDir) -> PathBuf {
23+
home.path().join(".commander").join("settings.json")
24+
}
25+
26+
#[test]
27+
#[serial]
28+
fn test_code_auto_collapse_default_and_persistence() {
29+
let (app, _home_td) = build_test_app();
30+
let handle = app.handle();
31+
32+
let defaults = tauri::async_runtime::block_on(load_app_settings(handle.clone()))
33+
.expect("load_app_settings should succeed");
34+
assert!(!defaults.code_settings.auto_collapse_sidebar);
35+
36+
let mut updated = defaults.clone();
37+
updated.code_settings.auto_collapse_sidebar = true;
38+
tauri::async_runtime::block_on(save_app_settings(handle.clone(), updated))
39+
.expect("save_app_settings should succeed");
40+
41+
let reloaded = tauri::async_runtime::block_on(load_app_settings(handle.clone()))
42+
.expect("load_app_settings should succeed after save");
43+
assert!(reloaded.code_settings.auto_collapse_sidebar);
44+
}
45+
46+
#[test]
47+
#[serial]
48+
fn test_code_auto_collapse_persists_to_user_file_and_is_respected() {
49+
let (app, home_td) = build_test_app();
50+
let handle = app.handle();
51+
52+
let mut s = AppSettings::default();
53+
s.code_settings.auto_collapse_sidebar = true;
54+
tauri::async_runtime::block_on(save_app_settings(handle.clone(), s))
55+
.expect("save_app_settings should succeed");
56+
57+
let sf = settings_file_path(&home_td);
58+
assert!(sf.exists(), "user settings file should be created");
59+
60+
let mut json: serde_json::Value = serde_json::from_str(
61+
&fs::read_to_string(&sf).expect("read user settings"),
62+
)
63+
.expect("parse user settings json");
64+
assert_eq!(
65+
json.get("code")
66+
.and_then(|c| c.get("auto_collapse_sidebar"))
67+
.and_then(|b| b.as_bool()),
68+
Some(true)
69+
);
70+
71+
// Flip the value manually to ensure load respects user edits.
72+
json["code"]["auto_collapse_sidebar"] = serde_json::json!(false);
73+
fs::write(&sf, serde_json::to_string_pretty(&json).expect("serialize json"))
74+
.expect("write user settings");
75+
76+
let loaded = tauri::async_runtime::block_on(load_app_settings(handle.clone()))
77+
.expect("load_app_settings should succeed after manual edit");
78+
assert!(!loaded.code_settings.auto_collapse_sidebar);
79+
}
80+
}

0 commit comments

Comments
 (0)