@@ -159,6 +159,41 @@ pub fn get_projects_on_page(app_state: &tauri::State<AppState>, page: usize, per
159
159
Ok ( projects)
160
160
}
161
161
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
+
162
197
// commands
163
198
164
199
#[ tauri:: command]
@@ -181,26 +216,38 @@ pub async fn cmd_remove_missing_projects(app_handle: tauri::AppHandle, app_state
181
216
}
182
217
183
218
#[ 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 > {
185
220
if !Path :: new ( & project_path) . exists ( ) {
186
221
return Err ( errors:: io_not_found ( "Invalid project path" ) ) ;
187
222
}
188
223
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
+ }
193
229
}
194
230
195
- let mut project = load ( project_path) ?;
231
+ let mut project = load ( project_path. clone ( ) ) ?;
196
232
project. added_at = std:: time:: UNIX_EPOCH
197
233
. elapsed ( )
198
234
. unwrap_or ( std:: time:: Duration :: from_secs ( 0 ) )
199
235
. 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
+
204
251
Ok ( project)
205
252
}
206
253
@@ -237,32 +284,7 @@ pub async fn cmd_get_projects_on_page(app_state: tauri::State<'_, AppState>, pag
237
284
238
285
#[ tauri:: command]
239
286
pub 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) ?;
266
288
Ok ( ( ) )
267
289
}
268
290
0 commit comments