diff options
Diffstat (limited to 'src/jcgp/gui/population/ChromosomePane.java')
-rw-r--r-- | src/jcgp/gui/population/ChromosomePane.java | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/src/jcgp/gui/population/ChromosomePane.java b/src/jcgp/gui/population/ChromosomePane.java new file mode 100644 index 0000000..a87a054 --- /dev/null +++ b/src/jcgp/gui/population/ChromosomePane.java @@ -0,0 +1,140 @@ +package jcgp.gui.population; + +import java.util.ArrayList; + +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.Pane; +import javafx.scene.shape.Line; +import jcgp.backend.population.Chromosome; +import jcgp.backend.population.Node; +import jcgp.gui.GUI; + +/** + * This extension of {@code ScrollPane} contains a series of + * nodes, inputs and outputs spread across a grid. It also contains + * all of the connection lines laid over the nodes, inputs and outputs. + * + * + * @author Eduardo Pedroni + * + */ +public class ChromosomePane extends ScrollPane { + + private GUIInput[] guiInputs; + private GUINode[][] guiNodes; + private GUIOutput[] guiOutputs; + + private Pane content; + + private boolean target = false; + + public ChromosomePane(Chromosome chromosome) { + super(); + + ArrayList<Line> connectionLines = new ArrayList<Line>(); + + int rows = GUI.resources.rows(); + int columns = GUI.resources.columns(); + + content = new Pane(); + content.setId("content pane for genes"); + + /* + * inputs + */ + guiInputs = new GUIInput[GUI.resources.inputs()]; + for (int i = 0; i < guiInputs.length; i++) { + guiInputs[i] = new GUIInput(chromosome.getInput(i)); + } + // add inputs to content pane + content.getChildren().addAll(guiInputs); + + /* + * nodes + */ + guiNodes = new GUINode[rows][columns]; + for (int c = 0; c < columns; c++) { + for (int r = 0; r < rows; r++) { + // make the connection lines + Line lines[] = new Line[GUI.resources.arity()]; + for (int l = 0; l < lines.length; l++) { + lines[l] = new Line(); + lines[l].setMouseTransparent(true); + lines[l].setVisible(false); + connectionLines.add(lines[l]); + } + // make the GUI element + guiNodes[r][c] = new GUINode(chromosome.getNode(r, c), lines); + // add node to content pane + content.getChildren().add(guiNodes[r][c]); + } + } + + /* + * outputs + */ + guiOutputs = new GUIOutput[GUI.resources.outputs()]; + for (int i = 0; i < guiOutputs.length; i++) { + // make the connection line + Line line = new Line(); + line.setVisible(false); + line.setMouseTransparent(true); + connectionLines.add(line); + // make the GUI element + guiOutputs[i] = new GUIOutput(chromosome.getOutput(i), line); + } + // add outputs to content pane + content.getChildren().addAll(guiOutputs); + + // add lines to the pane on top of genes + content.getChildren().addAll(connectionLines); + + setPrefWidth(620); + setContent(content); + } + + protected boolean isTarget() { + return target; + } + + protected void setTarget(boolean newValue) { + target = newValue; + } + + public void updateGenes(Chromosome chr) { + for (int r = 0; r < GUI.resources.rows(); r++) { + for (int c = 0; c < GUI.resources.columns(); c++) { + guiNodes[r][c].setNode(chr.getNode(r, c)); + } + } + for (int i = 0; i < guiOutputs.length; i++) { + guiOutputs[i].setOutput(chr.getOutput(i)); + } + } + + public static boolean isAllowed(GUIMutable source, GUIConnection target) { + if (source instanceof GUINode) { + // if the source is a node, all inputs and some nodes are valid + if (target instanceof GUIInput) { + return true; + } else if (target instanceof GUINode) { + // target and source are nodes, let's look at levels back + Node t = ((GUINode) target).getNode(), s = ((GUINode) source).getNode(); + if (s.getColumn() - t.getColumn() > 0 && s.getColumn() - t.getColumn() <= GUI.resources.levelsBack()) { + return true; + } + } + return false; + } else if (source instanceof GUIOutput) { + // if the source is an output, any node or input is valid + if (target instanceof GUINode || target instanceof GUIInput) { + return true; + } else { + // this should never happen... + return false; + } + } + // if the source was neither node nor output, something bad is happening + throw new ClassCastException("Source was neither GUINode nor GUIOutput."); + } +} |