diff options
author | Eduardo Pedroni <ep625@york.ac.uk> | 2014-04-06 21:58:53 +0100 |
---|---|---|
committer | Eduardo Pedroni <ep625@york.ac.uk> | 2014-04-06 21:58:53 +0100 |
commit | e6dd7711c7dad5e000445208eb5845801f4ccffc (patch) | |
tree | 1454bd20a8dd7069b1283184c42f4def6d5f7e6f /src/jcgp/gui/population/GUINode.java | |
parent | c7969623b44f375e30fa3f15dcd7581609276a0f (diff) |
About to make big changes to the way fitness works, committing just in case
Diffstat (limited to 'src/jcgp/gui/population/GUINode.java')
-rw-r--r-- | src/jcgp/gui/population/GUINode.java | 207 |
1 files changed, 94 insertions, 113 deletions
diff --git a/src/jcgp/gui/population/GUINode.java b/src/jcgp/gui/population/GUINode.java index 450647f..98ba738 100644 --- a/src/jcgp/gui/population/GUINode.java +++ b/src/jcgp/gui/population/GUINode.java @@ -1,22 +1,15 @@ package jcgp.gui.population; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; -import javafx.geometry.VPos; import javafx.scene.control.Label; import javafx.scene.input.MouseDragEvent; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Paint; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; -import javafx.scene.text.Font; -import javafx.scene.text.Text; -import javafx.scene.text.TextAlignment; import jcgp.backend.population.Connection; import jcgp.backend.population.Input; import jcgp.backend.population.Node; -import jcgp.gui.ChromosomePane; import jcgp.gui.GUI; public class GUINode extends GUIGene { @@ -26,7 +19,8 @@ public class GUINode extends GUIGene { private int connectionIndex = 0; public GUINode(ChromosomePane parentRef, final Node node, Line[] connectionLines) { - + super(); + // store references this.parent = parentRef; this.node = node; @@ -46,21 +40,12 @@ public class GUINode extends GUIGene { Circle output = new Circle(NODE_RADIUS, 0, SOCKET_RADIUS, Paint.valueOf("white")); output.setStroke(Paint.valueOf("black")); - mainCircle = new Circle(NODE_RADIUS, Paint.valueOf("white")); - mainCircle.setStroke(Paint.valueOf("black")); - - text = new Text(node.getFunction().getName()); - text.setFont(Font.font("Arial", NODE_TEXT)); - text.setTextOrigin(VPos.CENTER); - text.setTextAlignment(TextAlignment.CENTER); - text.setWrappingWidth(NODE_RADIUS * 2); - text.setX(-NODE_RADIUS); - text.setVisible(true); + text.setText(node.getFunction().getName()); Circle[] sockets = new Circle[GUI.resources.getInt("arity")]; double angle, xPos, yPos; for (int l = 0; l < sockets.length; l++) { - angle = ((((double) (l + 1)) / ((GUI.resources.getDouble("arity") + 1))) * THETA) - (THETA / 2); + angle = (((l + 1) / ((GUI.resources.getDouble("arity") + 1))) * THETA) - (THETA / 2); xPos = -Math.cos(angle) * NODE_RADIUS; yPos = Math.sin(angle) * NODE_RADIUS; @@ -75,7 +60,7 @@ public class GUINode extends GUIGene { * Mouse event handlers on sockets * */ - s.addEventFilter(MouseDragEvent.DRAG_DETECTED, new EventHandler<MouseEvent>() { + s.addEventFilter(MouseEvent.DRAG_DETECTED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { // the mouse has been dragged out of the socket, this means a full drag is in progress @@ -101,16 +86,16 @@ public class GUINode extends GUIGene { } }); - s.addEventFilter(MouseDragEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { + s.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { // mouse was pressed on the socket - stateProperty.set(GUIGeneState.SOURCE); + setState(GUIGeneState.SOURCE); connectionIndex = index; } }); - s.addEventFilter(MouseDragEvent.MOUSE_DRAGGED, new EventHandler<MouseEvent>() { + s.addEventFilter(MouseEvent.MOUSE_DRAGGED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (!parent.isTarget()) { @@ -120,14 +105,14 @@ public class GUINode extends GUIGene { } }); - s.addEventFilter(MouseDragEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() { + s.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (event.isStillSincePress()) { // mouse was released before dragging out of the socket updateLine(index); - stateProperty.set(GUIGeneState.HOVER); - } else if (stateProperty.get() == GUIGeneState.SOURCE) { + setState(GUIGeneState.HOVER); + } else if (getState() == GUIGeneState.SOURCE) { // no connection has been made, fallback resetState(); updateLines(); @@ -139,6 +124,14 @@ public class GUINode extends GUIGene { /* * Mouse event handlers on whole gene */ + + addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent event) { + GUI.functionSelector.relocateAndShow(event, (GUINode) event.getSource()); + } + }); + addEventFilter(MouseDragEvent.MOUSE_DRAG_ENTERED, new EventHandler<MouseDragEvent>() { @Override public void handle(MouseDragEvent event) { @@ -149,12 +142,12 @@ public class GUINode extends GUIGene { Connection source = ((GUIGene) event.getGestureSource()).getChangingConnection(); if (node == source) { - stateProperty.set(GUIGeneState.NO_CHANGE_TARGET); + setState(GUIGeneState.NO_CHANGE_TARGET); } else { - stateProperty.set(GUIGeneState.TARGET); + setState(GUIGeneState.TARGET); } } else { - stateProperty.set(GUIGeneState.FORBIDDEN_TARGET); + setState(GUIGeneState.FORBIDDEN_TARGET); } } }); @@ -167,12 +160,12 @@ public class GUINode extends GUIGene { parent.setTarget(false); if (event.isPrimaryButtonDown()) { if (event.getGestureSource() == event.getSource()) { - stateProperty.set(GUIGeneState.SOURCE); + setState(GUIGeneState.SOURCE); } else { - if (stateProperty.get() == GUIGeneState.NO_CHANGE_TARGET) { - stateProperty.set(GUIGeneState.INDIRECT_HOVER); + if (getState() == GUIGeneState.NO_CHANGE_TARGET) { + setState(GUIGeneState.INDIRECT_HOVER); } else { - stateProperty.set(GUIGeneState.NEUTRAL); + setState(GUIGeneState.NEUTRAL); ((GUIGene) event.getGestureSource()).setConnections(GUIGeneState.INDIRECT_HOVER); } } @@ -210,7 +203,7 @@ public class GUINode extends GUIGene { } source.updateLines(); - stateProperty.set(GUIGeneState.HOVER); + setState(GUIGeneState.HOVER); } }); @@ -219,8 +212,8 @@ public class GUINode extends GUIGene { @Override public void handle(MouseEvent event) { // cursor has entered this node without dragging, or it is dragging and this is the source - if (stateProperty.get() == GUIGeneState.NEUTRAL) { - stateProperty.set(GUIGeneState.HOVER); + if (getState() == GUIGeneState.NEUTRAL) { + setState(GUIGeneState.HOVER); } else if (locked > 0) { setConnections(GUIGeneState.LOCKED_HOVER); } @@ -231,11 +224,11 @@ public class GUINode extends GUIGene { @Override public void handle(MouseEvent event) { // cursor has left this node without dragging, or it is dragging and this is the source - if (stateProperty.get() == GUIGeneState.HOVER && locked <= 0) { - stateProperty.set(GUIGeneState.NEUTRAL); + if (getState() == GUIGeneState.HOVER && locked <= 0) { + setState(GUIGeneState.NEUTRAL); setConnections(GUIGeneState.NEUTRAL); } else if (locked > 0) { - if (stateProperty.get() == GUIGeneState.SOURCE || stateProperty.get() == GUIGeneState.FORBIDDEN_TARGET) { + if (getState() == GUIGeneState.SOURCE || getState() == GUIGeneState.FORBIDDEN_TARGET) { setConnections(GUIGeneState.INDIRECT_HOVER); } else { setConnections(GUIGeneState.HOVER); @@ -249,85 +242,72 @@ public class GUINode extends GUIGene { getChildren().addAll(sockets); getChildren().addAll(output, connectionNumber); - stateProperty.addListener(new ChangeListener<GUIGeneState>() { - @Override - public void changed(ObservableValue<? extends GUIGeneState> observable, GUIGeneState oldValue, GUIGeneState newValue) { + } - switch (newValue) { - case ACTIVE_HOVER: - if (locked > 0) { - stateProperty().set(GUIGeneState.LOCKED_HOVER); - } else { - mainCircle.setFill(Paint.valueOf(GUI.SOFT_HIGHLIGHT_COLOUR)); - showLines(true); - } - setConnections(GUIGeneState.ACTIVE_HOVER); - break; - case LOCKED_HOVER: - mainCircle.setFill(Paint.valueOf(GUI.SOFT_HIGHLIGHT_COLOUR)); - break; - case FORBIDDEN_TARGET: - mainCircle.setFill(Paint.valueOf(GUI.BAD_SELECTION_COLOUR)); - break; - case HOVER: - mainCircle.setFill(Paint.valueOf(GUI.MEDIUM_HIGHLIGHT_COLOUR)); - showLines(true); - if (locked <= 0) { - setConnections(GUIGeneState.INDIRECT_HOVER); - } else { - setConnections(GUIGeneState.HOVER); - } - break; - case INDIRECT_HOVER: - mainCircle.setFill(Paint.valueOf(GUI.SOFT_HIGHLIGHT_COLOUR)); - break; - case NEUTRAL: - if (locked > 0) { - stateProperty.set(GUIGeneState.HOVER); - } else { - mainCircle.setFill(Paint.valueOf(GUI.NEUTRAL_COLOUR)); - showLines(false); - if (oldValue == GUIGeneState.ACTIVE_HOVER) { - setConnections(GUIGeneState.NEUTRAL); - } - } - break; - case NO_CHANGE_TARGET: - parent.setTarget(true); - mainCircle.setFill(Paint.valueOf(GUI.NEUTRAL_SELECTION_COLOUR)); - break; - case SOURCE: - mainCircle.setFill(Paint.valueOf(GUI.HARD_HIGHLIGHT_COLOUR)); - break; - case TARGET: - parent.setTarget(true); - mainCircle.setFill(Paint.valueOf(GUI.GOOD_SELECTION_COLOUR)); - break; - default: - break; + @Override + public void setState(GUIGeneState newState) { + switch (newState) { + case ACTIVE_HOVER: + if (locked > 0) { + setState(GUIGeneState.LOCKED_HOVER); + } else { + mainCircle.setFill(Paint.valueOf(GUI.SOFT_HIGHLIGHT_COLOUR)); + showLines(true); + } + setConnections(GUIGeneState.ACTIVE_HOVER); + break; + case LOCKED_HOVER: + mainCircle.setFill(Paint.valueOf(GUI.SOFT_HIGHLIGHT_COLOUR)); + break; + case FORBIDDEN_TARGET: + mainCircle.setFill(Paint.valueOf(GUI.BAD_SELECTION_COLOUR)); + break; + case HOVER: + mainCircle.setFill(Paint.valueOf(GUI.MEDIUM_HIGHLIGHT_COLOUR)); + showLines(true); + if (locked <= 0) { + setConnections(GUIGeneState.INDIRECT_HOVER); + } else { + setConnections(GUIGeneState.HOVER); + } + break; + case INDIRECT_HOVER: + mainCircle.setFill(Paint.valueOf(GUI.SOFT_HIGHLIGHT_COLOUR)); + break; + case NEUTRAL: + if (locked > 0) { + setState(GUIGeneState.HOVER); + } else { + mainCircle.setFill(Paint.valueOf(GUI.NEUTRAL_COLOUR)); + showLines(false); + if (getState() == GUIGeneState.ACTIVE_HOVER) { + setConnections(GUIGeneState.NEUTRAL); } } - }); - -// for (int c = 0; c < lines.length; c++) { -// final int i = c; -// node.connections().get(c).addListener(new ChangeListener<Connection>() { -// @Override -// public void changed(ObservableValue<? extends Connection> observable, -// Connection oldValue, Connection newValue) { -// updateLine(i); -// } -// }); -// } + break; + case NO_CHANGE_TARGET: + parent.setTarget(true); + mainCircle.setFill(Paint.valueOf(GUI.NEUTRAL_SELECTION_COLOUR)); + break; + case SOURCE: + mainCircle.setFill(Paint.valueOf(GUI.HARD_HIGHLIGHT_COLOUR)); + break; + case TARGET: + parent.setTarget(true); + mainCircle.setFill(Paint.valueOf(GUI.GOOD_SELECTION_COLOUR)); + break; + default: + break; + } + super.setState(newState); } - + @Override public Connection getChangingConnection() { return node.getConnection(connectionIndex); } - private boolean isAllowed(GUIGene source, GUIGene target) { if (source instanceof GUINode) { // if the source is a node, all inputs and some nodes are valid @@ -381,6 +361,7 @@ public class GUINode extends GUIGene { /** * Updates the end of all lines to match the associated connections. */ + @Override public void updateLines() { for (int c = 0; c < lines.length; c++) { updateLine(c); @@ -420,9 +401,9 @@ public class GUINode extends GUIGene { @Override public void resetState() { if (locked > 0) { - stateProperty.set(GUIGeneState.HOVER); + setState(GUIGeneState.HOVER); } else { - stateProperty.set(GUIGeneState.NEUTRAL); + setState(GUIGeneState.NEUTRAL); setConnections(GUIGeneState.NEUTRAL); } @@ -431,7 +412,7 @@ public class GUINode extends GUIGene { @Override void setLocked(boolean value) { locked += value ? 1 : -1; - stateProperty.set(locked > 0 ? GUIGeneState.HOVER : GUIGeneState.ACTIVE_HOVER); + setState(locked > 0 ? GUIGeneState.HOVER : GUIGeneState.ACTIVE_HOVER); for (int i = 0; i < lines.length; i++) { parent.getGuiGene(node.getConnection(i)).setLocked(value); @@ -441,7 +422,7 @@ public class GUINode extends GUIGene { @Override public void addLocks(int value) { locked += value; - stateProperty.set(locked > 0 ? GUIGeneState.HOVER : GUIGeneState.ACTIVE_HOVER); + setState(locked > 0 ? GUIGeneState.HOVER : GUIGeneState.ACTIVE_HOVER); for (int i = 0; i < lines.length; i++) { parent.getGuiGene(node.getConnection(i)).addLocks(value); @@ -451,7 +432,7 @@ public class GUINode extends GUIGene { @Override public void removeLocks(int value) { locked -= value; - stateProperty.set(locked > 0 ? GUIGeneState.HOVER : GUIGeneState.NEUTRAL); + setState(locked > 0 ? GUIGeneState.HOVER : GUIGeneState.NEUTRAL); for (int i = 0; i < lines.length; i++) { parent.getGuiGene(node.getConnection(i)).removeLocks(value); |