1
0
mirror of https://github.com/aNNiMON/HotaruFX.git synced 2024-09-19 14:14:21 +03:00

Add node translate properties

This commit is contained in:
Victor 2017-09-01 12:28:48 +03:00
parent c3920e7e42
commit 3f0034b4aa
4 changed files with 38 additions and 7 deletions

View File

@ -7,6 +7,7 @@ import com.annimon.hotarufx.visual.TimeLine;
import com.annimon.hotarufx.visual.visitors.NodeVisitor; import com.annimon.hotarufx.visual.visitors.NodeVisitor;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import static com.annimon.hotarufx.visual.PropertyType.*; import static com.annimon.hotarufx.visual.PropertyType.*;
import static com.annimon.hotarufx.visual.objects.PropertyConsumers.*;
public class CircleNode extends ShapeNode { public class CircleNode extends ShapeNode {
@ -41,9 +42,9 @@ public class CircleNode extends ShapeNode {
@Override @Override
public void buildTimeline(TimeLine timeline) { public void buildTimeline(TimeLine timeline) {
super.buildTimeline(timeline); super.buildTimeline(timeline);
centerX.ifPresent(PropertyConsumers.numberConsumer(timeline)); centerX.ifPresent(numberConsumer(timeline));
centerY.ifPresent(PropertyConsumers.numberConsumer(timeline)); centerY.ifPresent(numberConsumer(timeline));
radius.ifPresent(PropertyConsumers.numberConsumer(timeline)); radius.ifPresent(numberConsumer(timeline));
} }
@Override @Override

View File

@ -1,26 +1,53 @@
package com.annimon.hotarufx.visual.objects; package com.annimon.hotarufx.visual.objects;
import com.annimon.hotarufx.visual.PropertyBindings; import com.annimon.hotarufx.visual.PropertyBindings;
import com.annimon.hotarufx.visual.PropertyTimeline;
import com.annimon.hotarufx.visual.PropertyTimelineHolder;
import com.annimon.hotarufx.visual.TimeLine; import com.annimon.hotarufx.visual.TimeLine;
import com.annimon.hotarufx.visual.visitors.NodeVisitor; import com.annimon.hotarufx.visual.visitors.NodeVisitor;
import javafx.scene.Node; import javafx.scene.Node;
import static com.annimon.hotarufx.visual.PropertyType.*;
import static com.annimon.hotarufx.visual.objects.PropertyConsumers.*;
public abstract class ObjectNode { public abstract class ObjectNode {
private final Node node; private final Node node;
private PropertyTimelineHolder<Number> translateX, translateY, translateZ;
public ObjectNode(Node node) { public ObjectNode(Node node) {
this.node = node; this.node = node;
translateX = PropertyTimelineHolder.empty();
translateY = PropertyTimelineHolder.empty();
translateZ = PropertyTimelineHolder.empty();
} }
public void buildTimeline(TimeLine timeline) { } public PropertyTimeline<Number> translateXProperty() {
return translateX.setIfEmptyThenGet(node::translateXProperty);
}
public PropertyTimeline<Number> translateYProperty() {
return translateY.setIfEmptyThenGet(node::translateYProperty);
}
public PropertyTimeline<Number> translateZProperty() {
return translateZ.setIfEmptyThenGet(node::translateZProperty);
}
public void buildTimeline(TimeLine timeline) {
translateX.ifPresent(numberConsumer(timeline));
translateY.ifPresent(numberConsumer(timeline));
translateZ.ifPresent(numberConsumer(timeline));
}
public final PropertyBindings propertyBindings() { public final PropertyBindings propertyBindings() {
return propertyBindings(new PropertyBindings()); return propertyBindings(new PropertyBindings());
} }
protected PropertyBindings propertyBindings(PropertyBindings bindings) { protected PropertyBindings propertyBindings(PropertyBindings bindings) {
return bindings; return bindings
.add("translateX", NUMBER, this::translateXProperty)
.add("translateY", NUMBER, this::translateYProperty)
.add("translateZ", NUMBER, this::translateZProperty);
} }
public abstract <R, T> R accept(NodeVisitor<R, T> visitor, T input); public abstract <R, T> R accept(NodeVisitor<R, T> visitor, T input);

View File

@ -7,6 +7,7 @@ import com.annimon.hotarufx.visual.TimeLine;
import javafx.scene.paint.Paint; import javafx.scene.paint.Paint;
import javafx.scene.shape.Shape; import javafx.scene.shape.Shape;
import static com.annimon.hotarufx.visual.PropertyType.*; import static com.annimon.hotarufx.visual.PropertyType.*;
import static com.annimon.hotarufx.visual.objects.PropertyConsumers.*;
public abstract class ShapeNode extends ObjectNode { public abstract class ShapeNode extends ObjectNode {
@ -32,8 +33,8 @@ public abstract class ShapeNode extends ObjectNode {
@Override @Override
public void buildTimeline(TimeLine timeline) { public void buildTimeline(TimeLine timeline) {
super.buildTimeline(timeline); super.buildTimeline(timeline);
fill.ifPresent(PropertyConsumers.paintConsumer(timeline)); fill.ifPresent(paintConsumer(timeline));
stroke.ifPresent(PropertyConsumers.paintConsumer(timeline)); stroke.ifPresent(paintConsumer(timeline));
} }
@Override @Override

View File

@ -28,6 +28,7 @@ class NodesBundleTest {
assertThat(context.functions(), hasKey("circle")); assertThat(context.functions(), hasKey("circle"));
val map = new HashMap<String, Value>(); val map = new HashMap<String, Value>();
map.put("translateZ", NumberValue.of(-40));
map.put("cx", NumberValue.of(-10)); map.put("cx", NumberValue.of(-10));
map.put("radius", NumberValue.of(50)); map.put("radius", NumberValue.of(50));
map.put("fill", new StringValue("#00AA00")); map.put("fill", new StringValue("#00AA00"));
@ -43,5 +44,6 @@ class NodesBundleTest {
assertThat(circle.circle.getCenterX(), closeTo(-10, 0.001)); assertThat(circle.circle.getCenterX(), closeTo(-10, 0.001));
assertThat(circle.circle.getRadius(), closeTo(50, 0.001)); assertThat(circle.circle.getRadius(), closeTo(50, 0.001));
assertThat(circle.circle.getFill(), is(Color.web("#00AA00"))); assertThat(circle.circle.getFill(), is(Color.web("#00AA00")));
assertThat(circle.circle.getTranslateZ(), closeTo(-40, 0.001));
} }
} }