mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-28 03:57:44 -06:00
Merge pull request #1027 from vbasky/fix/985-precompose-context-menu
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
//! User-reported selection, Project deletion, and render-queue drop regressions.
|
||||
use effectcraft_engine::{Session, project::LayerId};
|
||||
use effectcraft_ui_egui::{EffectcraftApp, dock::PanelKind};
|
||||
use effectcraft_ui_egui::{Dialog, EffectcraftApp, dock::PanelKind};
|
||||
use egui::{Event, Modifiers, PointerButton, Pos2, Rect, pos2, vec2};
|
||||
use egui_kittest::Harness;
|
||||
use egui_kittest::kittest::Queryable as _;
|
||||
@@ -508,3 +508,44 @@ fn project_context_move_to_root_acts_on_the_whole_selection() {
|
||||
assert_eq!(project.item(effectcraft_engine::project::ItemId(*id)).unwrap().parent, None);
|
||||
}
|
||||
}
|
||||
|
||||
/// Timeline right-click "Pre-compose…" groups every selected layer into one composition,
|
||||
/// like Layer > Pre-compose does, from both the outline row and the layer bar
|
||||
/// (#985, #1003).
|
||||
#[test]
|
||||
fn timeline_context_menu_precompose_groups_the_whole_selection() {
|
||||
let right_click = |h: &mut Harness<'_, EffectcraftApp>, p: Pos2| {
|
||||
for pressed in [true, false] {
|
||||
h.input_mut().events.push(Event::PointerMoved(p));
|
||||
h.input_mut().events.push(Event::PointerButton { pos: p, button: PointerButton::Secondary, pressed, modifiers: Modifiers::NONE });
|
||||
h.step();
|
||||
}
|
||||
h.run_steps(3);
|
||||
};
|
||||
let row = |h: &Harness<'_, EffectcraftApp>, id: LayerId| {
|
||||
let r = rect(h, &format!("timeline.layer.{}.row", id.0));
|
||||
pos2(r.min.x + 210.0, r.center().y)
|
||||
};
|
||||
let bar = |h: &Harness<'_, EffectcraftApp>, id: LayerId| rect(h, &format!("timeline.layer.{}.bar", id.0)).center();
|
||||
for via_bar in [false, true] {
|
||||
let mut h = harness();
|
||||
let ids: Vec<LayerId> = h.state().session.active_comp().unwrap().layers.iter().map(|l| l.id).collect();
|
||||
let mut want: Vec<String> =
|
||||
h.state().session.active_comp().unwrap().layers.iter().filter(|l| l.id == ids[0] || l.id == ids[1]).map(|l| l.name.clone()).collect();
|
||||
want.sort();
|
||||
h.state_mut().session.execute("layer.select", json!({"layers":[ids[0].0, ids[1].0]})).unwrap();
|
||||
h.run_steps(3);
|
||||
let p = if via_bar { bar(&h, ids[1]) } else { row(&h, ids[1]) };
|
||||
right_click(&mut h, p);
|
||||
h.get_by_label("Pre-compose…").click();
|
||||
h.run_steps(3);
|
||||
assert_eq!(h.state().dialog, Some(Dialog::Precompose), "via_bar={via_bar}: Pre-compose opens its dialog");
|
||||
let ok = rect(&h, "dialog.precompose.ok").center();
|
||||
click(&mut h, ok, Modifiers::NONE);
|
||||
h.run_steps(3);
|
||||
// The dialog opens the new composition holding both nested layers.
|
||||
let mut nested: Vec<String> = h.state().session.active_comp().unwrap().layers.iter().map(|l| l.name.clone()).collect();
|
||||
nested.sort();
|
||||
assert_eq!(nested, want, "via_bar={via_bar}: both selected layers are nested");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user