Skip to content

Commit 446d0c6

Browse files
committed
[*] refactor: video-editor
1 parent 8d96aa2 commit 446d0c6

File tree

9 files changed

+274
-4
lines changed

9 files changed

+274
-4
lines changed

wayshot/src/logic.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ mod realtime_image_effect;
1818
mod recorder;
1919
mod share_screen;
2020
mod transcribe;
21+
mod video_editor;
2122

2223
pub fn init(ui: &AppWindow) {
2324
util::init(ui);
@@ -38,6 +39,7 @@ pub fn init(ui: &AppWindow) {
3839
realtime_image_effect::init(ui);
3940
transcribe::init(ui);
4041
downloader::init(ui);
42+
video_editor::init(ui);
4143
}
4244

4345
#[macro_export]

wayshot/src/logic/video_editor.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
mod common;
2+
mod project;
3+
4+
pub fn init(ui: &crate::slint_generatedAppWindow::AppWindow) {
5+
project::init(ui);
6+
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
use crate::slint_generatedAppWindow::{
2+
AppWindow, VideoEditorFilter as UIVideoEditorFilter,
3+
VideoEditorTrackType as UIVideoEditorTrackType,
4+
};
5+
use derivative::Derivative;
6+
use pmacro::SlintFromConvert;
7+
use serde::{Deserialize, Serialize};
8+
use slint::Model;
9+
10+
crate::impl_slint_enum_serde!(UIVideoEditorTrackType, Audio, Video, Subtitle, Overlay);
11+
12+
#[derive(Serialize, Deserialize, Debug, Clone, Derivative, SlintFromConvert)]
13+
#[derivative(Default)]
14+
#[from("UIVideoEditorFilter")]
15+
#[serde(default)]
16+
pub struct VideoEditorFilter {
17+
name: String,
18+
19+
#[vec(from = "filters")]
20+
filters: Vec<String>,
21+
}
22+
23+
// TODO:
24+
// pub struct VideoEditorTrackSegment {
25+
// hiding: bool,
26+
// duration: i32, // ms
27+
// timeline_offset: i32, // ms
28+
// source_offset: i32, // ms
29+
//
30+
// video_filters: [VideoEditorFilter],
31+
// audio_filters: [VideoEditorFilter],
32+
// subtitle_filters: [VideoEditorFilter],
33+
// overlay_filters: [VideoEditorFilter],
34+
//
35+
// left_screenshot: image,
36+
// right_screenshot: image,
37+
// preview_audio_channels: i32,
38+
// preview_audio_samples: [f32], // 只用于预览,可能经过重采样和平均化
39+
//
40+
// filters: [SegmentFilter], // 每个segment拥有的滤镜
41+
// }
42+
//
43+
// pub struct VideoEditorTrack {
44+
// locked: bool,
45+
// hiding: bool,
46+
// muted: bool,
47+
// name: String,
48+
// duration: i32, // ms
49+
// ty: VideoEditorTrackType,
50+
// segments: [VideoEditorTrackSegment],
51+
// }
52+
//
53+
// pub struct VideoEditorTracksManager {
54+
// duration: i32, // ms
55+
// tracks: [VideoEditorTrack],
56+
// }
57+
//
58+
// pub struct VideoEditorUIState {
59+
// enabled_link_track: bool,
60+
// enabled_link_all_tracks: bool,
61+
// enabled_snap_track_segments: bool,
62+
// tracks_height: String,
63+
// left_panel_width: String,
64+
// right_panel_width: String,
65+
// tracks_zoom_level: String,
66+
// preview_volumn: f32,
67+
// }
68+
//
69+
// pub struct VideoEditorPreviewConfig {
70+
// fps: Fps,
71+
// resolution: Resolution,
72+
// channels: AudioChannels,
73+
// sample_rate: AudioSampleRate,
74+
// }
75+
//
76+
// pub struct VideoEditorNewProjectConfig {
77+
// name: String,
78+
// preview_config: VideoEditorPreviewConfig,
79+
// }
80+
//
81+
// pub struct SelectedTrackIndex {
82+
// index: i32,
83+
// modifiers: KeyboardModifiers,
84+
// }
85+
//
86+
// pub struct SelectedSegmentIndex {
87+
// index: i32,
88+
// track_index: i32,
89+
// modifiers: KeyboardModifiers,
90+
// }
91+
//
92+
// pub struct VideoEditorPlaylistItem {
93+
// file_path: String,
94+
// name: String,
95+
// media_type: MediaType,
96+
// duration: String,
97+
// file_size: String,
98+
// thumbnail: image,
99+
// }
100+
//
101+
// pub struct VideoEditorExportQueueItem {
102+
// name: String,
103+
// media_type: MediaType,
104+
// progress: f32,
105+
// is_cancelled: bool,
106+
// }
107+
//
108+
// pub struct VideoEditorExportVideoConfig {
109+
// fps: Fps,
110+
// resolution: Resolution,
111+
// channels: AudioChannels,
112+
// sample_rate: AudioSampleRate,
113+
// }
114+
//
115+
// pub struct VideoEditorExportAudioConfig {
116+
// format: AudioFormat,
117+
// channels: AudioChannels,
118+
// sample_rate: AudioSampleRate,
119+
// }
120+
//
121+
// pub struct VideoEditorVolume {
122+
// left: f32,
123+
// right: f32,
124+
// }
125+
// pub enum SubtitleType {
126+
// Srt,
127+
// Vtt,
128+
// Ass,
129+
// }
130+
//
131+
// pub struct VideoEditorSubtitle {
132+
// start_timestamp: String,
133+
// end_timestamp: String,
134+
// subtitle: String,
135+
// }
136+
//
137+
// pub struct RecentEntry {
138+
// name: String,
139+
// path: String,
140+
// modify_at: String,
141+
// }
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use crate::{
2+
logic_cb,
3+
slint_generatedAppWindow::{
4+
AppWindow, VideoEditorNewProjectConfig as UIVideoEditorNewProjectConfig,
5+
},
6+
};
7+
use slint::ComponentHandle;
8+
9+
// #[macro_export]
10+
// macro_rules! store_camera_background_remover_models_dowloader {
11+
// ($ui:expr) => {
12+
// crate::global_store!($ui)
13+
// .get_camera_background_remover_models_dowloader()
14+
// .as_any()
15+
// .downcast_ref::<VecModel<UIDownloader>>()
16+
// .expect("We know we set a VecModel<UIDownloader> earlier")
17+
// };
18+
// }
19+
20+
pub fn init(ui: &AppWindow) {
21+
inner_init(&ui);
22+
23+
logic_cb!(video_editor_update_ui_state, ui);
24+
logic_cb!(video_editor_show_new_project_dialog, ui);
25+
logic_cb!(video_editor_new_project, ui, config);
26+
logic_cb!(video_editor_show_recent_dialog, ui);
27+
logic_cb!(video_editor_open_recent_project, ui, index);
28+
logic_cb!(video_editor_open_project, ui);
29+
logic_cb!(video_editor_open_file, ui);
30+
logic_cb!(video_editor_save_project, ui);
31+
logic_cb!(video_editor_save_as_project, ui);
32+
logic_cb!(video_editor_backup_project, ui);
33+
logic_cb!(video_editor_close_project, ui);
34+
}
35+
36+
fn inner_init(_ui: &AppWindow) {}
37+
38+
fn video_editor_update_ui_state(_ui: &AppWindow) {
39+
todo!()
40+
}
41+
42+
fn video_editor_show_new_project_dialog(_ui: &AppWindow) {
43+
todo!()
44+
}
45+
46+
fn video_editor_new_project(_ui: &AppWindow, _config: UIVideoEditorNewProjectConfig) {
47+
todo!()
48+
}
49+
50+
fn video_editor_show_recent_dialog(_ui: &AppWindow) {
51+
todo!()
52+
}
53+
54+
fn video_editor_open_recent_project(_ui: &AppWindow, _index: i32) {
55+
todo!()
56+
}
57+
58+
fn video_editor_open_project(_ui: &AppWindow) {
59+
todo!()
60+
}
61+
62+
fn video_editor_open_file(_ui: &AppWindow) {
63+
todo!()
64+
}
65+
66+
fn video_editor_save_project(_ui: &AppWindow) {
67+
todo!()
68+
}
69+
70+
fn video_editor_save_as_project(_ui: &AppWindow) {
71+
todo!()
72+
}
73+
74+
fn video_editor_backup_project(_ui: &AppWindow) {
75+
todo!()
76+
}
77+
78+
fn video_editor_close_project(_ui: &AppWindow) {
79+
todo!()
80+
}

wayshot/ui/desktop-window.slint

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ import {
1919
import { DesktopPanel } from "panel/desktop/desktop.slint";
2020

2121
export component AppWindow inherits Window {
22-
width: Theme.default-width;
23-
height: Theme.default-height;
24-
// preferred-width: Theme.default-width;
25-
// preferred-height: Theme.default-height;
22+
// width: Theme.default-width;
23+
// height: Theme.default-height;
24+
preferred-width: Theme.default-width;
25+
preferred-height: Theme.default-height;
2626
default-font-size: Theme.default-font-size;
2727
default-font-weight: Theme.normal-font-weight;
2828
default-font-family: Theme.default-font-family;

wayshot/ui/logic.slint

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ export global Logic {
264264
callback video-editor-save-as-project();
265265
callback video-editor-backup-project();
266266
callback video-editor-close-project();
267+
267268
callback video-editor-quit();
268269
callback video-editor-undo();
269270
callback video-editor-redo();
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ScrollView } from "std-widgets.slint";
2+
import {
3+
Store,
4+
Logic,
5+
Theme,
6+
Icons,
7+
} from "../../def.slint";
8+
import {
9+
Label,
10+
MovingDialog,
11+
NoMessageImg,
12+
} from "../../../base/widgets.slint";
13+
14+
export component MetadataDialog inherits MovingDialog {
15+
title: Logic.tr("metadata");
16+
icon: Icons.metadata-light;
17+
header-width: Theme.default-font-size * 20;
18+
19+
ScrollView {
20+
height: root.header-width;
21+
22+
VerticalLayout {
23+
padding: Theme.padding;
24+
alignment: start;
25+
26+
Label {
27+
text: "TODO";
28+
}
29+
}
30+
}
31+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { LeftPanel } from "left-panel/left-panel.slint";
1616
import { RightPanel } from "right-panel/right-panel.slint";
1717
import { NewProject } from "new-project.slint";
1818
import { RecentDialog } from "recent-dialog.slint";
19+
import { MetadataDialog } from "metadata-dialog.slint";
1920

2021
component Body inherits Rectangle {
2122
lp := LeftPanel {
@@ -172,6 +173,13 @@ export component VideoEditor inherits Rectangle {
172173
}
173174
}
174175

176+
if Store.video-editor-is-show-metadata-dialog: MetadataDialog {
177+
close => {
178+
Store.video-editor-is-show-metadata-dialog = false;
179+
fs.focus();
180+
}
181+
}
182+
175183
if Store.video-editor-is-show-recent-dialog: RecentDialog {
176184
close => {
177185
Store.video-editor-is-show-recent-dialog = false;

wayshot/ui/store.slint

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ export global Store {
640640
in-out property <KeyboardModifiers> video-editor-keyboard-modifiers;
641641
in-out property <bool> video-editor-is-show-new-project-dialog;
642642
in-out property <bool> video-editor-is-show-recent-dialog;
643+
in-out property <bool> video-editor-is-show-metadata-dialog;
643644
in-out property <bool> video-editor-is-unsaved;
644645
in-out property <bool> video-editor-is-previewing;
645646
in-out property <int> video-editor-timeline-offset; // floor(mod(animation-tick(), 10s) / 10s * 100000);

0 commit comments

Comments
 (0)