Skip to content

Commit 55be254

Browse files
committed
[*] refactor video editor
1 parent 6389066 commit 55be254

File tree

10 files changed

+184
-105
lines changed

10 files changed

+184
-105
lines changed

Cargo.toml

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
[workspace]
22
resolver = "3"
33
exclude = ["lib/gpt-sovits"]
4+
default-members = ["wayshot"]
45
members = ["wayshot", "wayshot-cursor", "tr-helper", "icon-helper", "lib/*"]
56

67
[workspace.package]
7-
license = "MIT"
8+
license = "GPLv3"
89
edition = "2024"
910
version = "0.1.0"
1011
readme = "README.md"
1112
authors = ["Heng30 <[email protected]>"]
12-
keywords = ["Rust", "GUI", "Wayland", "Linux", "wlr"]
13+
keywords = [
14+
"Rust",
15+
"GUI",
16+
"Wayland",
17+
"Linux",
18+
"wlr",
19+
"share screen",
20+
"video editor",
21+
"push stream",
22+
"STT",
23+
]
1324
homepage = "https://github.com/Heng30/wayshot"
1425
repository = "https://github.com/Heng30/wayshot"
15-
description = "It's a screen recorder."
26+
description = "It's a screen recorder, video editor, share screen tool and push stream tool."
1627

1728
[profile.dev]
1829
lto = false

wayshot/src/logic/video_editor/conversion.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::slint_generatedAppWindow::{
1313
VideoEditorTrack as UIVideoEditorTrack, VideoEditorTrackSegment as UIVideoEditorTrackSegment,
1414
VideoEditorTrackType as UIVideoEditorTrackType,
1515
VideoEditorTracksManager as UIVideoEditorTracksManager, VideoPreviewSize as UIVideoPreviewSize,
16+
ZoomDetail as UIZoomDetail,
1617
};
1718
use slint::{ModelRc, SharedPixelBuffer, ToSharedString, VecModel};
1819
use std::{
@@ -721,6 +722,28 @@ pub fn layer_frame_to_ui(layer: &LayerFrame) -> Option<UIVideoEditorLayerImage>
721722
})
722723
.unwrap_or_else(|| CropFilter::default().into());
723724

725+
let zoom: UIZoomDetail = layer
726+
.from_segment
727+
.as_ref()
728+
.and_then(|(_, segment)| {
729+
if is_image_track {
730+
segment
731+
.image_filters
732+
.iter()
733+
.find(|f| f.inner.name() == ZoomFilter::NAME)
734+
.and_then(|f| f.inner.as_any().downcast_ref::<ZoomFilter>())
735+
.map(|t| t.clone().into())
736+
} else {
737+
segment
738+
.video_filters
739+
.iter()
740+
.find(|f| f.inner.name() == ZoomFilter::NAME)
741+
.and_then(|f| f.inner.as_any().downcast_ref::<ZoomFilter>())
742+
.map(|t| t.clone().into())
743+
}
744+
})
745+
.unwrap_or_else(|| ZoomFilter::default().into());
746+
724747
Some(UIVideoEditorLayerImage {
725748
track_index: layer.track_index as i32,
726749
segment_index: layer
@@ -732,6 +755,7 @@ pub fn layer_frame_to_ui(layer: &LayerFrame) -> Option<UIVideoEditorLayerImage>
732755
image: rgba_image_to_slint_image(filtered_buffer),
733756
transform,
734757
crop,
758+
zoom,
735759
})
736760
}
737761

wayshot/src/logic/video_editor/filters/conversion.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ impl From<ZoomFilter> for UIZoomDetail {
113113
zoom_in_duration_ms: f.zoom_in_duration.as_millis() as i32,
114114
hold_duration_ms: f.hold_duration.as_millis() as i32,
115115
zoom_out_duration_ms: f.zoom_out_duration.as_millis() as i32,
116-
target_width: f.target_size.0 as i32,
117-
target_height: f.target_size.1 as i32,
116+
target_width: f.target_size.0,
117+
target_height: f.target_size.1,
118118
center_x: f.center.0,
119119
center_y: f.center.1,
120120
}
@@ -220,7 +220,7 @@ impl From<UIZoomDetail> for ZoomFilter {
220220
.with_zoom_in_duration(Duration::from_millis(d.zoom_in_duration_ms as u64))
221221
.with_hold_duration(Duration::from_millis(d.hold_duration_ms as u64))
222222
.with_zoom_out_duration(Duration::from_millis(d.zoom_out_duration_ms as u64))
223-
.with_target_size((d.target_width as u32, d.target_height as u32))
223+
.with_target_size((d.target_width, d.target_height))
224224
.with_center((d.center_x, d.center_y))
225225
}
226226
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,6 @@ export global VEFilter {
392392

393393
public function is-edit-mode-filter(filter-name: string) -> bool {
394394
let name = filter-name.to-lowercase();
395-
return name == "transform" || name == "crop";
395+
return name == "transform" || name == "crop" || name == "zoom";
396396
}
397397
}

wayshot/ui/panel/desktop/video-editor/preview/preview-zoom-layers.slint

Lines changed: 108 additions & 82 deletions
Large diffs are not rendered by default.

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
import { VEFilter } from "../filter.slint";
2121
import { PreviewTransformLayers } from "preview-transform-layers.slint";
2222
import { PreviewCropLayers } from "preview-crop-layers.slint";
23+
import { PreviewZoomLayers } from "preview-zoom-layers.slint";
2324

