fix(script): deselect individual properties via Property.selected=false (#548)
This commit is contained in:
parent
813c7c4650
commit
4bc619b010
|
|
@ -346,6 +346,19 @@ fn select_prop(s: &mut Session, p: &Value) -> Result<Value> {
|
|||
Ok(Value::Null)
|
||||
}
|
||||
|
||||
/// Deselect only the named property, preserving unrelated property, layer, key and
|
||||
/// mask-vertex selections. Selected keys also imply selectedProperties in the script API.
|
||||
fn deselect_prop(s: &mut Session, params: &Value) -> Result<Value> {
|
||||
let (_, lid, uid) = prop_ref(s, params, "prop.deselect")?;
|
||||
let mask = s.active_comp().and_then(|c| c.layer(lid)).and_then(|l| path_points(l, uid, l.layer_time(s.time()))).map(|(mask, _)| mask);
|
||||
s.state.selected_props.retain(|(layer, prop)| *layer != lid || *prop != uid);
|
||||
s.state.selected_keys.retain(|key| key.layer != lid || key.prop != uid);
|
||||
if let Some(mask) = mask {
|
||||
s.state.selected_vertices.retain(|v| v.layer != lid || v.mask != mask);
|
||||
}
|
||||
Ok(Value::Null)
|
||||
}
|
||||
|
||||
/// The mask or shape Path item that `uid` (the group, or its Path property) is, with its number
|
||||
/// of points at layer time `lt`.
|
||||
fn path_points(l: &Layer, uid: Uid, lt: Tick) -> Option<(Uid, usize)> {
|
||||
|
|
@ -820,6 +833,7 @@ pub fn specs() -> Vec<CommandSpec> {
|
|||
reset
|
||||
),
|
||||
cmd!("prop.select", "Select Property", [], None, "{layer?, path|prop, add?, selectKeys?}", has_layers, select_prop),
|
||||
cmd!("prop.deselect", "Deselect Property", [], None, "{layer?, path|prop}", has_layers, deselect_prop),
|
||||
cmd!(
|
||||
"prop.convertExpressionToKeyframes",
|
||||
"Convert Expression to Keyframes",
|
||||
|
|
|
|||
|
|
@ -574,7 +574,9 @@ PropertyBase.prototype = {
|
|||
return false;
|
||||
},
|
||||
set selected(v) {
|
||||
if (v) __call("prop.select", { comp: this.__layer.__comp, layer: this.__layer.__id, prop: this.__uid, add: true });
|
||||
var ref = { comp: this.__layer.__comp, layer: this.__layer.__id, prop: this.__uid };
|
||||
if (v) __call("prop.select", { comp: ref.comp, layer: ref.layer, prop: ref.prop, add: true });
|
||||
else __call("prop.deselect", ref);
|
||||
},
|
||||
propertyGroup: function (n) {
|
||||
var p = this;
|
||||
|
|
|
|||
|
|
@ -524,3 +524,32 @@ fn comp_preserves_nested_frame_rate_and_resolution() {
|
|||
let (_, c) = comp_named(&s, "Nested");
|
||||
assert!(c.preserve_frame_rate && c.preserve_resolution);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn property_selected_false_preserves_other_property_and_key_selections() {
|
||||
let mut s = session();
|
||||
let out = ok(
|
||||
&mut s,
|
||||
r#"
|
||||
var c = app.project.items.addComp("Selection", 64, 64, 1, 1, 10);
|
||||
c.openInViewer();
|
||||
var layer = c.layers.addSolid([1, 0, 0], "Layer", 8, 8, 1);
|
||||
var opacity = layer.transform.opacity;
|
||||
var rotation = layer.transform.rotation;
|
||||
rotation.setValueAtTime(0, 0);
|
||||
rotation.setValueAtTime(0.5, 45);
|
||||
app.run("edit.deselectAll", {});
|
||||
rotation.selected = true;
|
||||
opacity.selected = true;
|
||||
var states = [[opacity.selected, rotation.selected]];
|
||||
opacity.selected = false;
|
||||
states.push([opacity.selected, rotation.selected]);
|
||||
opacity.selected = false;
|
||||
states.push([opacity.selected, rotation.selected]);
|
||||
opacity.selected = true;
|
||||
states.push([opacity.selected, rotation.selected]);
|
||||
[states, rotation.selectedKeys.length, c.selectedProperties.length];
|
||||
"#,
|
||||
);
|
||||
assert_eq!(out.result, json!([[[true, true], [false, true], [false, true], [true, true]], 2, 2]));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue