From 98e02b48ea5b83fa6c3247869b841b0afd260a89 Mon Sep 17 00:00:00 2001 From: Eduardo Pedroni Date: Sun, 23 Nov 2014 16:06:59 +0000 Subject: Commented some new files, optimised some methods, moved as much setting up as possible into the GUIGene constructors - ChromosomePane is slightly tidier now. --- src/jcgp/gui/constants/Constants.java | 52 ++++++++++++++--------- src/jcgp/gui/constants/Position.java | 79 +++++++++++++++++++++++++++++++---- 2 files changed, 104 insertions(+), 27 deletions(-) (limited to 'src/jcgp/gui/constants') diff --git a/src/jcgp/gui/constants/Constants.java b/src/jcgp/gui/constants/Constants.java index 350f8b1..d53b1ca 100644 --- a/src/jcgp/gui/constants/Constants.java +++ b/src/jcgp/gui/constants/Constants.java @@ -1,52 +1,62 @@ package jcgp.gui.constants; +import javafx.scene.paint.Paint; + /** * Holds the constants used in the GUI. * * @author Eduardo Pedroni * */ -public abstract class Constants { +public final class Constants { + /** + * Private constructor to prevent instantiation. + */ + private Constants(){} + /* Colours */ /** - * A string containing the hexadecimal colour used for representing neutrality. + * A {@code Paint} containing the colour used for representing neutrality. */ - public static final String NEUTRAL_COLOUR = "#FFFFFF"; + public static final Paint NEUTRAL_COLOUR = Paint.valueOf("#FFFFFF"); /** - * A string containing the hexadecimal colour used for representing a hard highlight. + * A {@code Paint} containing the colour used for representing a hard highlight. * A "hard" select, for instance, happens when an output path is locked on the chromosome * pane. */ - public static final String HARD_HIGHLIGHT_COLOUR = "#5496FF"; + public static final Paint HARD_HIGHLIGHT_COLOUR = Paint.valueOf("#5496FF"); /** - * A string containing the hexadecimal colour used for a medium highlight. + * A {@code Paint} containing the colour used for a medium highlight. * One example of such a selection is the colour applied to a node * when it is hovered over. */ - public static final String MEDIUM_HIGHLIGHT_COLOUR = "#75BAFF"; + public static final Paint MEDIUM_HIGHLIGHT_COLOUR = Paint.valueOf("#75BAFF"); /** - * A string containing the hexadecimal colour used for a soft highlight. + * A {@code Paint} containing the colour used for a soft highlight. * When hovering over a node, its connections are soft-selected. */ - public static final String SOFT_HIGHLIGHT_COLOUR = "#C7DFFF"; + public static final Paint SOFT_HIGHLIGHT_COLOUR = Paint.valueOf("#C7DFFF"); /** - * A string containing the hexadecimal colour used for representing a good selection. + * A {@code Paint} containing the colour used for representing a good selection. * Ideally a shade of green, used for instance when a manual connection is valid. */ - public static final String GOOD_SELECTION_COLOUR = "#38C25B"; + public static final Paint GOOD_SELECTION_COLOUR = Paint.valueOf("#38C25B"); /** - * A string containing the hexadecimal colour used for representing a neutral selection. + * A {@code Paint} containing the colour used for representing a neutral selection. * Ideally a shade of yellow, used for instance when a manual connection is already the * current connection. */ - public static final String NEUTRAL_SELECTION_COLOUR = "#FFEF73"; + public static final Paint NEUTRAL_SELECTION_COLOUR = Paint.valueOf("#FFEF73"); /** - * A string containing the hexadecimal colour used for representing a bad selection. + * A {@code Paint} containing the colour used for representing a bad selection. * Ideally a shade of red, use for instance when a manual connection is not valid. */ - public static final String BAD_SELECTION_COLOUR = "#FF5C5C"; - + public static final Paint BAD_SELECTION_COLOUR = Paint.valueOf("#FF5C5C"); + /** + * A {@code Paint} containing the colour used for the gene sockets. + */ + public static final Paint SOCKET_COLOUR = Paint.valueOf("#FFFFFF"); /* Sizes and distances */ @@ -74,13 +84,15 @@ public abstract class Constants { */ public static final double SPACING = 15; /** - * The angle across which the node's sockets are evently distributed. + * The margin between the genes and the edge of the chromosome pane. + */ + public static final double CHROMOSOME_PANE_MARGIN = 10; + /** + * The angle across which the node's sockets are evenly distributed. */ public static final double THETA = Math.PI / 1.4; /** - * The radius of the connection sockets, calculated as a function of - * NODE_RADIUS. - * + * The radius of the connection sockets, calculated as a function of NODE_RADIUS. */ public static final double SOCKET_RADIUS = Math.sqrt(NODE_RADIUS) / 1.8; /** diff --git a/src/jcgp/gui/constants/Position.java b/src/jcgp/gui/constants/Position.java index a13d21e..144ba6d 100644 --- a/src/jcgp/gui/constants/Position.java +++ b/src/jcgp/gui/constants/Position.java @@ -1,5 +1,6 @@ package jcgp.gui.constants; +import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import jcgp.gui.GUI; import jcgp.gui.population.GUIGene; @@ -7,34 +8,98 @@ import jcgp.gui.population.GUIInput; import jcgp.gui.population.GUINode; import jcgp.gui.population.GUIOutput; +/** + * Abstracts the task of positioning GUI components. + *
+ * Do not instantiate this class; instead, use the {@code public static} methods provided. + * + * @author Eduardo Pedroni + * + */ public final class Position { + /** + * Private constructor to prevent instantiation. + */ + private Position() {} + + /** + * Sets the X and Y layouts of the specified input to the appropriate values, according to its index. + * + * @param input the {@code GUIInput} instance to relocate. + */ public static void place(GUIInput input) { - input.relocate(0, - input.getInput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING)); + // inputs are the first column, so we only worry about the margin and their index + input.relocate(Constants.CHROMOSOME_PANE_MARGIN, + input.getInput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN); } + /** + * Sets the X and Y layouts of the specified node to the appropriate values, according to its row and column values. + * This also connects the start of every line with its respective socket. Therefore, this method should be called at least + * once when the {@code GUINode} is instantiated. + * + * @param node the {@code GUINode} instance to relocate. + */ public static void place(GUINode node) { - // TODO cut down method calls - double xOffset = ((node.getNode().getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)); - double yOffset = node.getNode().getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING); + // calculate x and y offsets, in relation to the layout origin + double xOffset = (node.getNode().getColumn() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN; + double yOffset = node.getNode().getRow() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN; + + // move node node.relocate(xOffset, yOffset); + // use the offset and the socket positions to connect the lines for (int i = 0; i < GUI.resources.arity(); i++) { node.getLine(i).setStartX(node.getSocket(i).getCenterX() + xOffset + Constants.NODE_RADIUS + Constants.SOCKET_RADIUS); node.getLine(i).setStartY(node.getSocket(i).getCenterY() + yOffset + Constants.NODE_RADIUS); } } + /** + * Sets the X and Y layouts of the specified output to the appropriate values, according to its index. + * This also connects the start of the output's single line to its single input socket.Therefore, + * this method should be called at least once when the {@code GUIOutput} is instantiated. + * + * @param output the {@code GUIOutput} instance to relocate. + */ public static void place(GUIOutput output) { - output.relocate(((GUI.resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)), - output.getOutput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING)); + // the output's position is a function of the number of columns and its own index + output.relocate(((GUI.resources.columns() + 1) * (2 * Constants.NODE_RADIUS + Constants.SPACING)) + Constants.CHROMOSOME_PANE_MARGIN, + output.getOutput().getIndex() * (2 * Constants.NODE_RADIUS + Constants.SPACING) + Constants.CHROMOSOME_PANE_MARGIN); output.getLine().setStartX(output.getLayoutX() - Constants.NODE_RADIUS); output.getLine().setStartY(output.getLayoutY()); } + + + /** + * Connects the end of a specified line to the specified gene. + * + * @param line the line to connect. + * @param target the target gene to connect to. + */ public static void connect(Line line, GUIGene target) { + // set line ends based on the layout position of the target line.setEndX(target.getLayoutX() + Constants.NODE_RADIUS); line.setEndY(target.getLayoutY()); } + + /** + * Relocates the given socket to the appropriate position given the + * socket's index. + * + * @param index the socket index. + * @param socket the {@code Circle} instance to relocate. + */ + public static void placeSocket(int index, Circle socket) { + // calculate the angle with respect to the x-axis + double angle = (((index + 1) / ((double) (GUI.resources.arity() + 1))) * Constants.THETA) - (Constants.THETA / 2); + // convert to cartesian form + double xPos = -Math.cos(angle) * Constants.NODE_RADIUS; + double yPos = Math.sin(angle) * Constants.NODE_RADIUS; + // set centre + socket.setCenterX(xPos); + socket.setCenterY(yPos); + } } -- cgit v1.2.3