diff --git a/diylc/diylc-core/src/org/diylc/core/measures/Size.java b/diylc/diylc-core/src/org/diylc/core/measures/Size.java index 8ee20276..def090e3 100644 --- a/diylc/diylc-core/src/org/diylc/core/measures/Size.java +++ b/diylc/diylc-core/src/org/diylc/core/measures/Size.java @@ -62,6 +62,10 @@ public class Size extends AbstractMeasure implements Comparable throw new IllegalArgumentException("Could not parse size: " + value); } + public static Size fromPixels(double pixels, SizeUnit unit) { + return new Size(pixels / unit.getFactor() * SizeUnit.in.getFactor() / Constants.PIXELS_PER_INCH, unit); + } + public Size scale(double factor) { return new Size(value * factor, unit); } diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index abcc9ab2..08cd6742 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -3170,6 +3170,14 @@ IMPROVEMENT Improved rendering precision, especially when using metric units + + IMPROVEMENT + Improve snap to grid when moving a node that connects several components + + + IMPROVEMENT + Improved board sizing, keep explicit dimensions in sync with control point location + IMPROVEMENT Shorten donation label when the window is smaller diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 909e364e..420f6d82 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java b/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java index a992fe18..ad5cfc0f 100644 --- a/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java +++ b/diylc/diylc-library/src/org/diylc/components/boards/AbstractBoard.java @@ -28,8 +28,10 @@ import java.awt.Graphics2D; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; +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.VerticalAlignment; import org.diylc.components.AbstractTransparentComponent; @@ -53,8 +55,10 @@ public abstract class AbstractBoard extends AbstractTransparentComponent public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in); protected String value = ""; + // two control points used for controlling the position protected Point2D[] controlPoints = new Point2D[] {new Point2D.Double(0, 0), new Point2D.Double(DEFAULT_WIDTH.convertToPixels(), DEFAULT_HEIGHT.convertToPixels())}; + // top-left and bottom-right points protected Point2D firstPoint = new Point2D.Double(); protected Point2D secondPoint = new Point2D.Double(); @@ -306,26 +310,50 @@ public abstract class AbstractBoard extends AbstractTransparentComponent public void setValue(String value) { this.value = value; } + + private SizeUnit getDefaultUnit() { + if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.METRIC_KEY, true)) + return SizeUnit.mm; + return SizeUnit.in; + } @EditableProperty(name = "Explicit Length", validatorClass = BoardModeValidator.class) public Size getLength() { - return length; + if (getMode() == BoardSizingMode.TwoPoints) { + double lengthPx = Math.abs(this.firstPoint.getX() - this.secondPoint.getX()); + this.length = Size.fromPixels(lengthPx, length == null ? getDefaultUnit() : length.getUnit()); + } + return this.length; } public void setLength(Size length) { - this.length = length; + if (getMode() == BoardSizingMode.Explicit) { + setControlPoint(firstPoint, 0); + Point2D second = new Point2D.Double(firstPoint.getX() + length.convertToPixels(), firstPoint.getY() + width.convertToPixels()); + setControlPoint(second, 1); + } + this.length = length; } @EditableProperty(name = "Explicit Width", validatorClass = BoardModeValidator.class) - public Size getWidth() { - return width; + public Size getWidth() { + if (getMode() == BoardSizingMode.TwoPoints) { + double widthPx = Math.abs(this.firstPoint.getY() - this.secondPoint.getY()); + this.width = Size.fromPixels(widthPx, width == null ? getDefaultUnit() : width.getUnit()); + } + return this.width; } public void setWidth(Size width) { + if (getMode() == BoardSizingMode.Explicit) { + setControlPoint(firstPoint, 0); + Point2D second = new Point2D.Double(firstPoint.getX() + length.convertToPixels(), firstPoint.getY() + width.convertToPixels()); + setControlPoint(second, 1); + } this.width = width; } - @EditableProperty(name = "Sizing Mode") + @EditableProperty(name = "Dimension Mode") public BoardSizingMode getMode() { if (mode == null) mode = BoardSizingMode.TwoPoints; diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 909e364e..420f6d82 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index af23411f..4d2eb344 100644 Binary files a/diylc/diylc-swing/library/main.jar and b/diylc/diylc-swing/library/main.jar differ