fixes an drag&draw issue in the k-map

This commit is contained in:
hneemann 2020-10-23 14:35:55 +02:00
parent 036410ce57
commit 9e478d9f5a

View File

@ -45,7 +45,7 @@ public class KarnaughMapComponent extends JComponent {
private int cellSize; private int cellSize;
private int xDrag; private int xDrag;
private int yDrag; private int yDrag;
private int startVar = -1; private VarRect startVarRect = null;
/** /**
* Creates a new instance * Creates a new instance
@ -109,8 +109,8 @@ public class KarnaughMapComponent extends JComponent {
gr.fillRect(0, 0, width, height); gr.fillRect(0, 0, width, height);
gr.setColor(Color.BLACK); gr.setColor(Color.BLACK);
if (startVar >= 0) if (startVarRect != null)
gr.drawString(vars.get(startVar).getIdentifier(), xDrag, yDrag); startVarRect.fragment.draw(gr, xDrag, yDrag);
if (kv != null) { if (kv != null) {
AffineTransform trans = gr.getTransform(); // store the old transform AffineTransform trans = gr.getTransform(); // store the old transform
@ -267,7 +267,7 @@ public class KarnaughMapComponent extends JComponent {
int xFr = row * cellSize + xPos - xOffs; int xFr = row * cellSize + xPos - xOffs;
int yFr = col * cellSize + yPos - yOffs; int yFr = col * cellSize + yPos - yOffs;
fr.draw(gr, xFr, yFr); fr.draw(gr, xFr, yFr);
varPosList.add(new VarRect(var, xFr, yFr + fontMetrics.getDescent() - fr.getHeight(), fr.getWidth(), fr.getHeight())); varPosList.add(new VarRect(var, xFr, yFr + fontMetrics.getDescent() - fr.getHeight(), fr.getWidth(), fr.getHeight(), fr));
} }
private GraphicsFormatter.Fragment getFragment(int var, boolean invert) { private GraphicsFormatter.Fragment getFragment(int var, boolean invert) {
@ -312,9 +312,9 @@ public class KarnaughMapComponent extends JComponent {
int row = kv.getCell(y, x).getBoolTableRow(); int row = kv.getCell(y, x).getBoolTableRow();
tableCellModifier.modify(boolTable, row); tableCellModifier.modify(boolTable, row);
} else { } else {
int varAt = findVarAt(mouseEvent); VarRect varAt = findVarRect(mouseEvent);
if (varAt >= 0) { if (varAt != null) {
mapLayout.toggleInvertByMouse(varAt); mapLayout.toggleInvertByMouse(varAt.var);
update(); update();
} }
} }
@ -323,12 +323,12 @@ public class KarnaughMapComponent extends JComponent {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
startVar = findVarAt(e); startVarRect = findVarRect(e);
} }
@Override @Override
public void mouseDragged(MouseEvent e) { public void mouseDragged(MouseEvent e) {
if (startVar >= 0) { if (startVarRect != null) {
xDrag = e.getX(); xDrag = e.getX();
yDrag = e.getY(); yDrag = e.getY();
repaint(); repaint();
@ -337,37 +337,44 @@ public class KarnaughMapComponent extends JComponent {
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
int endVar = findVarAt(e); VarRect endVarRect = findVarRect(e);
if (endVar != startVar if (startVarRect != null && endVarRect != null
&& endVar >= 0 && startVar >= 0 && startVarRect.isValid(vars.size())
&& endVar < vars.size() && startVar <= vars.size()) { && endVarRect.isValid(vars.size())
mapLayout.swapByMouse(startVar, endVar); && startVarRect.var != endVarRect.var) {
startVar = -1; mapLayout.swapByMouse(startVarRect.var, endVarRect.var);
startVarRect = null;
update(); update();
} else { } else {
startVar = -1; startVarRect = null;
repaint(); repaint();
} }
} }
}
private int findVarAt(MouseEvent e) { private VarRect findVarRect(MouseEvent e) {
int x = e.getX() - xOffs; int x = e.getX() - xOffs;
int y = e.getY() - yOffs; int y = e.getY() - yOffs;
for (VarRect r : varPosList) { for (VarRect r : varPosList) {
if (r.rect.contains(x, y)) if (r.rect.contains(x, y))
return r.var; return r;
}
return -1;
} }
return null;
} }
private static final class VarRect { private static final class VarRect {
private final Rectangle rect; private final Rectangle rect;
private final int var; private final int var;
private final GraphicsFormatter.Fragment fragment;
private VarRect(int var, int x, int y, int width, int height) { private VarRect(int var, int x, int y, int width, int height, GraphicsFormatter.Fragment fragment) {
this.var = var; this.var = var;
rect = new Rectangle(x, y, width, height); rect = new Rectangle(x, y, width, height);
this.fragment = fragment;
}
private boolean isValid(int size) {
return var >= 0 && var < size;
} }
} }