Extract common logic to SubController and remove unused Settable interface

pull/46/head
James Ball 2021-12-30 14:01:41 +00:00 zatwierdzone przez James H Ball
rodzic 6c28de07aa
commit 2377fa89a4
7 zmienionych plików z 82 dodań i 46 usunięć

Wyświetl plik

@ -1,7 +0,0 @@
package sh.ball.gui;
@FunctionalInterface
public interface Settable<T> {
void set(T value);
}

Wyświetl plik

@ -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<SVGPath, Slider> getMidiButtonMap() {
return Map.of(
vectorCancellingMidi, vectorCancellingSlider,
@ -199,19 +200,22 @@ public class EffectsController implements Initializable {
traceCheckBox.selectedProperty().addListener(traceListener);
}
public List<CheckBox> checkBoxes() {
private List<CheckBox> checkBoxes() {
return List.of(vectorCancellingCheckBox, bitCrushCheckBox, verticalDistortCheckBox,
horizontalDistortCheckBox, wobbleCheckBox, smoothCheckBox, traceCheckBox);
}
@Override
public List<Slider> sliders() {
return List.of(vectorCancellingSlider, bitCrushSlider, verticalDistortSlider,
horizontalDistortSlider, wobbleSlider, smoothSlider, traceSlider);
}
@Override
public List<String> labels() {
return List.of("vectorCancelling", "bitCrush", "verticalDistort", "horizontalDistort",
"wobble", "smooth", "trace");
}
@Override
public Element save(Document document) {
Element element = document.createElement("checkBoxes");
List<CheckBox> 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<CheckBox> checkBoxes = checkBoxes();

Wyświetl plik

@ -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<SVGPath, Slider> getMidiButtonMap() {
return Map.of(octaveMidi, octaveSlider);
}
@ -328,14 +331,36 @@ public class GeneralController implements Initializable {
);
}
@Override
public List<Slider> sliders() {
return List.of(octaveSlider);
}
@Override
public List<String> 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;
}

Wyświetl plik

@ -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<SVGPath, Slider> getMidiButtonMap() {
return Map.of(
frequencyMidi, frequencySlider,
@ -119,16 +120,19 @@ public class ImageController implements Initializable {
);
}
@Override
public List<Slider> sliders() {
return List.of(frequencySlider, rotateSpeedSlider, translationSpeedSlider,
volumeSlider, visibilitySlider);
}
@Override
public List<String> 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);

Wyświetl plik

@ -112,13 +112,14 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
// control if they are selected.
private Map<SVGPath, Slider> initializeMidiButtonMap() {
Map<SVGPath, Slider> 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<SubController> 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<Slider> otherSliders() {
private List<Slider> sliders() {
List<Slider> 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<String> otherLabels() {
private List<String> labels() {
List<String> labels = new ArrayList<>();
labels.addAll(generalController.labels());
labels.addAll(imageController.labels());
labels.addAll(objController.labels());
return labels;
}
private List<Slider> allSliders() {
List<Slider> sliders = new ArrayList<>(effectsController.sliders());
sliders.addAll(otherSliders());
return sliders;
}
private List<String> allLabels() {
List<String> 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<Slider> sliders = allSliders();
List<String> labels = allLabels();
List<Slider> sliders = sliders();
List<String> 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<Integer, SVGPath> 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<Slider> sliders = allSliders();
List<String> labels = allLabels();
List<Slider> sliders = sliders();
List<String> 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<byte[]> files = new ArrayList<>();

Wyświetl plik

@ -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<List<Shape>> producer;
@ -31,6 +31,7 @@ public class ObjController implements Initializable {
@FXML
private CheckBox rotateCheckBox;
@Override
public Map<SVGPath, Slider> getMidiButtonMap() {
return Map.of(
focalLengthMidi, focalLengthSlider,
@ -94,14 +95,17 @@ public class ObjController implements Initializable {
);
}
@Override
public List<Slider> sliders() {
return List.of(focalLengthSlider, objectRotateSpeedSlider);
}
@Override
public List<String> 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);

Wyświetl plik

@ -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<SVGPath, Slider> getMidiButtonMap();
List<Slider> sliders();
List<String> labels();
Element save(Document document);
void load(Element root);
}