[#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) {
|
scrollPane = new ScaleScrollPane(figure) {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
final CustomClickCountListener clickCountListener = new CustomClickCountListener();
|
final CustomClickCountListener clickCountListener = new CustomClickCountListener();
|
||||||
|
private Point mousePressedLoc = null;
|
||||||
|
private double originalFigureRotation = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseClicked(MouseEvent event) {
|
public void mouseClicked(MouseEvent event) {
|
||||||
clickCountListener.click();
|
clickCountListener.click();
|
||||||
handleMouseClick(event, clickCountListener.getClickCount());
|
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.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
|
||||||
scrollPane.setFitting(true);
|
scrollPane.setFitting(true);
|
||||||
@ -413,6 +428,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
|
|||||||
|
|
||||||
// Create slider and scroll pane
|
// Create slider and scroll pane
|
||||||
rotationModel = new DoubleModel(figure, "Rotation", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
|
rotationModel = new DoubleModel(figure, "Rotation", UnitGroup.UNITS_ANGLE, 0, 2 * Math.PI);
|
||||||
|
figure.addChangeListener(rotationModel);
|
||||||
UnitSelector us = new UnitSelector(rotationModel, true);
|
UnitSelector us = new UnitSelector(rotationModel, true);
|
||||||
us.setHorizontalAlignment(JLabel.CENTER);
|
us.setHorizontalAlignment(JLabel.CENTER);
|
||||||
add(us, "alignx 50%, growx");
|
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(figureHolder, "grow, spany 2, wmin 300lp, hmin 100lp, wrap");
|
||||||
|
|
||||||
// Add rotation slider
|
// Add rotation slider
|
||||||
// Dummy label to find the minimum size to fit "360deg"
|
// Dummy label to find the minimum size to fit "360.0deg"
|
||||||
JLabel l = new JLabel("360" + Chars.DEGREE);
|
JLabel l = new JLabel("360.0" + Chars.DEGREE);
|
||||||
Dimension d = l.getPreferredSize();
|
Dimension d = l.getPreferredSize();
|
||||||
|
|
||||||
add(rotationSlider = new BasicSlider(rotationModel.getSliderModel(0, 2 * Math.PI), JSlider.VERTICAL, true),
|
us.setMinimumSize(new Dimension(d.width, us.getPreferredSize().height));
|
||||||
"ax 50%, wrap, width " + (d.width + 6) + "px:null:null, growy");
|
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() {
|
rotationSlider.addChangeListener(new ChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public void stateChanged(ChangeEvent e) {
|
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
|
* Updates the extra data included in the figure. Currently this includes
|
||||||
* the CP and CG carets. Also start the background simulator.
|
* the CP and CG carets. Also start the background simulator.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user