diff --git a/diylc/diylc-core/src/main/resources/update.xml b/diylc/diylc-core/src/main/resources/update.xml index b660b532..b2c8d556 100644 --- a/diylc/diylc-core/src/main/resources/update.xml +++ b/diylc/diylc-core/src/main/resources/update.xml @@ -277,6 +277,10 @@ IMPROVEMENT Slightly improved rendering quality of component icons + + BUG_FIX + 'Mini Toggle Switch' ends up misaligned after rotating together with other components + BUG_FIX Moving selected components with a mouse doesn't register file modification action and doesn't enable Undo action diff --git a/diylc/diylc-library/src/main/java/org/diylc/components/transform/MiniToggleSwitchTransformer.java b/diylc/diylc-library/src/main/java/org/diylc/components/transform/MiniToggleSwitchTransformer.java index 21da24ee..f347f9f2 100644 --- a/diylc/diylc-library/src/main/java/org/diylc/components/transform/MiniToggleSwitchTransformer.java +++ b/diylc/diylc-library/src/main/java/org/diylc/components/transform/MiniToggleSwitchTransformer.java @@ -48,14 +48,26 @@ public class MiniToggleSwitchTransformer implements IComponentTransformer { @Override public void rotate(IDIYComponent component, Point2D center, int direction) { - AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.getX(), center.getY()); - for (int index = 0; index < component.getControlPointCount(); index++) { - Point2D p = new Point2D.Double(); - rotate.transform(component.getControlPoint(index), p); - component.setControlPoint(p, index); - } - MiniToggleSwitch sw = (MiniToggleSwitch) component; + + // Calculate center of all control points + double sumX = 0, sumY = 0; + for (int i = 0; i < sw.getControlPointCount(); i++) { + Point2D p = sw.getControlPoint(i); + sumX += p.getX(); + sumY += p.getY(); + } + Point2D controlCenter = new Point2D.Double( + sumX / sw.getControlPointCount(), + sumY / sw.getControlPointCount() + ); + + // Calculate where control center should end up after rotation + Point2D targetCenter = new Point2D.Double(); + AffineTransform rotate = AffineTransform.getRotateInstance(Math.PI / 2 * direction, center.getX(), center.getY()); + rotate.transform(controlCenter, targetCenter); + + // Update orientation first - this will rotate points around first point OrientationHV o = sw.getOrientation(); int oValue = o.ordinal(); oValue += direction; @@ -65,6 +77,29 @@ public class MiniToggleSwitchTransformer implements IComponentTransformer { oValue = 0; o = OrientationHV.values()[oValue]; sw.setOrientation(o); + + // Recalculate current control center after orientation change + sumX = 0; + sumY = 0; + for (int i = 0; i < sw.getControlPointCount(); i++) { + Point2D p = sw.getControlPoint(i); + sumX += p.getX(); + sumY += p.getY(); + } + Point2D newControlCenter = new Point2D.Double( + sumX / sw.getControlPointCount(), + sumY / sw.getControlPointCount() + ); + + // Calculate and apply translation to move control center to target position + double dx = targetCenter.getX() - newControlCenter.getX(); + double dy = targetCenter.getY() - newControlCenter.getY(); + + // Apply translation to all points + for (int i = 0; i < sw.getControlPointCount(); i++) { + Point2D p = sw.getControlPoint(i); + sw.setControlPoint(new Point2D.Double(p.getX() + dx, p.getY() + dy), i); + } } @Override