mirror of
https://github.com/storytold/effectcraft.git
synced 2026-10-14 19:27:05 -04:00
Merge pull request #845 from Ni-zav/fix/814-batch-remove-keys-s20261011T141200Z-fd2e
feat(script): delete keyframe ranges in one undoable command # Conflicts: # crates/script/src/tests.rs
This commit is contained in:
commit
61f5b937dc
2 files changed
+33
No files matched your search
@@ -899,6 +899,19 @@ Property.prototype.property = function () { return null; };
|
||||
return __call(id, params);
|
||||
};
|
||||
P.removeKey = function (i) { this.__keyCmd(i, "keys.delete"); };
|
||||
// EffectCraft extension: remove an inclusive range with one engine edit instead of
|
||||
// cloning the project for every removed key. Indices are one-based as in removeKey.
|
||||
P.removeKeys = function (first, last) {
|
||||
var keys = this.__keys();
|
||||
first = __num(first, "first key");
|
||||
last = __num(last, "last key");
|
||||
if (!Number.isInteger(first) || !Number.isInteger(last) || first < 1 || last < first || last > keys.length)
|
||||
throw __err("removeKeys: key range is out of bounds");
|
||||
var targets = [];
|
||||
for (var i = first; i <= last; i++)
|
||||
targets.push({ layer: this.__layer.__id, prop: this.__uid, index: i - 1 });
|
||||
return __call("keys.delete", { comp: this.__layer.__comp, __keys: targets });
|
||||
};
|
||||
P.keyInInterpolationType = function (i) { return KeyframeInterpolationType[this.__key(i).inInterp]; };
|
||||
P.keyOutInterpolationType = function (i) { return KeyframeInterpolationType[this.__key(i).outInterp]; };
|
||||
// Values that don't interpolate (checkboxes, popups, text) only hold.
|
||||
|
||||
@@ -815,3 +815,23 @@ fn long_script_undo_group_counts_as_one_level() {
|
||||
s.undo();
|
||||
assert_eq!(s.project.comp(ItemId(1)).unwrap().layers.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn script_remove_keys_batches_a_range_as_one_edit() {
|
||||
let mut s = session();
|
||||
let o = ok(
|
||||
&mut s,
|
||||
"var c = app.project.items.addComp('Batch Keys', 100, 100, 1, 10, 25); var p = c.layers.addNull().transform.rotation; for (var i = 0; i < 5; i++) p.setValueAtTime(i, i * 10); p.removeKeys(2, 4); [p.numKeys, p.keyTime(1), p.keyTime(2)]",
|
||||
);
|
||||
assert_eq!(o.result, json!([2, 0, 4]));
|
||||
// The entire deletion is one undo step; keys outside the range survive.
|
||||
s.undo();
|
||||
let restored = ok(&mut s, "app.project.item(1).layer(1).transform.rotation.numKeys");
|
||||
assert_eq!(restored.result, json!(5));
|
||||
let invalid = run_code(
|
||||
&mut s,
|
||||
"app.project.item(1).layer(1).transform.rotation.removeKeys(0, 2)",
|
||||
"remove-keys-range.jsx",
|
||||
);
|
||||
assert!(invalid.error.is_some());
|
||||
}
|
||||
Reference in new issue
Block a user