From 09f5deb561c07259709280f0041f0d390bbcc9cf Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 1 Sep 2017 18:32:28 +0300 Subject: [PATCH] Add scaleX/Y/Z and layoutX/Y properties --- .../hotarufx/visual/objects/ObjectNode.java | 39 ++++++++++++++++++- app/src/main/resources/main.hfx | 15 ++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/annimon/hotarufx/visual/objects/ObjectNode.java b/app/src/main/java/com/annimon/hotarufx/visual/objects/ObjectNode.java index 2c4892c..8abc009 100644 --- a/app/src/main/java/com/annimon/hotarufx/visual/objects/ObjectNode.java +++ b/app/src/main/java/com/annimon/hotarufx/visual/objects/ObjectNode.java @@ -16,6 +16,8 @@ public abstract class ObjectNode { private PropertyTimelineHolder clip; private PropertyTimelineHolder rotate; private PropertyTimelineHolder translateX, translateY, translateZ; + private PropertyTimelineHolder scaleX, scaleY, scaleZ; + private PropertyTimelineHolder layoutX, layoutY; @Getter @Setter private boolean isUsedAsClip; @@ -26,6 +28,11 @@ public abstract class ObjectNode { translateX = PropertyTimelineHolder.empty(); translateY = PropertyTimelineHolder.empty(); translateZ = PropertyTimelineHolder.empty(); + scaleX = PropertyTimelineHolder.empty(); + scaleY = PropertyTimelineHolder.empty(); + scaleZ = PropertyTimelineHolder.empty(); + layoutX = PropertyTimelineHolder.empty(); + layoutY = PropertyTimelineHolder.empty(); isUsedAsClip = false; } @@ -53,12 +60,37 @@ public abstract class ObjectNode { return translateZ.setIfEmptyThenGet(node::translateZProperty); } + public PropertyTimeline scaleXProperty() { + return scaleX.setIfEmptyThenGet(node::scaleXProperty); + } + + public PropertyTimeline scaleYProperty() { + return scaleY.setIfEmptyThenGet(node::scaleYProperty); + } + + public PropertyTimeline scaleZProperty() { + return scaleZ.setIfEmptyThenGet(node::scaleZProperty); + } + + public PropertyTimeline layoutXProperty() { + return layoutX.setIfEmptyThenGet(node::layoutXProperty); + } + + public PropertyTimeline layoutYProperty() { + return layoutY.setIfEmptyThenGet(node::layoutYProperty); + } + public void buildTimeline(TimeLine timeline) { clip.applyIfPresent(timeline); rotate.applyIfPresent(timeline); translateX.applyIfPresent(timeline); translateY.applyIfPresent(timeline); translateZ.applyIfPresent(timeline); + scaleX.applyIfPresent(timeline); + scaleY.applyIfPresent(timeline); + scaleZ.applyIfPresent(timeline); + layoutX.applyIfPresent(timeline); + layoutY.applyIfPresent(timeline); } public final PropertyBindings propertyBindings() { @@ -71,7 +103,12 @@ public abstract class ObjectNode { .add("rotate", NUMBER, this::rotateProperty) .add("translateX", NUMBER, this::translateXProperty) .add("translateY", NUMBER, this::translateYProperty) - .add("translateZ", NUMBER, this::translateZProperty); + .add("translateZ", NUMBER, this::translateZProperty) + .add("scaleX", NUMBER, this::scaleXProperty) + .add("scaleY", NUMBER, this::scaleYProperty) + .add("scaleZ", NUMBER, this::scaleZProperty) + .add("layoutX", NUMBER, this::layoutXProperty) + .add("layoutY", NUMBER, this::layoutYProperty); } public abstract R accept(NodeVisitor visitor, T input); diff --git a/app/src/main/resources/main.hfx b/app/src/main/resources/main.hfx index 89c4b6d..04c67d0 100644 --- a/app/src/main/resources/main.hfx +++ b/app/src/main/resources/main.hfx @@ -34,7 +34,9 @@ CLIP = circle({ radius: 78 }) CLIP@cx - .add(60, 173) + .add(60, -400) + .add(100, 173) + C = text({ x: -240, @@ -45,5 +47,14 @@ C = text({ font: 100, clip: CLIP }) +C@layoutX + .add(100, 0) + .add(120, -300) +C@scaleX + .add(100, 1) + .add(120, 1.8) +C@scaleY + .add(100, 1) + .add(120, 1.8) -render(C, CLIP) \ No newline at end of file +render(B, A, C, CLIP) \ No newline at end of file