aboutsummaryrefslogtreecommitdiffstats
path: root/src/jcgp/gui/population/ChromosomePane.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/jcgp/gui/population/ChromosomePane.java')
-rw-r--r--src/jcgp/gui/population/ChromosomePane.java140
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.");
+ }
+}