[#2093] Allow 2D views to be rotated by click-dragging
This commit is contained in:
		
							parent
							
								
									e2b69c4650
								
							
						
					
					
						commit
						7252ae66e0
					
				| @ -217,12 +217,27 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change | ||||
| 		scrollPane = new ScaleScrollPane(figure) { | ||||
| 			private static final long serialVersionUID = 1L; | ||||
| 			final CustomClickCountListener clickCountListener = new CustomClickCountListener(); | ||||
| 			private Point mousePressedLoc = null; | ||||
| 			private double originalFigureRotation = 0; | ||||
| 
 | ||||
| 			@Override | ||||
| 			public void mouseClicked(MouseEvent event) { | ||||
| 				clickCountListener.click(); | ||||
| 				handleMouseClick(event, clickCountListener.getClickCount()); | ||||
| 			} | ||||
| 
 | ||||
| 			public void mousePressed(MouseEvent e) { | ||||
| 				if (is3d) { | ||||
| 					return; | ||||
| 				} | ||||
| 				mousePressedLoc = e.getPoint(); | ||||
| 				originalFigureRotation = figure.getRotation(); | ||||
| 			} | ||||
| 
 | ||||
| 			@Override | ||||
| 			public void mouseDragged(MouseEvent e) { | ||||
| 				handleMouseDragged(e, mousePressedLoc, originalFigureRotation); | ||||
| 			} | ||||
| 		}; | ||||
| 		scrollPane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); | ||||
| 		scrollPane.setFitting(true); | ||||
| @ -413,6 +428,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change | ||||
| 
 | ||||
| 		// Create slider and scroll pane | ||||
| 		rotationModel = new DoubleModel(figure, "Rotation", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI); | ||||
| 		figure.addChangeListener(rotationModel); | ||||
| 		UnitSelector us = new UnitSelector(rotationModel, true); | ||||
| 		us.setHorizontalAlignment(JLabel.CENTER); | ||||
| 		add(us, "alignx 50%, growx"); | ||||
| @ -422,12 +438,13 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change | ||||
| 		add(figureHolder, "grow, spany 2, wmin 300lp, hmin 100lp, wrap"); | ||||
| 
 | ||||
| 		// Add rotation slider | ||||
| 		// Dummy label to find the minimum size to fit "360deg" | ||||
| 		JLabel l = new JLabel("360" + Chars.DEGREE); | ||||
| 		// Dummy label to find the minimum size to fit "360.0deg" | ||||
| 		JLabel l = new JLabel("360.0" + Chars.DEGREE); | ||||
| 		Dimension d = l.getPreferredSize(); | ||||
| 
 | ||||
| 		add(rotationSlider = new BasicSlider(rotationModel.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true), | ||||
| 				"ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy"); | ||||
| 		us.setMinimumSize(new Dimension(d.width, us.getPreferredSize().height)); | ||||
| 		rotationSlider = new BasicSlider(rotationModel.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true); | ||||
| 		add(rotationSlider, "ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy"); | ||||
| 		rotationSlider.addChangeListener(new ChangeListener() { | ||||
| 			@Override | ||||
| 			public void stateChanged(ChangeEvent e) { | ||||
| @ -737,6 +754,20 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private void handleMouseDragged(MouseEvent event, Point originalDragLocation, double originalRotation) { | ||||
| 		if (originalDragLocation == null || is3d) { | ||||
| 			return; | ||||
| 		} | ||||
| 
 | ||||
| 		int dy = event.getY() - originalDragLocation.y; | ||||
| 
 | ||||
| 		double rotationOffset = ((double) dy / scrollPane.getHeight()) * Math.PI; | ||||
| 		double newRotation = originalRotation - rotationOffset; | ||||
| 		// Ensure the rotation is within the range [0, 2*PI] | ||||
| 		newRotation = (newRotation + 2 * Math.PI) % (2 * Math.PI); | ||||
| 		figure.setRotation(newRotation); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Updates the extra data included in the figure.  Currently this includes | ||||
| 	 * the CP and CG carets. Also start the background simulator. | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user