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

Add line node

This commit is contained in:
Victor 2017-09-02 14:10:00 +03:00
parent 4e72878546
commit eded42e5fb
5 changed files with 91 additions and 1 deletions

View File

@ -8,6 +8,7 @@ import com.annimon.hotarufx.lib.Validator;
import com.annimon.hotarufx.lib.Value; import com.annimon.hotarufx.lib.Value;
import com.annimon.hotarufx.visual.objects.CircleNode; import com.annimon.hotarufx.visual.objects.CircleNode;
import com.annimon.hotarufx.visual.objects.GroupNode; import com.annimon.hotarufx.visual.objects.GroupNode;
import com.annimon.hotarufx.visual.objects.LineNode;
import com.annimon.hotarufx.visual.objects.ObjectNode; import com.annimon.hotarufx.visual.objects.ObjectNode;
import com.annimon.hotarufx.visual.objects.PolygonNode; import com.annimon.hotarufx.visual.objects.PolygonNode;
import com.annimon.hotarufx.visual.objects.PolylineNode; import com.annimon.hotarufx.visual.objects.PolylineNode;
@ -26,6 +27,7 @@ public class NodesBundle implements Bundle {
public void load(Context context) { public void load(Context context) {
context.functions().put("circle", node(CircleNode::new)); context.functions().put("circle", node(CircleNode::new));
context.functions().put("group", group()); context.functions().put("group", group());
context.functions().put("line", node(LineNode::new));
context.functions().put("polygon", poly(PolygonNode::new)); context.functions().put("polygon", poly(PolygonNode::new));
context.functions().put("polyline", poly(PolylineNode::new)); context.functions().put("polyline", poly(PolylineNode::new));
context.functions().put("rectangle", node(RectangleNode::new)); context.functions().put("rectangle", node(RectangleNode::new));

View File

@ -0,0 +1,68 @@
package com.annimon.hotarufx.visual.objects;
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.visitors.NodeVisitor;
import javafx.scene.shape.Line;
import static com.annimon.hotarufx.visual.PropertyType.NUMBER;
public class LineNode extends ShapeNode {
public final Line line;
private PropertyTimelineHolder<Number> startX, startY, endX, endY;
public LineNode() {
this(new Line());
}
private LineNode(Line line) {
super(line);
this.line = line;
startX = PropertyTimelineHolder.empty();
startY = PropertyTimelineHolder.empty();
endX = PropertyTimelineHolder.empty();
endY = PropertyTimelineHolder.empty();
}
public PropertyTimeline<Number> startXProperty() {
return startX.setIfEmptyThenGet(line::startXProperty);
}
public PropertyTimeline<Number> startYProperty() {
return startY.setIfEmptyThenGet(line::startYProperty);
}
public PropertyTimeline<Number> endXProperty() {
return endX.setIfEmptyThenGet(line::endXProperty);
}
public PropertyTimeline<Number> endYProperty() {
return endY.setIfEmptyThenGet(line::endYProperty);
}
@Override
public void buildTimeline(TimeLine timeline) {
super.buildTimeline(timeline);
startX.applyIfPresent(timeline);
startY.applyIfPresent(timeline);
endX.applyIfPresent(timeline);
endY.applyIfPresent(timeline);
}
@Override
public PropertyBindings propertyBindings(PropertyBindings bindings) {
return super.propertyBindings(bindings)
.add("startX", NUMBER, this::startXProperty)
.add("startY", NUMBER, this::startYProperty)
.add("endX", NUMBER, this::endXProperty)
.add("endY", NUMBER, this::endYProperty);
}
@Override
public <R, T> R accept(NodeVisitor<R, T> visitor, T input) {
return visitor.visit(this, input);
}
}

View File

@ -2,6 +2,7 @@ package com.annimon.hotarufx.visual.visitors;
import com.annimon.hotarufx.visual.objects.CircleNode; import com.annimon.hotarufx.visual.objects.CircleNode;
import com.annimon.hotarufx.visual.objects.GroupNode; import com.annimon.hotarufx.visual.objects.GroupNode;
import com.annimon.hotarufx.visual.objects.LineNode;
import com.annimon.hotarufx.visual.objects.PolygonNode; import com.annimon.hotarufx.visual.objects.PolygonNode;
import com.annimon.hotarufx.visual.objects.PolylineNode; import com.annimon.hotarufx.visual.objects.PolylineNode;
import com.annimon.hotarufx.visual.objects.RectangleNode; import com.annimon.hotarufx.visual.objects.RectangleNode;
@ -12,6 +13,7 @@ public interface NodeVisitor<R, T> {
R visit(CircleNode node, T input); R visit(CircleNode node, T input);
R visit(GroupNode node, T input); R visit(GroupNode node, T input);
R visit(LineNode node, T input);
R visit(PolygonNode node, T input); R visit(PolygonNode node, T input);
R visit(PolylineNode node, T input); R visit(PolylineNode node, T input);
R visit(RectangleNode node, T input); R visit(RectangleNode node, T input);

View File

@ -4,6 +4,7 @@ import com.annimon.hotarufx.visual.TimeLine;
import com.annimon.hotarufx.visual.VirtualScene; import com.annimon.hotarufx.visual.VirtualScene;
import com.annimon.hotarufx.visual.objects.CircleNode; import com.annimon.hotarufx.visual.objects.CircleNode;
import com.annimon.hotarufx.visual.objects.GroupNode; import com.annimon.hotarufx.visual.objects.GroupNode;
import com.annimon.hotarufx.visual.objects.LineNode;
import com.annimon.hotarufx.visual.objects.ObjectNode; import com.annimon.hotarufx.visual.objects.ObjectNode;
import com.annimon.hotarufx.visual.objects.PolygonNode; import com.annimon.hotarufx.visual.objects.PolygonNode;
import com.annimon.hotarufx.visual.objects.PolylineNode; import com.annimon.hotarufx.visual.objects.PolylineNode;
@ -32,6 +33,11 @@ public class RenderVisitor implements NodeVisitor<Void, VirtualScene> {
return null; return null;
} }
@Override
public Void visit(LineNode node, VirtualScene scene) {
return render(node, scene);
}
@Override @Override
public Void visit(PolygonNode node, VirtualScene scene) { public Void visit(PolygonNode node, VirtualScene scene) {
return render(node, scene); return render(node, scene);

View File

@ -86,5 +86,17 @@ POLYLINE = polyline(points, {
stroke: "purple" stroke: "purple"
}) })
render(B, A, C, CLIP, HEART, POLYGON, POLYLINE) LINE = line({
visible: 0,
startX: -600
startY: 300
endX: 600
endY: 300,
stroke: "#777",
strokeDashOffset: 45
})
LINE@visible.add(100, 1)
LINE@strokeWidth.add(100, 0).add(140, 10)
render(B, A, C, CLIP, HEART, POLYGON, POLYLINE, LINE)