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