@@ -159,6 +159,41 @@ pub fn get_projects_on_page(app_state: &tauri::State<AppState>, page: usize, per
159159 Ok ( projects)
160160}
161161
162+ pub fn update_project_open_time ( app_state : & tauri:: State < AppState > , project_path : PathBuf , app_handle : & tauri:: AppHandle ) -> Result < ( ) , errors:: AnyError > {
163+ let time = std:: time:: UNIX_EPOCH
164+ . elapsed ( )
165+ . unwrap_or ( std:: time:: Duration :: from_secs ( 0 ) ) ;
166+ let millis = time. as_millis ( ) ;
167+
168+ let mut projects = app_state. projects . lock ( )
169+ . map_err ( |_| errors:: str_error ( "Failed to get projects. Is it locked?" ) ) ?;
170+ let project = projects
171+ . iter_mut ( )
172+ . find ( |x| x. path == project_path)
173+ . ok_or ( errors:: str_error ( format ! ( "Project not found at {:?}" , project_path) . as_str ( ) ) ) ?;
174+ project. last_opened_at = millis;
175+
176+ app:: save_projects_to_disk ( & projects, & app_handle) ?;
177+
178+ Ok ( ( ) )
179+ }
180+
181+ pub fn open_project ( project_path : PathBuf , editor_version : String , app_state : & tauri:: State < AppState > , app_handle : & tauri:: AppHandle ) -> Result < ( ) , errors:: AnyError > {
182+ if !project_path. exists ( ) {
183+ return Err ( errors:: io_not_found ( "Invalid project path" ) ) ;
184+ }
185+
186+ let project_path_str = project_path. to_str ( )
187+ . ok_or ( errors:: str_error ( "Invalid project path" ) ) ?
188+ . to_string ( ) ;
189+
190+ let args = vec ! [ "-projectPath" . to_string( ) , project_path_str] ;
191+ crate :: editor:: open ( editor_version, args, & app_state, false ) ?;
192+
193+ update_project_open_time ( & app_state, project_path, & app_handle) ?;
194+ Ok ( ( ) )
195+ }
196+
162197// commands
163198
164199#[ tauri:: command]
@@ -181,26 +216,38 @@ pub async fn cmd_remove_missing_projects(app_handle: tauri::AppHandle, app_state
181216}
182217
183218#[ tauri:: command]
184- pub fn cmd_add_project ( project_path : PathBuf , app_handle : tauri:: AppHandle , app_state : tauri:: State < AppState > ) -> Result < Project , errors:: AnyError > {
219+ pub fn cmd_add_project ( project_path : PathBuf , and_open : bool , app_handle : tauri:: AppHandle , app_state : tauri:: State < AppState > ) -> Result < Project , errors:: AnyError > {
185220 if !Path :: new ( & project_path) . exists ( ) {
186221 return Err ( errors:: io_not_found ( "Invalid project path" ) ) ;
187222 }
188223
189- let mut projects = app_state. projects . lock ( )
190- . map_err ( |_| errors:: str_error ( "Failed to get projects. Is it locked?" ) ) ?;
191- if projects. iter ( ) . any ( |x| x. path == project_path) {
192- return Err ( errors:: str_error ( "Project already exists" ) ) ;
224+ {
225+ let projects = app:: get_projects ( & app_state) ?;
226+ if projects. iter ( ) . any ( |x| x. path == project_path) {
227+ return Err ( errors:: str_error ( "Project already exists" ) ) ;
228+ }
193229 }
194230
195- let mut project = load ( project_path) ?;
231+ let mut project = load ( project_path. clone ( ) ) ?;
196232 project. added_at = std:: time:: UNIX_EPOCH
197233 . elapsed ( )
198234 . unwrap_or ( std:: time:: Duration :: from_secs ( 0 ) )
199235 . as_millis ( ) ;
200- projects. insert ( 0 , project. clone ( ) ) ;
201-
202- app:: save_projects_to_disk ( & projects, & app_handle) ?;
203-
236+
237+ {
238+ let mut projects = app_state. projects . lock ( )
239+ . map_err ( |_| errors:: str_error ( "Failed to get projects. Is it locked?" ) ) ?;
240+ projects. insert ( 0 , project. clone ( ) ) ;
241+
242+ app:: save_projects_to_disk ( & projects, & app_handle) ?;
243+ }
244+
245+ if and_open {
246+ let editor_version = & project. version ;
247+ update_project_open_time ( & app_state, project_path. clone ( ) , & app_handle) ?;
248+ open_project ( project_path, editor_version. to_string ( ) , & app_state, & app_handle) ?;
249+ }
250+
204251 Ok ( project)
205252}
206253
@@ -237,32 +284,7 @@ pub async fn cmd_get_projects_on_page(app_state: tauri::State<'_, AppState>, pag
237284
238285#[ tauri:: command]
239286pub fn cmd_open_project_in_editor ( app_handle : tauri:: AppHandle , app_state : tauri:: State < AppState > , project_path : PathBuf , editor_version : String ) -> Result < ( ) , errors:: AnyError > {
240- if !project_path. exists ( ) {
241- return Err ( errors:: io_not_found ( "Invalid project path" ) ) ;
242- }
243-
244- let project_path_str = project_path. to_str ( )
245- . ok_or ( errors:: str_error ( "Invalid project path" ) ) ?
246- . to_string ( ) ;
247-
248- let args = vec ! [ "-projectPath" . to_string( ) , project_path_str] ;
249- crate :: editor:: open ( editor_version, args, & app_state, false ) ?;
250-
251- let time = std:: time:: UNIX_EPOCH
252- . elapsed ( )
253- . unwrap_or ( std:: time:: Duration :: from_secs ( 0 ) ) ;
254- let millis = time. as_millis ( ) ;
255-
256- let mut projects = app_state. projects . lock ( )
257- . map_err ( |_| errors:: str_error ( "Failed to get projects. Is it locked?" ) ) ?;
258- let project = projects
259- . iter_mut ( )
260- . find ( |x| x. path == project_path)
261- . ok_or ( errors:: str_error ( "Project not found" ) ) ?;
262- project. last_opened_at = millis;
263-
264- app:: save_projects_to_disk ( & projects, & app_handle) ?;
265-
287+ open_project ( project_path, editor_version, & app_state, & app_handle) ?;
266288 Ok ( ( ) )
267289}
268290
0 commit comments