Selaa lähdekoodia

Implements a simple Alignment Feature

How to Use: RightClick anywhere on Canvas -> click AlignAll

What it will do: Move every Object on the clicked Canvas to the nearest
Position on a Grid with half of an Object space between two Objects.
(unlucky placement might lead to objects being further apart than before
or more objects moving to the same Position)

TODO: Move logic to a Controller Class
TODO: Make Grid/Space between Objects variable
TODO: Acces via GUI, maybe add option to show grid
Andreas T. Meyer-Berg 7 vuotta sitten
vanhempi
commit
724e552874
3 muutettua tiedostoa jossa 76 lisäystä ja 1 poistoa
  1. 33 0
      src/ui/view/AbstractCanvas.java
  2. 23 1
      src/ui/view/MyCanvas.java
  3. 20 0
      src/ui/view/UpperNodeCanvas.java

+ 33 - 0
src/ui/view/AbstractCanvas.java

@@ -10,6 +10,7 @@ import javax.swing.*;
 import java.awt.*;
 import java.awt.event.MouseEvent;
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.TimerTask;
 
@@ -37,6 +38,7 @@ public abstract class AbstractCanvas extends JPanel {
 	final JMenuItem itemTrack = new JMenuItem(Languages.getLanguage()[101]);
 	final JMenuItem itemUntrack = new JMenuItem(Languages.getLanguage()[102]);
 	final JMenuItem itemCreateTemplate = new JMenuItem(Languages.getLanguage()[Languages.right_click_create_template]);
+	final JMenuItem itemAlignAll = new JMenuItem("AlignAll");
 	final int ANIMTIME = 500; // animation Time
 	private final int animFPS = 60;
 	final int animDelay = 1000 / animFPS; // animation Delay
@@ -626,4 +628,35 @@ public abstract class AbstractCanvas extends JPanel {
 					(int) (controller.getScale() + ((scalediv20 + 5) * 2)));
 		}
 	}
+	
+	/**
+	 * Align alle Objects on the Canvas to a Grid with objects every 10 pixels
+	 */
+	public abstract void tryToAlignObjects();
+
+	/**
+	 * Aligns the Object the a grid
+	 * @param cps Object that should be aligned
+	 * @param distance distance between the AlignmentGrid Lines. (objects every 'distance' pixels
+	 */
+	protected void align(AbstractCpsObject cps, int distance) {
+		/** Position of the AbstractCpsObject which should be aligned */
+		Position p = cps.getPosition();
+		
+		//calculate how many pixels the cps should be decreased to align
+		/** x offset relative to a grid with lines every distance pixels */
+		int x_off = cps.getPosition().x % distance;
+		
+		/** y offset relative to a grid with lines every distance pixels */
+		int y_off = cps.getPosition().y % distance;
+		
+		//align to the other Line, if it is nearer
+		if(x_off > distance/2)
+			x_off -= distance;
+		if(y_off > distance/2)
+			y_off -= distance;
+		
+		/** set new Position */
+		cps.setPosition(p.x-x_off, p.y-y_off);
+	}
 }

+ 23 - 1
src/ui/view/MyCanvas.java

@@ -61,6 +61,7 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		popmenu.add(itemTrack);
 		popmenu.add(itemUntrack);
 		popmenu.add(itemCreateTemplate);
+		popmenu.add(itemAlignAll);
 
 		updCon = new UpdateController(mod, control);
 
@@ -72,9 +73,12 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		itemUngroup.setEnabled(false);
 		itemTrack.setEnabled(false);
 		itemUntrack.setEnabled(false);
+		itemAlignAll.setEnabled(true);
 
 		itemCut.setText(Languages.getLanguage()[95]);
 
+		itemAlignAll.addActionListener(a -> tryToAlignObjects());
+		
 		itemGroup.addActionListener(actionEvent -> {
 			// calculate uppernode pos (taken from the controller)
 				unPos = new Position(0, 0);
@@ -964,5 +968,23 @@ public class MyCanvas extends AbstractCanvas implements MouseListener,
 		
 		return checkForReplacement(model.getObjectsOnCanvas(), null, x, y);
 	}
-
+	
+	@Override
+	public void tryToAlignObjects(){
+		/**
+		 * Align all Objects
+		 */
+		for(AbstractCpsObject cps: model.getObjectsOnCanvas())
+			align(cps,3*model.getScaleDiv2());
+		
+		/**
+		 * AutoSave new Positons
+		 */
+		try{	
+			controller.autoSave();
+		} catch (IOException ex) {
+			System.err.println("AutoSave error by aligning");
+			ex.printStackTrace();
+		}
+	}
 }

+ 20 - 0
src/ui/view/UpperNodeCanvas.java

@@ -1248,5 +1248,25 @@ public class UpperNodeCanvas extends AbstractCanvas implements MouseListener, Mo
 	public boolean checkForReplacement(int x, int y) {
 		return checkForReplacement(upperNode.getNodes(), null, x, y);
 	}
+    
+
+	@Override
+	public void tryToAlignObjects(){
+		/**
+		 * Align all Objects
+		 */
+		for(AbstractCpsObject cps: upperNode.getNodes())
+			align(cps,3*model.getScaleDiv2());
+		
+		/**
+		 * AutoSave new Positons
+		 */
+		try{	
+			controller.autoSave();
+		} catch (IOException ex) {
+			System.err.println("AutoSave error by aligning");
+			ex.printStackTrace();
+		}
+	}
 
 }