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:
parent
1e5ca3c1b3
commit
9b4f8140e3
16
app/src/main/java/com/annimon/hotarufx/visual/Property.java
Normal file
16
app/src/main/java/com/annimon/hotarufx/visual/Property.java
Normal 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;
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
};
|
||||
}
|
||||
}
|
@ -1,10 +1,12 @@
|
||||
package com.annimon.hotarufx.visual.objects;
|
||||
|
||||
import com.annimon.hotarufx.visual.PropertyBindings;
|
||||
import com.annimon.hotarufx.visual.PropertyTimelineHolder;
|
||||
import com.annimon.hotarufx.visual.PropertyTimeline;
|
||||
import com.annimon.hotarufx.visual.TimeLine;
|
||||
import com.annimon.hotarufx.visual.visitors.NodeVisitor;
|
||||
import javafx.scene.shape.Circle;
|
||||
import static com.annimon.hotarufx.visual.PropertyType.*;
|
||||
|
||||
public class CircleNode extends ShapeNode {
|
||||
|
||||
@ -36,6 +38,7 @@ public class CircleNode extends ShapeNode {
|
||||
return radius.setIfEmptyThenGet(circle::radiusProperty);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildTimeline(TimeLine timeline) {
|
||||
super.buildTimeline(timeline);
|
||||
centerX.ifPresent(PropertyConsumers.numberConsumer(timeline));
|
||||
@ -43,6 +46,16 @@ public class CircleNode extends ShapeNode {
|
||||
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
|
||||
public <R, T> R accept(NodeVisitor<R, T> visitor, T input) {
|
||||
return visitor.visit(this, input);
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.annimon.hotarufx.visual.objects;
|
||||
|
||||
import com.annimon.hotarufx.visual.PropertyBindings;
|
||||
import com.annimon.hotarufx.visual.TimeLine;
|
||||
import com.annimon.hotarufx.visual.visitors.NodeVisitor;
|
||||
import javafx.scene.Node;
|
||||
@ -12,8 +13,14 @@ public abstract class ObjectNode {
|
||||
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);
|
||||
|
@ -1,10 +1,12 @@
|
||||
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 javafx.scene.paint.Paint;
|
||||
import javafx.scene.shape.Shape;
|
||||
import static com.annimon.hotarufx.visual.PropertyType.*;
|
||||
|
||||
public abstract class ShapeNode extends ObjectNode {
|
||||
|
||||
@ -27,9 +29,17 @@ public abstract class ShapeNode extends ObjectNode {
|
||||
return stroke.setIfEmptyThenGet(shape::strokeProperty);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void buildTimeline(TimeLine timeline) {
|
||||
super.buildTimeline(timeline);
|
||||
fill.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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user