DDPropertyChooser.java 1.5 KB

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