]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Option to use custom snap advisor for scaling 28/4428/1
authorJussi Koskela <jussi.koskela@semantum.fi>
Wed, 9 Sep 2020 09:17:18 +0000 (12:17 +0300)
committerJussi Koskela <jussi.koskela@semantum.fi>
Wed, 9 Sep 2020 09:17:18 +0000 (12:17 +0300)
gitlab #600

Change-Id: I011992e13516635e3afbdad1a30191e100f1b4a8

bundles/org.simantics.diagram/src/org/simantics/diagram/handler/MouseScaleMode.java
bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/DiagramHints.java
bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/snap/RelativeScaleSnapAdvisor.java [new file with mode: 0644]

index 32df540eec5a10ea41da8062652b30d16002d4dd..f7c00c4869b422a5f481f34aeaca8ccd5eb921a8 100644 (file)
@@ -208,6 +208,7 @@ public class MouseScaleMode extends AbstractMode {
             ElementUtils.controlToCanvasCoordinate(getContext(), mme.controlPosition, lastMousePos);
 
             ISnapAdvisor snapAdvisor = getContext().getDefaultHintContext().getHint(DiagramHints.SNAP_ADVISOR);
+            ISnapAdvisor scaleSnapAdvisor = getContext().getDefaultHintContext().getHint(DiagramHints.SCALE_SNAP_ADVISOR);
 
             double d = 0;
             if (DEBUG) {
@@ -256,9 +257,13 @@ public class MouseScaleMode extends AbstractMode {
                 }
                 //System.out.println("SET new scale:" + newScale);
 
-                // Try to snap to grid.
-                if (snapAdvisor != null) {
-                       this.snapAdvisor.snap(newScale);
+                // Snap scale
+                if (scaleSnapAdvisor != null) {
+                    scaleSnapAdvisor.snap(newScale);
+                } else {
+                    if (snapAdvisor != null) {
+                        this.snapAdvisor.snap(newScale);
+                    }
                 }
 
                 double sx = newScale.getX() / originalScale.getX();
index 4c5f0f12d801b4b3c816e7a5ac08a1b03bcde190..17f987469ef8f8d2f3e26f4bdfb6d140e974e0a7 100644 (file)
@@ -92,6 +92,8 @@ public class DiagramHints {
 
     public static final Key SNAP_ADVISOR              = new KeyOf(ISnapAdvisor.class, "SNAP_ADVISOR");
 
+    public static final Key SCALE_SNAP_ADVISOR      = new KeyOf(ISnapAdvisor.class, "SCALE_SNAP_ADVISOR");
+
     public static final Key KEY_LAYERS                = new KeyOf(ILayers.class, "LAYERS");
 
     public static final Key KEY_LAYERS_EDITOR         = new KeyOf(ILayersEditor.class, "LAYERS_EDITOR");
diff --git a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/snap/RelativeScaleSnapAdvisor.java b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/snap/RelativeScaleSnapAdvisor.java
new file mode 100644 (file)
index 0000000..54eafcb
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Semantum Oy - initial API and implementation
+ *******************************************************************************/
+package org.simantics.scenegraph.g2d.snap;
+
+import java.awt.geom.Point2D;
+
+public class RelativeScaleSnapAdvisor implements ISnapAdvisor {
+
+    private double step;
+
+    public RelativeScaleSnapAdvisor(double step) {
+        this.step = step;
+    }
+
+    @Override
+    public void snap(Point2D point) {
+        point.setLocation(
+                Math.pow(1 + step, Math.round(Math.log(point.getX()) / Math.log(1 + step))),
+                Math.pow(1 + step, Math.round(Math.log(point.getY()) / Math.log(1 + step))));
+    }
+
+    @Override
+    public void snap(Point2D point, Point2D[] features) {
+        snap(point);
+    }
+
+}