Skip to content

Commit

Permalink
Added code to set turnout circle color based on turnout state
Browse files Browse the repository at this point in the history
Also added xml save and load code
and schema
and test cases
  • Loading branch information
geowar1 committed Apr 30, 2019
1 parent 84a67b8 commit 4f8ac94
Show file tree
Hide file tree
Showing 7 changed files with 255 additions and 62 deletions.
59 changes: 58 additions & 1 deletion java/src/jmri/jmrit/display/layoutEditor/LayoutEditor.java
Expand Up @@ -288,6 +288,8 @@ public class LayoutEditor extends PanelEditor implements MouseWheelListener {
protected static final double SIZE2 = SIZE * 2.; //must be twice SIZE

protected Color turnoutCircleColor = Color.black; //matches earlier versions
protected Color turnoutCircleThrownColor = Color.black;
protected boolean turnoutFillControlCircles = false;
protected int turnoutCircleSize = 4; //matches earlier versions

//use turnoutCircleSize when you need an int and these when you need a double
Expand Down Expand Up @@ -339,6 +341,7 @@ public class LayoutEditor extends PanelEditor implements MouseWheelListener {
private transient JCheckBoxMenuItem antialiasingOnCheckBoxMenuItem = null;
private transient JCheckBoxMenuItem turnoutCirclesOnCheckBoxMenuItem = null;
private transient JCheckBoxMenuItem turnoutDrawUnselectedLegCheckBoxMenuItem = null;
private transient JCheckBoxMenuItem turnoutFillControlCirclesCheckBoxMenuItem = null;
private transient JCheckBoxMenuItem hideTrackSegmentConstructionLinesCheckBoxMenuItem = null;
private transient JCheckBoxMenuItem useDirectTurnoutControlCheckBoxMenuItem = null;
private transient ButtonGroup turnoutCircleSizeButtonGroup = null;
Expand Down Expand Up @@ -2744,7 +2747,6 @@ public void menuCanceled(MenuEvent event) {

//select turnout circle color
JMenuItem turnoutCircleColorMenuItem = new JMenuItem(Bundle.getMessage("TurnoutCircleColor"));

turnoutCircleColorMenuItem.addActionListener((ActionEvent event) -> {
Color desiredColor = JmriColorChooser.showDialog(this,
Bundle.getMessage("TurnoutCircleColor"),
Expand All @@ -2757,6 +2759,28 @@ public void menuCanceled(MenuEvent event) {
});
turnoutOptionsMenu.add(turnoutCircleColorMenuItem);

//select turnout circle thrown color
JMenuItem turnoutCircleThrownColorMenuItem = new JMenuItem(Bundle.getMessage("TurnoutCircleThrownColor"));
turnoutCircleThrownColorMenuItem.addActionListener((ActionEvent event) -> {
Color desiredColor = JmriColorChooser.showDialog(this,
Bundle.getMessage("TurnoutCircleThrownColor"),
turnoutCircleThrownColor);
if (desiredColor != null && !turnoutCircleThrownColor.equals(desiredColor)) {
setTurnoutCircleThrownColor(desiredColor);
setDirty();
redrawPanel();
}
});
turnoutOptionsMenu.add(turnoutCircleThrownColorMenuItem);

turnoutFillControlCirclesCheckBoxMenuItem = new JCheckBoxMenuItem(Bundle.getMessage("TurnoutFillControlCircles"));
turnoutOptionsMenu.add(turnoutFillControlCirclesCheckBoxMenuItem);
turnoutFillControlCirclesCheckBoxMenuItem.addActionListener((ActionEvent event) -> {
turnoutFillControlCircles = turnoutFillControlCirclesCheckBoxMenuItem.isSelected();
redrawPanel();
});
turnoutFillControlCirclesCheckBoxMenuItem.setSelected(turnoutFillControlCircles);

//select turnout circle size
JMenu turnoutCircleSizeMenu = new JMenu(Bundle.getMessage("TurnoutCircleSize"));
turnoutCircleSizeButtonGroup = new ButtonGroup();
Expand Down Expand Up @@ -9111,6 +9135,14 @@ public String getTurnoutCircleColor() {
return ColorUtil.colorToColorName(turnoutCircleColor);
}

public String getTurnoutCircleThrownColor() {
return ColorUtil.colorToColorName(turnoutCircleThrownColor);
}

public boolean isTurnoutFillControlCircles() {
return turnoutFillControlCircles;
}

public int getTurnoutCircleSize() {
return turnoutCircleSize;
}
Expand Down Expand Up @@ -9329,6 +9361,29 @@ public void setTurnoutCircleColor(Color color) {
}
}

/**
* @param color new color for turnout circle.
*/
public void setTurnoutCircleThrownColor(Color color) {
if (color == null) {
turnoutCircleThrownColor = ColorUtil.stringToColor(getDefaultTrackColor());
} else {
turnoutCircleThrownColor = color;
JmriColorChooser.addRecentColor(color);
}
}

/**
* Should only be invoked on the GUI (Swing) thread
*/
@InvokeOnGuiThread
public void setTurnoutFillControlCircles(boolean state) {
if (turnoutFillControlCircles != state) {
turnoutFillControlCircles = state;
turnoutFillControlCirclesCheckBoxMenuItem.setSelected(turnoutFillControlCircles);
}
}

public void setTurnoutCircleSize(int size) {
//this is an int
turnoutCircleSize = size;
Expand Down Expand Up @@ -10181,6 +10236,8 @@ private void drawShapeEditControls(Graphics2D g2) {
private void drawTurnoutControls(Graphics2D g2) {
g2.setStroke(new BasicStroke(1.0F, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND));
g2.setColor(turnoutCircleColor);
g2.setBackground(turnoutCircleThrownColor);

// loop over all turnouts
boolean editable = isEditable();
layoutTrackList.forEach((tr) -> {
Expand Down
Expand Up @@ -391,8 +391,10 @@ DefaultOccupiedTrackColor = Set Default Occupied Track Color
DefaultAlternativeTrackColor = Set Default Alternative Track Color
TurnoutOptions = Turnout Options
TurnoutCircleColor = Set Turnout Circle Color
TurnoutCircleThrownColor = Set Turnout Circle Thrown Color
TurnoutCircleSize = Set Turnout Circle Size
TurnoutDrawUnselectedLeg = Draw Unselected Turnout Leg
TurnoutFillControlCircles = Fill Turnout Circles
UseDefaultTrackColor = Use Default Track Color

# items specific to Layout Editor tools
Expand Down
63 changes: 56 additions & 7 deletions java/src/jmri/jmrit/display/layoutEditor/LayoutSlip.java
Expand Up @@ -1120,8 +1120,8 @@ private void updateState() {
}

/**
* Check if either turnout is inconsistent.
* This is used to create an alternate slip image.
* Check if either turnout is inconsistent. This is used to create an
* alternate slip image.
*
* @return true if either turnout is inconsistent.
*/
Expand Down Expand Up @@ -1527,12 +1527,61 @@ protected void highlightUnconnected(Graphics2D g2, int specificType) {

@Override
protected void drawTurnoutControls(Graphics2D g2) {
// drawHidden left/right turnout control circles
Point2D leftCircleCenter = getCoordsLeft();
g2.draw(layoutEditor.trackControlCircleAt(leftCircleCenter));
if (!disabled && !(disableWhenOccupied && isOccupied())) {
// TODO: query user base if this is "acceptable" (can obstruct state)
if (false) {
int stateA = UNKNOWN;
Turnout toA = getTurnout();
if (toA != null) {
stateA = toA.getKnownState();
}

Color foregroundColor = g2.getColor();
Color backgroundColor = g2.getBackground();

if (stateA == Turnout.THROWN) {
g2.setColor(backgroundColor);
} else if (stateA != Turnout.CLOSED) {
g2.setColor(Color.GRAY);
}
Point2D rightCircleCenter = getCoordsRight();
if (layoutEditor.isTurnoutFillControlCircles()) {
g2.fill(layoutEditor.trackControlCircleAt(rightCircleCenter));
} else {
g2.draw(layoutEditor.trackControlCircleAt(rightCircleCenter));
}
if (stateA != Turnout.CLOSED) {
g2.setColor(foregroundColor);
}

Point2D rightCircleCenter = getCoordsRight();
g2.draw(layoutEditor.trackControlCircleAt(rightCircleCenter));
int stateB = UNKNOWN;
Turnout toB = getTurnoutB();
if (toB != null) {
stateB = toB.getKnownState();
}

if (stateB == Turnout.THROWN) {
g2.setColor(backgroundColor);
} else if (stateB != Turnout.CLOSED) {
g2.setColor(Color.GRAY);
}
// drawHidden left/right turnout control circles
Point2D leftCircleCenter = getCoordsLeft();
if (layoutEditor.isTurnoutFillControlCircles()) {
g2.fill(layoutEditor.trackControlCircleAt(leftCircleCenter));
} else {
g2.draw(layoutEditor.trackControlCircleAt(leftCircleCenter));
}
if (stateB != Turnout.CLOSED) {
g2.setColor(foregroundColor);
}
} else {
Point2D rightCircleCenter = getCoordsRight();
g2.draw(layoutEditor.trackControlCircleAt(rightCircleCenter));
Point2D leftCircleCenter = getCoordsLeft();
g2.draw(layoutEditor.trackControlCircleAt(leftCircleCenter));
}
}
} // drawTurnoutControls

static class TurnoutState {
Expand Down
33 changes: 24 additions & 9 deletions java/src/jmri/jmrit/display/layoutEditor/LayoutTurnout.java
Expand Up @@ -1011,6 +1011,15 @@ public int getContinuingSense() {
return continuingSense;
}

/**
* isInContinuingSenseState
*
* @return true is the continuingSense matches the known state
*/
public boolean isInContinuingSenseState() {
return getState() == continuingSense;
}

public void setTurnout(@Nullable String tName) {
if (namedTurnout != null) {
deactivateTurnout();
Expand Down Expand Up @@ -3227,10 +3236,7 @@ protected void draw1(Graphics2D g2, boolean isMain, boolean isBlock) {

int state = UNKNOWN;
if (layoutEditor.isAnimating()) {
Turnout to = getTurnout();
if (to != null) {
state = to.getKnownState();
}
state = getState();
}

int type = getTurnoutType();
Expand Down Expand Up @@ -3572,10 +3578,7 @@ protected void draw2(Graphics2D g2, boolean isMain, float railDisplacement) {

int state = UNKNOWN;
if (layoutEditor.isAnimating()) {
Turnout to = getTurnout();
if (to != null) {
state = to.getKnownState();
}
state = getState();
}

switch (type) {
Expand Down Expand Up @@ -4220,7 +4223,19 @@ protected void highlightUnconnected(Graphics2D g2, int specificType) {
@Override
protected void drawTurnoutControls(Graphics2D g2) {
if (!disabled && !(disableWhenOccupied && isOccupied())) {
g2.draw(layoutEditor.trackControlCircleAt(center));
Color foregroundColor = g2.getColor();
if (!isInContinuingSenseState()) {
Color backgroundColor = g2.getBackground();
g2.setColor(backgroundColor);
}
if (layoutEditor.isTurnoutFillControlCircles()) {
g2.fill(layoutEditor.trackControlCircleAt(center));
} else {
g2.draw(layoutEditor.trackControlCircleAt(center));
}
if (!isInContinuingSenseState()) {
g2.setColor(foregroundColor);
}
}
}

Expand Down

0 comments on commit 4f8ac94

Please sign in to comment.