fixed a bug in auto scale mode

This commit is contained in:
hneemann 2019-06-21 10:34:58 +02:00
parent 4d95d67745
commit e01ca85158
2 changed files with 38 additions and 19 deletions

View File

@ -968,9 +968,9 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
transform.translate(dif.x, dif.y);
transform.scale(f, f);
transform.translate(-dif.x, -dif.y);
isManualScale = true;
if (circuitScrollPanel != null)
circuitScrollPanel.transformChanged(transform);
isManualScale = true;
graphicHasChanged();
}
@ -982,9 +982,9 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
*/
public void translateCircuit(int dx, int dy) {
transform.translate(dx, dy);
isManualScale = true;
if (circuitScrollPanel != null)
circuitScrollPanel.transformChanged(transform);
isManualScale = true;
graphicHasChanged();
}
@ -999,6 +999,8 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
matrix[4] = x;
transform = new AffineTransform(matrix);
isManualScale = true;
if (circuitScrollPanel != null)
circuitScrollPanel.transformChanged(transform);
graphicHasChanged();
}
@ -1013,6 +1015,8 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
matrix[5] = y;
transform = new AffineTransform(matrix);
isManualScale = true;
if (circuitScrollPanel != null)
circuitScrollPanel.transformChanged(transform);
graphicHasChanged();
}
@ -1234,6 +1238,13 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
undoManager.addListener(listener);
}
/**
* @return true is component is in manual scale mode
*/
boolean isManualScale() {
return isManualScale;
}
private final class PlusMinusAction extends ToolTipAction {
private final int delta;
@ -1307,10 +1318,10 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
Vector delta = newPos.sub(pos);
double s = transform.getScaleX();
transform.translate(delta.x / s, delta.y / s);
isManualScale = true;
if (circuitScrollPanel != null)
circuitScrollPanel.transformChanged(transform);
pos = newPos;
isManualScale = true;
graphicHasChanged();
}
}
@ -1602,9 +1613,9 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
public void delete() {
if (!isLocked()) {
getCircuit().delete(visualElement);
isManualScale = true;
modify(new ModifyDeleteElement(originalVisualElement));
mouseNormal.activate();
isManualScale = true;
}
}
@ -1669,9 +1680,9 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
@Override
public void delete() {
getCircuit().delete(wire);
isManualScale = true;
modify(new ModifyDeleteWire(originalWire));
mouseNormal.activate();
isManualScale = true;
}
@Override
@ -1999,9 +2010,9 @@ public class CircuitComponent extends JComponent implements ChangedListener, Lib
@Override
public void delete() {
if (!isLocked()) {
isManualScale = true;
modify(new ModifyDeleteRect(Vector.min(corner1, corner2), Vector.max(corner1, corner2)));
mouseNormal.activate();
isManualScale = true;
}
}

View File

@ -24,7 +24,7 @@ public class CircuitScrollPanel extends JPanel {
private static final int BORDER = SIZE * 10;
private final CircuitComponent circuitComponent;
private final JScrollBar horizontal;
private final JScrollBar vertcal;
private final JScrollBar vertical;
private GraphicMinMax graphicMinMax;
private AffineTransform transform;
@ -36,17 +36,18 @@ public class CircuitScrollPanel extends JPanel {
public CircuitScrollPanel(CircuitComponent circuitComponent) {
super(new BorderLayout());
horizontal = new JScrollBar(JScrollBar.HORIZONTAL);
vertcal = new JScrollBar(JScrollBar.VERTICAL);
vertical = new JScrollBar(JScrollBar.VERTICAL);
this.circuitComponent = circuitComponent;
add(circuitComponent, BorderLayout.CENTER);
add(horizontal, BorderLayout.SOUTH);
add(vertcal, BorderLayout.EAST);
add(vertical, BorderLayout.EAST);
horizontal.addAdjustmentListener(adjustmentEvent -> {
if (adjustmentEvent.getValueIsAdjusting())
circuitComponent.translateCircuitToX(-adjustmentEvent.getValue() * transform.getScaleX());
});
vertcal.addAdjustmentListener(adjustmentEvent -> {
vertical.addAdjustmentListener(adjustmentEvent -> {
if (adjustmentEvent.getValueIsAdjusting())
circuitComponent.translateCircuitToY(-adjustmentEvent.getValue() * transform.getScaleY());
});
@ -89,27 +90,34 @@ public class CircuitScrollPanel extends JPanel {
private void updateBars() {
GraphicMinMax gr = getCircuitSize();
if (gr.getMin() == null || gr.getMax() == null) {
if (gr.getMin() == null || gr.getMax() == null || !circuitComponent.isManualScale()) {
horizontal.setVisible(false);
vertcal.setVisible(false);
vertical.setVisible(false);
} else {
Point2D min = new Point2D.Float();
Point2D max = new Point2D.Float();
Point2D max0 = new Point2D.Float();
try {
transform.inverseTransform(new Point2D.Float(0, 0), min);
transform.inverseTransform(new Point2D.Float(getWidth(), getHeight()), max);
int viewDx = (int) (max.getX() - min.getX());
int viewDy = (int) (max.getY() - min.getY());
transform.inverseTransform(new Point2D.Float(getWidth(), getHeight()), max0);
int viewDx = (int) (max0.getX() - min.getX());
int viewDy = (int) (max0.getY() - min.getY());
int valueX = (int) min.getX();
int valueY = (int) min.getY();
horizontal.setValues(valueX, viewDx, gr.getMin().x - BORDER, gr.getMax().x + BORDER);
horizontal.setVisible(viewDx < gr.getMax().x - gr.getMin().x + 2 * BORDER);
vertcal.setValues(valueY, viewDy, gr.getMin().y - BORDER, gr.getMax().y + BORDER);
vertcal.setVisible(viewDy < gr.getMax().y - gr.getMin().y + 2 * BORDER);
vertical.setValues(valueY, viewDy, gr.getMin().y - BORDER, gr.getMax().y + BORDER);
checkVisibility(horizontal, viewDx, gr.getMax().x - gr.getMin().x + 2 * BORDER);
checkVisibility(vertical, viewDy, gr.getMax().y - gr.getMin().y + 2 * BORDER);
} catch (NoninvertibleTransformException e) {
// can not happen! Scaling is never zero!
e.printStackTrace();
}
}
}
private void checkVisibility(JScrollBar bar, int view, int size) {
bar.setVisible(view < size);
}
}