diff --git a/src/main/java/sh/ball/gui/Settable.java b/src/main/java/sh/ball/gui/Settable.java deleted file mode 100644 index 5f98c69f..00000000 --- a/src/main/java/sh/ball/gui/Settable.java +++ /dev/null @@ -1,7 +0,0 @@ -package sh.ball.gui; - -@FunctionalInterface -public interface Settable { - - void set(T value); -} diff --git a/src/main/java/sh/ball/gui/controller/EffectsController.java b/src/main/java/sh/ball/gui/controller/EffectsController.java index 8ac55082..5c4be1ec 100644 --- a/src/main/java/sh/ball/gui/controller/EffectsController.java +++ b/src/main/java/sh/ball/gui/controller/EffectsController.java @@ -22,7 +22,7 @@ import java.util.*; import static sh.ball.gui.Gui.audioPlayer; -public class EffectsController implements Initializable { +public class EffectsController implements Initializable, SubController { private static final int DEFAULT_SAMPLE_RATE = 192000; @@ -79,6 +79,7 @@ public class EffectsController implements Initializable { this.wobbleEffect = new WobbleEffect(DEFAULT_SAMPLE_RATE); } + @Override public Map getMidiButtonMap() { return Map.of( vectorCancellingMidi, vectorCancellingSlider, @@ -199,19 +200,22 @@ public class EffectsController implements Initializable { traceCheckBox.selectedProperty().addListener(traceListener); } - public List checkBoxes() { + private List checkBoxes() { return List.of(vectorCancellingCheckBox, bitCrushCheckBox, verticalDistortCheckBox, horizontalDistortCheckBox, wobbleCheckBox, smoothCheckBox, traceCheckBox); } + @Override public List sliders() { return List.of(vectorCancellingSlider, bitCrushSlider, verticalDistortSlider, horizontalDistortSlider, wobbleSlider, smoothSlider, traceSlider); } + @Override public List labels() { return List.of("vectorCancelling", "bitCrush", "verticalDistort", "horizontalDistort", "wobble", "smooth", "trace"); } + @Override public Element save(Document document) { Element element = document.createElement("checkBoxes"); List checkBoxes = checkBoxes(); @@ -226,6 +230,7 @@ public class EffectsController implements Initializable { return element; } + @Override public void load(Element root) { Element element = (Element) root.getElementsByTagName("checkBoxes").item(0); List checkBoxes = checkBoxes(); diff --git a/src/main/java/sh/ball/gui/controller/GeneralController.java b/src/main/java/sh/ball/gui/controller/GeneralController.java index a9d71545..f95b35c9 100644 --- a/src/main/java/sh/ball/gui/controller/GeneralController.java +++ b/src/main/java/sh/ball/gui/controller/GeneralController.java @@ -12,6 +12,8 @@ import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; import javafx.stage.Stage; import javafx.util.Duration; +import org.w3c.dom.Document; +import org.w3c.dom.Element; import org.xml.sax.SAXException; import sh.ball.audio.engine.AudioDevice; @@ -29,7 +31,7 @@ import java.util.*; import static sh.ball.gui.Gui.audioPlayer; import static sh.ball.gui.Gui.defaultDevice; -public class GeneralController implements Initializable { +public class GeneralController implements Initializable, SubController { private MainController mainController; @@ -312,6 +314,7 @@ public class GeneralController implements Initializable { }); } + @Override public Map getMidiButtonMap() { return Map.of(octaveMidi, octaveSlider); } @@ -328,14 +331,36 @@ public class GeneralController implements Initializable { ); } + @Override public List sliders() { return List.of(octaveSlider); } + @Override public List labels() { return List.of("octave"); } + @Override + public Element save(Document document) { + Element element = document.createElement("general"); + Element frameRate = document.createElement("frameRate"); + frameRate.appendChild(document.createTextNode(Integer.toString(this.frameRate))); + element.appendChild(frameRate); + return element; + } + + @Override + public void load(Element root) { + Element element = (Element) root.getElementsByTagName("general").item(0); + if (element != null) { + Element frameRate = (Element) element.getElementsByTagName("frameRate").item(0); + if (frameRate != null) { + this.frameRate = Integer.parseInt(frameRate.getTextContent()); + } + } + } + public void setFrameSourceName(String name) { this.frameSourceName = name; } diff --git a/src/main/java/sh/ball/gui/controller/ImageController.java b/src/main/java/sh/ball/gui/controller/ImageController.java index c995f404..8b7db668 100644 --- a/src/main/java/sh/ball/gui/controller/ImageController.java +++ b/src/main/java/sh/ball/gui/controller/ImageController.java @@ -25,7 +25,7 @@ import java.util.function.Consumer; import static sh.ball.gui.Gui.audioPlayer; import static sh.ball.math.Math.tryParse; -public class ImageController implements Initializable { +public class ImageController implements Initializable, SubController { private static final double MAX_FREQUENCY = 12000; private static final int DEFAULT_SAMPLE_RATE = 192000; @@ -109,6 +109,7 @@ public class ImageController implements Initializable { audioPlayer.setVolume(volumeSlider.valueProperty()); } + @Override public Map getMidiButtonMap() { return Map.of( frequencyMidi, frequencySlider, @@ -119,16 +120,19 @@ public class ImageController implements Initializable { ); } + @Override public List sliders() { return List.of(frequencySlider, rotateSpeedSlider, translationSpeedSlider, volumeSlider, visibilitySlider); } + @Override public List labels() { return List.of("frequency", "rotateSpeed", "translationSpeed", "volume", "visibility"); } + @Override public Element save(Document document) { Element element = document.createElement("translation"); Element x = document.createElement("x"); @@ -140,6 +144,7 @@ public class ImageController implements Initializable { return element; } + @Override public void load(Element root) { Element element = (Element) root.getElementsByTagName("translation").item(0); Element x = (Element) element.getElementsByTagName("x").item(0); diff --git a/src/main/java/sh/ball/gui/controller/MainController.java b/src/main/java/sh/ball/gui/controller/MainController.java index de2d16fc..77e1fee0 100644 --- a/src/main/java/sh/ball/gui/controller/MainController.java +++ b/src/main/java/sh/ball/gui/controller/MainController.java @@ -112,13 +112,14 @@ public class MainController implements Initializable, FrequencyListener, MidiLis // control if they are selected. private Map initializeMidiButtonMap() { Map midiMap = new HashMap<>(); - midiMap.putAll(generalController.getMidiButtonMap()); - midiMap.putAll(imageController.getMidiButtonMap()); - midiMap.putAll(objController.getMidiButtonMap()); - midiMap.putAll(effectsController.getMidiButtonMap()); + subControllers().forEach(controller -> midiMap.putAll(controller.getMidiButtonMap())); return midiMap; } + private List subControllers() { + return List.of(effectsController, objController, imageController, generalController); + } + @Override public void initialize(URL url, ResourceBundle resourceBundle) { objController.setAudioProducer(producer); @@ -404,28 +405,14 @@ public class MainController implements Initializable, FrequencyListener, MidiLis } // must be functions, otherwise they are not initialised - private List otherSliders() { + private List sliders() { List sliders = new ArrayList<>(); - sliders.addAll(generalController.sliders()); - sliders.addAll(imageController.sliders()); - sliders.addAll(objController.sliders()); + subControllers().forEach(controller -> sliders.addAll(controller.sliders())); return sliders; } - private List otherLabels() { + private List labels() { List labels = new ArrayList<>(); - labels.addAll(generalController.labels()); - labels.addAll(imageController.labels()); - labels.addAll(objController.labels()); - return labels; - } - private List allSliders() { - List sliders = new ArrayList<>(effectsController.sliders()); - sliders.addAll(otherSliders()); - return sliders; - } - private List allLabels() { - List labels = new ArrayList<>(effectsController.labels()); - labels.addAll(otherLabels()); + subControllers().forEach(controller -> labels.addAll(controller.labels())); return labels; } @@ -455,14 +442,13 @@ public class MainController implements Initializable, FrequencyListener, MidiLis Element root = document.createElement("project"); document.appendChild(root); - List sliders = allSliders(); - List labels = allLabels(); + List sliders = sliders(); + List labels = labels(); Element slidersElement = document.createElement("sliders"); appendSliders(sliders, labels, slidersElement, document); root.appendChild(slidersElement); - root.appendChild(effectsController.save(document)); Element midiElement = document.createElement("midi"); for (Map.Entry entry : CCMap.entrySet()) { @@ -475,9 +461,7 @@ public class MainController implements Initializable, FrequencyListener, MidiLis } root.appendChild(midiElement); - root.appendChild(imageController.save(document)); - - root.appendChild(objController.save(document)); + subControllers().forEach(controller -> root.appendChild(controller.save(document))); Element filesElement = document.createElement("files"); for (int i = 0; i < openFiles.size(); i++) { @@ -521,8 +505,8 @@ public class MainController implements Initializable, FrequencyListener, MidiLis Document document = documentBuilder.parse(new File(projectFileName)); document.getDocumentElement().normalize(); - List sliders = allSliders(); - List labels = allLabels(); + List sliders = sliders(); + List labels = labels(); // Disable cycling through frames generalController.disablePlayback(); @@ -531,7 +515,6 @@ public class MainController implements Initializable, FrequencyListener, MidiLis Element slidersElement = (Element) root.getElementsByTagName("sliders").item(0); loadSliderValues(sliders, labels, slidersElement); - effectsController.load(root); Element midiElement = (Element) root.getElementsByTagName("midi").item(0); resetCCMap(); @@ -549,9 +532,7 @@ public class MainController implements Initializable, FrequencyListener, MidiLis } root.appendChild(midiElement); - imageController.load(root); - - objController.load(root); + subControllers().forEach(controller -> controller.load(root)); Element filesElement = (Element) root.getElementsByTagName("files").item(0); List files = new ArrayList<>(); diff --git a/src/main/java/sh/ball/gui/controller/ObjController.java b/src/main/java/sh/ball/gui/controller/ObjController.java index 2f1c4c37..3886255a 100644 --- a/src/main/java/sh/ball/gui/controller/ObjController.java +++ b/src/main/java/sh/ball/gui/controller/ObjController.java @@ -15,7 +15,7 @@ import sh.ball.shapes.Shape; import java.net.URL; import java.util.*; -public class ObjController implements Initializable { +public class ObjController implements Initializable, SubController { private Vector3 rotation = new Vector3(2 * Math.PI, 2 * Math.PI, 0); private FrameProducer> producer; @@ -31,6 +31,7 @@ public class ObjController implements Initializable { @FXML private CheckBox rotateCheckBox; + @Override public Map getMidiButtonMap() { return Map.of( focalLengthMidi, focalLengthSlider, @@ -94,14 +95,17 @@ public class ObjController implements Initializable { ); } + @Override public List sliders() { return List.of(focalLengthSlider, objectRotateSpeedSlider); } + @Override public List labels() { return List.of("focalLength", "objectRotateSpeed"); } + @Override public Element save(Document document) { Element element = document.createElement("objectRotation"); Element x = document.createElement("x"); @@ -116,6 +120,7 @@ public class ObjController implements Initializable { return element; } + @Override public void load(Element root) { Element element = (Element) root.getElementsByTagName("objectRotation").item(0); Element x = (Element) element.getElementsByTagName("x").item(0); diff --git a/src/main/java/sh/ball/gui/controller/SubController.java b/src/main/java/sh/ball/gui/controller/SubController.java new file mode 100644 index 00000000..8cb4788c --- /dev/null +++ b/src/main/java/sh/ball/gui/controller/SubController.java @@ -0,0 +1,22 @@ +package sh.ball.gui.controller; + +import javafx.scene.control.Slider; +import javafx.scene.shape.SVGPath; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import java.util.List; +import java.util.Map; + +public interface SubController { + + Map getMidiButtonMap(); + + List sliders(); + + List labels(); + + Element save(Document document); + + void load(Element root); +}