kopia lustrzana https://github.com/jameshball/osci-render
Extract common logic to SubController and remove unused Settable interface
rodzic
6c28de07aa
commit
2377fa89a4
|
@ -1,7 +0,0 @@
|
||||||
package sh.ball.gui;
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
public interface Settable<T> {
|
|
||||||
|
|
||||||
void set(T value);
|
|
||||||
}
|
|
|
@ -22,7 +22,7 @@ import java.util.*;
|
||||||
|
|
||||||
import static sh.ball.gui.Gui.audioPlayer;
|
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;
|
private static final int DEFAULT_SAMPLE_RATE = 192000;
|
||||||
|
|
||||||
|
@ -79,6 +79,7 @@ public class EffectsController implements Initializable {
|
||||||
this.wobbleEffect = new WobbleEffect(DEFAULT_SAMPLE_RATE);
|
this.wobbleEffect = new WobbleEffect(DEFAULT_SAMPLE_RATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<SVGPath, Slider> getMidiButtonMap() {
|
public Map<SVGPath, Slider> getMidiButtonMap() {
|
||||||
return Map.of(
|
return Map.of(
|
||||||
vectorCancellingMidi, vectorCancellingSlider,
|
vectorCancellingMidi, vectorCancellingSlider,
|
||||||
|
@ -199,19 +200,22 @@ public class EffectsController implements Initializable {
|
||||||
traceCheckBox.selectedProperty().addListener(traceListener);
|
traceCheckBox.selectedProperty().addListener(traceListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<CheckBox> checkBoxes() {
|
private List<CheckBox> checkBoxes() {
|
||||||
return List.of(vectorCancellingCheckBox, bitCrushCheckBox, verticalDistortCheckBox,
|
return List.of(vectorCancellingCheckBox, bitCrushCheckBox, verticalDistortCheckBox,
|
||||||
horizontalDistortCheckBox, wobbleCheckBox, smoothCheckBox, traceCheckBox);
|
horizontalDistortCheckBox, wobbleCheckBox, smoothCheckBox, traceCheckBox);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public List<Slider> sliders() {
|
public List<Slider> sliders() {
|
||||||
return List.of(vectorCancellingSlider, bitCrushSlider, verticalDistortSlider,
|
return List.of(vectorCancellingSlider, bitCrushSlider, verticalDistortSlider,
|
||||||
horizontalDistortSlider, wobbleSlider, smoothSlider, traceSlider);
|
horizontalDistortSlider, wobbleSlider, smoothSlider, traceSlider);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public List<String> labels() {
|
public List<String> labels() {
|
||||||
return List.of("vectorCancelling", "bitCrush", "verticalDistort", "horizontalDistort",
|
return List.of("vectorCancelling", "bitCrush", "verticalDistort", "horizontalDistort",
|
||||||
"wobble", "smooth", "trace");
|
"wobble", "smooth", "trace");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Element save(Document document) {
|
public Element save(Document document) {
|
||||||
Element element = document.createElement("checkBoxes");
|
Element element = document.createElement("checkBoxes");
|
||||||
List<CheckBox> checkBoxes = checkBoxes();
|
List<CheckBox> checkBoxes = checkBoxes();
|
||||||
|
@ -226,6 +230,7 @@ public class EffectsController implements Initializable {
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void load(Element root) {
|
public void load(Element root) {
|
||||||
Element element = (Element) root.getElementsByTagName("checkBoxes").item(0);
|
Element element = (Element) root.getElementsByTagName("checkBoxes").item(0);
|
||||||
List<CheckBox> checkBoxes = checkBoxes();
|
List<CheckBox> checkBoxes = checkBoxes();
|
||||||
|
|
|
@ -12,6 +12,8 @@ import javafx.stage.DirectoryChooser;
|
||||||
import javafx.stage.FileChooser;
|
import javafx.stage.FileChooser;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import javafx.util.Duration;
|
import javafx.util.Duration;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
import org.xml.sax.SAXException;
|
import org.xml.sax.SAXException;
|
||||||
import sh.ball.audio.engine.AudioDevice;
|
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.audioPlayer;
|
||||||
import static sh.ball.gui.Gui.defaultDevice;
|
import static sh.ball.gui.Gui.defaultDevice;
|
||||||
|
|
||||||
public class GeneralController implements Initializable {
|
public class GeneralController implements Initializable, SubController {
|
||||||
|
|
||||||
private MainController mainController;
|
private MainController mainController;
|
||||||
|
|
||||||
|
@ -312,6 +314,7 @@ public class GeneralController implements Initializable {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<SVGPath, Slider> getMidiButtonMap() {
|
public Map<SVGPath, Slider> getMidiButtonMap() {
|
||||||
return Map.of(octaveMidi, octaveSlider);
|
return Map.of(octaveMidi, octaveSlider);
|
||||||
}
|
}
|
||||||
|
@ -328,14 +331,36 @@ public class GeneralController implements Initializable {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<Slider> sliders() {
|
public List<Slider> sliders() {
|
||||||
return List.of(octaveSlider);
|
return List.of(octaveSlider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<String> labels() {
|
public List<String> labels() {
|
||||||
return List.of("octave");
|
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) {
|
public void setFrameSourceName(String name) {
|
||||||
this.frameSourceName = name;
|
this.frameSourceName = name;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ import java.util.function.Consumer;
|
||||||
import static sh.ball.gui.Gui.audioPlayer;
|
import static sh.ball.gui.Gui.audioPlayer;
|
||||||
import static sh.ball.math.Math.tryParse;
|
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 double MAX_FREQUENCY = 12000;
|
||||||
private static final int DEFAULT_SAMPLE_RATE = 192000;
|
private static final int DEFAULT_SAMPLE_RATE = 192000;
|
||||||
|
@ -109,6 +109,7 @@ public class ImageController implements Initializable {
|
||||||
audioPlayer.setVolume(volumeSlider.valueProperty());
|
audioPlayer.setVolume(volumeSlider.valueProperty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<SVGPath, Slider> getMidiButtonMap() {
|
public Map<SVGPath, Slider> getMidiButtonMap() {
|
||||||
return Map.of(
|
return Map.of(
|
||||||
frequencyMidi, frequencySlider,
|
frequencyMidi, frequencySlider,
|
||||||
|
@ -119,16 +120,19 @@ public class ImageController implements Initializable {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<Slider> sliders() {
|
public List<Slider> sliders() {
|
||||||
return List.of(frequencySlider, rotateSpeedSlider, translationSpeedSlider,
|
return List.of(frequencySlider, rotateSpeedSlider, translationSpeedSlider,
|
||||||
volumeSlider, visibilitySlider);
|
volumeSlider, visibilitySlider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<String> labels() {
|
public List<String> labels() {
|
||||||
return List.of("frequency", "rotateSpeed", "translationSpeed", "volume",
|
return List.of("frequency", "rotateSpeed", "translationSpeed", "volume",
|
||||||
"visibility");
|
"visibility");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Element save(Document document) {
|
public Element save(Document document) {
|
||||||
Element element = document.createElement("translation");
|
Element element = document.createElement("translation");
|
||||||
Element x = document.createElement("x");
|
Element x = document.createElement("x");
|
||||||
|
@ -140,6 +144,7 @@ public class ImageController implements Initializable {
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void load(Element root) {
|
public void load(Element root) {
|
||||||
Element element = (Element) root.getElementsByTagName("translation").item(0);
|
Element element = (Element) root.getElementsByTagName("translation").item(0);
|
||||||
Element x = (Element) element.getElementsByTagName("x").item(0);
|
Element x = (Element) element.getElementsByTagName("x").item(0);
|
||||||
|
|
|
@ -112,13 +112,14 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
||||||
// control if they are selected.
|
// control if they are selected.
|
||||||
private Map<SVGPath, Slider> initializeMidiButtonMap() {
|
private Map<SVGPath, Slider> initializeMidiButtonMap() {
|
||||||
Map<SVGPath, Slider> midiMap = new HashMap<>();
|
Map<SVGPath, Slider> midiMap = new HashMap<>();
|
||||||
midiMap.putAll(generalController.getMidiButtonMap());
|
subControllers().forEach(controller -> midiMap.putAll(controller.getMidiButtonMap()));
|
||||||
midiMap.putAll(imageController.getMidiButtonMap());
|
|
||||||
midiMap.putAll(objController.getMidiButtonMap());
|
|
||||||
midiMap.putAll(effectsController.getMidiButtonMap());
|
|
||||||
return midiMap;
|
return midiMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<SubController> subControllers() {
|
||||||
|
return List.of(effectsController, objController, imageController, generalController);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(URL url, ResourceBundle resourceBundle) {
|
public void initialize(URL url, ResourceBundle resourceBundle) {
|
||||||
objController.setAudioProducer(producer);
|
objController.setAudioProducer(producer);
|
||||||
|
@ -404,28 +405,14 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
||||||
}
|
}
|
||||||
|
|
||||||
// must be functions, otherwise they are not initialised
|
// must be functions, otherwise they are not initialised
|
||||||
private List<Slider> otherSliders() {
|
private List<Slider> sliders() {
|
||||||
List<Slider> sliders = new ArrayList<>();
|
List<Slider> sliders = new ArrayList<>();
|
||||||
sliders.addAll(generalController.sliders());
|
subControllers().forEach(controller -> sliders.addAll(controller.sliders()));
|
||||||
sliders.addAll(imageController.sliders());
|
|
||||||
sliders.addAll(objController.sliders());
|
|
||||||
return sliders;
|
return sliders;
|
||||||
}
|
}
|
||||||
private List<String> otherLabels() {
|
private List<String> labels() {
|
||||||
List<String> labels = new ArrayList<>();
|
List<String> labels = new ArrayList<>();
|
||||||
labels.addAll(generalController.labels());
|
subControllers().forEach(controller -> labels.addAll(controller.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());
|
|
||||||
return labels;
|
return labels;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,14 +442,13 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
||||||
Element root = document.createElement("project");
|
Element root = document.createElement("project");
|
||||||
document.appendChild(root);
|
document.appendChild(root);
|
||||||
|
|
||||||
List<Slider> sliders = allSliders();
|
List<Slider> sliders = sliders();
|
||||||
List<String> labels = allLabels();
|
List<String> labels = labels();
|
||||||
|
|
||||||
Element slidersElement = document.createElement("sliders");
|
Element slidersElement = document.createElement("sliders");
|
||||||
appendSliders(sliders, labels, slidersElement, document);
|
appendSliders(sliders, labels, slidersElement, document);
|
||||||
root.appendChild(slidersElement);
|
root.appendChild(slidersElement);
|
||||||
|
|
||||||
root.appendChild(effectsController.save(document));
|
|
||||||
|
|
||||||
Element midiElement = document.createElement("midi");
|
Element midiElement = document.createElement("midi");
|
||||||
for (Map.Entry<Integer, SVGPath> entry : CCMap.entrySet()) {
|
for (Map.Entry<Integer, SVGPath> entry : CCMap.entrySet()) {
|
||||||
|
@ -475,9 +461,7 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
||||||
}
|
}
|
||||||
root.appendChild(midiElement);
|
root.appendChild(midiElement);
|
||||||
|
|
||||||
root.appendChild(imageController.save(document));
|
subControllers().forEach(controller -> root.appendChild(controller.save(document)));
|
||||||
|
|
||||||
root.appendChild(objController.save(document));
|
|
||||||
|
|
||||||
Element filesElement = document.createElement("files");
|
Element filesElement = document.createElement("files");
|
||||||
for (int i = 0; i < openFiles.size(); i++) {
|
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 document = documentBuilder.parse(new File(projectFileName));
|
||||||
document.getDocumentElement().normalize();
|
document.getDocumentElement().normalize();
|
||||||
|
|
||||||
List<Slider> sliders = allSliders();
|
List<Slider> sliders = sliders();
|
||||||
List<String> labels = allLabels();
|
List<String> labels = labels();
|
||||||
|
|
||||||
// Disable cycling through frames
|
// Disable cycling through frames
|
||||||
generalController.disablePlayback();
|
generalController.disablePlayback();
|
||||||
|
@ -531,7 +515,6 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
||||||
Element slidersElement = (Element) root.getElementsByTagName("sliders").item(0);
|
Element slidersElement = (Element) root.getElementsByTagName("sliders").item(0);
|
||||||
loadSliderValues(sliders, labels, slidersElement);
|
loadSliderValues(sliders, labels, slidersElement);
|
||||||
|
|
||||||
effectsController.load(root);
|
|
||||||
|
|
||||||
Element midiElement = (Element) root.getElementsByTagName("midi").item(0);
|
Element midiElement = (Element) root.getElementsByTagName("midi").item(0);
|
||||||
resetCCMap();
|
resetCCMap();
|
||||||
|
@ -549,9 +532,7 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
|
||||||
}
|
}
|
||||||
root.appendChild(midiElement);
|
root.appendChild(midiElement);
|
||||||
|
|
||||||
imageController.load(root);
|
subControllers().forEach(controller -> controller.load(root));
|
||||||
|
|
||||||
objController.load(root);
|
|
||||||
|
|
||||||
Element filesElement = (Element) root.getElementsByTagName("files").item(0);
|
Element filesElement = (Element) root.getElementsByTagName("files").item(0);
|
||||||
List<byte[]> files = new ArrayList<>();
|
List<byte[]> files = new ArrayList<>();
|
||||||
|
|
|
@ -15,7 +15,7 @@ import sh.ball.shapes.Shape;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.*;
|
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 Vector3 rotation = new Vector3(2 * Math.PI, 2 * Math.PI, 0);
|
||||||
private FrameProducer<List<Shape>> producer;
|
private FrameProducer<List<Shape>> producer;
|
||||||
|
@ -31,6 +31,7 @@ public class ObjController implements Initializable {
|
||||||
@FXML
|
@FXML
|
||||||
private CheckBox rotateCheckBox;
|
private CheckBox rotateCheckBox;
|
||||||
|
|
||||||
|
@Override
|
||||||
public Map<SVGPath, Slider> getMidiButtonMap() {
|
public Map<SVGPath, Slider> getMidiButtonMap() {
|
||||||
return Map.of(
|
return Map.of(
|
||||||
focalLengthMidi, focalLengthSlider,
|
focalLengthMidi, focalLengthSlider,
|
||||||
|
@ -94,14 +95,17 @@ public class ObjController implements Initializable {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<Slider> sliders() {
|
public List<Slider> sliders() {
|
||||||
return List.of(focalLengthSlider, objectRotateSpeedSlider);
|
return List.of(focalLengthSlider, objectRotateSpeedSlider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public List<String> labels() {
|
public List<String> labels() {
|
||||||
return List.of("focalLength", "objectRotateSpeed");
|
return List.of("focalLength", "objectRotateSpeed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Element save(Document document) {
|
public Element save(Document document) {
|
||||||
Element element = document.createElement("objectRotation");
|
Element element = document.createElement("objectRotation");
|
||||||
Element x = document.createElement("x");
|
Element x = document.createElement("x");
|
||||||
|
@ -116,6 +120,7 @@ public class ObjController implements Initializable {
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void load(Element root) {
|
public void load(Element root) {
|
||||||
Element element = (Element) root.getElementsByTagName("objectRotation").item(0);
|
Element element = (Element) root.getElementsByTagName("objectRotation").item(0);
|
||||||
Element x = (Element) element.getElementsByTagName("x").item(0);
|
Element x = (Element) element.getElementsByTagName("x").item(0);
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
Ładowanie…
Reference in New Issue