diff options
| author | cashmere <cashmere@autistici.org> | 2026-07-28 19:41:16 +0200 |
|---|---|---|
| committer | cashmere <cashmere@autistici.org> | 2026-07-28 19:41:16 +0200 |
| commit | f5a82152394fde4d8f740f664ab7737b82861618 (patch) | |
| tree | 5a51b181abead1ce03d2dbfc12b77918d3be0e1b /rust/crates/scene/src/project.rs | |
| parent | e837e7504379e100ff3b56282577ec67bb88bec9 (diff) | |
| download | opencut-f5a82152394fde4d8f740f664ab7737b82861618.tar.gz | |
feat: GPUI desktop port foundation
- scene crate: full project/scene/element model, serde round-trip
proven against the web SerializedProject shape
- transfer crate: .ocp zip container, cross-compat with web fflate
archives proven in both directions
- storage crate: filesystem project store replacing IndexedDB,
.ocp import/export
- media crate: ffmpeg-next 8 decoder (frames, audio, thumbnails,
waveform summaries)
- playback crate: wall-clock anchored, frame-rounded playback clock
- gpu crate: native texture readback; compositor renders headless
offscreen on Vulkan (spike test)
- flake devshell: rust toolchain, GPUI native deps, ffmpeg dev,
bindgen clang args; GPUI hello-world builds
- port plan in notes/gpui-port.md
Diffstat (limited to 'rust/crates/scene/src/project.rs')
| -rw-r--r-- | rust/crates/scene/src/project.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/rust/crates/scene/src/project.rs b/rust/crates/scene/src/project.rs new file mode 100644 index 00000000..6af6c3cc --- /dev/null +++ b/rust/crates/scene/src/project.rs @@ -0,0 +1,76 @@ +use chrono::{DateTime, Utc}; +use serde::{Deserialize, Serialize}; +use time::{FrameRate, MediaTime}; + +use crate::iso_date; +use crate::scene::Scene; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(tag = "type", rename_all = "camelCase", rename_all_fields = "camelCase")] +pub enum Background { + Color { color: String }, + Blur { blur_intensity: f64 }, +} + +#[derive(Serialize, Deserialize, Clone, Copy, Debug, Eq, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct CanvasSize { + pub width: u32, + pub height: u32, +} + +#[derive(Serialize, Deserialize, Clone, Copy, Debug, Eq, PartialEq)] +#[serde(rename_all = "camelCase")] +pub enum CanvasSizeMode { + Preset, + Custom, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ProjectMetadata { + pub id: String, + pub name: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub thumbnail: Option<String>, + pub duration: MediaTime, + #[serde(with = "iso_date")] + pub created_at: DateTime<Utc>, + #[serde(with = "iso_date")] + pub updated_at: DateTime<Utc>, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct ProjectSettings { + pub fps: FrameRate, + pub canvas_size: CanvasSize, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub canvas_size_mode: Option<CanvasSizeMode>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub last_custom_canvas_size: Option<CanvasSize>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub original_canvas_size: Option<CanvasSize>, + pub background: Background, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct TimelineViewState { + pub zoom_level: f64, + pub scroll_left: f64, + pub playhead_time: MediaTime, +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] +#[serde(rename_all = "camelCase")] +pub struct Project { + pub metadata: ProjectMetadata, + #[serde(default)] + pub scenes: Vec<Scene>, + pub current_scene_id: String, + pub settings: ProjectSettings, + pub version: u32, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub timeline_view_state: Option<TimelineViewState>, +} |
