Skip to content

Commit bdbeb1b

Browse files
committed
Screenshot project name now uses the formatted filename template
1 parent 259c4e8 commit bdbeb1b

File tree

2 files changed

+52
-28
lines changed

2 files changed

+52
-28
lines changed

apps/desktop/src-tauri/src/recording.rs

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

apps/desktop/src/routes/(window-chrome)/settings/general.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -817,11 +817,12 @@ function DefaultProjectNameCard(props: {
817817
<div class="space-y-1">
818818
<p class="font-medium text-foreground">Recording Mode</p>
819819
<p>
820-
<CodeView>{"{recording_mode}"}</CodeView> → "Studio" or
821-
"Instant"
820+
<CodeView>{"{recording_mode}"}</CodeView> → "Studio", "Instant",
821+
or "Screenshot"
822822
</p>
823823
<p>
824-
<CodeView>{"{mode}"}</CodeView> → "studio" or "instant"
824+
<CodeView>{"{mode}"}</CodeView> → "studio", "instant", or
825+
"screenshot"
825826
</p>
826827
</div>
827828

0 commit comments

Comments
 (0)