@@ -462,16 +462,17 @@ pub async fn start_recording(
462462
463463 let recordings_base_dir = app. path ( ) . app_data_dir ( ) . unwrap ( ) . join ( "recordings" ) ;
464464
465- let recording_dir = recordings_base_dir. join ( & cap_utils:: ensure_unique_filename (
465+ let project_file_path = recordings_base_dir. join ( & cap_utils:: ensure_unique_filename (
466466 & filename,
467467 & recordings_base_dir,
468468 ) ?) ;
469469
470- ensure_dir ( & recording_dir) . map_err ( |e| format ! ( "Failed to create recording directory: {e}" ) ) ?;
470+ ensure_dir ( & project_file_path)
471+ . map_err ( |e| format ! ( "Failed to create recording directory: {e}" ) ) ?;
471472 state_mtx
472473 . write ( )
473474 . await
474- . add_recording_logging_handle ( & recording_dir . join ( "recording-logs.log" ) )
475+ . add_recording_logging_handle ( & project_file_path . join ( "recording-logs.log" ) )
475476 . await ?;
476477
477478 if let Some ( window) = CapWindowId :: Camera . get ( & app) {
@@ -528,7 +529,7 @@ pub async fn start_recording(
528529
529530 let meta = RecordingMeta {
530531 platform : Some ( Platform :: default ( ) ) ,
531- project_path : recording_dir . clone ( ) ,
532+ project_path : project_file_path . clone ( ) ,
532533 pretty_name : project_name. clone ( ) ,
533534 inner : match inputs. mode {
534535 RecordingMode :: Studio => {
@@ -619,7 +620,7 @@ pub async fn start_recording(
619620 let actor_task = {
620621 let state_mtx = Arc :: clone ( & state_mtx) ;
621622 let general_settings = general_settings. cloned ( ) ;
622- let recording_dir = recording_dir . clone ( ) ;
623+ let recording_dir = project_file_path . clone ( ) ;
623624 let inputs = inputs. clone ( ) ;
624625 async move {
625626 fail ! ( "recording::spawn_actor" ) ;
@@ -844,15 +845,25 @@ pub async fn start_recording(
844845 Ok ( Ok ( rx) ) => rx,
845846 Ok ( Err ( err) ) => {
846847 let message = format ! ( "{err:#}" ) ;
847- handle_spawn_failure ( & app, & state_mtx, recording_dir. as_path ( ) , message. clone ( ) )
848- . await ?;
848+ handle_spawn_failure (
849+ & app,
850+ & state_mtx,
851+ project_file_path. as_path ( ) ,
852+ message. clone ( ) ,
853+ )
854+ . await ?;
849855 return Err ( message) ;
850856 }
851857 Err ( panic) => {
852858 let panic_msg = panic_message ( panic) ;
853859 let message = format ! ( "Failed to spawn recording actor: {panic_msg}" ) ;
854- handle_spawn_failure ( & app, & state_mtx, recording_dir. as_path ( ) , message. clone ( ) )
855- . await ?;
860+ handle_spawn_failure (
861+ & app,
862+ & state_mtx,
863+ project_file_path. as_path ( ) ,
864+ message. clone ( ) ,
865+ )
866+ . await ?;
856867 return Err ( message) ;
857868 }
858869 } ;
@@ -893,7 +904,7 @@ pub async fn start_recording(
893904 dialog. blocking_show ( ) ;
894905
895906 // this clears the current recording for us
896- handle_recording_end ( app, Err ( e. to_string ( ) ) , & mut state, recording_dir )
907+ handle_recording_end ( app, Err ( e. to_string ( ) ) , & mut state, project_file_path )
897908 . await
898909 . ok ( ) ;
899910 }
@@ -1110,6 +1121,19 @@ pub async fn take_screenshot(
11101121 use image:: ImageEncoder ;
11111122 use std:: time:: Instant ;
11121123
1124+ let general_settings = GeneralSettingsStore :: get ( & app) . ok ( ) . flatten ( ) ;
1125+ let general_settings = general_settings. as_ref ( ) ;
1126+
1127+ let project_name = format_project_name (
1128+ general_settings
1129+ . and_then ( |s| s. default_project_name_template . clone ( ) )
1130+ . as_deref ( ) ,
1131+ target. title ( ) . as_deref ( ) . unwrap_or ( "Unknown" ) ,
1132+ target. kind_str ( ) ,
1133+ RecordingMode :: Screenshot ,
1134+ None ,
1135+ ) ;
1136+
11131137 let image = capture_screenshot ( target)
11141138 . await
11151139 . map_err ( |e| format ! ( "Failed to capture screenshot: {e}" ) ) ?;
@@ -1118,23 +1142,22 @@ pub async fn take_screenshot(
11181142 let image_height = image. height ( ) ;
11191143 let image_data = image. into_raw ( ) ;
11201144
1121- let screenshots_dir = app. path ( ) . app_data_dir ( ) . unwrap ( ) . join ( "screenshots" ) ;
1145+ let filename = project_name. replace ( ":" , "." ) ;
1146+ let filename = format ! ( "{}.cap" , sanitize_filename:: sanitize( & filename) ) ;
11221147
1123- std :: fs :: create_dir_all ( & screenshots_dir ) . map_err ( |e| e . to_string ( ) ) ? ;
1148+ let screenshots_base_dir = app . path ( ) . app_data_dir ( ) . unwrap ( ) . join ( "screenshots" ) ;
11241149
1125- let date_time = if cfg ! ( windows) {
1126- chrono:: Local :: now ( ) . format ( "%Y-%m-%d %H.%M.%S" )
1127- } else {
1128- chrono:: Local :: now ( ) . format ( "%Y-%m-%d %H:%M:%S" )
1129- } ;
1150+ let project_file_path = screenshots_base_dir. join ( & cap_utils:: ensure_unique_filename (
1151+ & filename,
1152+ & screenshots_base_dir,
1153+ ) ?) ;
11301154
1131- let id = uuid:: Uuid :: new_v4 ( ) . to_string ( ) ;
1132- let cap_dir = screenshots_dir. join ( format ! ( "{id}.cap" ) ) ;
1133- std:: fs:: create_dir_all ( & cap_dir) . map_err ( |e| e. to_string ( ) ) ?;
1155+ ensure_dir ( & project_file_path)
1156+ . map_err ( |e| format ! ( "Failed to create screenshots directory: {e}" ) ) ?;
11341157
11351158 let image_filename = "original.png" ;
1136- let image_path = cap_dir . join ( image_filename) ;
1137- let cap_dir_key = cap_dir . to_string_lossy ( ) . to_string ( ) ;
1159+ let image_path = project_file_path . join ( image_filename) ;
1160+ let cap_dir_key = project_file_path . to_string_lossy ( ) . to_string ( ) ;
11381161
11391162 let pending_screenshots = app. state :: < PendingScreenshots > ( ) ;
11401163 pending_screenshots. insert (
@@ -1164,8 +1187,8 @@ pub async fn take_screenshot(
11641187
11651188 let meta = cap_project:: RecordingMeta {
11661189 platform : Some ( Platform :: default ( ) ) ,
1167- project_path : cap_dir . clone ( ) ,
1168- pretty_name : format ! ( "Screenshot {}" , date_time ) ,
1190+ project_path : project_file_path . clone ( ) ,
1191+ pretty_name : project_name ,
11691192 sharing : None ,
11701193 inner : cap_project:: RecordingMetaInner :: Studio (
11711194 cap_project:: StudioRecordingMeta :: SingleSegment { segment } ,
@@ -1177,7 +1200,7 @@ pub async fn take_screenshot(
11771200 . map_err ( |e| format ! ( "Failed to save recording meta: {e}" ) ) ?;
11781201
11791202 cap_project:: ProjectConfiguration :: default ( )
1180- . write ( & cap_dir )
1203+ . write ( & project_file_path )
11811204 . map_err ( |e| format ! ( "Failed to save project config: {e}" ) ) ?;
11821205
11831206 let is_large_capture = ( image_width as u64 ) . saturating_mul ( image_height as u64 ) > 8_000_000 ;
0 commit comments