From 3fcc9091a7d86ce6fb0e775cf60c1eab2fb70606 Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Sun, 16 Mar 2025 20:54:47 +0100 Subject: [PATCH] Megaswitch highlighting --- .../src/main/java/org/diylc/core/ISwitch.java | 2 +- .../java/org/diylc/utils/SwitchUtils.java | 2 +- .../java/org/diylc/utils/SwitchUtilsTest.java | 2 +- .../diylc/components/guitar/LeverSwitch.java | 16 ++-- .../components/guitar/SchallerMegaSwitch.java | 84 +++++++++++++++---- ...MegaSwitchPositionPropertyValueSource.java | 63 ++++++++++++++ 6 files changed, 140 insertions(+), 29 deletions(-) create mode 100644 diylc/diylc-library/src/main/java/org/diylc/components/guitar/SchallerMegaSwitchPositionPropertyValueSource.java diff --git a/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java b/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java index f76028ae..c1fdbb91 100644 --- a/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java +++ b/diylc/diylc-core/src/main/java/org/diylc/core/ISwitch.java @@ -71,7 +71,7 @@ public interface ISwitch { return null; } - default Boolean getRenderConnectedTerminals() { + default Boolean getHighlightConnectedTerminals() { return false; } } diff --git a/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java b/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java index 40bac993..754f683a 100644 --- a/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java +++ b/diylc/diylc-core/src/main/java/org/diylc/utils/SwitchUtils.java @@ -31,7 +31,7 @@ public class SwitchUtils { List> connectedGroups = new ArrayList<>(); // Only process if we have a selected position and should render connections - if (switchComponent.getSelectedPosition() == null || !Boolean.TRUE.equals(switchComponent.getRenderConnectedTerminals())) { + if (switchComponent.getSelectedPosition() == null || !Boolean.TRUE.equals(switchComponent.getHighlightConnectedTerminals())) { return connectedGroups; } diff --git a/diylc/diylc-core/src/test/java/org/diylc/utils/SwitchUtilsTest.java b/diylc/diylc-core/src/test/java/org/diylc/utils/SwitchUtilsTest.java index 878289e0..25b5a271 100644 --- a/diylc/diylc-core/src/test/java/org/diylc/utils/SwitchUtilsTest.java +++ b/diylc/diylc-core/src/test/java/org/diylc/utils/SwitchUtilsTest.java @@ -34,7 +34,7 @@ public class SwitchUtilsTest { } @Override - public Boolean getRenderConnectedTerminals() { + public Boolean getHighlightConnectedTerminals() { return renderConnected; } diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java index 57200772..913a20ba 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/LeverSwitch.java @@ -83,7 +83,7 @@ public class LeverSwitch extends AbstractAngledComponent implemen private transient Double labelDx = null; private transient Double labelDy = null; + private Integer selectedPosition; + private Boolean highlightConnectedTerminals; + public SchallerMegaSwitch() { super(); updateControlPoints(); @@ -152,12 +161,13 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen g2d.fill(body[2]); g2d.setColor(LUG_COLOR.darker()); g2d.draw(body[2]); - - // g2d.setColor(Color.black); - // for(int i = 0; i < getControlPointCount(); i++) { - // g2d.drawString(i + "", controlPoints[i].getX(), controlPoints[i].getY()); - // } - + for (int i = 3; i < body.length; i++) { + g2d.setColor(ISwitch.POLE_COLORS[i - 3]); + g2d.fill(body[i]); + g2d.setColor(ISwitch.POLE_COLORS[i - 3].darker()); + g2d.draw(body[i]); + } + g2d.setColor(labelColor); // g2d.setFont(project.getFont().deriveFont(LABEL_FONT_SIZE)); if (type == MegaSwitchType.M) { @@ -200,14 +210,15 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen } g2d.setFont(project.getFont().deriveFont((float) (project.getFont().getSize2D() * 1.25))); - StringUtils.drawCenteredText(g2d, "Schaller Megaswitch� " + type.toString(), x, y, + StringUtils.drawCenteredText(g2d, "Schaller Megaswitch " + type.toString(), x, y, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); } public Shape[] getBody() { if (body == null) { - body = new Shape[4]; + List> connectedTerminals = getConnectedTerminals(this, controlPoints.length); + body = new Shape[3 + connectedTerminals.size()]; int lastPointIdx = type == MegaSwitchType.M ? controlPoints.length / 2 - 1 : controlPoints.length - 1; @@ -251,6 +262,10 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen double theta = getAngle().getValueRad(); + for (int i = 0; i <= connectedTerminals.size(); i++) { + body[2 + i] = new Area(); + } + Area terminalArea = new Area(); for (int i = 0; i < controlPoints.length; i++) { Point2D point = controlPoints[i]; @@ -266,10 +281,14 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen AffineTransform rotation = AffineTransform.getRotateInstance(theta, point.getX(), point.getY()); terminal.transform(rotation); } - - terminalArea.add(terminal); + + int finalI = i; + int groupIndex = IntStream.range(0, connectedTerminals.size()) + .filter(j -> connectedTerminals.get(j).contains(finalI)) + .findFirst().orElse(-1); + + ((Area)body[3 + groupIndex]).add(terminal); } - body[2] = terminalArea; // Rotate if needed if (theta != 0) { @@ -457,12 +476,19 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen } public enum MegaSwitchType { - E("E"), E_PLUS("E+"), M("M"), P("P"), S("S"), T("T"); + E("E", 5), E_PLUS("E+", 5), M("M", 5), + P("P", 5), S("S", 5), T("T", 3); private String title; + private final int positionCount; - private MegaSwitchType(String title) { + private MegaSwitchType(String title, int positionCount) { this.title = title; + this.positionCount = positionCount; + } + + public int getPositionCount() { + return positionCount; } @Override @@ -481,10 +507,7 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen @Override public int getPositionCount() { - if (type == MegaSwitchType.T) { - return 3; - } - return 5; + return type.getPositionCount(); } @Override @@ -541,7 +564,32 @@ public class SchallerMegaSwitch extends AbstractAngledComponent implemen public boolean canPointMoveFreely(int pointIndex) { return false; } - + + @DynamicEditableProperty(source = SchallerMegaSwitchPositionPropertyValueSource.class) + @EditableProperty(name = "Selected Position") + @Override + public Integer getSelectedPosition() { + return selectedPosition; + } + + public void setSelectedPosition(Integer selectedPosition) { + this.selectedPosition = selectedPosition; + this.body = null; + } + + @EditableProperty(name = "Highlight Connected") + @Override + public Boolean getHighlightConnectedTerminals() { + if (highlightConnectedTerminals == null) { + highlightConnectedTerminals = false; + } + return highlightConnectedTerminals; + } + + public void setHighlightConnectedTerminals(Boolean highlightConnectedTerminals) { + this.highlightConnectedTerminals = highlightConnectedTerminals; + this.body = null; + } private static final List> E_CONNECTIONS = Arrays.asList( Arrays.asList( diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/guitar/SchallerMegaSwitchPositionPropertyValueSource.java b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/SchallerMegaSwitchPositionPropertyValueSource.java new file mode 100644 index 00000000..b9b10375 --- /dev/null +++ b/diylc/diylc-library/src/main/java/org/diylc/components/guitar/SchallerMegaSwitchPositionPropertyValueSource.java @@ -0,0 +1,63 @@ +package org.diylc.components.guitar; + +import org.diylc.common.PropertyWrapper; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDynamicPropertySource; +import org.diylc.core.ISwitch; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SchallerMegaSwitchPositionPropertyValueSource implements IDynamicPropertySource { + + private List properties; + private IDIYComponent component; + + @Override + public void setProperties(List properties) { + this.properties = properties; + } + + @Override + public void setComponent(IDIYComponent component) { + this.component = component; + } + + @Override + public List getAvailableValues() { + if (properties == null) { + return List.of(); + } + Optional optionalPropertyWrapper = this.properties.stream().filter(p -> { + try { + return p.getGetter().getName().equals("getType"); + } catch (NoSuchMethodException e) { + return false; + } + }).findFirst(); + if (optionalPropertyWrapper.isEmpty()) { + return List.of(); + } + SchallerMegaSwitch.MegaSwitchType + switchType = (SchallerMegaSwitch.MegaSwitchType) optionalPropertyWrapper.get().getValue(); + int positionCount = switchType.getPositionCount(); + List res = new ArrayList<>(); + res.add(null); + for (int i = 0; i < positionCount; i++) { + res.add(i); + } + return res; + } + + @Override + public String getDisplayValue(Object value) { + if (value == null) { + return "None"; + } + if (component instanceof ISwitch sw) { + return sw.getPositionName((Integer)value); + } + return "#" + (((Integer)value) + 1); + } +}