Skip to content

Commit 8686269

Browse files
committed
[*] refactor: video-editor
1 parent b6d6286 commit 8686269

File tree

9 files changed

+81
-33
lines changed

9 files changed

+81
-33
lines changed

lib/record-audio/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,8 @@ impl AudioRecorder {
283283
.map_err(|e| AudioRecorderError::StreamCreation(e.to_string()))?;
284284

285285
for device in devices {
286-
if let Ok(desc) = device.description()
287-
&& desc.name() == name
286+
if let Ok(id) = device.id()
287+
&& id.to_string() == name
288288
{
289289
let supported_config = device
290290
.default_input_config()

todo.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33

44
## 待验证
55
- 视频轨道分离字幕
6-
- 添加录音功能,录音文件需要添加到playlist中。录音UI可以选择设备和保存目录
7-
86

97
## 待实现功能
108
- playlist和library支持编辑移除

wayshot/src/logic/video_editor/command.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ use super::{
55
};
66
use crate::{
77
global_store, logic_cb,
8-
slint_generatedAppWindow::{
9-
AppWindow, SelectedSegmentIndex as UISelectedSegmentIndex,
10-
VideoEditorTracksManager as UIVideoEditorTracksManager,
11-
},
8+
slint_generatedAppWindow::{AppWindow, SelectedSegmentIndex as UISelectedSegmentIndex},
129
};
1310
use slint::{ComponentHandle, Model, VecModel};
1411
use std::{
@@ -542,14 +539,21 @@ fn get_selected_segments(ui: &AppWindow) -> Vec<ClipboardSegment> {
542539
}
543540

544541
pub fn sync_manager_to_ui(ui: &AppWindow) {
545-
let ui_manager: UIVideoEditorTracksManager = with_history_manager(|state| {
542+
let (new_duration, ui_manager) = with_history_manager(|state| {
546543
if let Some(ref autosave) = state.autosave_manager {
547544
autosave.mark_dirty();
548545
}
549546

550-
state.tracks_manager.clone().into()
547+
let manager = state.tracks_manager.clone();
548+
(manager.duration, manager.into())
551549
});
552550

551+
let current_offset = global_store!(ui).get_video_editor_timeline_offset();
552+
let new_offset_ms = new_duration.as_millis() as i32;
553+
if current_offset > new_offset_ms {
554+
global_store!(ui).set_video_editor_timeline_offset(new_offset_ms);
555+
}
556+
553557
global_store!(ui).set_video_editor_tracks_manager(ui_manager);
554558
global_store!(ui).set_video_editor_is_unsaved(true);
555559
}

wayshot/src/logic/video_editor/playlist.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -153,18 +153,20 @@ pub fn async_add_item_to_track(ui_weak: Weak<AppWindow>, name: String, file_path
153153
}
154154
};
155155

156-
let (segment_index, segment_uuid, inserted_track_index) =
157-
if let Some(track_index) = created_track_index {
158-
let track = tracks_manager
159-
.get(track_index)
160-
.expect("already crate a new track");
161-
let segment = track
162-
.segments()
163-
.first()
164-
.expect("already add segment to the track");
165-
(0, segment.uuid.clone(), track_index)
166-
} else {
167-
let track_index = current_track_index.max(0) as usize;
156+
let (segment_index, segment_uuid, inserted_track_index) = if let Some(track_index) =
157+
created_track_index
158+
{
159+
let track = tracks_manager
160+
.get(track_index)
161+
.expect("already crate a new track");
162+
let segment = track
163+
.segments()
164+
.first()
165+
.expect("already add segment to the track");
166+
(0, segment.uuid.clone(), track_index)
167+
} else {
168+
let track_index = current_track_index.max(0) as usize;
169+
let (segment_index, segment_uuid) = {
168170
let Some(track) = tracks_manager.get_mut(track_index) else {
169171
crate::toast_warn!(ui, "Already found the edited track. But no found");
170172
return;
@@ -183,8 +185,11 @@ pub fn async_add_item_to_track(ui_weak: Weak<AppWindow>, name: String, file_path
183185
));
184186
track.add_segment(segment.clone());
185187
let segment_index = track.segments_count() - 1;
186-
(segment_index, segment.uuid.clone(), track_index)
188+
(segment_index, segment.uuid.clone())
187189
};
190+
tracks_manager.update_duration();
191+
(segment_index, segment_uuid, track_index)
192+
};
188193

189194
{
190195
let mut state = PROJECT_STATE.lock().unwrap();

wayshot/src/logic/video_editor/segment.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ macro_rules! store_video_editor_tracks_manager_track_segment {
4040

4141
pub fn init(ui: &AppWindow) {
4242
logic_cb!(video_editor_add_selected_segment, ui, index);
43+
logic_cb!(video_editor_select_all_segments, ui);
4344
logic_cb!(video_editor_remove_segments, ui);
4445
logic_cb!(video_editor_linked_remove_segments, ui);
4546
logic_cb!(video_editor_split_segment, ui);
@@ -133,6 +134,33 @@ fn video_editor_add_selected_segment(ui: &AppWindow, index: UISelectedSegmentInd
133134
store_video_editor_selected_segments_index!(ui).set_vec(selected_indices);
134135
}
135136

137+
fn video_editor_select_all_segments(ui: &AppWindow) {
138+
let all_segments: Vec<UISelectedSegmentIndex> = with_history_manager(|state| {
139+
let mut result = Vec::new();
140+
141+
for (track_idx, track) in state.tracks_manager.iter().enumerate() {
142+
let segments_len = match track {
143+
Track::Video(inner) => inner.track.segments.len(),
144+
Track::Audio(inner) => inner.track.segments.len(),
145+
Track::Subtitle(inner) => inner.track.segments.len(),
146+
Track::Overlay(inner) => inner.track.segments.len(),
147+
};
148+
149+
for seg_idx in 0..segments_len {
150+
result.push(UISelectedSegmentIndex {
151+
track_index: track_idx as i32,
152+
index: seg_idx as i32,
153+
modifiers: Default::default(),
154+
});
155+
}
156+
}
157+
158+
result
159+
});
160+
161+
store_video_editor_selected_segments_index!(ui).set_vec(all_segments);
162+
}
163+
136164
fn video_editor_is_selected_segment(
137165
_ui: &AppWindow,
138166
selected_segment: ModelRc<UISelectedSegmentIndex>,

wayshot/ui/logic.slint

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ export global Logic {
330330
pure callback video-editor-is-selected-track(selected-tracks: [SelectedTrackIndex], index: int, _falg: bool) -> bool;
331331

332332
callback video-editor-add-selected-segment(index: SelectedSegmentIndex);
333+
callback video-editor-select-all-segments();
333334
callback video-editor-remove-segments();
334335
callback video-editor-linked-remove-segments();
335336
callback video-editor-split-segment();

wayshot/ui/panel/desktop/video-editor/record-audio-dialog.slint

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ export component RecordAudioDialog inherits MovingDialog {
2626
private property record-duration <=> Store.video-editor-record-audio-duration;
2727
private property <VideoEditorRecordAudioConfig> cache-config <=> Store.video-editor-record-audio-config;
2828

29+
public function stop() {
30+
record-duration = 0;
31+
Logic.video-editor-stop-recording-audio();
32+
}
33+
2934
out-vbox := VerticalLayout {
3035
padding: Theme.padding * 2;
3136
spacing: Theme.spacing * 4;
@@ -84,8 +89,7 @@ export component RecordAudioDialog inherits MovingDialog {
8489
width: vbox.preferred-height;
8590

8691
clicked => {
87-
record-duration = 0;
88-
Logic.video-editor-stop-recording-audio();
92+
root.stop();
8993
}
9094
}
9195
}

wayshot/ui/panel/desktop/video-editor/tracks/timeline.slint

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,25 @@ export component Timeline inherits Rectangle {
5151
background: Theme.table-item-second;
5252

5353
HorizontalLayout {
54-
HorizontalLayout {
55-
padding-left: Theme.padding * 2;
54+
Rectangle {
5655
width: header-width;
56+
HorizontalLayout {
57+
alignment: start;
58+
padding-left: Theme.padding * 2;
5759

58-
ouput-lb := Label {
59-
text: Logic.tr("Tracks");
60-
}
60+
ouput-lb := Label {
61+
text: Logic.tr("Tracks");
62+
}
6163

62-
Label {
63-
text: "(" + Store.video-editor-tracks-manager.tracks.length + ")";
64-
color: Theme.placeholder-text-color;
64+
Label {
65+
text: "(" + Store.video-editor-tracks-manager.tracks.length + ")";
66+
color: Theme.placeholder-text-color;
67+
}
6568
}
6669

6770
TouchArea {
71+
mouse-cursor: MouseCursor.pointer;
72+
6873
clicked => {
6974
Logic.video-editor-select-all-tracks();
7075
}

wayshot/ui/panel/desktop/video-editor/video-editor.slint

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ export component VideoEditor inherits Rectangle {
132132
} else if (event.text == "l") {
133133
Store.video-editor-ui-state.enabled-link-track = !Store.video-editor-ui-state.enabled-link-track;
134134
Logic.video-editor-update-ui-state();
135+
} else if (event.text == "a") {
136+
Logic.video-editor-select-all-segments();
135137
}
136138
}
137139
} else if (event.modifiers.alt) {
@@ -225,6 +227,7 @@ export component VideoEditor inherits Rectangle {
225227

226228
if Store.video-editor-is-show-record-audio-dialog: RecordAudioDialog {
227229
close => {
230+
self.stop();
228231
Store.video-editor-is-show-record-audio-dialog = false;
229232
fs.focus();
230233
}

0 commit comments

Comments
 (0)