diff options
Diffstat (limited to 'src/jcgp/gui/SettingsPane.java')
-rw-r--r-- | src/jcgp/gui/SettingsPane.java | 253 |
1 files changed, 241 insertions, 12 deletions
diff --git a/src/jcgp/gui/SettingsPane.java b/src/jcgp/gui/SettingsPane.java index f7e7767..594147f 100644 --- a/src/jcgp/gui/SettingsPane.java +++ b/src/jcgp/gui/SettingsPane.java @@ -1,37 +1,266 @@ package jcgp.gui; +import java.util.ArrayList; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.scene.Cursor; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.AnchorPane; import javafx.scene.layout.VBox; +import javafx.scene.text.Font; import javafx.scene.text.Text; +import jcgp.GUI; import jcgp.JCGP; +import jcgp.function.FunctionSet; +import jcgp.gui.settings.GUIBooleanParameter; +import jcgp.gui.settings.GUIDoubleParameter; import jcgp.gui.settings.GUIIntegerParameter; +import jcgp.gui.settings.GUIParameter; +import jcgp.modules.ea.EvolutionaryAlgorithm; +import jcgp.modules.fitness.FitnessFunction; +import jcgp.modules.mutator.Mutator; +import jcgp.parameters.BooleanParameter; +import jcgp.parameters.DoubleParameter; import jcgp.parameters.IntegerParameter; import jcgp.parameters.Parameter; -public class SettingsPane extends VBox { +public class SettingsPane extends AnchorPane { + private VBox mainContainer, eas, mutators, ffs; + private boolean dragging = false; + public SettingsPane(JCGP cgp) { super(); - setPrefSize(180, 500); + setResizeListeners(); - Text parameters = new Text("Parameters"); - getChildren().add(parameters); + //setStyle("-fx-border-width: 0 0 0 5; -fx-border-color: #D1D1D1"); - Iterator<Entry<String, Parameter>> it = cgp.getResources().iterator(); - while (it.hasNext()) { - Parameter p = (Parameter) ((Map.Entry<String, Parameter>) it.next()).getValue(); - if (p instanceof IntegerParameter) { - GUIIntegerParameter gip = new GUIIntegerParameter((IntegerParameter) p); - getChildren().add(gip); - } - } + mainContainer = new VBox(); + + AnchorPane.setTopAnchor(mainContainer, 0.0); + AnchorPane.setBottomAnchor(mainContainer, 0.0); + AnchorPane.setRightAnchor(mainContainer, 0.0); + AnchorPane.setLeftAnchor(mainContainer, GUI.RESIZE_MARGIN); + mainContainer.setPadding(new Insets(5, 0, 0, 0)); + mainContainer.setSpacing(6); + + setMinWidth(GUI.SETTINGS_WIDTH); + setPrefWidth(GUI.SETTINGS_WIDTH); + + makeBaseParameters(cgp); + makeEAParameters(cgp); + mainContainer.getChildren().add(eas); + + makeMutatorParameters(cgp); + mainContainer.getChildren().add(mutators); + makeFitnessFunctionParameters(cgp); + mainContainer.getChildren().add(ffs); + + makeNodeFunctionParameters(cgp); + + getChildren().add(mainContainer); + } + + private void makeBaseParameters(JCGP cgp) { + VBox vb = new VBox(); + vb.setSpacing(2); + + Text header = new Text("Base Parameters"); + header.setFont(Font.font("Arial", 14)); + header.setUnderline(true); + + vb.getChildren().add(header); + + ArrayList<GUIParameter> gp = new ArrayList<GUIParameter>(); + + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("rows"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("columns"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("inputs"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("outputs"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("levelsBack"))); + + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("popSize"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("generations"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("runs"))); + + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("seed"))); + gp.add(new GUIIntegerParameter((IntegerParameter) cgp.getResources().getParameter("report"))); + gp.add(new GUIBooleanParameter((BooleanParameter) cgp.getResources().getParameter("debug"))); + + vb.getChildren().addAll(gp); + + mainContainer.getChildren().add(vb); + } + + private void makeEAParameters(JCGP cgp) { + eas = new VBox(); + eas.setSpacing(2); + + Text header = new Text("EA"); + header.setFont(Font.font("Arial", 14)); + header.setUnderline(true); + + eas.getChildren().add(header); + + ComboBox<EvolutionaryAlgorithm> eab = new ComboBox<EvolutionaryAlgorithm>(); + eab.getItems().addAll(cgp.getEvolutionaryAlgorithms()); + eab.getSelectionModel().select(cgp.getEvolutionaryAlgorithm()); + eab.prefWidthProperty().bind(mainContainer.widthProperty()); + eas.getChildren().add(eab); + + addParameters(cgp.getEvolutionaryAlgorithm().getLocalParameters().entrySet().iterator(), eas); + } + + private void makeMutatorParameters(JCGP cgp) { + mutators = new VBox(); + mutators.setSpacing(2); + + Text header = new Text("Mutator"); + header.setFont(Font.font("Arial", 14)); + header.setUnderline(true); + + mutators.getChildren().add(header); + + ComboBox<Mutator> mb = new ComboBox<Mutator>(); + mb.getItems().addAll(cgp.getMutators()); + mb.getSelectionModel().select(cgp.getMutator()); + mb.prefWidthProperty().bind(mainContainer.widthProperty()); + mutators.getChildren().add(mb); + + addParameters(cgp.getMutator().getLocalParameters().entrySet().iterator(), mutators); + } + + private void makeFitnessFunctionParameters(JCGP cgp) { + ffs = new VBox(); + ffs.setSpacing(2); + + Text header = new Text("Fitness Function"); + header.setFont(Font.font("Arial", 14)); + header.setUnderline(true); + + ffs.getChildren().add(header); + + ComboBox<FitnessFunction> ff = new ComboBox<FitnessFunction>(); + ff.getItems().addAll(cgp.getFitnessFunctions()); + ff.getSelectionModel().select(cgp.getFitnessFunction()); + ff.prefWidthProperty().bind(mainContainer.widthProperty()); + ffs.getChildren().add(ff); + + addParameters(cgp.getFitnessFunction().getLocalParameters().entrySet().iterator(), ffs); + } + + private void makeNodeFunctionParameters(JCGP cgp) { + VBox vb = new VBox(); + vb.setSpacing(2); + + Text header = new Text("Node Functions"); + header.setFont(Font.font("Arial", 14)); + header.setUnderline(true); + + vb.getChildren().add(header); + + ComboBox<FunctionSet> nf = new ComboBox<FunctionSet>(); + nf.getItems().addAll(cgp.getResources().getFunctionSets()); + nf.getSelectionModel().select(cgp.getResources().getFunctionSet()); + nf.prefWidthProperty().bind(mainContainer.widthProperty()); + vb.getChildren().add(nf); + + // TODO make this function re-usable + addFunctions(cgp.getResources().getFunctionSet(), vb); + + mainContainer.getChildren().add(vb); } + /** + * @param cgp + * @param vb + */ + private void addParameters(Iterator<Entry<String, Parameter>> it, VBox vb) { + while (it.hasNext()) { + Parameter parameter = ((Map.Entry<String, Parameter>) it.next()).getValue(); + if (parameter instanceof IntegerParameter) { + vb.getChildren().add(new GUIIntegerParameter((IntegerParameter) parameter)); + } else if (parameter instanceof DoubleParameter) { + vb.getChildren().add(new GUIDoubleParameter((DoubleParameter) parameter)); + } else if (parameter instanceof BooleanParameter) { + vb.getChildren().add(new GUIBooleanParameter((BooleanParameter) parameter)); + } + } + } + private void addFunctions(final FunctionSet fs, VBox vb) { + CheckBox cb; + for (int i = 0; i < fs.getTotalFunctionCount(); i++) { + cb = new CheckBox(fs.getFunction(i).getName()); + cb.setId(String.valueOf(i)); + cb.setSelected(true); + final int index = i; + cb.setOnAction(new EventHandler<ActionEvent>() { + @Override + public void handle(ActionEvent event) { + if (((CheckBox) event.getSource()).isSelected()) { + fs.enableFunction(index); + } else { + fs.disableFunction(index); + } + } + }); + vb.getChildren().add(cb); + } + } + private void setResizeListeners() { + setOnMousePressed(new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent event) { + if(isInDraggableZone(event)) { + dragging = true; + } + } + }); + setOnMouseDragged(new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent event) { + if(dragging) { + double newWidth = getWidth() - event.getX(); + if (newWidth >= getMinWidth()) { + setPrefWidth(newWidth); + } else { + setPrefWidth(getMinWidth()); + } + } + } + }); + setOnMouseMoved(new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent event) { + if(isInDraggableZone(event) || dragging) { + setCursor(Cursor.H_RESIZE); + } + else { + setCursor(Cursor.DEFAULT); + } + } + }); + setOnMouseReleased(new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent event) { + dragging = false; + setCursor(Cursor.DEFAULT); + } + }); + } + private boolean isInDraggableZone(MouseEvent event) { + return event.getX() < (GUI.RESIZE_MARGIN); + } + } |