From ebf988eabaac34d7bb5cb7b8bc4004f69aa6ebc7 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Wed, 9 Jan 2019 14:23:15 +0100 Subject: [PATCH] "Jazz Bass Pickup" added --- .../components/guitar/JazzBassPickup.java | 330 ++++++++++++++++++ diylc/diylc-swing/library/main.jar | Bin 462952 -> 469482 bytes diylc/diylc-swing/update.xml | 18 +- 3 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/guitar/JazzBassPickup.java diff --git a/diylc/diylc-library/src/org/diylc/components/guitar/JazzBassPickup.java b/diylc/diylc-library/src/org/diylc/components/guitar/JazzBassPickup.java new file mode 100644 index 00000000..81e6998a --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/guitar/JazzBassPickup.java @@ -0,0 +1,330 @@ +/* + + 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.guitar; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Polygon; +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 = "Jazz Bass Pickup", category = "Guitar", author = "Branislav Stojkovic", + description = "Single coil pickup for Jazz Bass and similar guitars", stretchable = false, + zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "PKP", autoEdit = false, + keywordPolicy = KeywordPolicy.SHOW_TAG, keywordTag = "Guitar Wiring Diagram") +public class JazzBassPickup extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + private static Color BODY_COLOR = Color.decode("#333333");; + private static Color POINT_COLOR = Color.gray; + + private static Size WIDTH = new Size(0.73, SizeUnit.in); + private static Size LENGTH = new Size(4.1, SizeUnit.in); + private static Size EDGE_RADIUS = new Size(0.08d, SizeUnit.in); + private static Size LIP_RADIUS = new Size(0.45d, SizeUnit.in); + private static Size LIP_SPACING = new Size(1.92d, SizeUnit.in); + private static Size LIP_HOLE_SIZE = new Size(0.1d, SizeUnit.in); + private static Size LIP_HOLE_SPACING = new Size(0.1d, SizeUnit.in); + + private static Size POINT_MARGIN = new Size(1.5d, SizeUnit.mm); + private static Size POINT_SIZE = new Size(2d, SizeUnit.mm); + private static Size POLE_SIZE = new Size(4d, SizeUnit.mm); + private static Size POLE_SPACING = new Size(0.85d, SizeUnit.in); + private static Size POLE_SPACING_MINOR = new Size(0.28d, SizeUnit.in); + + private String value = ""; + private Point controlPoint = new Point(0, 0); + transient Shape[] body; + private Orientation orientation = Orientation.DEFAULT; + private Color color = BODY_COLOR; + private Color poleColor = METAL_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 && componentState != ComponentState.DRAGGING) { + g2d.setColor(getPoleColor()); + g2d.fill(body[3]); + g2d.setColor(darkerOrLighter(getPoleColor())); + 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(project.getFont()); + 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 lipRadius = (int) LIP_RADIUS.convertToPixels(); + int lipSpacing = (int) LIP_SPACING.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)); + + Area lip = new Area(new Ellipse2D.Double(-lipRadius / 2, -lipRadius / 2, lipRadius, lipRadius)); + lip.subtract(new Area(new Ellipse2D.Double(-lipHoleSize / 2, -lipHoleSpacing - lipHoleSize / 2, lipHoleSize, lipHoleSize))); + lip.transform(AffineTransform.getTranslateInstance(x + pointMargin - length / 2 - lipSpacing / 2, y - pointMargin)); + + body[1] = new Area(lip); + lip.transform(AffineTransform.getTranslateInstance(lipSpacing, 0)); + ((Area)body[1]).add(lip); + lip = new Area(body[1]); + double y1 = lip.getBounds2D().getY(); + lip.transform(AffineTransform.getScaleInstance(1, -1)); + lip.transform(AffineTransform.getTranslateInstance(0, 2 * y1 + width + lipRadius)); + ((Area)body[1]).add(lip); + + ((Area)body[1]).subtract((Area)body[0]); + + 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 poleSpacingMinor = (int) POLE_SPACING_MINOR.convertToPixels(); + int poleMargin = (length - poleSpacing * 3) / 2; + Area poleArea = new Area(); + for (int i = 0; i < 4; i++) { + Ellipse2D pole = + new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2 - poleSpacingMinor / 2, y + - pointMargin - poleSize / 2 + width / 2, poleSize, poleSize); + poleArea.add(new Area(pole)); + pole = + new Ellipse2D.Double(x + pointMargin - length + poleMargin + i * poleSpacing - poleSize / 2 + poleSpacingMinor / 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 bodyWidth = (int) (5f * width / 32); + int bodyLength = (int) (30f * width / 32); + + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); + g2d.setColor(BODY_COLOR); + g2d.fillRoundRect((width - bodyWidth) / 2, (height - bodyLength) / 2, bodyWidth, bodyLength, 3, 3); + + int lipSpacing = (int) (14f * width / 32); + int lipSize = (int) (3f * width / 32); + + g2d.fillRoundRect((width - bodyWidth) / 2 - lipSize, (height - lipSpacing - lipSize) / 2 , bodyWidth + 2 * lipSize, lipSize, lipSize, lipSize); + g2d.fillRoundRect((width - bodyWidth) / 2 - lipSize, (height + lipSpacing - lipSize) / 2 , bodyWidth + 2 * lipSize, lipSize, lipSize, lipSize); + + g2d.setColor(BODY_COLOR.darker()); + g2d.drawRoundRect((width - bodyWidth) / 2, (height - bodyLength) / 2, bodyWidth, bodyLength, 3, 3); + + // g2d.setColor(Color.gray); + // g2d.drawLine(width / 2, 4 * width / 32, width / 2, 4 * width / 32); + // g2d.drawLine(width / 2, height - 4 * width / 32, width / 2, height - 4 * width / 32); + + g2d.setColor(METAL_COLOR); + int poleSize = 2; + int poleSpacing = (int) (15d * width / 32); + for (int i = 0; i < 4; i++) { + g2d.fillOval((width - poleSize) / 2, (height - poleSpacing) / 2 + (i * poleSpacing / 3), 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; + } + + @EditableProperty(name = "Pole Color") + public Color getPoleColor() { + if (poleColor == null) + poleColor = METAL_COLOR; + return poleColor; + } + + public void setPoleColor(Color poleColor) { + this.poleColor = poleColor; + } +} diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 77156f16695bc5f2004841c2967657fe2649da3e..cc956e251e6293f778688e2f01295172f85233cc 100644 GIT binary patch delta 14088 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 delta 7553 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 diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 65e60bee..91a5304f 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -2128,6 +2128,22 @@ https://github.com/bancika/diy-layout-creator/releases - + + + + 3 + 48 + 0 + + 2019-01-09 00:00:00.000 CET + + + + NEW_FEATURE + "Jazz Bass Pickup" added + + + https://github.com/bancika/diy-layout-creator/releases +