From 1c5adfe885ea48820339702f8cdf0cf536a141b1 Mon Sep 17 00:00:00 2001 From: Victor Date: Sat, 2 Sep 2017 11:46:19 +0300 Subject: [PATCH] Add svg path node --- .../annimon/hotarufx/bundles/NodesBundle.java | 2 + .../hotarufx/visual/objects/SVGPathNode.java | 47 +++++++++++++++++++ .../hotarufx/visual/visitors/NodeVisitor.java | 2 + .../visual/visitors/RenderVisitor.java | 6 +++ app/src/main/resources/main.hfx | 12 ++++- 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/annimon/hotarufx/visual/objects/SVGPathNode.java diff --git a/app/src/main/java/com/annimon/hotarufx/bundles/NodesBundle.java b/app/src/main/java/com/annimon/hotarufx/bundles/NodesBundle.java index 290cf8d..627ba9c 100644 --- a/app/src/main/java/com/annimon/hotarufx/bundles/NodesBundle.java +++ b/app/src/main/java/com/annimon/hotarufx/bundles/NodesBundle.java @@ -7,6 +7,7 @@ import com.annimon.hotarufx.lib.Validator; import com.annimon.hotarufx.visual.objects.CircleNode; import com.annimon.hotarufx.visual.objects.ObjectNode; import com.annimon.hotarufx.visual.objects.RectangleNode; +import com.annimon.hotarufx.visual.objects.SVGPathNode; import com.annimon.hotarufx.visual.objects.TextNode; import java.util.function.Supplier; import lombok.val; @@ -17,6 +18,7 @@ public class NodesBundle implements Bundle { public void load(Context context) { context.functions().put("circle", node(CircleNode::new)); context.functions().put("rectangle", node(RectangleNode::new)); + context.functions().put("svgPath", node(SVGPathNode::new)); context.functions().put("text", node(TextNode::new)); } diff --git a/app/src/main/java/com/annimon/hotarufx/visual/objects/SVGPathNode.java b/app/src/main/java/com/annimon/hotarufx/visual/objects/SVGPathNode.java new file mode 100644 index 0000000..1f7cbb3 --- /dev/null +++ b/app/src/main/java/com/annimon/hotarufx/visual/objects/SVGPathNode.java @@ -0,0 +1,47 @@ +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.SVGPath; +import static com.annimon.hotarufx.visual.PropertyType.STRING; + +public class SVGPathNode extends ShapeNode { + + public final SVGPath svgPath; + + private PropertyTimelineHolder content; + + public SVGPathNode() { + this(new SVGPath()); + } + + private SVGPathNode(SVGPath svgPath) { + super(svgPath); + this.svgPath = svgPath; + content = PropertyTimelineHolder.empty(); + } + + public PropertyTimeline contentProperty() { + return content.setIfEmptyThenGet(svgPath::contentProperty); + } + + @Override + public void buildTimeline(TimeLine timeline) { + super.buildTimeline(timeline); + content.applyIfPresent(timeline); + } + + @Override + public PropertyBindings propertyBindings(PropertyBindings bindings) { + return super.propertyBindings(bindings) + .add("content", STRING, this::contentProperty); + } + + @Override + public R accept(NodeVisitor visitor, T input) { + return visitor.visit(this, input); + } +} diff --git a/app/src/main/java/com/annimon/hotarufx/visual/visitors/NodeVisitor.java b/app/src/main/java/com/annimon/hotarufx/visual/visitors/NodeVisitor.java index 201b05e..68917f9 100644 --- a/app/src/main/java/com/annimon/hotarufx/visual/visitors/NodeVisitor.java +++ b/app/src/main/java/com/annimon/hotarufx/visual/visitors/NodeVisitor.java @@ -2,11 +2,13 @@ package com.annimon.hotarufx.visual.visitors; import com.annimon.hotarufx.visual.objects.CircleNode; import com.annimon.hotarufx.visual.objects.RectangleNode; +import com.annimon.hotarufx.visual.objects.SVGPathNode; import com.annimon.hotarufx.visual.objects.TextNode; public interface NodeVisitor { R visit(CircleNode node, T input); R visit(RectangleNode node, T input); + R visit(SVGPathNode node, T input); R visit(TextNode node, T input); } diff --git a/app/src/main/java/com/annimon/hotarufx/visual/visitors/RenderVisitor.java b/app/src/main/java/com/annimon/hotarufx/visual/visitors/RenderVisitor.java index e08c202..489e46a 100644 --- a/app/src/main/java/com/annimon/hotarufx/visual/visitors/RenderVisitor.java +++ b/app/src/main/java/com/annimon/hotarufx/visual/visitors/RenderVisitor.java @@ -5,6 +5,7 @@ import com.annimon.hotarufx.visual.VirtualScene; import com.annimon.hotarufx.visual.objects.CircleNode; import com.annimon.hotarufx.visual.objects.ObjectNode; import com.annimon.hotarufx.visual.objects.RectangleNode; +import com.annimon.hotarufx.visual.objects.SVGPathNode; import com.annimon.hotarufx.visual.objects.TextNode; import lombok.RequiredArgsConstructor; @@ -23,6 +24,11 @@ public class RenderVisitor implements NodeVisitor { return render(node, scene); } + @Override + public Void visit(SVGPathNode node, VirtualScene scene) { + return render(node, scene); + } + @Override public Void visit(TextNode node, VirtualScene scene) { return render(node, scene); diff --git a/app/src/main/resources/main.hfx b/app/src/main/resources/main.hfx index f22f709..33f4c6f 100644 --- a/app/src/main/resources/main.hfx +++ b/app/src/main/resources/main.hfx @@ -61,4 +61,14 @@ C@scaleY .add(100, 1) .add(120, 1.8) -render(B, A, C, CLIP) \ No newline at end of file +HEART = svgPath({ + layoutX: -15, + layoutY: -12, + content: "M23.6,0c-3.4,0-6.3,2.7-7.6,5.6C14.7,2.7,11.8,0,8.4,0C3.8,0,0,3.8,0,8.4c0,9.4,9.5,11.9,16,21.2 + 6.1-9.3,16-12.1,16-21.2C32,3.8,28.2,0,23.6,0z", + fill: "red", + strokeWidth: 2, + stroke: "white" +}) + +render(B, A, C, CLIP, HEART) \ No newline at end of file