Skip to content

Commit 14eafde

Browse files
committed
[*] refactor: video-editor
1 parent 9db94b1 commit 14eafde

File tree

12 files changed

+70
-50
lines changed

12 files changed

+70
-50
lines changed

lib/video-editor/src/tracks/track.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ impl Track {
279279
segment.timeline_offset.checked_add(amount).ok_or_else(|| {
280280
Error::InvalidConfig("Timeline offset overflow after shifting".to_string())
281281
})?;
282+
track.update_duration();
282283
}
283284
Track::Audio(track) => {
284285
let track = Arc::make_mut(track);
@@ -287,6 +288,7 @@ impl Track {
287288
segment.timeline_offset.checked_add(amount).ok_or_else(|| {
288289
Error::InvalidConfig("Timeline offset overflow after shifting".to_string())
289290
})?;
291+
track.update_duration();
290292
}
291293
Track::Subtitle(track) => {
292294
let track = Arc::make_mut(track);
@@ -295,6 +297,7 @@ impl Track {
295297
segment.timeline_offset.checked_add(amount).ok_or_else(|| {
296298
Error::InvalidConfig("Timeline offset overflow after shifting".to_string())
297299
})?;
300+
track.update_duration();
298301
}
299302
Track::Overlay(track) => {
300303
let track = Arc::make_mut(track);
@@ -303,6 +306,7 @@ impl Track {
303306
segment.timeline_offset.checked_add(amount).ok_or_else(|| {
304307
Error::InvalidConfig("Timeline offset overflow after shifting".to_string())
305308
})?;
309+
track.update_duration();
306310
}
307311
}
308312
Ok(())
@@ -321,6 +325,7 @@ impl Track {
321325
segment.timeline_offset.checked_sub(amount).ok_or_else(|| {
322326
Error::InvalidConfig("Timeline offset underflow after shifting".to_string())
323327
})?;
328+
track.update_duration();
324329
}
325330
Track::Audio(track) => {
326331
let track = Arc::make_mut(track);
@@ -329,6 +334,7 @@ impl Track {
329334
segment.timeline_offset.checked_sub(amount).ok_or_else(|| {
330335
Error::InvalidConfig("Timeline offset underflow after shifting".to_string())
331336
})?;
337+
track.update_duration();
332338
}
333339
Track::Subtitle(track) => {
334340
let track = Arc::make_mut(track);
@@ -337,6 +343,7 @@ impl Track {
337343
segment.timeline_offset.checked_sub(amount).ok_or_else(|| {
338344
Error::InvalidConfig("Timeline offset underflow after shifting".to_string())
339345
})?;
346+
track.update_duration();
340347
}
341348
Track::Overlay(track) => {
342349
let track = Arc::make_mut(track);
@@ -345,6 +352,7 @@ impl Track {
345352
segment.timeline_offset.checked_sub(amount).ok_or_else(|| {
346353
Error::InvalidConfig("Timeline offset underflow after shifting".to_string())
347354
})?;
355+
track.update_duration();
348356
}
349357
}
350358
Ok(())
@@ -724,6 +732,7 @@ impl Track {
724732
}
725733
}
726734

735+
Self::update_track_duration(self);
727736
Ok(())
728737
}
729738

@@ -744,6 +753,7 @@ impl Track {
744753
}
745754
}
746755

756+
Self::update_track_duration(self);
747757
Ok(())
748758
}
749759

lib/video-editor/tests/commands_test.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ fn create_test_track() -> Track {
7878
name: String::default(),
7979
hiding: false,
8080
muted: false,
81-
track: InnerTrack {
82-
metadata: create_test_metadata(),
83-
duration: Duration::from_secs(10),
84-
segments: vec![create_test_segment(Duration::ZERO, Duration::from_secs(10))],
85-
},
81+
track: InnerTrack::new(
82+
create_test_metadata(),
83+
Duration::from_secs(10),
84+
vec![create_test_segment(Duration::ZERO, Duration::from_secs(10))],
85+
),
8686
}))
8787
}
8888

