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