Transform tab.

This commit is contained in:
Jindra Petřík
2024-10-05 23:41:20 +02:00
parent 6106253451
commit fa4d5f7320
3 changed files with 114 additions and 37 deletions

View File

@@ -17,11 +17,10 @@
package com.jpexs.decompiler.flash.easygui;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
import com.jpexs.decompiler.flash.gui.BoundsChangeListener;
import com.jpexs.decompiler.flash.gui.ImagePanel;
import com.jpexs.decompiler.flash.gui.RegistrationPointPosition;
import com.jpexs.decompiler.flash.gui.TimelinedMaker;
import com.jpexs.decompiler.flash.gui.TransformPanel;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.tags.base.PlaceObjectTypeTag;
import com.jpexs.decompiler.flash.timeline.DepthState;
@@ -34,19 +33,18 @@ import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.border.BevelBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
@@ -66,6 +64,8 @@ public class MainFrame extends JFrame {
private JButton undoButton;
private JButton redoButton;
private UndoManager undoManager;
private JTabbedPane rightTabbedPane;
private TransformPanel transformPanel;
public MainFrame() {
setTitle("JPEXS FFDec Easy GUI");
@@ -94,33 +94,50 @@ public class MainFrame extends JFrame {
public void run() {
final int depth = stagePanel.getSelectedDepth();
final int frame = stagePanel.getFrame();
MATRIX m = stagePanel.getNewMatrix().toMATRIX();
final MATRIX newMatrix = stagePanel.getNewMatrix().toMATRIX();
MATRIX previousMatrix = null;
synchronized (stagePanel) {
DepthState ds = stagePanel.getTimelined().getTimeline().getFrame(frame).layers.get(depth);
previousMatrix = ds.matrix;
}
final Point2D regPoint = stagePanel.getRegistrationPoint();
final RegistrationPointPosition regPointPos = stagePanel.getRegistrationPointPosition();
final MATRIX fpreviousMatrix = previousMatrix;
final boolean transformEnabled = transformEnabled();
undoManager.doOperation(new DoableOperation() {
private MATRIX previousMatrix;
private MATRIX newMatrix = m;
@Override
public void doOperation() {
timelinePanel.setFrame(frame, depth);
DepthState ds = stagePanel.getTimelined().getTimeline().getFrame(frame).layers.get(depth);
PlaceObjectTypeTag pl = ds.placeObjectTag;
previousMatrix = ds.matrix;
ds.setMATRIX(newMatrix);
stagePanel.repaint();
if (transformEnabled()) {
stagePanel.freeTransformDepth(depth);
stagePanel.setRegistrationPoint(regPoint);
if (regPointPos != null) {
stagePanel.setRegistrationPointPosition(regPointPos);
}
}
}
@Override
public void undoOperation() {
timelinePanel.setFrame(frame, depth);
DepthState ds = stagePanel.getTimelined().getTimeline().getFrame(frame).layers.get(depth);
ds.setMATRIX(previousMatrix);
ds.setMATRIX(fpreviousMatrix);
stagePanel.repaint();
if (transformEnabled()) {
stagePanel.freeTransformDepth(depth);
}
}
@Override
public String getDescription() {
return "Move";
return transformEnabled ? "Transform" : "Move";
}
});
@@ -193,16 +210,35 @@ public class MainFrame extends JFrame {
libraryPreviewPanel = new ImagePanel();
libraryPreviewPanel.setTopPanelVisible(false);
JPanel topLibraryPanel = new JPanel(new BorderLayout());
JLabel libraryLabel = new JLabel("Library");
libraryLabel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
topLibraryPanel.add(libraryLabel, BorderLayout.NORTH);
topLibraryPanel.add(libraryPreviewPanel, BorderLayout.CENTER);
libraryPanel.add(topLibraryPanel, BorderLayout.NORTH);
libraryPanel.add(libraryPreviewPanel, BorderLayout.NORTH);
libraryPreviewPanel.setPreferredSize(new Dimension(200,200));
horizontalSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, verticalSplitPane, libraryPanel);
rightTabbedPane = new JTabbedPane();
rightTabbedPane.addTab("Library", libraryPanel);
JPanel transformTab = new JPanel(new BorderLayout());
transformPanel = new TransformPanel(stagePanel, false);
transformTab.add(new JScrollPane(transformPanel), BorderLayout.CENTER);
rightTabbedPane.addTab("Transform", transformTab);
rightTabbedPane.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
int depth = stagePanel.getSelectedDepth();
transformPanel.setVisible(depth != -1);
if (transformEnabled()) {
stagePanel.freeTransformDepth(depth);
stagePanel.setTransformSelectionMode(true);
} else {
stagePanel.freeTransformDepth(-1);
stagePanel.selectDepth(depth);
stagePanel.setTransformSelectionMode(false);
}
}
});
horizontalSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, verticalSplitPane, rightTabbedPane);
libraryScrollPane.getViewport().setBackground(UIManager.getColor("Tree.background"));
cnt.add(horizontalSplitPane, BorderLayout.CENTER);
@@ -227,6 +263,10 @@ public class MainFrame extends JFrame {
});
}
private boolean transformEnabled() {
return rightTabbedPane.getSelectedIndex() == 1;
}
public void open(File file) throws IOException, InterruptedException {
try(FileInputStream fis = new FileInputStream(file)) {
swf = new SWF(fis, true);
@@ -240,9 +280,13 @@ public class MainFrame extends JFrame {
timelinePanel.addFrameSelectionListener(new FrameSelectionListener() {
@Override
public void frameSelected(int frame, int depth) {
stagePanel.selectDepth(depth);
stagePanel.pause();
stagePanel.gotoFrame(frame + 1);
stagePanel.gotoFrame(frame + 1);
stagePanel.selectDepth(depth);
if (transformEnabled()) {
stagePanel.freeTransformDepth(depth);
}
transformPanel.setVisible(depth != -1);
}
});
}

View File

@@ -311,9 +311,15 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
private boolean showAllDepthLevelsInfo = true;
private boolean selectionMode = false;
private boolean transformSelectionMode = false;
public void setSelectionMode(boolean selectionMode) {
this.selectionMode = selectionMode;
}
public void setTransformSelectionMode(boolean transformSelectionMode) {
this.transformSelectionMode = transformSelectionMode;
}
public void setTagNameResolver(TagNameResolverInterface tagNameResolver) {
@@ -598,6 +604,12 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
}
public synchronized void selectDepth(int depth) {
boolean wasFreeTransform = freeTransformDepth != -1;
transformUpdated = null;
registrationPointUpdated = null;
transform = null;
if (depth != selectedDepth) {
this.selectedDepth = depth;
freeTransformDepth = -1;
@@ -651,6 +663,9 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
}
public synchronized void freeTransformDepth(int depth) {
if (selectedDepth != depth) {
selectedDepth = depth;
}
if (depth != freeTransformDepth) {
this.freeTransformDepth = depth;
}
@@ -1128,7 +1143,11 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
if (SwingUtilities.isLeftMouseButton(e)) {
if (altDown || selectionMode) {
if (depthStateUnderCursor != null) {
if (selectionMode) {
if (transformSelectionMode) {
if (freeTransformDepth != depthStateUnderCursor.depth) {
freeTransformDepth(depthStateUnderCursor.depth);
}
} else if (selectionMode) {
selectDepth(depthStateUnderCursor.depth);
}
firePlaceObjectSelected();
@@ -1252,7 +1271,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
fireTransformChanged();
repaint();
}
if (selectionMode) {
if (selectionMode && freeTransformDepth == -1) {
transform = null;
}
mode = Cursor.DEFAULT_CURSOR;
@@ -1343,7 +1362,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
return;
}
if (dragStart != null && selectionMode) {
if (dragStart != null && selectionMode && freeTransformDepth == -1) {
if (transform == null) {
return;
}
@@ -3010,7 +3029,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
Matrix fullM = m.clone();
MATRIX oldMatrix = null;
if (freeTransformDepth > -1) {
if (freeTransformDepth > -1 && newMatrix != null) {
DepthState ds = timeline.getFrame(frame).layers.get(freeTransformDepth);
if (ds != null) {
oldMatrix = ds.matrix;
@@ -3043,7 +3062,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
ds = timeline.getFrame(frame).layers.get(selectedDepth);
}
if (ds != null) {
if (ds != null && freeTransformDepth == -1) {
CharacterTag cht = ds.getCharacter();
if (cht != null) {
if (cht instanceof DrawableTag) {
@@ -3103,7 +3122,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
boundsRef.setVal(bounds);
gg.setStroke(new BasicStroke(1));
gg.setPaint(Color.black);
if (!selectionMode) {
if (!selectionMode || freeTransformDepth != -1) {
gg.draw(bounds);
drawHandles(gg, bounds);
Point2D regPoint = registrationPointRef.getVal();
@@ -3315,7 +3334,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
}*/
RenderContext renderContext = new RenderContext();
renderContext.displayObjectCache = displayObjectCache;
if (cursorPosition != null && freeTransformDepth == -1) {
if (cursorPosition != null && (freeTransformDepth == -1 || transformSelectionMode)) {
renderContext.cursorPosition = new Point((int) (cursorPosition.x * SWF.unitDivisor), (int) (cursorPosition.y * SWF.unitDivisor));
}
@@ -3907,7 +3926,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
this.autoPlayed = true;
this.frame = frame - 1;
this.prevFrame = -1;
this.prevFrame = -1;
stopInternal();
redraw();
fireMediaDisplayStateChanged();
@@ -3984,6 +4003,14 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
return mutable;
}
public Point2D getRegistrationPoint() {
return registrationPoint;
}
public RegistrationPointPosition getRegistrationPointPosition() {
return registrationPointPosition;
}
public void setRegistrationPoint(Point2D registrationPoint) {
this.registrationPoint = registrationPoint;
this.registrationPointPosition = null;
@@ -4012,6 +4039,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
redraw();
fireBoundsChange(getTransformBounds(), registrationPoint, registrationPointPosition);
fireTransformChanged();
}
private Point2D toTransformPoint(Point2D point) {
@@ -4064,7 +4092,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay {
int time = frozen ? 0 : this.time;
DepthState ds = null;
Timeline timeline = timelined.getTimeline();
if (freeTransformDepth > -1 && timeline.getFrameCount() > frame) {
if (freeTransformDepth > -1 && timeline.getFrameCount() > frame && transform != null) {
ds = timeline.getFrame(frame).layers.get(freeTransformDepth);
}
if (freeTransformDepth == -1 && selectionMode && transform != null && selectedDepth != -1 && timeline.getFrameCount() > frame) {

View File

@@ -170,6 +170,9 @@ public class TransformPanel extends JPanel {
}
public TransformPanel(ImagePanel imagePanel) {
this(imagePanel, true);
}
public TransformPanel(ImagePanel imagePanel, boolean headerLabel) {
imagePanel.addBoundsChangeListener(new BoundsChangeListener() {
@Override
@@ -181,10 +184,12 @@ public class TransformPanel extends JPanel {
this.imagePanel = imagePanel;
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
JLabel transformLabel = new JLabel(AppStrings.translate("transform"));
transformLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
transformLabel.setFont(transformLabel.getFont().deriveFont(Font.BOLD));
add(transformLabel);
if (headerLabel) {
JLabel transformLabel = new JLabel(AppStrings.translate("transform"));
transformLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
transformLabel.setFont(transformLabel.getFont().deriveFont(Font.BOLD));
add(transformLabel);
}
JPanel registrationPointPanel = new JPanel(new FlowLayout());
this.registrationPointPanel = new RegistrationPointPanel(this::registrationPointChangedActionPerformed);