package org.leumasjaffe.charsheet.model.features; import java.util.Collections; import java.util.List; import org.leumasjaffe.charsheet.model.DDCharacterClass; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; @JsonTypeInfo(use=Id.MINIMAL_CLASS) public interface DDPropertyChooser { default int getTimes() { return 1; } String getHeader(); default List getChoices() { return Collections.emptyList(); } public DDProperty get(int selectedIndex); default boolean applySideEffects(DDCharacterClass to, int selectedIndex) { to.addFeature(get(selectedIndex)); return true; } default void undoSideEffects(DDCharacterClass to, int selectedIndex) { to.removeFeature(get(selectedIndex)); } @RequiredArgsConstructor @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true) public static class State { DDCharacterClass ddCharacter; DDPropertyChooser chooser; @NonFinal boolean hasApplied = false; @NonFinal int previousIndex = -1; public void apply(int selectedIndex) { if (hasApplied) { chooser.undoSideEffects(ddCharacter, previousIndex); } hasApplied = chooser.applySideEffects(ddCharacter, previousIndex = selectedIndex); } } }