irongit

feat: open last session

huncholanehuncholaneauthored
parent 5e0f0aecommit 9dc3fce5364ad935dbe1428ff1167fd443e1db2dBrowse files

2 files changed, +38 -6

+15-6src/app.rs
@@ -210,7 +210,14 @@ impl JvApp {
210210 let session = manager.create_session("Default Session");
211211 Some(LoadedSession::new(session))
212212 } 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+ };
214221 Some(LoadedSession::new(session))
215222 };
216223
@@ -343,6 +350,7 @@ impl JvApp {
343350 for (i, name) in session_names.iter().enumerate() {
344351 if ui.selectable_label(name == &current_name, name).clicked() {
345352 let session = self.session_manager.sessions[i].clone();
353+ self.session_manager.save_last_session_id(&session.id);
346354 self.current_session = Some(LoadedSession::new(session));
347355 self.selected_file_index = 0;
348356 self.rebuild_schema();
@@ -361,13 +369,13 @@ impl JvApp {
361369 if let Some(loaded) = &self.current_session {
362370 let id = loaded.session.id.clone();
363371 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")
367374 } else {
368- let s = self.session_manager.sessions[0].clone();
369- Some(LoadedSession::new(s))
375+ self.session_manager.sessions[0].clone()
370376 };
377+ self.session_manager.save_last_session_id(&new_session.id);
378+ self.current_session = Some(LoadedSession::new(new_session));
371379 self.selected_file_index = 0;
372380 self.rebuild_schema();
373381 }
@@ -1149,6 +1157,7 @@ impl eframe::App for JvApp {
11491157 let session = self
11501158 .session_manager
11511159 .create_session(&self.new_session_name);
1160+ self.session_manager.save_last_session_id(&session.id);
11521161 self.current_session = Some(LoadedSession::new(session));
11531162 self.selected_file_index = 0;
11541163 self.new_session_name.clear();
+23-0src/session.rs
@@ -148,6 +148,7 @@ impl Session {
148148 pub struct SessionManager {
149149 pub sessions: Vec<Session>,
150150 data_dir: PathBuf,
151+ pub last_session_id: Option<String>,
151152 }
152153
153154 impl SessionManager {
@@ -159,8 +160,10 @@ impl SessionManager {
159160 let mut manager = Self {
160161 sessions: Vec::new(),
161162 data_dir,
163+ last_session_id: None,
162164 };
163165 manager.load_sessions();
166+ manager.load_last_session_id();
164167 manager
165168 }
166169
@@ -220,4 +223,24 @@ impl SessionManager {
220223 *existing = session.clone();
221224 }
222225 }
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+ }
223246 }