effectcraft/crates/ui-egui/tests/ui_timeline_zoom.rs

59 lines
2.5 KiB
Rust

//! Zooming the Timeline's time ruler with real input: Alt+wheel zooms out until the whole comp
//! shows (#158).
use effectcraft_engine::Session;
use effectcraft_ui_egui::EffectcraftApp;
use egui::{Event, Modifiers, MouseWheelUnit, Pos2, pos2, vec2};
use egui_kittest::Harness;
use serde_json::json;
/// A 10-minute comp with one solid, zoomed in on its start.
fn harness() -> (Harness<'static, EffectcraftApp>, u64) {
let mut s = Session::default();
s.execute("comp.new", json!({"name": "Long", "width": 320, "height": 180, "frameRate": 30, "duration": 600})).unwrap();
let layer = s.execute("layer.newSolid", json!({"name": "Plate", "color": "#406080"})).unwrap()["layer"].as_u64().unwrap();
let mut app = EffectcraftApp::new(s);
app.ui.timeline.pps = Some(200.0);
let mut h = Harness::builder().with_size(vec2(1600.0, 1000.0)).build_eframe(|_| app);
h.run_steps(3);
(h, layer)
}
/// A point over the layer's bar in the time graph.
fn over_bar(h: &Harness<'_, EffectcraftApp>, layer: u64) -> Pos2 {
let e = h.state().auto.find(&format!("timeline.layer.{layer}.bar")).expect("layer bar").clone();
pos2(e.rect[0] + 40.0, e.rect[1] + e.rect[3] / 2.0)
}
fn alt_wheel(h: &mut Harness<'_, EffectcraftApp>, at: Pos2, dy: f32) {
h.event(Event::PointerMoved(at));
h.event(Event::ModifiersChanged(Modifiers::ALT));
h.event(Event::MouseWheel { unit: MouseWheelUnit::Point, delta: vec2(0.0, dy), modifiers: Modifiers::ALT, phase: egui::TouchPhase::Move });
h.step();
h.event(Event::ModifiersChanged(Modifiers::NONE));
h.step();
}
/// #158: on a long comp, Alt+wheel zooms out all the way to the whole comp (and no further).
#[test]
fn alt_wheel_zooms_out_until_the_whole_comp_shows() {
let (mut h, layer) = harness();
for _ in 0..80 {
let at = over_bar(&h, layer);
alt_wheel(&mut h, at, -120.0);
if h.state().ui.timeline.pps.is_none() {
break;
}
}
let tl = &h.state().ui.timeline;
assert_eq!((tl.pps, tl.start), (None, 0.0), "fits the whole comp: {:?}", tl.pps);
// The bar spans (nearly) the whole time graph.
let bar = h.state().auto.find(&format!("timeline.layer.{layer}.bar")).unwrap().rect;
let ruler = h.state().auto.find("timeline.ruler").unwrap().rect;
assert!(bar[2] > ruler[2] * 0.95, "bar {bar:?} ruler {ruler:?}");
// Zooming in again works from there.
let at = over_bar(&h, layer);
alt_wheel(&mut h, at, 240.0);
assert!(h.state().ui.timeline.pps.is_some());
}