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) {
}
//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();
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");
--- /dev/null
+/*******************************************************************************
+ * 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);
+ }
+
+}