diff --git a/diylc/diylc-core/src/org/diylc/core/Project.java b/diylc/diylc-core/src/org/diylc/core/Project.java index 627db442..c25a5bba 100644 --- a/diylc/diylc-core/src/org/diylc/core/Project.java +++ b/diylc/diylc-core/src/org/diylc/core/Project.java @@ -34,7 +34,8 @@ import java.util.Set; import org.diylc.appframework.update.VersionNumber; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.annotations.MultiLineText; -import org.diylc.core.annotations.PositiveMeasureValidator; +import org.diylc.core.annotations.PositiveMeasureValidator; +import org.diylc.core.annotations.PositiveNonZeroMeasureValidator; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; @@ -62,7 +63,8 @@ public class Project implements Serializable, Cloneable { private String description; private Size width; private Size height; - private Size gridSpacing; + private Size gridSpacing; + private Integer dotSpacing; private List> components; private Set>> groups; private Set lockedLayers; @@ -134,6 +136,17 @@ public class Project implements Serializable, Cloneable { public void setGridSpacing(Size gridSpacing) { this.gridSpacing = gridSpacing; + } + + @EditableProperty(name = "Dot Spacing", validatorClass = PositiveNonZeroMeasureValidator.class) + public Integer getDotSpacing() { + if (dotSpacing == null) + dotSpacing = 1; + return dotSpacing; + } + + public void setDotSpacing(Integer dotSpacing) { + this.dotSpacing = dotSpacing; } /** diff --git a/diylc/diylc-core/src/org/diylc/core/Theme.java b/diylc/diylc-core/src/org/diylc/core/Theme.java index b762d462..ace929fb 100644 --- a/diylc/diylc-core/src/org/diylc/core/Theme.java +++ b/diylc/diylc-core/src/org/diylc/core/Theme.java @@ -31,13 +31,15 @@ public class Theme implements Serializable { private String name; private Color bgColor; private Color gridColor; - private Color outlineColor; + private Color outlineColor; + private Color dotColor; - public Theme(String name, Color bgColor, Color gridColor, Color outlineColor) { + public Theme(String name, Color bgColor, Color gridColor, Color dotColor, Color outlineColor) { super(); this.name = name; this.bgColor = bgColor; - this.gridColor = gridColor; + this.gridColor = gridColor; + this.dotColor = dotColor; this.outlineColor = outlineColor; } @@ -51,6 +53,12 @@ public class Theme implements Serializable { public Color getGridColor() { return gridColor; + } + + public Color getDotColor() { + if (dotColor == null) + dotColor = gridColor; + return dotColor; } public Color getOutlineColor() { @@ -61,9 +69,6 @@ public class Theme implements Serializable { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((bgColor == null) ? 0 : bgColor.hashCode()); - result = prime * result + ((gridColor == null) ? 0 : gridColor.hashCode()); - result = prime * result + ((outlineColor == null) ? 0 : outlineColor.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @@ -76,22 +81,7 @@ public class Theme implements Serializable { return false; if (getClass() != obj.getClass()) return false; - Theme other = (Theme) obj; - if (bgColor == null) { - if (other.bgColor != null) - return false; - } else if (!bgColor.equals(other.bgColor)) - return false; - if (gridColor == null) { - if (other.gridColor != null) - return false; - } else if (!gridColor.equals(other.gridColor)) - return false; - if (outlineColor == null) { - if (other.outlineColor != null) - return false; - } else if (!outlineColor.equals(other.outlineColor)) - return false; + Theme other = (Theme) obj; if (name == null) { if (other.name != null) return false; diff --git a/diylc/diylc-core/src/org/diylc/core/annotations/PositiveMeasureValidator.java b/diylc/diylc-core/src/org/diylc/core/annotations/PositiveMeasureValidator.java index b9eb6743..3ec08d2c 100644 --- a/diylc/diylc-core/src/org/diylc/core/annotations/PositiveMeasureValidator.java +++ b/diylc/diylc-core/src/org/diylc/core/annotations/PositiveMeasureValidator.java @@ -42,8 +42,12 @@ public class PositiveMeasureValidator implements IPropertyValidator { if (measure.getValue() < 0) { throw new ValidationException("must be greater or equal to zero."); } + } else if (value instanceof Integer) { + Integer i = (Integer) value; + if (i < 0) + throw new ValidationException("must be greater or equal to zero."); } else { - throw new ValidationException("wrong data type, measure expected."); + throw new ValidationException("wrong data type."); } } } diff --git a/diylc/diylc-core/src/org/diylc/core/annotations/PositiveNonZeroMeasureValidator.java b/diylc/diylc-core/src/org/diylc/core/annotations/PositiveNonZeroMeasureValidator.java index fc4479c1..68072061 100644 --- a/diylc/diylc-core/src/org/diylc/core/annotations/PositiveNonZeroMeasureValidator.java +++ b/diylc/diylc-core/src/org/diylc/core/annotations/PositiveNonZeroMeasureValidator.java @@ -42,8 +42,12 @@ public class PositiveNonZeroMeasureValidator implements IPropertyValidator { if (measure.getValue() <= 0) { throw new ValidationException("must be greater than zero."); } - } else { - throw new ValidationException("wrong data type, measure expected."); + } else if (value instanceof Integer) { + Integer i = (Integer) value; + if (i < 0) + throw new ValidationException("must be greater or equal to zero."); + } else { + throw new ValidationException("wrong data type."); } } } 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 378f64b0..8ee20276 100644 --- a/diylc/diylc-core/src/org/diylc/core/measures/Size.java +++ b/diylc/diylc-core/src/org/diylc/core/measures/Size.java @@ -60,6 +60,10 @@ public class Size extends AbstractMeasure implements Comparable } } throw new IllegalArgumentException("Could not parse size: " + value); + } + + public Size scale(double factor) { + return new Size(value * factor, unit); } @Override diff --git a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java index a37b5f12..9d7d550a 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/DrawingManager.java @@ -182,6 +182,10 @@ public class DrawingManager { g2dWrapper.setColor(theme.getBgColor()); g2dWrapper.fillRect(0, 0, d.width, d.height); g2d.clip(new Rectangle(new Point(0, 0), d)); + + // calculate size to be rendered + double extraSpace = getExtraSpace(project) * zoom; + Dimension dInner = getCanvasDimensions(project, zoom, false); GridType gridType = GridType.LINES; if (drawOptions.contains(DrawOption.GRID) && gridType != GridType.NONE) { @@ -204,15 +208,21 @@ public class DrawingManager { for (double j = zoomStep; j < d.height; j += zoomStep) { g2dWrapper.draw(new Line2D.Double(0, j, d.width - 1, j)); } + // draw dots if needed + if (project.getDotSpacing() > 1 && zoomStep > 8) { + g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(gridThickness * 3)); + g2d.setColor(theme.getDotColor()); + for (double i = extraSpace + zoomStep * project.getDotSpacing(); i < extraSpace + dInner.width; i += zoomStep * project.getDotSpacing()) + for (double j = extraSpace + zoomStep * project.getDotSpacing(); j < extraSpace + dInner.height; j += zoomStep * project.getDotSpacing()) { + g2d.fillOval((int)Math.round(i - 1), (int)Math.round(j - 1), 3, 3); + } + } } Rectangle2D extraSpaceRect = null; AffineTransform extraSpaceTx = null; // manage extra space - double extraSpace = 0; - if (drawOptions.contains(DrawOption.EXTRA_SPACE)) { - Dimension dInner = getCanvasDimensions(project, zoom, false); - extraSpace = getExtraSpace(project) * zoom; + if (drawOptions.contains(DrawOption.EXTRA_SPACE)) { float borderThickness = (float) (3f * (zoom > 1 ? 1 : zoom)); g2d.setStroke(ObjectCache.getInstance().fetchStroke(borderThickness, new float[] {borderThickness * 4, borderThickness * 4, }, 0, BasicStroke.CAP_BUTT)); g2dWrapper.setColor(theme.getOutlineColor()); @@ -458,7 +468,7 @@ public class DrawingManager { double width = project.getWidth().convertToPixels(); double height = project.getHeight().convertToPixels(); double targetExtraSpace = EXTRA_SPACE * Math.max(width, height); - return CalcUtils.roundToGrid(targetExtraSpace, project.getGridSpacing()); + return CalcUtils.roundToGrid(targetExtraSpace, project.getGridSpacing().scale(project.getDotSpacing())); } public Dimension getCanvasDimensions(Project project, Double zoomLevel, boolean includeExtraSpace) { @@ -488,7 +498,7 @@ public class DrawingManager { public void setTheme(Theme theme) { this.theme = theme; - ConfigurationManager.getInstance().writeValue(IPlugInPort.THEME_KEY, theme); + ConfigurationManager.getInstance().writeValue(IPlugInPort.THEME_KEY, theme.getName()); messageDispatcher.dispatchMessage(EventType.REPAINT); } diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 656071f8..c3a6edfc 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -2774,6 +2774,10 @@ 2020-03-26 00:00:00.000 CET + + NEW_FEATURE + Added "Dot Spacing" property in project settings that shows dots on every N-th grid line intersection + BUG_FIX Issues with circuit analysis introduced in version 4.0.1. Wires and jumpers are made non-conductive by mistake. diff --git a/diylc/diylc-core/src/org/diylc/utils/Constants.java b/diylc/diylc-core/src/org/diylc/utils/Constants.java index 654fff3c..8f812929 100644 --- a/diylc/diylc-core/src/org/diylc/utils/Constants.java +++ b/diylc/diylc-core/src/org/diylc/utils/Constants.java @@ -38,7 +38,7 @@ public class Constants { public static final Stroke DASHED_STROKE = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10f, new float[] {2.0f, 4.0f}, 0.0f); - public static final Theme DEFAULT_THEME = new Theme("Light", Constants.CANVAS_COLOR, new Color(240, 240, 240), + public static final Theme DEFAULT_THEME = new Theme("Light", Constants.CANVAS_COLOR, new Color(240, 240, 240), new Color(200, 200, 200), Color.black); public static final Color TRANSPARENT_COLOR = new Color(0, 0, 0, 0); diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index f0646ab0..da1a5354 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-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index f0646ab0..da1a5354 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/themes/Blueprint.xml b/diylc/diylc-swing/themes/Blueprint.xml index bd5af8ab..5c723c98 100644 --- a/diylc/diylc-swing/themes/Blueprint.xml +++ b/diylc/diylc-swing/themes/Blueprint.xml @@ -12,6 +12,12 @@ 193 255 + + 142 + 219 + 255 + 255 + 255 255 diff --git a/diylc/diylc-swing/themes/Dark.xml b/diylc/diylc-swing/themes/Dark.xml index ef5b0634..b6c57760 100644 --- a/diylc/diylc-swing/themes/Dark.xml +++ b/diylc/diylc-swing/themes/Dark.xml @@ -12,6 +12,12 @@ 40 255 + + 60 + 60 + 60 + 255 + 255 255 diff --git a/diylc/diylc-swing/themes/Light.xml b/diylc/diylc-swing/themes/Light.xml index d2841ca7..ac66508c 100644 --- a/diylc/diylc-swing/themes/Light.xml +++ b/diylc/diylc-swing/themes/Light.xml @@ -12,6 +12,12 @@ 240 240 + + 200 + 200 + 200 + 240 + 0 0