DDPropertyChooser.java 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package org.leumasjaffe.charsheet.model.features;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import org.leumasjaffe.charsheet.model.DDCharacterClass;
  5. import com.fasterxml.jackson.annotation.JsonTypeInfo;
  6. import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
  7. import lombok.AccessLevel;
  8. import lombok.RequiredArgsConstructor;
  9. import lombok.experimental.FieldDefaults;
  10. import lombok.experimental.NonFinal;
  11. @JsonTypeInfo(use=Id.MINIMAL_CLASS)
  12. public interface DDPropertyChooser {
  13. default int getTimes() { return 1; }
  14. String getHeader();
  15. default List<String> getChoices() { return Collections.emptyList(); }
  16. public DDProperty get(int selectedIndex);
  17. default boolean applySideEffects(DDCharacterClass to, int selectedIndex) {
  18. to.addFeature(get(selectedIndex));
  19. return true;
  20. }
  21. default void undoSideEffects(DDCharacterClass to, int selectedIndex) {
  22. to.removeFeature(get(selectedIndex));
  23. }
  24. @RequiredArgsConstructor
  25. @FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
  26. public static class State {
  27. DDCharacterClass ddCharacter;
  28. DDPropertyChooser chooser;
  29. @NonFinal boolean hasApplied = false;
  30. @NonFinal int previousIndex = -1;
  31. public void apply(int selectedIndex) {
  32. if (hasApplied) { chooser.undoSideEffects(ddCharacter, previousIndex); }
  33. hasApplied = chooser.applySideEffects(ddCharacter, previousIndex = selectedIndex);
  34. }
  35. }
  36. }