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;
|
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);
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user