Added "Sizing Mode" to Image component that allows stretching the image

freely using two control points
This commit is contained in:
Branislav Stojkovic
2020-04-30 17:48:49 +02:00
parent 437657a79c
commit d4519ac5a9
3 changed files with 82 additions and 14 deletions
@@ -3046,6 +3046,10 @@
<changeType>NEW_FEATURE</changeType> <changeType>NEW_FEATURE</changeType>
<description>Internationalization - added support for translating UI of the app to other languages. Get in touch if you wish to translate DIYLC to your language</description> <description>Internationalization - added support for translating UI of the app to other languages. Get in touch if you wish to translate DIYLC to your language</description>
</org.diylc.appframework.update.Change> </org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>NEW_FEATURE</changeType>
<description>Added "Sizing Mode" to Image component that allows stretching the image freely using two control points</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change> <org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType> <changeType>IMPROVEMENT</changeType>
<description>Include themes and fonts in OSX app package</description> <description>Include themes and fonts in OSX app package</description>
@@ -72,6 +72,7 @@ public class Image extends AbstractTransparentComponent<Void> {
} }
private Point point = new Point(0, 0); private Point point = new Point(0, 0);
private Point secondPoint = null;
@XStreamConverter(IconImageConverter.class) @XStreamConverter(IconImageConverter.class)
@Deprecated @Deprecated
@@ -79,6 +80,7 @@ public class Image extends AbstractTransparentComponent<Void> {
private byte[] data; private byte[] data;
private Byte scale; private Byte scale;
private byte newScale = DEFAULT_SCALE; private byte newScale = DEFAULT_SCALE;
private ImageSizingMode sizingMode = ImageSizingMode.Scale;
public Image() { public Image() {
try { try {
@@ -91,10 +93,20 @@ public class Image extends AbstractTransparentComponent<Void> {
@Override @Override
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
IDrawingObserver drawingObserver) { IDrawingObserver drawingObserver) {
double s = 1d * getScale() / DEFAULT_SCALE; double scaleX;
double scaleY;
ImageIcon imageIcon = getImage();
if (getSizingMode() == ImageSizingMode.Scale) {
scaleX = scaleY = 1d * getScale() / DEFAULT_SCALE;
} else {
Point secondPoint = getControlPoint(1);
scaleX = 1d * Math.abs(point.x - secondPoint.x) / imageIcon.getIconWidth();
scaleY = 1d * Math.abs(point.y - secondPoint.y) / imageIcon.getIconHeight();
}
Shape clip = g2d.getClip().getBounds(); Shape clip = g2d.getClip().getBounds();
if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(), getImage().getIconWidth() * s, getImage() if (!clip.intersects(new Rectangle2D.Double(point.getX(), point.getY(), imageIcon.getIconWidth() * scaleX, imageIcon
.getIconHeight() * s))) { .getIconHeight() * scaleY))) {
return; return;
} }
Composite oldComposite = g2d.getComposite(); Composite oldComposite = g2d.getComposite();
@@ -102,14 +114,26 @@ public class Image extends AbstractTransparentComponent<Void> {
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA));
} }
g2d.scale(s, s); int x;
g2d.drawImage(getImage().getImage(), (int) (point.x / s), (int) (point.y / s), null); int y;
if (getSizingMode() == ImageSizingMode.Scale)
{
x = point.x;
y = point.y;
} else {
Point secondPoint = getControlPoint(1);
x = Math.min(point.x, secondPoint.x);
y = Math.min(point.y, secondPoint.y);
}
g2d.scale(scaleX, scaleY);
g2d.drawImage(imageIcon.getImage(), (int) (x / scaleX), (int) (y / scaleY), null);
if (componentState == ComponentState.SELECTED) { if (componentState == ComponentState.SELECTED) {
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
g2d.scale(1 / s, 1 / s); g2d.scale(1 / scaleX, 1 / scaleY);
g2d.setColor(SELECTION_COLOR); g2d.setColor(SELECTION_COLOR);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f));
g2d.drawRect(point.x, point.y, (int) (getImage().getIconWidth() * s), (int) (getImage().getIconHeight() * s)); g2d.drawRect(x, y, (int) (imageIcon.getIconWidth() * scaleX), (int) (imageIcon.getIconHeight() * scaleY));
} }
} }
@@ -120,12 +144,18 @@ public class Image extends AbstractTransparentComponent<Void> {
@Override @Override
public int getControlPointCount() { public int getControlPointCount() {
return 1; return getSizingMode() == ImageSizingMode.Scale ? 1 : 2;
} }
@Override @Override
public Point getControlPoint(int index) { public Point getControlPoint(int index) {
if (index == 0)
return point; return point;
if (secondPoint == null) {
ImageIcon imageIcon = getImage();
secondPoint = new Point(point.x + imageIcon.getIconWidth(), point.y + imageIcon.getIconHeight());
}
return secondPoint;
} }
@Override @Override
@@ -135,12 +165,19 @@ public class Image extends AbstractTransparentComponent<Void> {
@Override @Override
public VisibilityPolicy getControlPointVisibilityPolicy(int index) { public VisibilityPolicy getControlPointVisibilityPolicy(int index) {
return VisibilityPolicy.NEVER; return getSizingMode() == ImageSizingMode.Scale ? VisibilityPolicy.NEVER : VisibilityPolicy.WHEN_SELECTED;
} }
@Override @Override
public void setControlPoint(Point point, int index) { public void setControlPoint(Point point, int index) {
if (index == 0) {
this.point.setLocation(point); this.point.setLocation(point);
} else {
if (secondPoint == null)
secondPoint = new Point(point);
else
secondPoint.setLocation(point);
}
} }
public ImageIcon getImage() { public ImageIcon getImage() {
@@ -169,6 +206,10 @@ public class Image extends AbstractTransparentComponent<Void> {
public void setData(byte[] data) { public void setData(byte[] data) {
this.data = data; this.data = data;
this.image = null; this.image = null;
if (getSizingMode() == ImageSizingMode.TwoPoints) {
ImageIcon imageIcon = getImage();
setControlPoint(new Point(point.x + imageIcon.getIconWidth(), point.y + imageIcon.getIconHeight()), 1);
}
} }
@PercentEditor(_100PercentValue = 25) @PercentEditor(_100PercentValue = 25)
@@ -195,6 +236,32 @@ public class Image extends AbstractTransparentComponent<Void> {
return null; return null;
} }
@EditableProperty(name = "Sizing Mode")
public ImageSizingMode getSizingMode() {
if (sizingMode == null)
sizingMode = ImageSizingMode.Scale;
return sizingMode;
}
public void setSizingMode(ImageSizingMode sizingMode) {
this.sizingMode = sizingMode;
}
@Override @Override
public void setValue(Void value) {} public void setValue(Void value) {}
public static enum ImageSizingMode {
TwoPoints("Opposing Points"), Scale("Scale");
private String label;
private ImageSizingMode(String label) {
this.label = label;
}
@Override
public String toString() {
return label;
}
}
} }
-3
View File
@@ -36,7 +36,6 @@ DP3T
DP5T DP5T
DPDT DPDT
DPDT (Center OFF) DPDT (Center OFF)
Deutsch
E-B-C BJT E-B-C BJT
English English
Español Español
@@ -45,12 +44,10 @@ G-D-S JFET
G-D-S MOSFET G-D-S MOSFET
G-S-D JFET G-S-D JFET
G-S-D MOSFET G-S-D MOSFET
Italiano
Lin Lin
Log Log
NPN NPN
Nand Nand
Nederlands
Nor Nor
Not Not
Or Or