From 0e1db4ddb1750793599a5dd077eb8840d78a783d Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 26 Dec 2016 12:32:46 +0100 Subject: [PATCH] added P90 pickups, mini humbuckers, fixed links --- diylc/diylc-library/lib/diylc-core.jar | Bin 230151 -> 230151 bytes .../components/guitar/HumbuckerPickup.java | 64 +++- .../components/guitar/P90DogEarPickup.java | 284 ++++++++++++++++++ .../components/guitar/P90SoapBarPickup.java | 255 ++++++++++++++++ .../components/guitar/SingleCoilPickup.java | 2 + diylc/diylc-swing/lib/diylc-core.jar | Bin 230151 -> 230151 bytes diylc/diylc-swing/library/main.jar | Bin 337810 -> 351319 bytes .../swing/plugins/help/HelpMenuPlugin.java | 12 +- diylc/diylc-swing/update.xml | 26 +- 9 files changed, 629 insertions(+), 14 deletions(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/guitar/P90DogEarPickup.java create mode 100644 diylc/diylc-library/src/org/diylc/components/guitar/P90SoapBarPickup.java diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 225fea3fc67bb9dd86948ab09180f0763692a07d..7a02be5b5f4e512a3d0c00a8e93a4fcc1124de03 100644 GIT binary patch delta 4689 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 delta 4689 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 { private static Color BODY_COLOR = Color.lightGray; private static Color POINT_COLOR = Color.darkGray; + public static Color PIN_COLOR = Color.decode("#C3E4ED"); private static Size WIDTH = new Size(36.5d, SizeUnit.mm); private static Size LENGTH = new Size(68.58d, SizeUnit.mm); + private static Size WIDTH_MINI = new Size(29.3d, SizeUnit.mm); + private static Size LENGTH_MINI = new Size(67.4d, SizeUnit.mm); private static Size LIP_WIDTH = new Size(12.7d, SizeUnit.mm); private static Size LIP_LENGTH = new Size(7.9d, SizeUnit.mm); private static Size EDGE_RADIUS = new Size(4d, SizeUnit.mm); @@ -59,6 +62,7 @@ public class HumbuckerPickup extends AbstractTransparentComponent { transient Shape[] body; private Orientation orientation = Orientation.DEFAULT; private Color color = BODY_COLOR; + private HumbuckerType type; @Override public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, @@ -96,6 +100,8 @@ public class HumbuckerPickup extends AbstractTransparentComponent { g2d.draw(body[0]); g2d.draw(body[1]); if (!outlineMode) { + g2d.setColor(PIN_COLOR); + g2d.fill(body[3]); g2d.setColor(color.darker()); g2d.draw(body[3]); } @@ -126,8 +132,8 @@ public class HumbuckerPickup extends AbstractTransparentComponent { int x = controlPoint.x; int y = controlPoint.y; - int width = (int) WIDTH.convertToPixels(); - int length = (int) LENGTH.convertToPixels(); + int width = (int) getType().getWidth().convertToPixels(); + int length = (int) getType().getLength().convertToPixels(); int lipWidth = (int) LIP_WIDTH.convertToPixels(); int lipLength = (int) LIP_LENGTH.convertToPixels(); int edgeRadius = (int) EDGE_RADIUS.convertToPixels(); @@ -142,7 +148,7 @@ public class HumbuckerPickup extends AbstractTransparentComponent { new Area(new RoundRectangle2D.Double(x + pointMargin - length - lipLength, y - pointMargin + width / 2 - lipWidth / 2, length + 2 * lipLength, lipWidth, edgeRadius / 2, edgeRadius / 2)); Area lipArea = new Area(body[1]); - lipArea.subtract(new Area(body[0])); + lipArea.subtract((Area) (body[0])); lipArea.subtract(new Area(new Ellipse2D.Double(x + pointMargin - length - lipLength / 2, y - pointMargin + width / 2 - lipHoleSize / 2, lipHoleSize, lipHoleSize))); lipArea.subtract(new Area(new Ellipse2D.Double(x + pointMargin + lipLength / 2, y - pointMargin + width / 2 @@ -157,11 +163,14 @@ public class HumbuckerPickup extends AbstractTransparentComponent { int poleMargin = (length - poleSpacing * 5) / 2; Area poleArea = new Area(); for (int i = 0; i < 6; i++) { + if (getType() == HumbuckerType.PAF) { + Ellipse2D pole = + new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2, y + - pointMargin + coilMargin - poleSize / 2, poleSize, poleSize); + poleArea.add(new Area(pole)); + } + Ellipse2D pole = - new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2, y - - pointMargin + coilMargin - poleSize / 2, poleSize, poleSize); - poleArea.add(new Area(pole)); - pole = new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2, y - pointMargin + width - coilMargin - poleSize / 2, poleSize, poleSize); poleArea.add(new Area(pole)); @@ -194,6 +203,8 @@ public class HumbuckerPickup extends AbstractTransparentComponent { @Override public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(Math.PI / 4, width / 2, height / 2); + int baseWidth = 16 * width / 32; int baseLength = 27 * width / 32; @@ -210,6 +221,19 @@ public class HumbuckerPickup extends AbstractTransparentComponent { 4 * width / 32); } + @EditableProperty + public HumbuckerType getType() { + if (type == null) + type = HumbuckerType.PAF; + return type; + } + + public void setType(HumbuckerType type) { + this.type = type; + // Invalidate the body + body = null; + } + @Override public int getControlPointCount() { return 1; @@ -267,4 +291,30 @@ public class HumbuckerPickup extends AbstractTransparentComponent { public void setColor(Color color) { this.color = color; } + + public static enum HumbuckerType { + + PAF(WIDTH, LENGTH), Mini(WIDTH_MINI, LENGTH_MINI); + + private Size width; + private Size length; + + private HumbuckerType(Size width, Size length) { + this.width = width; + this.length = length; + } + + public Size getWidth() { + return width; + } + + public Size getLength() { + return length; + } + + @Override + public String toString() { + return name(); + } + } } diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/P90DogEarPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/P90DogEarPickup.java new file mode 100644 index 00000000..9ac491f0 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/guitar/P90DogEarPickup.java @@ -0,0 +1,284 @@ +package org.diylc.components.guitar; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +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.AbstractTransparentComponent; +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.annotations.KeywordPolicy; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "P-90 \"Dog Ear\" Pickup", category = "Guitar", author = "Branislav Stojkovic", + description = "Single coil P-90 guitar pickup with \"dog ears\"", stretchable = false, + zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PKP", autoEdit = false, + keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram") +public class P90DogEarPickup extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BODY_COLOR = Color.decode("#D8C989");; + private static Color POINT_COLOR = Color.darkGray; + public static Color POLE_COLOR = Color.decode("#C3E4ED"); + private static Size WIDTH = new Size(41d, SizeUnit.mm); + private static Size LENGTH = new Size(86.9d, SizeUnit.mm); + private static Size TOTAL_LENGTH = new Size(118.7d, SizeUnit.mm); + private static Size LIP_RADIUS = new Size(10d, SizeUnit.mm); + private static Size EDGE_RADIUS = new Size(4d, SizeUnit.mm); + private static Size POINT_MARGIN = new Size(5d, SizeUnit.mm); + private static Size POINT_SIZE = new Size(3d, SizeUnit.mm); + private static Size LIP_HOLE_SIZE = new Size(2.5d, SizeUnit.mm); + private static Size LIP_HOLE_SPACING = new Size(97d, SizeUnit.mm); + private static Size POLE_SIZE = new Size(3d, SizeUnit.mm); + private static Size POLE_SPACING = new Size(10.1d, SizeUnit.mm); + + private String value = ""; + private Point controlPoint = new Point(0, 0); + transient Shape[] body; + private Orientation orientation = Orientation.DEFAULT; + private Color color = BODY_COLOR; + + @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 : color); + g2d.fill(body[0]); + g2d.fill(body[1]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : POINT_COLOR); + g2d.fill(body[2]); + g2d.setComposite(oldComposite); + } + + Color finalBorderColor; + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : color.darker(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + g2d.draw(body[1]); + if (!outlineMode) { + g2d.setColor(POLE_COLOR); + g2d.fill(body[3]); + g2d.setColor(color.darker()); + g2d.draw(body[3]); + } + + Color finalLabelColor; + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : theme.getOutlineColor(); + } else { + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : LABEL_COLOR; + } + g2d.setColor(finalLabelColor); + g2d.setFont(LABEL_FONT); + Rectangle bounds = body[0].getBounds(); + drawCenteredText(g2d, value, bounds.x + bounds.width / 2, bounds.y + bounds.height / 2, HorizontalAlignment.CENTER, + VerticalAlignment.CENTER); + } + + @SuppressWarnings("incomplete-switch") + public Shape[] getBody() { + if (body == null) { + body = new Shape[4]; + + int x = controlPoint.x; + int y = controlPoint.y; + int width = (int) WIDTH.convertToPixels(); + int length = (int) LENGTH.convertToPixels(); + int edgeRadius = (int) EDGE_RADIUS.convertToPixels(); + int pointMargin = (int) POINT_MARGIN.convertToPixels(); + int totalLength = (int) TOTAL_LENGTH.convertToPixels(); + int lipRadius = (int) LIP_RADIUS.convertToPixels(); + int pointSize = getClosestOdd(POINT_SIZE.convertToPixels()); + int lipHoleSize = getClosestOdd(LIP_HOLE_SIZE.convertToPixels()); + int lipHoleSpacing = getClosestOdd(LIP_HOLE_SPACING.convertToPixels()); + + body[0] = + new Area(new RoundRectangle2D.Double(x + pointMargin - length, y - pointMargin, length, width, edgeRadius, + edgeRadius)); + + double rectWidth = (totalLength - length) / Math.sqrt(2); + RoundRectangle2D roundRect = + new RoundRectangle2D.Double(-rectWidth / 2, -rectWidth / 2, rectWidth, rectWidth, lipRadius, lipRadius); + Area leftEar = new Area(roundRect); + leftEar.transform(AffineTransform.getRotateInstance(Math.PI / 4)); + leftEar.transform(AffineTransform.getScaleInstance(1.1, 1.45)); + leftEar.transform(AffineTransform.getTranslateInstance(x + pointMargin - length, y - pointMargin + width / 2)); + leftEar.subtract((Area) body[0]); + Area rightEar = new Area(roundRect); + rightEar.transform(AffineTransform.getRotateInstance(Math.PI / 4)); + rightEar.transform(AffineTransform.getScaleInstance(1.1, 1.45)); + rightEar.transform(AffineTransform.getTranslateInstance(x + pointMargin, y - pointMargin + width / 2)); + rightEar.subtract((Area) body[0]); + Area lipArea = leftEar; + lipArea.add(rightEar); + lipArea.subtract(new Area(new Ellipse2D.Double(x + pointMargin - length / 2 - lipHoleSpacing / 2 - lipHoleSize + / 2, y - pointMargin + width / 2 - lipHoleSize / 2, lipHoleSize, lipHoleSize))); + lipArea.subtract(new Area(new Ellipse2D.Double(x + pointMargin - length / 2 + lipHoleSpacing / 2 - lipHoleSize + / 2, y - pointMargin + width / 2 - lipHoleSize / 2, lipHoleSize, lipHoleSize))); + + + body[1] = lipArea; + body[2] = new Area(new Ellipse2D.Double(x - pointSize / 2, y - pointSize / 2, pointSize, pointSize)); + + int poleSize = (int) POLE_SIZE.convertToPixels(); + int poleSpacing = (int) POLE_SPACING.convertToPixels(); + int poleMargin = (length - poleSpacing * 5) / 2; + Area poleArea = new Area(); + for (int i = 0; i < 6; i++) { + Ellipse2D pole = + new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2, y + - pointMargin - poleSize / 2 + width / 2, poleSize, poleSize); + poleArea.add(new Area(pole)); + } + body[3] = poleArea; + + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + for (Shape shape : body) { + Area area = (Area) shape; + area.transform(rotation); + } + } + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(Math.PI / 4, width / 2, height / 2); + + int baseWidth = 13 * width / 32; + int baseLength = 27 * width / 32; + int radius = 6 * width / 32; + + g2d.setColor(BODY_COLOR); + g2d.fillRoundRect((width - baseWidth) / 2, (height - baseLength) / 2, baseWidth, baseLength, radius, radius); + g2d.setColor(BODY_COLOR.darker()); + g2d.drawRoundRect((width - baseWidth) / 2, (height - baseLength) / 2, baseWidth, baseLength, radius, radius); + + g2d.setColor(POLE_COLOR.darker()); + int poleSize = 2; + int poleSpacing = 17 * width / 32; + for (int i = 0; i < 6; i++) { + g2d.fillOval((width - poleSize) / 2, (height - poleSpacing) / 2 + (i * poleSpacing / 5), poleSize, poleSize); + } + } + + @Override + public int getControlPointCount() { + return 1; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.WHEN_SELECTED; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public Point getControlPoint(int index) { + return controlPoint; + } + + @Override + public void setControlPoint(Point point, int index) { + this.controlPoint.setLocation(point); + // Invalidate the body + body = null; + } + + @EditableProperty(name = "Model") + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + // Invalidate the body + body = null; + } + + @EditableProperty + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/P90SoapBarPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/P90SoapBarPickup.java new file mode 100644 index 00000000..e2569cca --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/guitar/P90SoapBarPickup.java @@ -0,0 +1,255 @@ +package org.diylc.components.guitar; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.RoundRectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +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.AbstractTransparentComponent; +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.annotations.KeywordPolicy; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "P-90 \"Soap Bar\" Pickup", category = "Guitar", author = "Branislav Stojkovic", + description = "Single coil P-90 guitar pickup in \"soap bar\" shape", stretchable = false, + zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PKP", autoEdit = false, + keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram") +public class P90SoapBarPickup extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BODY_COLOR = Color.decode("#D8C989"); + private static Color POINT_COLOR = Color.darkGray; + public static Color POLE_COLOR = Color.decode("#C3E4ED"); + private static Size WIDTH = new Size(35.3d, SizeUnit.mm); + private static Size LENGTH = new Size(85.6d, SizeUnit.mm); + private static Size EDGE_RADIUS = new Size(8d, SizeUnit.mm); + private static Size POINT_MARGIN = new Size(5d, SizeUnit.mm); + private static Size POINT_SIZE = new Size(3d, SizeUnit.mm); + private static Size POLE_SIZE = new Size(3d, SizeUnit.mm); + private static Size POLE_SPACING = new Size(10.1d, SizeUnit.mm); + + private String value = ""; + private Point controlPoint = new Point(0, 0); + transient Shape[] body; + private Orientation orientation = Orientation.DEFAULT; + private Color color = BODY_COLOR; + + @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 : color); + g2d.fill(body[0]); + // g2d.fill(body[1]); + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : POINT_COLOR); + g2d.fill(body[2]); + g2d.setComposite(oldComposite); + } + + Color finalBorderColor; + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalBorderColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : color.darker(); + } + + g2d.setColor(finalBorderColor); + g2d.draw(body[0]); + // g2d.draw(body[1]); + if (!outlineMode) { + g2d.setColor(POLE_COLOR); + g2d.fill(body[3]); + g2d.setColor(color.darker()); + g2d.draw(body[3]); + } + + Color finalLabelColor; + if (outlineMode) { + Theme theme = + (Theme) ConfigurationManager.getInstance().readObject(IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : theme.getOutlineColor(); + } else { + finalLabelColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : LABEL_COLOR; + } + g2d.setColor(finalLabelColor); + g2d.setFont(LABEL_FONT); + Rectangle bounds = body[0].getBounds(); + drawCenteredText(g2d, value, bounds.x + bounds.width / 2, bounds.y + bounds.height / 2, HorizontalAlignment.CENTER, + VerticalAlignment.CENTER); + } + + @SuppressWarnings("incomplete-switch") + public Shape[] getBody() { + if (body == null) { + body = new Shape[4]; + + int x = controlPoint.x; + int y = controlPoint.y; + int width = (int) WIDTH.convertToPixels(); + int length = (int) LENGTH.convertToPixels(); + int edgeRadius = (int) EDGE_RADIUS.convertToPixels(); + int pointMargin = (int) POINT_MARGIN.convertToPixels(); + int pointSize = getClosestOdd(POINT_SIZE.convertToPixels()); + + body[0] = + new Area(new RoundRectangle2D.Double(x + pointMargin - length, y - pointMargin, length, width, edgeRadius, + edgeRadius)); + + body[2] = new Area(new Ellipse2D.Double(x - pointSize / 2, y - pointSize / 2, pointSize, pointSize)); + + int poleSize = (int) POLE_SIZE.convertToPixels(); + int poleSpacing = (int) POLE_SPACING.convertToPixels(); + int poleMargin = (length - poleSpacing * 5) / 2; + Area poleArea = new Area(); + for (int i = 0; i < 6; i++) { + Ellipse2D pole = + new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2, y + - pointMargin - poleSize / 2 + width / 2, poleSize, poleSize); + poleArea.add(new Area(pole)); + } + body[3] = poleArea; + + // Rotate if needed + if (orientation != Orientation.DEFAULT) { + double theta = 0; + switch (orientation) { + case _90: + theta = Math.PI / 2; + break; + case _180: + theta = Math.PI; + break; + case _270: + theta = Math.PI * 3 / 2; + break; + } + AffineTransform rotation = AffineTransform.getRotateInstance(theta, x, y); + for (Shape shape : body) { + Area area = (Area) shape; + if (shape != null) + area.transform(rotation); + } + } + } + return body; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(Math.PI / 4, width / 2, height / 2); + + int baseWidth = 13 * width / 32; + int baseLength = 27 * width / 32; + int radius = 6 * width / 32; + + g2d.setColor(BODY_COLOR); + g2d.fillRoundRect((width - baseWidth) / 2, (height - baseLength) / 2, baseWidth, baseLength, radius, radius); + g2d.setColor(BODY_COLOR.darker()); + g2d.drawRoundRect((width - baseWidth) / 2, (height - baseLength) / 2, baseWidth, baseLength, radius, radius); + + g2d.setColor(POLE_COLOR.darker()); + int poleSize = 2; + int poleSpacing = 17 * width / 32; + for (int i = 0; i < 6; i++) { + g2d.fillOval((width - poleSize) / 2, (height - poleSpacing) / 2 + (i * poleSpacing / 5), poleSize, poleSize); + } + } + + @Override + public int getControlPointCount() { + return 1; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.WHEN_SELECTED; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public Point getControlPoint(int index) { + return controlPoint; + } + + @Override + public void setControlPoint(Point point, int index) { + this.controlPoint.setLocation(point); + // Invalidate the body + body = null; + } + + @EditableProperty(name = "Model") + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + // Invalidate the body + body = null; + } + + @EditableProperty + public Color getColor() { + return color; + } + + public void setColor(Color color) { + this.color = color; + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java index ce1a00cb..96f20c69 100644 --- a/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java +++ b/diylc/diylc-library/src/org/diylc/components/guitar/SingleCoilPickup.java @@ -183,6 +183,8 @@ public class SingleCoilPickup extends AbstractTransparentComponent { @Override public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.rotate(Math.PI / 4, width / 2, height / 2); + int bodyWidth = 8 * width / 32; int bodyLength = 30 * width / 32; g2d.setColor(BODY_COLOR); diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 225fea3fc67bb9dd86948ab09180f0763692a07d..7a02be5b5f4e512a3d0c00a8e93a4fcc1124de03 100644 GIT binary patch delta 4689 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 delta 4689 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 delta 16090 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 diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java index 128de18d..e0dbd243 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/help/HelpMenuPlugin.java @@ -26,12 +26,12 @@ public class HelpMenuPlugin implements IPlugIn { private static final String HELP_TITLE = "Help"; - public static String MANUAL_URL = "http://code.google.com/p/diy-layout-creator/wiki/Manual"; - public static String FAQ_URL = "http://code.google.com/p/diy-layout-creator/wiki/FAQ"; - public static String COMPONENT_URL = "http://code.google.com/p/diy-layout-creator/wiki/ComponentAPI"; - public static String PLUGIN_URL = "http://code.google.com/p/diy-layout-creator/wiki/PluginAPI"; - public static String BUG_URL = "http://code.google.com/p/diy-layout-creator/issues/entry"; - public static String DONATE_URL = "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=25161"; + public static String MANUAL_URL = "https://github.com/bancika/diy-layout-creator/blob/wiki/Manual.md"; + public static String FAQ_URL = "https://github.com/bancika/diy-layout-creator/blob/wiki/FAQ.md"; + public static String COMPONENT_URL = "https://github.com/bancika/diy-layout-creator/blob/wiki/ComponentAPI.md"; + public static String PLUGIN_URL = "https://github.com/bancika/diy-layout-creator/blob/wiki/PluginAPI.md"; + public static String BUG_URL = "https://github.com/bancika/diy-layout-creator/issues"; + public static String DONATE_URL = "http://diy-fever.com/donate"; private IPlugInPort plugInPort; private AboutDialog aboutDialog; diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 1475b67a..a5f4c8d3 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1403,7 +1403,7 @@ 33 0 - 2016-11-12 20:00:00.000 CET + 2016-12-23 20:00:00.000 CET @@ -1444,6 +1444,30 @@ https://github.com/bancika/diy-layout-creator/releases + + + + 3 + 34 + 0 + + 2016-12-23 20:00:00.000 CET + + + + NEW_FEATURE + P-90 pickup in both "dog ear" and "soap bar" variations added + + + NEW_FEATURE + Mini humbucker pickup added + + + BUG_FIX + Fixed broken links in the Help menu + + + https://github.com/bancika/diy-layout-creator/releases \ No newline at end of file