@@ -94,11 +94,11 @@ fn create_test_track_with_two_segments() -> Track {
9494
name: String::default(),
9595
hiding: false,
9696
muted: false,
97-
track: InnerTrack {
98-
metadata: create_test_metadata(),
99-
duration: Duration::from_secs(10),
100-
segments: vec![seg1, seg2],
101-
},
97+
track: InnerTrack::new(
98+
create_test_metadata(),
99+
Duration::from_secs(10),
100+
vec![seg1, seg2],
101+
),
102102
}))
103103
}
104104

lib/video-editor/tests/track_operations_test.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ fn create_test_track() -> Track {
4747
name: String::default(),
4848
hiding: false,
4949
muted: false,
50-
track: InnerTrack {
51-
metadata: create_test_metadata(),
52-
duration: Duration::from_secs(10),
53-
segments: vec![create_test_segment(Duration::ZERO, Duration::from_secs(10))],
54-
},
50+
track: InnerTrack::new(
51+
create_test_metadata(),
52+
Duration::from_secs(10),
53+
vec![create_test_segment(Duration::ZERO, Duration::from_secs(10))],
54+
),
5555
}))
5656
}
5757

@@ -61,11 +61,11 @@ fn create_empty_track() -> Track {
6161
name: String::default(),
6262
hiding: false,
6363
muted: false,
64-
track: InnerTrack {
65-
metadata: create_test_metadata(),
66-
duration: Duration::ZERO,
67-
segments: vec![],
68-
},
64+
track: InnerTrack::new(
65+
create_test_metadata(),
66+
Duration::ZERO,
67+
vec![],
68+
),
6969
}))
7070
}
7171

todo.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
## 问题
22
- 导出配置应该记住上一次导出的配置
3-
- 联动模式下,向右移动非最后一个segment,manager的时间没有正确更新
4-
- 跳转到上一个segment功能有问题,会跳转到第一个segment开始
5-
- 移动segment时,不应该保证playhead在可是区域。原因是调用了seek操作,刷新了flag,进行了回调。可以检测playhead.x变化来进行回调
63
- playhead 在轨道中的中线长度有问题,如果轨道可以垂直轨道,中线上半部分会消失
74
- 粘贴时如果playhead下没有segment,而且被粘贴的segment和后续的segment重合。如果启用了联动则,移动后续的segment,给被粘贴的segment挪位置。如果没有启动联动,则减少当前segment的长度,使其贴合下一个segment
85
- 双击添加字幕轨道和overlay文件时, 轨道 应该放到最上方
9-
- 轨道头中,分离轨道,只能在视频轨道中启动,字幕轨道不应该启用
106
- 分离音频后,原来轨道segment应该刷新UI显示,不应该显示声波
117
- file -> close后,媒体库无法使用
128
- file -> recent 弹框,没有历史应该显示:图片+文字
13-
- 新建项目的toast应该显示扩展名
149
- file -> close 关闭项目会丢失最近历史。重启程序,最近历史也没有了
1510

1611
- 两个相近的segment,中间有gap时,从前一个segment播放,到后一个segment开始部分画面会出现错乱
@@ -22,9 +17,10 @@
2217
- 轨道声音混合效果有问题,而且逻辑也有问题。没有重合部分声音也减低了
2318
- 字幕轨道有问题,添加字幕是没有按照字幕条目进行分割成segment,而且UI上也没有显示字幕文字
2419
- 联动模式下,如果改变一个segment的大小,后面的segment在UI上没有同步移动。等到松开鼠标才更新位置,不利于操作
25-
- 轨道列表要考虑下方的横向滚动条,添加更多的空间,可以改成总是显示更合适
2620

2721
## 待验证
22+
- 轨道头中,分离字幕轨道,只能在视频轨道中启动,字幕轨道不应该启用
23+
- 移动segment时,不应该保证playhead在可是区域。原因是调用了seek操作,刷新了flag,进行了回调。可以检测playhead.x变化来进行回调
2824

2925
- 分离字幕
3026

