feat: open last session
2 files changed, +38 -6
+15-6src/app.rs
| @@ -210,7 +210,14 @@ impl JvApp { | ||
| 210 | 210 | let session = manager.create_session("Default Session"); |
| 211 | 211 | Some(LoadedSession::new(session)) |
| 212 | 212 | } else { |
| 213 | - let session = manager.sessions[0].clone(); | |
| 213 | + // Restore last active session, or fall back to first | |
| 214 | + let session = if let Some(last_id) = &manager.last_session_id { | |
| 215 | + manager.sessions.iter().find(|s| s.id == *last_id) | |
| 216 | + .cloned() | |
| 217 | + .unwrap_or_else(|| manager.sessions[0].clone()) | |
| 218 | + } else { | |
| 219 | + manager.sessions[0].clone() | |
| 220 | + }; | |
| 214 | 221 | Some(LoadedSession::new(session)) |
| 215 | 222 | }; |
| 216 | 223 | |
| @@ -343,6 +350,7 @@ impl JvApp { | ||
| 343 | 350 | for (i, name) in session_names.iter().enumerate() { |
| 344 | 351 | if ui.selectable_label(name == ¤t_name, name).clicked() { |
| 345 | 352 | let session = self.session_manager.sessions[i].clone(); |
| 353 | + self.session_manager.save_last_session_id(&session.id); | |
| 346 | 354 | self.current_session = Some(LoadedSession::new(session)); |
| 347 | 355 | self.selected_file_index = 0; |
| 348 | 356 | self.rebuild_schema(); |
| @@ -361,13 +369,13 @@ impl JvApp { | ||
| 361 | 369 | if let Some(loaded) = &self.current_session { |
| 362 | 370 | let id = loaded.session.id.clone(); |
| 363 | 371 | self.session_manager.delete_session(&id); |
| 364 | - self.current_session = if self.session_manager.sessions.is_empty() { | |
| 365 | - let s = self.session_manager.create_session("Default Session"); | |
| 366 | - Some(LoadedSession::new(s)) | |
| 372 | + let new_session = if self.session_manager.sessions.is_empty() { | |
| 373 | + self.session_manager.create_session("Default Session") | |
| 367 | 374 | } else { |
| 368 | - let s = self.session_manager.sessions[0].clone(); | |
| 369 | - Some(LoadedSession::new(s)) | |
| 375 | + self.session_manager.sessions[0].clone() | |
| 370 | 376 | }; |
| 377 | + self.session_manager.save_last_session_id(&new_session.id); | |
| 378 | + self.current_session = Some(LoadedSession::new(new_session)); | |
| 371 | 379 | self.selected_file_index = 0; |
| 372 | 380 | self.rebuild_schema(); |
| 373 | 381 | } |
| @@ -1149,6 +1157,7 @@ impl eframe::App for JvApp { | ||
| 1149 | 1157 | let session = self |
| 1150 | 1158 | .session_manager |
| 1151 | 1159 | .create_session(&self.new_session_name); |
| 1160 | + self.session_manager.save_last_session_id(&session.id); | |
| 1152 | 1161 | self.current_session = Some(LoadedSession::new(session)); |
| 1153 | 1162 | self.selected_file_index = 0; |
| 1154 | 1163 | self.new_session_name.clear(); |
+23-0src/session.rs
| @@ -148,6 +148,7 @@ impl Session { | ||
| 148 | 148 | pub struct SessionManager { |
| 149 | 149 | pub sessions: Vec<Session>, |
| 150 | 150 | data_dir: PathBuf, |
| 151 | + pub last_session_id: Option<String>, | |
| 151 | 152 | } |
| 152 | 153 | |
| 153 | 154 | impl SessionManager { |
| @@ -159,8 +160,10 @@ impl SessionManager { | ||
| 159 | 160 | let mut manager = Self { |
| 160 | 161 | sessions: Vec::new(), |
| 161 | 162 | data_dir, |
| 163 | + last_session_id: None, | |
| 162 | 164 | }; |
| 163 | 165 | manager.load_sessions(); |
| 166 | + manager.load_last_session_id(); | |
| 164 | 167 | manager |
| 165 | 168 | } |
| 166 | 169 | |
| @@ -220,4 +223,24 @@ impl SessionManager { | ||
| 220 | 223 | *existing = session.clone(); |
| 221 | 224 | } |
| 222 | 225 | } |
| 226 | + | |
| 227 | + fn state_path(&self) -> PathBuf { | |
| 228 | + self.data_dir.join("state.json") | |
| 229 | + } | |
| 230 | + | |
| 231 | + fn load_last_session_id(&mut self) { | |
| 232 | + if let Ok(content) = std::fs::read_to_string(self.state_path()) { | |
| 233 | + if let Ok(val) = serde_json::from_str::<serde_json::Value>(&content) { | |
| 234 | + self.last_session_id = val["last_session_id"].as_str().map(|s| s.to_string()); | |
| 235 | + } | |
| 236 | + } | |
| 237 | + } | |
| 238 | + | |
| 239 | + pub fn save_last_session_id(&self, id: &str) { | |
| 240 | + let val = serde_json::json!({ "last_session_id": id }); | |
| 241 | + std::fs::create_dir_all(&self.data_dir).ok(); | |
| 242 | + if let Ok(content) = serde_json::to_string(&val) { | |
| 243 | + std::fs::write(self.state_path(), content).ok(); | |
| 244 | + } | |
| 245 | + } | |
| 223 | 246 | } |