From 9d689b1a61b09a6f3844ff574445b90372887bea Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 22:29:04 +0000 Subject: [PATCH] Community follow-ups: dedup font files from overlapping folders (#665); empty-Timeline drop also accepts compositions, rustfmt (#662) Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01QiAJeFttZp83Fh7YuzAR5f --- crates/text/src/fonts.rs | 1 + crates/ui-egui/src/panels/timeline.rs | 6 ++---- crates/ui-egui/tests/ui_drag_drop.rs | 13 +++++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/crates/text/src/fonts.rs b/crates/text/src/fonts.rs index cb2b2ad2..2f7311c5 100644 --- a/crates/text/src/fonts.rs +++ b/crates/text/src/fonts.rs @@ -126,6 +126,7 @@ impl FontSource for DirectorySource { walk(d, 0, &mut files); } files.sort(); + files.dedup(); let mut out = Vec::new(); for f in files { let Ok(mut file) = std::fs::File::open(&f) else { continue }; diff --git a/crates/ui-egui/src/panels/timeline.rs b/crates/ui-egui/src/panels/timeline.rs index 7d7ebab4..61b2d22d 100644 --- a/crates/ui-egui/src/panels/timeline.rs +++ b/crates/ui-egui/src/panels/timeline.rs @@ -1217,10 +1217,8 @@ pub fn show(app: &mut EffectcraftApp, ui: &mut egui::Ui, rect: Rect) { .map(ItemId) .filter(|id| { app.session.project.item(*id).is_some_and(|item| match &item.kind { - effectcraft_engine::project::ItemKind::Footage(footage) => { - footage.kind != effectcraft_engine::project::FootageKind::Data - } - effectcraft_engine::project::ItemKind::Solid(_) => true, + effectcraft_engine::project::ItemKind::Footage(footage) => footage.kind != effectcraft_engine::project::FootageKind::Data, + effectcraft_engine::project::ItemKind::Solid(_) | effectcraft_engine::project::ItemKind::Comp(_) => true, _ => false, }) }) diff --git a/crates/ui-egui/tests/ui_drag_drop.rs b/crates/ui-egui/tests/ui_drag_drop.rs index fc6a9a69..ce09d7fd 100644 --- a/crates/ui-egui/tests/ui_drag_drop.rs +++ b/crates/ui-egui/tests/ui_drag_drop.rs @@ -215,10 +215,10 @@ fn project_items_dropped_on_new_comp_make_a_composition() { #[test] fn project_footage_dropped_on_empty_timeline_creates_first_comp() { let mut s = Session::default(); - let footage = s.execute( - "file.importPlaceholder", - json!({"name": "Landscape.png", "width": 640, "height": 360, "frameRate": 24, "duration": 5}), - ).unwrap()["item"].as_u64().unwrap(); + let footage = + s.execute("file.importPlaceholder", json!({"name": "Landscape.png", "width": 640, "height": 360, "frameRate": 24, "duration": 5})).unwrap()["item"] + .as_u64() + .unwrap(); let mut h = Harness::builder().with_size(vec2(1600.0, 1000.0)).build_eframe(|_| EffectcraftApp::new(s)); h.run_steps(3); assert!(h.state().session.active_comp().is_none()); @@ -241,10 +241,7 @@ fn multiple_selected_footage_dropped_on_empty_timeline_asks_how_to_create_comps( let mut s = Session::default(); let first = s.execute("file.importPlaceholder", json!({"name": "First.png", "width": 160, "height": 90})).unwrap()["item"].as_u64().unwrap(); let second = s.execute("file.importPlaceholder", json!({"name": "Second.png", "width": 300, "height": 200})).unwrap()["item"].as_u64().unwrap(); - s.state.project_selection = vec![ - effectcraft_engine::project::ItemId(first), - effectcraft_engine::project::ItemId(second), - ]; + s.state.project_selection = vec![effectcraft_engine::project::ItemId(first), effectcraft_engine::project::ItemId(second)]; let mut h = Harness::builder().with_size(vec2(1600.0, 1000.0)).build_eframe(|_| EffectcraftApp::new(s)); h.run_steps(3); let from = rect(&h, &format!("project.item.{first}.name")).center();