From 5e403681a2281a98958569a69d840add4fb5f105 Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 8 Sep 2017 11:12:31 +0300 Subject: [PATCH] Add enum to string property converter --- .../hotarufx/visual/objects/ObjectNode.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) 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 c0e3c39..e7265ad 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 @@ -1,13 +1,21 @@ package com.annimon.hotarufx.visual.objects; +import com.annimon.hotarufx.exceptions.HotaruRuntimeException; 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 java.util.EnumSet; +import java.util.function.Supplier; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.WritableValue; import javafx.scene.Node; +import javafx.util.StringConverter; import lombok.Getter; import lombok.Setter; +import lombok.val; import static com.annimon.hotarufx.visual.PropertyType.*; public abstract class ObjectNode { @@ -136,5 +144,33 @@ public abstract class ObjectNode { .add("layoutY", NUMBER, this::layoutYProperty); } + protected > Supplier> enumToString(Class enumClass, ObjectProperty property) { + return () -> { + val stringProperty = new SimpleStringProperty(); + stringProperty.bindBidirectional(property, new StringConverter() { + @Override + public String toString(T object) { + return object.name(); + } + + @Override + public T fromString(String string) { + try { + return Enum.valueOf(enumClass, string); + } catch (IllegalArgumentException e) { + try { + val number = (int) Double.parseDouble(string); + return enumClass.cast(EnumSet.allOf(enumClass).toArray()[number]); + } catch (Exception ex) { + throw new HotaruRuntimeException("No constant " + string + + " for type " + enumClass.getSimpleName()); + } + } + } + }); + return stringProperty; + }; + } + public abstract R accept(NodeVisitor visitor, T input); }