wayshot/src/logic/video_editor/preview.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ fn video_editor_preview_jump_previous_segment(ui: &AppWindow) {
7070
let mut prev_start = None;
7171

7272
'out: for track in state.tracks_manager.iter() {
73-
for segment in track.segments() {
73+
for segment in track.segments().iter().rev() {
7474
if segment.timeline_offset < current_position {
7575
prev_start = Some(segment.timeline_offset);
7676
break 'out;
@@ -287,10 +287,6 @@ pub fn seek_to_position(ui: &AppWindow, position: Duration) {
287287
return;
288288
}
289289

290-
global_store!(ui).set_video_editor_preivew_timeline_thumbnial_flag(
291-
!global_store!(ui).get_video_editor_preivew_timeline_thumbnial_flag(),
292-
);
293-
294290
if let Some(frame) = renderer.current_frame() {
295291
let img = rgba_image_to_slint(&frame);
296292
global_store!(ui).set_video_editor_preview_image(img);

wayshot/src/logic/video_editor/project.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,10 @@ fn video_editor_new_project(ui: &AppWindow, config: UIVideoEditorNewProjectConfi
234234

235235
let mut path = dir.join(config.name.clone());
236236
path.set_extension(PROJECT_EXT);
237-
let project_name = config.name.clone();
237+
let project_name = path
238+
.file_name()
239+
.map(|f| f.to_string_lossy().to_string())
240+
.unwrap_or_else(|| config.name.to_string());
238241
let preview_config: ProjectPreviewConfig = config.preview_config.clone().into();
239242

240243
let (manager, playlist) = {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ component SettingPanle inherits SettingDetail {
3636
};
3737
}
3838

39+
fs-timer := Timer {
40+
interval: 300ms;
41+
running: true;
42+
triggered() => {
43+
name-li.focus();
44+
self.running = false;
45+
}
46+
}
47+
3948
SettingDetailInner {
4049
SettingDetailInnerVbox {
4150
SettingDetailLabel {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export component TrackHead inherits Rectangle {
7979
user-data: index,
8080
},
8181
{
82-
disable: !Logic.video-editor-contain-subtitle-track(index),
82+
disable: !Logic.video-editor-contain-subtitle-track(index) || Logic.video-editor-is-subtitle-track(index),
8383
icon: Icons.detach2-light,
8484
text: Logic.tr("Detach Subtitle Track"),
8585
action: "video-editor-detach-subtitle-track",

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ component Segment inherits Rectangle {
100100
private property <int> display-duration: is-active-drag ? Store.video-editor-drag-preview-duration : segment.duration;
101101

102102
public function start-drag() {
103-
Store.video-editor-segment-is-dragging = true;
104103
Store.video-editor-drag-segment-uuid = root.segment.uuid;
105104
Store.video-editor-drag-segment-track-index = root.track-index;
106105
Store.video-editor-drag-segment-index = root.index;
@@ -196,11 +195,14 @@ component Segment inherits Rectangle {
196195
ta := TouchArea {
197196
mouse-cursor: track-locked ? MouseCursor.not-allowed : MouseCursor.move;
198197

198+
private property <bool> right-button-pressed;
199+
199200
pointer-event(event) => {
200201
if (track-locked) {
201202
return;
202203
}
203204
if (event.button == PointerEventButton.right) {
205+
right-button-pressed = true;
204206
PopupActionSetting.show(self.absolute-position.x + self.mouse-x, self.absolute-position.y + self.mouse-y, segment-action-entries);
205207
} else if (event.button == PointerEventButton.left) {
206208
if (event.kind == PointerEventKind.down) {
@@ -219,6 +221,8 @@ component Segment inherits Rectangle {
219221
}
220222

221223
clicked => {
224+
right-button-pressed = false;
225+
222226
if (Store.video-editor-segment-is-dragging) {
223227
return;
224228
}
@@ -236,7 +240,7 @@ component Segment inherits Rectangle {
236240
}
237241

238242
moved => {
239-
if (track-locked) {
243+
if (track-locked || right-button-pressed) {
240244
return;
241245
}
242246
// 使用绝对位置计算增量,避免因 segment 位置变化导致的抖动

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export component Timeline inherits Rectangle {
3939
Store.video-editor-timeline-flag = !Store.video-editor-timeline-flag;
4040
}
4141

42+
changed playhead-x => {
43+
update-preview-timeline-offset();
44+
}
45+
4246
public function playhead-in-viewport() -> bool {
4347
return abs(flick.viewport-x) - playhead.handle-width / 2 < playhead.x && playhead.x < abs(flick.viewport-x) + flick.width;
4448
}

0 commit comments

Comments
 (0)