diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml
index 77eb5440..96bc8411 100644
--- a/diylc/diylc-core/src/org/diylc/presenter/update.xml
+++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml
@@ -3589,5 +3589,21 @@
https://github.com/bancika/diy-layout-creator/releases
+
+
+ 4
+ 20
+ 0
+
+ 2021-09-12 00:00:00.000 CET
+
+
+
+ NEW_FEATURE
+ Added 'Open 1/8" Jack' component
+
+
+ https://github.com/bancika/diy-layout-creator/releases
+
diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar
index d615b6d5..dbaf43ff 100644
Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ
diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java
index 1a3dfb04..91a2550b 100644
--- a/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java
+++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java
@@ -25,6 +25,7 @@ import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Graphics2D;
+import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Area;
@@ -58,6 +59,7 @@ import org.diylc.utils.Constants;
zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", enableCache = true)
public class OpenJack1_4 extends AbstractMultiPartComponent {
+ private static final float FONT_SCALE = 0.8f;
private static final double RING_THETA = Math.PI * 0.795;
private static final double SLEEVE_THETA = Math.PI * 0.29444444444;
private static final double SLEEVE_SWITCHED_THETA = Math.PI * 4 / 3;
@@ -158,7 +160,7 @@ public class OpenJack1_4 extends AbstractMultiPartComponent {
// draw labels
if (showLabels) {
g2d.setColor(BASE_COLOR.darker());
- g2d.setFont(project.getFont().deriveFont(project.getFont().getSize2D() * 0.8f));
+ g2d.setFont(project.getFont().deriveFont(project.getFont().getSize2D() * FONT_SCALE));
int springLength = (int) SPRING_LENGTH.convertToPixels();
int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels();
double centerY = controlPoints[0].getY() + springLength - holeToEdge;
@@ -287,7 +289,9 @@ public class OpenJack1_4 extends AbstractMultiPartComponent {
@Override
public void drawIcon(Graphics2D g2d, int width, int height) {
int waferDiameter = 15 * width / 32;
- int sleeveDiameter = 9 * width / 32;
+ int sleeveDiameter = 9 * width / 32;
+
+ AffineTransform tx = g2d.getTransform();
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(6f * width / 32));
g2d.setColor(BASE_COLOR);
@@ -309,7 +313,18 @@ public class OpenJack1_4 extends AbstractMultiPartComponent {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(6f * width / 32));
g2d.rotate(-Math.PI / 2, width / 2, height / 2);
- g2d.drawLine(width / 2, 4 * width / 32, width / 2, width / 3);
+ g2d.drawLine(width / 2, 4 * width / 32, width / 2, width / 3);
+
+ g2d.setTransform(tx);
+ g2d.setColor(LABEL_COLOR);
+ g2d.setFont(LABEL_FONT.deriveFont(width / 3.5f));
+
+ RenderingHints rh = new RenderingHints(
+ RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+ g2d.setRenderingHints(rh);
+
+ StringUtils.drawCenteredText(g2d, "1/4\"", width / 2, height / 2, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
}
@Override
diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_8.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_8.java
new file mode 100644
index 00000000..0d2fd3aa
--- /dev/null
+++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_8.java
@@ -0,0 +1,449 @@
+/*
+
+ DIY Layout Creator (DIYLC).
+ Copyright (c) 2009-2018 held jointly by the individual authors.
+
+ This file is part of DIYLC.
+
+ DIYLC is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ DIYLC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DIYLC. If not, see .
+
+*/
+package org.diylc.components.electromechanical;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Area;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
+
+import org.diylc.appframework.miscutils.ConfigurationManager;
+import org.diylc.awt.StringUtils;
+import org.diylc.common.HorizontalAlignment;
+import org.diylc.common.IPlugInPort;
+import org.diylc.common.ObjectCache;
+import org.diylc.common.Orientation;
+import org.diylc.common.VerticalAlignment;
+import org.diylc.components.AbstractMultiPartComponent;
+import org.diylc.core.ComponentState;
+import org.diylc.core.IDIYComponent;
+import org.diylc.core.IDrawingObserver;
+import org.diylc.core.Project;
+import org.diylc.core.Theme;
+import org.diylc.core.VisibilityPolicy;
+import org.diylc.core.annotations.ComponentDescriptor;
+import org.diylc.core.annotations.EditableProperty;
+import org.diylc.core.measures.Size;
+import org.diylc.core.measures.SizeUnit;
+import org.diylc.utils.Constants;
+
+@ComponentDescriptor(name = "Open 1/8\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic",
+ description = "Switchcraft-style open panel mount 1/8\" phono jack, stereo and mono",
+ zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", enableCache = true)
+public class OpenJack1_8 extends AbstractMultiPartComponent {
+
+ private static final float FONT_SCALE = 0.6f;
+ private static final double RING_THETA = Math.PI * 0.795;
+ private static final double SLEEVE_THETA = Math.PI * 0.29444444444;
+ private static final double SLEEVE_SWITCHED_THETA = Math.PI * 4 / 3;
+ private static final double SWITCH_THETA = Math.PI * 5 / 3;
+
+ private static final long serialVersionUID = 1L;
+
+ private static Color BASE_COLOR = Color.lightGray;
+ private static Color WAFER_COLOR = Color.decode("#CD8500");
+
+ private static Size OUTER_DIAMETER = new Size(0.375d, SizeUnit.in);
+ private static Size INNER_DIAMETER = new Size(0.125d, SizeUnit.in);
+ private static Size RING_DIAMETER = new Size(0.165d, SizeUnit.in);
+ private static Size SPRING_LENGTH = new Size(0.2815d, SizeUnit.in);
+ private static Size SPRING_WIDTH = new Size(0.06d, SizeUnit.in);
+ private static Size HOLE_DIAMETER = new Size(0.025d, SizeUnit.in);
+ private static Size HOLE_TO_EDGE = new Size(0.0315d, SizeUnit.in);
+
+ private String value = "";
+ private Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0), new Point2D.Double(0, 0), new Point2D.Double(0, 0)};
+ transient Area[] body;
+ @Deprecated
+ private Orientation orientation = Orientation.DEFAULT;
+ private Integer angle = 0;
+ private OpenJackType type = OpenJackType.MONO;
+ private boolean showLabels = true;
+
+ public OpenJack1_8() {
+ super();
+ updateControlPoints();
+ }
+
+ @Override
+ public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
+ IDrawingObserver drawingObserver) {
+ Shape[] body = getBody();
+
+ g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
+// if (componentState != ComponentState.DRAGGING) {
+ Composite oldComposite = g2d.getComposite();
+ if (alpha < MAX_ALPHA) {
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
+ }
+ g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : WAFER_COLOR);
+ g2d.fill(body[0]);
+
+ g2d.setComposite(oldComposite);
+// }
+
+ Color finalBorderColor;
+
+ if (outlineMode) {
+ Theme theme =
+ (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME);
+ finalBorderColor = theme.getOutlineColor();
+ } else {
+ finalBorderColor = WAFER_COLOR.darker();
+ }
+
+ g2d.setColor(finalBorderColor);
+ g2d.draw(body[0]);
+
+// if (componentState != ComponentState.DRAGGING) {
+ oldComposite = g2d.getComposite();
+ if (alpha < MAX_ALPHA) {
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
+ }
+ g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : BASE_COLOR);
+
+ drawingObserver.startTrackingContinuityArea(true);
+ g2d.fill(body[1]);
+ g2d.fill(body[2]);
+ if (body[3] != null)
+ g2d.fill(body[3]);
+ drawingObserver.stopTrackingContinuityArea();
+
+ g2d.setComposite(oldComposite);
+// }
+
+ if (outlineMode) {
+ Theme theme =
+ (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME);
+ finalBorderColor = theme.getOutlineColor();
+ } else {
+ finalBorderColor = BASE_COLOR.darker();
+ }
+
+ drawingObserver.stopTracking();
+
+ g2d.setColor(finalBorderColor);
+ g2d.draw(body[1]);
+ g2d.draw(body[2]);
+ if (body[3] != null)
+ g2d.draw(body[3]);
+
+ drawingObserver.startTracking();
+
+ // draw labels
+ if (showLabels) {
+ g2d.setColor(BASE_COLOR.darker());
+ g2d.setFont(project.getFont().deriveFont(project.getFont().getSize2D() * FONT_SCALE));
+ int springLength = (int) SPRING_LENGTH.convertToPixels();
+ int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels();
+ double centerY = controlPoints[0].getY() + springLength - holeToEdge;
+ Point2D tipLabel = new Point2D.Double(controlPoints[0].getX(), (int) (controlPoints[0].getY() + holeToEdge * 1.25));
+ AffineTransform ringTransform = AffineTransform.getRotateInstance(getType() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, controlPoints[0].getX(), centerY);
+ AffineTransform sleeveTransform = AffineTransform.getRotateInstance(getType() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, controlPoints[0].getX(), centerY);
+ Point2D ringOrSwitchLabel = new Point2D.Double(0, 0);
+ Point2D sleeveLabel = new Point2D.Double(0, 0);
+ ringTransform.transform(tipLabel, ringOrSwitchLabel);
+ sleeveTransform.transform(tipLabel, sleeveLabel);
+
+ if (getTheta() != 0) {
+ AffineTransform rotation = AffineTransform.getRotateInstance(getTheta(), controlPoints[0].getX(), controlPoints[0].getY());
+ rotation.transform(tipLabel, tipLabel);
+ rotation.transform(ringOrSwitchLabel, ringOrSwitchLabel);
+ rotation.transform(sleeveLabel, sleeveLabel);
+ }
+ StringUtils.drawCenteredText(g2d, "T", tipLabel.getX(), tipLabel.getY(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
+ StringUtils.drawCenteredText(g2d, "S", sleeveLabel.getX(), sleeveLabel.getY(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
+ if (getType() == OpenJackType.STEREO)
+ StringUtils.drawCenteredText(g2d, "R", ringOrSwitchLabel.getX(), ringOrSwitchLabel.getY(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
+ if (getType() == OpenJackType.SWITCHED)
+ StringUtils.drawCenteredText(g2d, "Sw", ringOrSwitchLabel.getX(), ringOrSwitchLabel.getY(), HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
+ }
+
+ drawSelectionOutline(g2d, componentState, outlineMode, project, drawingObserver);
+ }
+
+ public Area[] getBody() {
+ if (body == null) {
+ body = new Area[4];
+
+ double x = controlPoints[0].getX();
+ double y = controlPoints[0].getY();
+ int outerDiameter = getClosestOdd(OUTER_DIAMETER.convertToPixels());
+ int innerDiameter = getClosestOdd(INNER_DIAMETER.convertToPixels());
+ int ringDiameter = getClosestOdd(RING_DIAMETER.convertToPixels());
+ int springLength = (int) SPRING_LENGTH.convertToPixels();
+ int springWidth = (int) SPRING_WIDTH.convertToPixels();
+ int holeDiameter = getClosestOdd(HOLE_DIAMETER.convertToPixels());
+ int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels();
+
+ double centerY = y + springLength - holeToEdge;
+
+ Area wafer =
+ new Area(new Ellipse2D.Double(x - outerDiameter / 2, centerY - outerDiameter / 2, outerDiameter,
+ outerDiameter));
+ wafer.subtract(new Area(new Ellipse2D.Double(x - ringDiameter / 2, centerY - ringDiameter / 2, ringDiameter,
+ ringDiameter)));
+
+ body[0] = wafer;
+
+ Area tip =
+ new Area(new RoundRectangle2D.Double(x - springWidth / 2, y - holeToEdge, springWidth, springLength
+ - ringDiameter / 2, springWidth, springWidth));
+ tip.subtract(new Area(
+ new Ellipse2D.Double(x - holeDiameter / 2, y - holeDiameter / 2, holeDiameter, holeDiameter)));
+ tip.subtract(wafer);
+
+ body[1] = tip;
+
+ Area sleeve =
+ new Area(new RoundRectangle2D.Double(x - springWidth / 2, y - holeToEdge, springWidth, springLength,
+ springWidth, springWidth));
+ sleeve.subtract(new Area(new Ellipse2D.Double(x - holeDiameter / 2, y - holeDiameter / 2, holeDiameter,
+ holeDiameter)));
+ sleeve.transform(AffineTransform.getRotateInstance(getType() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, x, centerY));
+ sleeve.add(new Area(new Ellipse2D.Double(x - ringDiameter / 2, centerY - ringDiameter / 2, ringDiameter,
+ ringDiameter)));
+ sleeve.subtract(new Area(new Ellipse2D.Double(x - innerDiameter / 2, centerY - innerDiameter / 2, innerDiameter,
+ innerDiameter)));
+
+ body[2] = sleeve;
+
+ if (getType() != OpenJackType.MONO) {
+ Area ringOrSwitch =
+ new Area(new RoundRectangle2D.Double(x - springWidth / 2, y - holeToEdge, springWidth, springLength,
+ springWidth, springWidth));
+ ringOrSwitch.subtract(new Area(new Ellipse2D.Double(x - holeDiameter / 2, y - holeDiameter / 2, holeDiameter,
+ holeDiameter)));
+ ringOrSwitch.transform(AffineTransform.getRotateInstance(getType() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, x, centerY));
+ ringOrSwitch.subtract(new Area(new Ellipse2D.Double(x - outerDiameter / 2, centerY - outerDiameter / 2, outerDiameter,
+ outerDiameter)));
+
+ body[3] = ringOrSwitch;
+ }
+
+ // Rotate if needed
+ if (getTheta() != 0) {
+ AffineTransform rotation = AffineTransform.getRotateInstance(getTheta(), x, y);
+ // Skip the last one because it's already rotated
+ for (int i = 0; i < body.length; i++) {
+ Shape shape = body[i];
+ Area area = (Area) shape;
+ if (area != null) {
+ area.transform(rotation);
+ }
+ }
+ }
+ }
+
+ return body;
+ }
+
+ private void updateControlPoints() {
+ double x = controlPoints[0].getX();
+ double y = controlPoints[0].getY();
+
+ int springLength = (int) SPRING_LENGTH.convertToPixels();
+ int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels();
+
+ double centerY = y + springLength - holeToEdge;
+
+ AffineTransform.getRotateInstance(getType() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, x, centerY).transform(controlPoints[0], controlPoints[1]);
+ AffineTransform.getRotateInstance(getType() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, x, centerY).transform(controlPoints[0], controlPoints[2]);
+
+ // Rotate if needed
+ if (getTheta() != 0) {
+ AffineTransform rotation = AffineTransform.getRotateInstance(getTheta(), x, y);
+ for (Point2D point : controlPoints) {
+ rotation.transform(point, point);
+ }
+ }
+ }
+
+ @Override
+ public void drawIcon(Graphics2D g2d, int width, int height) {
+ int waferDiameter = 15 * width / 32;
+ int sleeveDiameter = 9 * width / 32;
+
+ AffineTransform tx = g2d.getTransform();
+
+ g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(6f * width / 32));
+ g2d.setColor(BASE_COLOR);
+ g2d.drawLine(width / 2, 4 * width / 32, width / 2, width / 4);
+
+ g2d.rotate(RING_THETA, width / 2, height / 2);
+
+ g2d.drawLine(width / 2, 4 * width / 32, width / 2, width / 4);
+
+ g2d.setColor(WAFER_COLOR);
+ g2d.draw(new Ellipse2D.Double(width / 2 - waferDiameter / 2, height / 2 - waferDiameter / 2, waferDiameter,
+ waferDiameter));
+
+ g2d.setColor(BASE_COLOR);
+ g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2f * width / 32));
+ g2d.draw(new Ellipse2D.Double(width / 2 - sleeveDiameter / 2, height / 2 - sleeveDiameter / 2, sleeveDiameter,
+ sleeveDiameter));
+
+ g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(6f * width / 32));
+ g2d.rotate(-Math.PI / 2, width / 2, height / 2);
+
+ g2d.drawLine(width / 2, 4 * width / 32, width / 2, width / 3);
+
+ g2d.setTransform(tx);
+ g2d.setColor(LABEL_COLOR);
+ g2d.setFont(LABEL_FONT.deriveFont(width / 3.5f));
+
+ RenderingHints rh = new RenderingHints(
+ RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+ g2d.setRenderingHints(rh);
+
+ StringUtils.drawCenteredText(g2d, "1/8\"", width / 2 - 1, height / 2, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
+ }
+
+ @Override
+ public int getControlPointCount() {
+ return controlPoints.length;
+ }
+
+ @Override
+ public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
+ return VisibilityPolicy.NEVER;
+ }
+
+ @Override
+ public boolean isControlPointSticky(int index) {
+ return index < 2 || (getType() == OpenJackType.STEREO || getType() == OpenJackType.SWITCHED);
+ }
+
+ @Override
+ public Point2D getControlPoint(int index) {
+ return controlPoints[index];
+ }
+
+ @Override
+ public void setControlPoint(Point2D point, int index) {
+ this.controlPoints[index].setLocation(point);
+ // Invalidate the body
+ body = null;
+ }
+
+ @Override
+ public String getValue() {
+ return value;
+ }
+
+ @Override
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @EditableProperty
+ public Integer getAngle() {
+ if (angle == null || (orientation != null && orientation != Orientation.DEFAULT)) {
+ if (orientation != null && orientation != Orientation.DEFAULT)
+ angle = Integer.parseInt(orientation.name().replace("_", ""));
+ else
+ angle = 0;
+ }
+ return angle;
+ }
+
+ public void setAngle(Integer angle) {
+ this.angle = angle;
+ updateControlPoints();
+ // Invalidate the body
+ body = null;
+ }
+
+ protected double getTheta() {
+ return Math.toRadians(getAngle());
+ }
+
+ @EditableProperty
+ public OpenJackType getType() {
+ return type;
+ }
+
+ public void setType(OpenJackType type) {
+ this.type = type;
+ updateControlPoints();
+ // Invalidate the body
+ body = null;
+ }
+
+ @EditableProperty(name = "Labels")
+ public boolean getShowLabels() {
+ return showLabels;
+ }
+
+ public void setShowLabels(boolean showLabels) {
+ this.showLabels = showLabels;
+ }
+
+ @Override
+ public String getControlPointNodeName(int index) {
+ if (index == 0)
+ return "Tip";
+ if (index == 1)
+ return "Sleeve";
+ if (index == 2 && getType() == OpenJackType.STEREO)
+ return "Ring";
+ if (index == 2 && getType() == OpenJackType.SWITCHED)
+ return "Shunt";
+ return null;
+ }
+
+ @Override
+ public boolean canPointMoveFreely(int pointIndex) {
+ return false;
+ }
+
+ @Override
+ public Rectangle2D getCachingBounds() {
+ Area area = new Area();
+ Area[] body = getBody();
+ int margin = 20;
+ for (Area a : body)
+ if (a != null)
+ area.add(a);
+ Rectangle2D bounds = area.getBounds2D();
+ return new Rectangle2D.Double(bounds.getX() - margin, bounds.getY() - margin, bounds.getWidth() + 2 * margin, bounds.getHeight() + 2 * margin);
+ }
+
+ public enum OpenJackType {
+
+ MONO, STEREO, SWITCHED;
+
+ @Override
+ public String toString() {
+ return name().substring(0, 1) + name().substring(1).toLowerCase();
+ }
+ }
+}
diff --git a/diylc/diylc-swing/.classpath b/diylc/diylc-swing/.classpath
index 7041ee5a..e9e69448 100644
--- a/diylc/diylc-swing/.classpath
+++ b/diylc/diylc-swing/.classpath
@@ -9,7 +9,6 @@
-
@@ -18,6 +17,7 @@
+
diff --git a/diylc/diylc-swing/build.xml b/diylc/diylc-swing/build.xml
index a3fc1073..384b9c19 100644
--- a/diylc/diylc-swing/build.xml
+++ b/diylc/diylc-swing/build.xml
@@ -10,7 +10,7 @@
-
+
diff --git a/diylc/diylc-swing/dict.txt b/diylc/diylc-swing/dict.txt
index d08bf3e7..592775bc 100644
--- a/diylc/diylc-swing/dict.txt
+++ b/diylc/diylc-swing/dict.txt
@@ -25,6 +25,7 @@
AWG
And
C-B-E BJT
+Check Trace Proximity
D-G-S JFET
D-G-S MOSFET
D-S-G JFET
@@ -39,6 +40,8 @@ DPDT (Center OFF)
Deutsch
Dimension Mode
Donate
+Dots (Gradual)
+Dots (Uniform)
E-B-C BJT
English
Español
@@ -47,18 +50,28 @@ G-D-S JFET
G-D-S MOSFET
G-S-D JFET
G-S-D MOSFET
+Import Netlist
Italiano
Lin
Log
+Marker Size
NPN
Nand
Nederlands
Nor
Not
+Numeric (0-10)
+Numeric (1-10)
+Numeric (1-11)
+Numeric (1-12)
+Numeric (Even, No Ticks)
+Numeric (Even, With Ticks)
Or
PAF
PCB
PNP
+Panel
+Português
Rev log
S-G-D JFET
S-G-D MOSFET
@@ -67,6 +80,8 @@ SPDT
SPDT (Center OFF)
SPST
Srpski
+Tick Width
+Ticks
Xnor
Xor
cm
diff --git a/diylc/diylc-swing/flatpak/com.diy_fever.DIYLayoutCreator.metainfo.xml b/diylc/diylc-swing/flatpak/com.diy_fever.DIYLayoutCreator.metainfo.xml
index dfea351f..21e7e8fd 100644
--- a/diylc/diylc-swing/flatpak/com.diy_fever.DIYLayoutCreator.metainfo.xml
+++ b/diylc/diylc-swing/flatpak/com.diy_fever.DIYLayoutCreator.metainfo.xml
@@ -37,6 +37,14 @@
nbenitezl_AT_gmail.com
+
+
+
+ - [New Feature] Added 'Open 1/8" Jack' component
+
+
+ https://github.com/bancika/diy-layout-creator/releases/tag/v4.20.0
+
diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar
index d615b6d5..dbaf43ff 100644
Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ
diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar
index 4323f2b7..fb23531d 100644
Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