diff --git a/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java index f307414b..1c5cceb5 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/AbstractTubeSymbol.java @@ -3,13 +3,16 @@ package org.diylc.components.tube; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.Rectangle; import java.awt.Shape; +import java.awt.geom.AffineTransform; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.Display; 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.AbstractComponent; import org.diylc.core.ComponentState; @@ -34,6 +37,8 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { protected Display display = Display.NAME; transient protected Shape[] body; protected boolean showHeaters; + protected Orientation orientation = Orientation.DEFAULT; + protected Point[] controlPoints; @Override public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, @@ -82,7 +87,9 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { : LABEL_COLOR; } g2d.setColor(finalLabelColor); - Point p = getTextLocation(); + + Rectangle rect = body[2] != null ? body[2].getBounds() : body[1].getBounds(); + String label = ""; label = display == Display.VALUE ? getValue() : getName(); if (display == Display.NONE) { @@ -91,7 +98,24 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { if (display == Display.BOTH) { label = getName() + " " + (getValue() == null ? "" : getValue().toString()); } - drawCenteredText(g2d, label, p.x, p.y, HorizontalAlignment.LEFT, VerticalAlignment.TOP); + drawCenteredText(g2d, label, rect.x + rect.width, rect.y + rect.height, HorizontalAlignment.RIGHT, VerticalAlignment.BOTTOM); + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + + refreshDrawing(); } @EditableProperty @@ -130,8 +154,41 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { public void setShowHeaters(boolean showHeaters) { this.showHeaters = showHeaters; - // Invalidate body + + refreshDrawing(); + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + + refreshDrawing(); + } + + protected void refreshDrawing() { + updateControlPoints(); + // make sure we have a new drawing body = null; + getBody(); + + if (this.orientation == Orientation.DEFAULT) + return; + + Point first = this.controlPoints[0]; + double angle = Double.parseDouble(this.orientation.name().replace("_", "")); + AffineTransform rotate = AffineTransform.getRotateInstance(Math.toRadians(angle), first.x, first.y); + for (int i = 1; i < this.controlPoints.length; i++) { + rotate.transform(this.controlPoints[i], this.controlPoints[i]); + } + if (this.body != null) { + for (int i = 0; i < this.body.length; i++) { + this.body[i] = rotate.createTransformedShape(this.body[i]); + } + } } /** @@ -142,4 +199,6 @@ public abstract class AbstractTubeSymbol extends AbstractComponent { protected abstract Shape[] getBody(); protected abstract Point getTextLocation(); + + protected abstract void updateControlPoints(); } diff --git a/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java index a7c9eb09..c032e31c 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/DiodeSymbol.java @@ -21,14 +21,13 @@ import org.diylc.core.annotations.KeywordPolicy; public class DiodeSymbol extends AbstractTubeSymbol { private static final long serialVersionUID = 1L; - - protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), - new Point(0, 0)}; - + protected boolean directlyHeated = false; public DiodeSymbol() { super(); + this.controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), + new Point(0, 0)}; updateControlPoints(); } @@ -111,15 +110,6 @@ public class DiodeSymbol extends AbstractTubeSymbol { } @Override - public Point getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. @@ -139,13 +129,6 @@ public class DiodeSymbol extends AbstractTubeSymbol { controlPoints[4].y = y + pinSpacing * 3; } - @Override - public void setControlPoint(Point point, int index) { - controlPoints[index].setLocation(point); - // Invalidate body - body = null; - } - @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { if (directlyHeated) { @@ -181,8 +164,8 @@ public class DiodeSymbol extends AbstractTubeSymbol { public void setDirectlyHeated(boolean directlyHeated) { this.directlyHeated = directlyHeated; - // Invalidate body - body = null; + + refreshDrawing(); } public class HeaterValidator implements IPropertyValidator { diff --git a/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java index aabcc6c9..d0406862 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/PentodeSymbol.java @@ -21,13 +21,12 @@ public class PentodeSymbol extends AbstractTubeSymbol { private static final long serialVersionUID = 1L; - protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), - new Point(0, 0), new Point(0, 0), new Point(0, 0)}; - protected boolean exposeSuppressorGrid = true; public PentodeSymbol() { super(); + this.controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), + new Point(0, 0), new Point(0, 0), new Point(0, 0)}; updateControlPoints(); } @@ -156,16 +155,6 @@ public class PentodeSymbol extends AbstractTubeSymbol { g2d.drawLine(width / 8, height * 5 / 8, width * 7 / 8, height * 5 / 8); } - @Override - public Point getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. @@ -191,13 +180,6 @@ public class PentodeSymbol extends AbstractTubeSymbol { controlPoints[6].y = y + pinSpacing * 2; } - @Override - public void setControlPoint(Point point, int index) { - controlPoints[index].setLocation(point); - // Invalidate body - body = null; - } - @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { if (showHeaters) { @@ -230,6 +212,7 @@ public class PentodeSymbol extends AbstractTubeSymbol { public void setExposeSuppressorGrid(boolean exposeSuppressorGrid) { this.exposeSuppressorGrid = exposeSuppressorGrid; - this.body = null; + + refreshDrawing(); } } diff --git a/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java b/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java index 0cf04cfc..811d10c0 100644 --- a/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java +++ b/diylc/diylc-library/src/org/diylc/components/tube/TriodeSymbol.java @@ -21,13 +21,12 @@ public class TriodeSymbol extends AbstractTubeSymbol { private static final long serialVersionUID = 1L; - protected Point[] controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), - new Point(0, 0)}; - protected boolean directlyHeated = false; public TriodeSymbol() { super(); + this.controlPoints = new Point[] {new Point(0, 0), new Point(0, 0), new Point(0, 0), new Point(0, 0), + new Point(0, 0)}; updateControlPoints(); } @@ -127,16 +126,6 @@ public class TriodeSymbol extends AbstractTubeSymbol { g2d.drawLine(width / 8, height / 2, width * 7 / 8, height / 2); } - @Override - public Point getControlPoint(int index) { - return controlPoints[index]; - } - - @Override - public int getControlPointCount() { - return controlPoints.length; - } - protected void updateControlPoints() { int pinSpacing = (int) PIN_SPACING.convertToPixels(); // Update control points. @@ -156,13 +145,6 @@ public class TriodeSymbol extends AbstractTubeSymbol { controlPoints[4].y = y + pinSpacing * 3; } - @Override - public void setControlPoint(Point point, int index) { - controlPoints[index].setLocation(point); - // Invalidate body - body = null; - } - @Override public VisibilityPolicy getControlPointVisibilityPolicy(int index) { if (directlyHeated) { @@ -198,7 +180,7 @@ public class TriodeSymbol extends AbstractTubeSymbol { public void setDirectlyHeated(boolean directlyHeated) { this.directlyHeated = directlyHeated; - // Invalidate body - body = null; + + refreshDrawing(); } } diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index f176d0d2..6c9b6154 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 2931a0ee..e311ce7b 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1418,6 +1418,10 @@ NEW_FEATURE Battery schematic symbol added + + NEW_FEATURE + Tube symbols can be rotated + IMPROVEMENT Added percent text box next to the slider for editors like Alpha or Scale