From 1ee2b4fc651cf48be5977a4d14a62b28ab6236a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 29 Dec 2022 23:53:38 +0100 Subject: [PATCH] Deleting points --- .../decompiler/flash/gui/ImagePanel.java | 29 ++- .../flash/gui/PointUpdateListener.java | 4 +- .../decompiler/flash/gui/PreviewPanel.java | 169 ++++++++++++++---- 3 files changed, 160 insertions(+), 42 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index c4c4e2382..0769177c8 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -101,6 +101,7 @@ import java.io.IOException; import java.text.DecimalFormat; import java.text.ParseException; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Timer; @@ -320,16 +321,20 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } } - private void firePointAdded(int position, DisplayPoint point) { + private boolean firePointAdded(List points, int position, DisplayPoint point) { + boolean result = true; for (PointUpdateListener listener : pointUpdateListeners) { - listener.pointAdded(position, point); + result = result && listener.pointAdded(points, position, point); } + return result; } - private void firePointRemoved(int position) { + private boolean firePointRemoved(List points, int position) { + boolean result = true; for (PointUpdateListener listener : pointUpdateListeners) { - listener.pointRemoved(position); + result = result && listener.pointRemoved(points, position); } + return result; } private void applyPointsXY() { @@ -947,6 +952,22 @@ public final class ImagePanel extends JPanel implements MediaDisplay { @Override public void keyPressed(KeyEvent e) { + if (hilightedPoints != null) { + if (e.getKeyCode() == KeyEvent.VK_DELETE) { + List selectedPointsDesc = new ArrayList<>(selectedPoints); + selectedPointsDesc.sort(new Comparator() { + @Override + public int compare(Integer o1, Integer o2) { + return o2 - o1; + } + }); + for (int i:selectedPoints) { + firePointRemoved(hilightedPoints, i); + } + selectedPoints.clear(); + repaint(); + } + } if (freeTransformDepth > -1 || hilightedPoints != null) { if (e.getKeyCode() == KeyEvent.VK_LEFT) { move(-1, 0); diff --git a/src/com/jpexs/decompiler/flash/gui/PointUpdateListener.java b/src/com/jpexs/decompiler/flash/gui/PointUpdateListener.java index a46a094a6..c6b01f75d 100644 --- a/src/com/jpexs/decompiler/flash/gui/PointUpdateListener.java +++ b/src/com/jpexs/decompiler/flash/gui/PointUpdateListener.java @@ -25,7 +25,7 @@ import java.util.List; public interface PointUpdateListener { public void pointsUpdated(List points); - public void pointAdded(int position, DisplayPoint point); + public boolean pointAdded(List points, int position, DisplayPoint point); - public void pointRemoved(int position); + public boolean pointRemoved(List points, int position); } diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 1c686eb3a..948a47d9a 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -222,7 +222,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private JButton displayEditSaveButton; private JButton displayEditCancelButton; - + private JButton displayEditEditPointsButton; private JPanel parametersPanel; @@ -249,7 +249,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private final int EDIT_RAW = 2; private final int EDIT_POINTS = 3; private int displayEditMode = EDIT_RAW; - + private List oldShapeRecords; //used only for flash player @@ -337,7 +337,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel setRightComponent(parametersPanel); } - private JPanel createImageButtonsPanel() { + private JPanel createImageButtonsPanel() { replaceSoundButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("replacesound16")); replaceSoundButton.setMargin(new Insets(3, 3, 3, 10)); replaceSoundButton.addActionListener(new ActionListener() { @@ -715,7 +715,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel JPanel previewPanel = new JPanel(new BorderLayout()); - JPanel previewCnt = new JPanel(new BorderLayout()); + JPanel previewCnt = new JPanel(new BorderLayout()); displayEditImagePanel = new ImagePanel(); displayEditImagePanel.addPlaceObjectSelectedListener(new ActionListener() { @@ -738,7 +738,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } }); } - + displayEditImagePanel.addPointUpdateListener(new PointUpdateListener() { @Override public void pointsUpdated(List points) { @@ -746,7 +746,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel int pointsPos = 0; int x = 0; int y = 0; - for(int i = 0; i < shape.shapes.shapeRecords.size(); i++) { + for (int i = 0; i < shape.shapes.shapeRecords.size(); i++) { SHAPERECORD rec = shape.shapes.shapeRecords.get(i); if (rec instanceof StyleChangeRecord) { StyleChangeRecord scr = (StyleChangeRecord) rec; @@ -770,8 +770,8 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel cer.controlDeltaY = points.get(pointsPos).y - y; cer.anchorDeltaX = points.get(pointsPos + 1).x - points.get(pointsPos).x; cer.anchorDeltaY = points.get(pointsPos + 1).y - points.get(pointsPos).y; - pointsPos += 2; - } + pointsPos += 2; + } x = rec.changeX(x); y = rec.changeY(y); } @@ -780,16 +780,115 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } @Override - public void pointAdded(int position, DisplayPoint point) { + public boolean pointAdded(List points, int position, DisplayPoint point) { + return true; } @Override - public void pointRemoved(int position) { - + public boolean pointRemoved(List points, int position) { + ShapeTag shape = (ShapeTag) displayEditTag; + int pointsPos = 0; + int x = 0; + int y = 0; + + for (int i = 0; i < shape.shapes.shapeRecords.size(); i++) { + SHAPERECORD rec = shape.shapes.shapeRecords.get(i); + SHAPERECORD prevRec = i == 0 ? null : shape.shapes.shapeRecords.get(i - 1); + SHAPERECORD nextRec = i + 1 < shape.shapes.shapeRecords.size() ? shape.shapes.shapeRecords.get(i + 1) : null; + + if (rec instanceof StyleChangeRecord) { + StyleChangeRecord scr = (StyleChangeRecord) rec; + if (scr.stateMoveTo) { + pointsPos++; + } + } + if (rec instanceof StraightEdgeRecord) { + StraightEdgeRecord ser = (StraightEdgeRecord) rec; + if (pointsPos == position) { + if (nextRec instanceof StraightEdgeRecord) { + StraightEdgeRecord nextSer = (StraightEdgeRecord) nextRec; + nextSer.generalLineFlag = true; + nextSer.deltaX += ser.deltaX; + nextSer.deltaY += ser.deltaY; + shape.shapes.shapeRecords.remove(i); + + points.remove(position); + shape.getSwf().clearShapeCache(); + displayEditImagePanel.repaint(); + return true; + } + if (nextRec instanceof CurvedEdgeRecord) { + CurvedEdgeRecord cer = (CurvedEdgeRecord) nextRec; + ser.generalLineFlag = true; + ser.deltaX += cer.controlDeltaX + cer.anchorDeltaX; + ser.deltaY += cer.controlDeltaY + cer.anchorDeltaY; + points.remove(position + 1); + points.remove(position); + shape.shapes.shapeRecords.remove(i + 1); + shape.getSwf().clearShapeCache(); + displayEditImagePanel.repaint(); + return true; + } + } + pointsPos += 1; + ser.simplify(); + } + if (rec instanceof CurvedEdgeRecord) { + CurvedEdgeRecord cer = (CurvedEdgeRecord) rec; + //delete control point -> make it straight edge + if (pointsPos == position) { + StraightEdgeRecord ser = new StraightEdgeRecord(); + ser.generalLineFlag = true; + ser.deltaX = cer.controlDeltaX + cer.anchorDeltaX; + ser.deltaY = cer.controlDeltaY + cer.anchorDeltaY; + ser.simplify(); + shape.shapes.shapeRecords.set(i, ser); + points.remove(position); + shape.getSwf().clearShapeCache(); + displayEditImagePanel.repaint(); + return true; + } + if (position == pointsPos + 1) { + if (nextRec instanceof CurvedEdgeRecord) { + CurvedEdgeRecord nextCer = (CurvedEdgeRecord) nextRec; + StraightEdgeRecord ser = new StraightEdgeRecord(); + ser.generalLineFlag = true; + ser.deltaX = cer.controlDeltaX + cer.anchorDeltaX + nextCer.controlDeltaX + nextCer.anchorDeltaX; + ser.deltaY = cer.controlDeltaY + cer.anchorDeltaY + nextCer.controlDeltaY + nextCer.anchorDeltaY; + ser.simplify(); + shape.shapes.shapeRecords.set(i, ser); + shape.shapes.shapeRecords.remove(i + 1); + points.remove(pointsPos + 2); + points.remove(pointsPos + 1); + points.remove(pointsPos); + shape.getSwf().clearShapeCache(); + displayEditImagePanel.repaint(); + return true; + } + if (nextRec instanceof StraightEdgeRecord) { + StraightEdgeRecord nextSer = (StraightEdgeRecord) nextRec; + nextSer.generalLineFlag = true; + nextSer.deltaX += cer.controlDeltaX + cer.anchorDeltaX; + nextSer.deltaY += cer.controlDeltaY + cer.anchorDeltaY; + nextSer.simplify(); + shape.shapes.shapeRecords.remove(i); + points.remove(pointsPos + 1); + points.remove(pointsPos); + shape.getSwf().clearShapeCache(); + displayEditImagePanel.repaint(); + return true; + } + } + pointsPos += 2; + } + x = rec.changeX(x); + y = rec.changeY(y); + } + return false; } - + }); - + displayEditTransformPanel = new TransformPanel(displayEditImagePanel); //imagePanel.setLoop(Configuration.loopMedia.get()); previewCnt.add(displayEditTransformSplitPane = new JPersistentSplitPane( @@ -887,8 +986,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } private JPanel createDisplayEditTagButtonsPanel() { - - + displayEditTransformButton = new JButton(mainPanel.translate("button.transform"), View.getIcon("freetransform16")); displayEditTransformButton.setMargin(new Insets(3, 3, 3, 10)); displayEditTransformButton.addActionListener(this::transformDisplayEditTagButtonActionPerformed); @@ -901,11 +999,11 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel displayEditCancelButton = new JButton(mainPanel.translate("button.cancel"), View.getIcon("cancel16")); displayEditCancelButton.setMargin(new Insets(3, 3, 3, 10)); displayEditCancelButton.addActionListener(this::cancelDisplayEditTagButtonActionPerformed); - + displayEditEditPointsButton = new JButton(mainPanel.translate("button.edit.points"), View.getIcon("edit16")); displayEditEditPointsButton.setMargin(new Insets(3, 3, 3, 10)); - displayEditEditPointsButton.addActionListener(this::editPointsDisplayEditTagButtonActionPerformed); - + displayEditEditPointsButton.addActionListener(this::editPointsDisplayEditTagButtonActionPerformed); + replaceShapeButton = new JButton(mainPanel.translate("button.replace"), View.getIcon("replaceshape16")); replaceShapeButton.setMargin(new Insets(3, 3, 3, 10)); replaceShapeButton.addActionListener(new ActionListener() { @@ -1639,13 +1737,13 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } displayEditGenericPanel.setEditMode(false, null); } - + if (displayEditTag instanceof ShapeTag) { replaceShapeButton.setVisible(true); - replaceShapeUpdateBoundsButton.setVisible(true); + replaceShapeUpdateBoundsButton.setVisible(true); displayEditEditPointsButton.setVisible(true); - } - + } + displayEditTransformButton.setVisible(true); if (Configuration.editorMode.get()) { displayEditEditButton.setVisible(false); @@ -1689,7 +1787,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel displayEditEditPointsButton.setVisible(false); mainPanel.setEditingStatus(); } - + private void editPointsDisplayEditTagButtonActionPerformed(ActionEvent evt) { displayEditMode = EDIT_POINTS; displayEditGenericPanel.setVisible(false); @@ -1700,17 +1798,16 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel replaceShapeButton.setVisible(false); replaceShapeUpdateBoundsButton.setVisible(false); displayEditEditPointsButton.setVisible(false); - - + ShapeTag shape = (ShapeTag) displayEditTag; - + oldShapeRecords = Helper.deepCopy(shape.shapes.shapeRecords); int x = 0; int y = 0; - + List points = new ArrayList<>(); - for (SHAPERECORD rec:shape.shapes.shapeRecords) { - if (rec instanceof StraightEdgeRecord) { + for (SHAPERECORD rec : shape.shapes.shapeRecords) { + if (rec instanceof StraightEdgeRecord) { StraightEdgeRecord ser = (StraightEdgeRecord) rec; DisplayPoint point = new DisplayPoint(x + ser.deltaX, y + ser.deltaY); points.add(point); @@ -1729,12 +1826,12 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel points.add(point); } } - + x = rec.changeX(x); y = rec.changeY(y); } displayEditImagePanel.setHilightedPoints(points); - + mainPanel.setEditingStatus(); } @@ -1753,7 +1850,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel displayEditTransformButton.setVisible(false); displayEditSaveButton.setVisible(true); displayEditCancelButton.setVisible(true); - + replaceShapeButton.setVisible(false); replaceShapeUpdateBoundsButton.setVisible(false); displayEditEditPointsButton.setVisible(false); @@ -2008,12 +2105,12 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel displayEditTransformScrollPane.setVisible(false); displayEditGenericPanel.setVisible(true); } - + if (displayEditMode == EDIT_POINTS) { displayEditImagePanel.setHilightedPoints(null); ShapeTag shape = (ShapeTag) displayEditTag; shape.shapes.shapeRecords = oldShapeRecords; - shape.getSwf().clearShapeCache(); + shape.getSwf().clearShapeCache(); displayEditImagePanel.repaint(); displayEditGenericPanel.setVisible(true); } @@ -2038,10 +2135,10 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel if (displayEditTag instanceof ShapeTag) { replaceShapeButton.setVisible(true); - replaceShapeUpdateBoundsButton.setVisible(true); + replaceShapeUpdateBoundsButton.setVisible(true); displayEditEditPointsButton.setVisible(true); } - + mainPanel.clearEditingStatus(); displayEditTransformButton.setVisible(true);