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

Add property bindings

This commit is contained in:
Victor 2017-08-30 16:54:57 +03:00
parent 1e5ca3c1b3
commit 9b4f8140e3
6 changed files with 95 additions and 1 deletions

View File

@ -0,0 +1,16 @@
package com.annimon.hotarufx.visual;
import java.util.function.Supplier;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public final class Property {
@Getter
private final PropertyType type;
@Getter
private final Supplier<PropertyTimeline<?>> property;
}

View File

@ -0,0 +1,17 @@
package com.annimon.hotarufx.visual;
import java.util.HashMap;
import java.util.function.Supplier;
public final class PropertyBindings extends HashMap<String, Property> {
public PropertyBindings add(String key, PropertyType type, Supplier<PropertyTimeline<?>> property) {
super.put(key, new Property(type, property));
return this;
}
public PropertyBindings merge(PropertyBindings bindings) {
super.putAll(bindings);
return this;
}
}

View File

@ -0,0 +1,31 @@
package com.annimon.hotarufx.visual;
import com.annimon.hotarufx.lib.NumberValue;
import com.annimon.hotarufx.lib.StringValue;
import com.annimon.hotarufx.lib.Types;
import com.annimon.hotarufx.lib.Value;
import java.util.function.Function;
import javafx.scene.paint.Color;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
@Getter
public enum PropertyType {
NUMBER(toNumber(), o -> NumberValue.of((Number) o)),
PAINT(v -> Color.valueOf(v.asString()), o -> new StringValue(o.toString()));
private final Function<Value, Object> fromHFX;
private final Function<Object, Value> toHFX;
private static Function<Value, Object> toNumber() {
return value -> {
if (value.type() == Types.NUMBER) {
return ((NumberValue) value).raw();
}
return value.asNumber();
};
}
}

View File

@ -1,10 +1,12 @@
package com.annimon.hotarufx.visual.objects; package com.annimon.hotarufx.visual.objects;
import com.annimon.hotarufx.visual.PropertyBindings;
import com.annimon.hotarufx.visual.PropertyTimelineHolder; import com.annimon.hotarufx.visual.PropertyTimelineHolder;
import com.annimon.hotarufx.visual.PropertyTimeline; import com.annimon.hotarufx.visual.PropertyTimeline;
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.shape.Circle; import javafx.scene.shape.Circle;
import static com.annimon.hotarufx.visual.PropertyType.*;
public class CircleNode extends ShapeNode { public class CircleNode extends ShapeNode {
@ -36,6 +38,7 @@ public class CircleNode extends ShapeNode {
return radius.setIfEmptyThenGet(circle::radiusProperty); return radius.setIfEmptyThenGet(circle::radiusProperty);
} }
@Override
public void buildTimeline(TimeLine timeline) { public void buildTimeline(TimeLine timeline) {
super.buildTimeline(timeline); super.buildTimeline(timeline);
centerX.ifPresent(PropertyConsumers.numberConsumer(timeline)); centerX.ifPresent(PropertyConsumers.numberConsumer(timeline));
@ -43,6 +46,16 @@ public class CircleNode extends ShapeNode {
radius.ifPresent(PropertyConsumers.numberConsumer(timeline)); radius.ifPresent(PropertyConsumers.numberConsumer(timeline));
} }
@Override
public PropertyBindings propertyBindings(PropertyBindings bindings) {
return super.propertyBindings(bindings)
.add("cx", NUMBER, this::centerXProperty)
.add("centerX", NUMBER, this::centerXProperty)
.add("cy", NUMBER, this::centerYProperty)
.add("centerY", NUMBER, this::centerYProperty)
.add("radius", NUMBER, this::radiusProperty);
}
@Override @Override
public <R, T> R accept(NodeVisitor<R, T> visitor, T input) { public <R, T> R accept(NodeVisitor<R, T> visitor, T input) {
return visitor.visit(this, input); return visitor.visit(this, input);

View File

@ -1,5 +1,6 @@
package com.annimon.hotarufx.visual.objects; package com.annimon.hotarufx.visual.objects;
import com.annimon.hotarufx.visual.PropertyBindings;
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;
@ -12,8 +13,14 @@ public abstract class ObjectNode {
this.node = node; this.node = node;
} }
public void buildTimeline(TimeLine timeline) { public void buildTimeline(TimeLine timeline) { }
public final PropertyBindings propertyBindings() {
return propertyBindings(new PropertyBindings());
}
protected PropertyBindings propertyBindings(PropertyBindings bindings) {
return bindings;
} }
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

@ -1,10 +1,12 @@
package com.annimon.hotarufx.visual.objects; package com.annimon.hotarufx.visual.objects;
import com.annimon.hotarufx.visual.PropertyBindings;
import com.annimon.hotarufx.visual.PropertyTimeline; import com.annimon.hotarufx.visual.PropertyTimeline;
import com.annimon.hotarufx.visual.PropertyTimelineHolder; import com.annimon.hotarufx.visual.PropertyTimelineHolder;
import com.annimon.hotarufx.visual.TimeLine; 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.*;
public abstract class ShapeNode extends ObjectNode { public abstract class ShapeNode extends ObjectNode {
@ -27,9 +29,17 @@ public abstract class ShapeNode extends ObjectNode {
return stroke.setIfEmptyThenGet(shape::strokeProperty); return stroke.setIfEmptyThenGet(shape::strokeProperty);
} }
@Override
public void buildTimeline(TimeLine timeline) { public void buildTimeline(TimeLine timeline) {
super.buildTimeline(timeline); super.buildTimeline(timeline);
fill.ifPresent(PropertyConsumers.paintConsumer(timeline)); fill.ifPresent(PropertyConsumers.paintConsumer(timeline));
stroke.ifPresent(PropertyConsumers.paintConsumer(timeline)); stroke.ifPresent(PropertyConsumers.paintConsumer(timeline));
} }
@Override
public PropertyBindings propertyBindings(PropertyBindings bindings) {
return super.propertyBindings(bindings)
.add("fill", PAINT, this::fillProperty)
.add("stroke", PAINT, this::strokeProperty);
}
} }