2425
component Btns inherits Rectangle {
2526
HorizontalLayout {
@@ -174,8 +175,6 @@ component Btns inherits Rectangle {
174175
component PreviewWindowGrid inherits Rectangle {
175176
in property <int> grid-size: Store.video-editor-ui-state.preview-grid-size;
176177

177-
visible: grid-size > 0;
178-
179178
VerticalLayout {
180179
for row in grid-size: HorizontalLayout {
181180
for col in grid-size: Rectangle {
@@ -242,16 +241,28 @@ component PreviewWindow inherits Rectangle {
242241
height: parent.height;
243242
layers: Store.video-editor-preview-layer-images;
244243
}
244+
245+
if VEFilter.selected-filter.name == "zoom": PreviewZoomLayers {
246+
width: parent.width;
247+
height: parent.height;
248+
layers: Store.video-editor-preview-layer-images;
249+
}
245250
}
246251

252+
// PreviewZoomLayers {
253+
// width: parent.width;
254+
// height: parent.height;
255+
// layers: Store.video-editor-preview-layer-images;
256+
// }
257+
247258
if !in-edit-mode: Image {
248259
width: parent.width;
249260
height: parent.height;
250261
source: Store.video-editor-preview-image;
251262
image-fit: ImageFit.contain;
252263
}
253264

254-
PreviewWindowGrid {
265+
if Store.video-editor-ui-state.preview-grid-size > 0: PreviewWindowGrid {
255266
width: parent.width;
256267
height: parent.height;
257268
}

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -447,14 +447,14 @@ component SegmentFilter inherits Rectangle {
447447

448448
rec := Rectangle {
449449
y: td.y + td.height;
450-
// visible: sl.selected-index >= 0;
451-
visible: true; // todo
450+
visible: sl.selected-index >= 0;
451+
// visible: true; // todo
452452
max-height: root.height - tab.height;
453453
height: root.height * 2 / 3;
454454
background: Theme.secondary-background;
455455

456456
// todo
457-
if tab.checked-index == 0 || true: FilterVideoDetail {
457+
if tab.checked-index == 0: FilterVideoDetail {
458458
y: 0;
459459
selected-filter: selected-filter;
460460
index: sl.selected-index;
@@ -480,12 +480,12 @@ component SegmentFilter inherits Rectangle {
480480
}
481481

482482
// todo
483-
// if sl.selected-index < 0: NoDataImg {
484-
// y: td.y + td.height;
485-
// height: root.height * 2 / 3;
486-
// text: Logic.tr("No Detail");
487-
// font-size: Theme.default-font-size;
488-
// }
483+
if sl.selected-index < 0: NoDataImg {
484+
y: td.y + td.height;
485+
height: root.height * 2 / 3;
486+
text: Logic.tr("No Detail");
487+
font-size: Theme.default-font-size;
488+
}
489489
}
490490

491491
component FilterSelector inherits VerticalLayout {
@@ -620,8 +620,8 @@ component FilterSelector inherits VerticalLayout {
620620
export component Filter inherits Rectangle {
621621
private property <bool> is-show-selector;
622622
private property <FilterType> filter-tab-type;
623-
private property <bool> is-show-segment-filter: true; // todo
624-
// private property <bool> is-show-segment-filter: Store.video-editor-current-edited-track-index >= 0 && Store.video-editor-selected-segments-index.length > 0;
623+
// private property <bool> is-show-segment-filter: true; // todo
624+
private property <bool> is-show-segment-filter: Store.video-editor-current-edited-track-index >= 0 && Store.video-editor-selected-segments-index.length > 0;
625625

626626
if !is-show-segment-filter: NoDataImg {
627627
text: Logic.tr("No Filter");

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ export component FilterVideoDetail inherits Rectangle {
114114
}
115115
}
116116

117-
// TODO:
118-
if selected-filter.name.to-lowercase() == "zoom" || true: Zoom {
117+
if selected-filter.name.to-lowercase() == "zoom": Zoom {
119118
index: index;
120119
width: parent.width;
121120
selected-filter: selected-filter;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,14 @@ export component TrackHead inherits Rectangle {
7272
},
7373
{ },
7474
{
75+
disable: Logic.video-editor-is-subtitle-track(index),
7576
icon: Icons.paste-light,
7677
text: Logic.tr("Paste Filter"),
7778
action: "video-editor-paste-filter-to-track",
7879
user-data: index,
7980
},
8081
{
82+
disable: Logic.video-editor-is-subtitle-track(index),
8183
icon: Icons.delete-all-light,
8284
text: Logic.tr("Remove All Filters"),
8385
action: "video-editor-remove-all-filters-from-track",

wayshot/ui/store.slint

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
SegmentFilter,
44
TransformDetail,
55
CropDetail,
6+
ZoomDetail,
67
} from "panel/desktop/video-editor/filter.slint";
78

89
export enum DeviceType {
@@ -601,8 +602,11 @@ export struct VideoEditorLayerImage {
601602
segment-index: int, // segment 索引,-1 表示无
602603
original-image: image, // 原始图层图像
603604
image: image, // 经过filter处理图层图像
605+
606+
// 滤镜
604607
transform: TransformDetail,
605608
crop: CropDetail,
609+
zoom: ZoomDetail,
606610
}
607611

608612
//////////////////////////////// Logic Struct End ////////////////////////////////
@@ -772,6 +776,7 @@ export global Store {
772776
{
773777
track-index: 0,
774778
segment-index: 0,
779+
original-image: @image-url("../ui/images/png/brand.png"),
775780
image: @image-url("../ui/images/png/brand.png"),
776781
transform: {
777782
zoom-level: 1,
@@ -783,6 +788,7 @@ export global Store {
783788
{
784789
track-index: 2,
785790
segment-index: 0,
791+
original-image: @image-url("../ui/images/png/github-action-release.png"),
786792
image: @image-url("../ui/images/png/github-action-release.png"),
787793
transform: {
788794
zoom-level: 1,

0 commit comments

Comments
 (0)