From feaa48fed58d2d6b6c0da45c9a244be4d0072cf1 Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Sun, 12 Sep 2021 19:24:30 +0200 Subject: [PATCH] Upcoming (#669) * Added 1/8" jack * Release 4.20 --- .../src/org/diylc/presenter/update.xml | 16 + diylc/diylc-library/lib/diylc-core.jar | Bin 353441 -> 353476 bytes .../electromechanical/OpenJack1_4.java | 21 +- .../electromechanical/OpenJack1_8.java | 449 ++++++++++++++++++ diylc/diylc-swing/.classpath | 2 +- diylc/diylc-swing/build.xml | 2 +- diylc/diylc-swing/dict.txt | 15 + ...om.diy_fever.DIYLayoutCreator.metainfo.xml | 8 + diylc/diylc-swing/lib/diylc-core.jar | Bin 353441 -> 353476 bytes diylc/diylc-swing/library/main.jar | Bin 783899 -> 792275 bytes 10 files changed, 508 insertions(+), 5 deletions(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_8.java 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 d615b6d57b439a11c8e70256820813adba76e21c..dbaf43ff8a409c7540e9ff137b870bd6775bd643 100644 GIT binary patch delta 27093 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 oq!9BLfrAl(fL(y8hxh$3 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 wG9Q&B!+&f~BY!$T+!$L7jwmHZ { + 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 +