From 57d71938dba7990504629495975fb58ad2274937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 13 Mar 2021 08:32:55 +0100 Subject: [PATCH] Placeobject display and edit - raw editor on right side --- CHANGELOG.md | 4 + .../decompiler/flash/gui/ImagePanel.java | 49 ++++++------ .../decompiler/flash/gui/PreviewPanel.java | 75 +++++++++++++++--- .../flash/gui/graphics/freetransform16.png | Bin 0 -> 697 bytes .../flash/gui/locales/MainFrame.properties | 2 + .../flash/gui/locales/MainFrame_cs.properties | 2 + 6 files changed, 95 insertions(+), 37 deletions(-) create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/freetransform16.png diff --git a/CHANGELOG.md b/CHANGELOG.md index dff19b6c2..a2a94a081 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ # Change Log All notable changes to this project will be documented in this file. +## [Unreleased] +### Added +- Placeobject display and edit - raw editor on right side + ## [14.2.0] - 2021-03-12 ### Added - [#1645] Scrollbar to recent searches dropdown diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index fbff1744e..6c8b1b6d7 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -228,33 +228,35 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } public MATRIX getNewMatrix() { - DepthState ds = null; - Timeline timeline = timelined.getTimeline(); - if (freeTransformDepth > -1 && timeline.getFrameCount() > frame) { - ds = timeline.getFrame(frame).layers.get(freeTransformDepth); - } + synchronized (lock) { + DepthState ds = null; + Timeline timeline = timelined.getTimeline(); + if (freeTransformDepth > -1 && timeline.getFrameCount() > frame) { + ds = timeline.getFrame(frame).layers.get(freeTransformDepth); + } - if (ds != null) { - CharacterTag cht = swf.getCharacter(ds.characterId); - if (cht != null) { - if (cht instanceof DrawableTag) { - RECT rect = timelined.getRect(); - Matrix m = new Matrix(); - double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value; - if (lowQuality) { - zoomDouble /= LQ_FACTOR; + if (ds != null) { + CharacterTag cht = swf.getCharacter(ds.characterId); + if (cht != null) { + if (cht instanceof DrawableTag) { + RECT rect = timelined.getRect(); + Matrix m = new Matrix(); + double zoomDouble = zoom.fit ? getZoomToFit() : zoom.value; + if (lowQuality) { + zoomDouble /= LQ_FACTOR; + } + double zoom = zoomDouble; + m.translate(-rect.Xmin * zoom, -rect.Ymin * zoom); + m.scale(zoom); + + Matrix eMatrix = Matrix.getScaleInstance(1 / SWF.unitDivisor).concatenate(m).inverse(); + + return transform.preConcatenate(eMatrix).toMATRIX(); } - double zoom = zoomDouble; - m.translate(-rect.Xmin * zoom, -rect.Ymin * zoom); - m.scale(zoom); - - Matrix eMatrix = Matrix.getScaleInstance(1 / SWF.unitDivisor).concatenate(m).inverse(); - - return transform.preConcatenate(eMatrix).toMATRIX(); } } + return null; } - return null; } public synchronized void selectDepth(int depth) { @@ -1573,7 +1575,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { textTag = null; newTextTag = null; - displayObjectCache.clear(); + displayObjectCache.clear(); } private void nextFrame(Timer thisTimer, final int cnt, final int timeShouldBe) { @@ -1646,7 +1648,6 @@ public final class ImagePanel extends JPanel implements MediaDisplay { timeline.toImage(frame, time, renderContext, image, false, m, m, m, null); - Graphics2D gg = (Graphics2D) image.getGraphics(); gg.setStroke(new BasicStroke(3)); gg.setPaint(Color.green); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index 7e436c7ee..1d21f4c89 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -120,6 +120,10 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private GenericTagPanel genericTagPanel; + private GenericTagPanel placeGenericPanel; + + private JSplitPane placeSplitPane; + private JPanel displayWithPreview; // Image tag buttons @@ -151,6 +155,8 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private JButton genericCancelButton; + private JButton placeFreeTransformButton; + private JButton placeEditButton; private JButton placeSaveButton; @@ -179,6 +185,10 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel private HexView unknownHexView; + private final int PLACE_EDIT_FREETRANSFORM = 1; + private final int PLACE_EDIT_RAW = 2; + private int placeEditMode = 0; + public void setReadOnly(boolean readOnly) { this.readOnly = readOnly; setDividerSize(this.readOnly ? 0 : dividerSize); @@ -464,13 +474,20 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel prevIntLabel.setHorizontalAlignment(SwingConstants.CENTER); previewPanel.add(prevIntLabel, BorderLayout.NORTH); - placeTagCard.add(previewPanel, BorderLayout.CENTER); + placeGenericPanel = new GenericTagTreePanel(mainPanel); + placeSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, previewPanel, placeGenericPanel); + + placeTagCard.add(placeSplitPane, BorderLayout.CENTER); + //placeSplitPane.setDividerLocation(800); placeTagCard.add(createPlaceTagButtonsPanel(), BorderLayout.SOUTH); return placeTagCard; } private JPanel createPlaceTagButtonsPanel() { + placeFreeTransformButton = new JButton(mainPanel.translate("button.freetransform"), View.getIcon("freetransform16")); + placeFreeTransformButton.setMargin(new Insets(3, 3, 3, 10)); + placeFreeTransformButton.addActionListener(this::freeTransformPlaceTagButtonActionPerformed); placeEditButton = new JButton(mainPanel.translate("button.edit"), View.getIcon("edit16")); placeEditButton.setMargin(new Insets(3, 3, 3, 10)); placeEditButton.addActionListener(this::editPlaceTagButtonActionPerformed); @@ -484,6 +501,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel placeCancelButton.setVisible(false); ButtonsPanel placeTagButtonsPanel = new ButtonsPanel(); + placeTagButtonsPanel.add(placeFreeTransformButton); placeTagButtonsPanel.add(placeEditButton); placeTagButtonsPanel.add(placeSaveButton); placeTagButtonsPanel.add(placeCancelButton); @@ -668,6 +686,8 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel showCardLeft(PLACE_TAG_CARD); placeTag = tag; oldMatrix = tag.getMatrix(); + placeSplitPane.setDividerLocation((int) (0.6 * this.getWidth())); + placeGenericPanel.setEditMode(false, tag); placeImagePanel.selectDepth(-1); placeImagePanel.setTimelined(((Tag) tag).getTimelined(), ((Tag) tag).getSwf(), frame); placeImagePanel.selectDepth(tag.getDepth()); @@ -840,13 +860,26 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } private void savePlaceTagButtonActionPerformed(ActionEvent evt) { - MATRIX matrix = placeImagePanel.getNewMatrix(); - placeTag.setPlaceFlagHasMatrix(true); - placeTag.setMatrix(matrix); - placeTag.setModified(true); - placeImagePanel.selectDepth(placeTag.getDepth()); - placeImagePanel.freeTransformDepth(-1); - placeTag.getTimelined().resetTimeline(); + if (placeEditMode == PLACE_EDIT_FREETRANSFORM) { + MATRIX matrix = placeImagePanel.getNewMatrix(); + placeTag.setPlaceFlagHasMatrix(true); + placeTag.setMatrix(matrix); + placeTag.setModified(true); + placeImagePanel.selectDepth(placeTag.getDepth()); + placeImagePanel.freeTransformDepth(-1); + placeTag.getTimelined().resetTimeline(); + } + if (placeEditMode == PLACE_EDIT_RAW) { + if (placeGenericPanel.save()) { + Tag tag = placeGenericPanel.getTag(); + SWF swf = tag.getSwf(); + tag.getTimelined().resetTimeline(); + mainPanel.refreshTree(swf); + mainPanel.setTagTreeSelectedNode(tag); + } + placeGenericPanel.setEditMode(false, null); + } + placeFreeTransformButton.setVisible(true); placeEditButton.setVisible(true); placeSaveButton.setVisible(false); placeCancelButton.setVisible(false); @@ -854,24 +887,40 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel } private void editPlaceTagButtonActionPerformed(ActionEvent evt) { + placeEditMode = PLACE_EDIT_RAW; + placeGenericPanel.setEditMode(true, placeTag); + placeEditButton.setVisible(false); + placeFreeTransformButton.setVisible(false); + placeSaveButton.setVisible(true); + placeCancelButton.setVisible(true); + } + + private void freeTransformPlaceTagButtonActionPerformed(ActionEvent evt) { TreeItem item = mainPanel.tagTree.getCurrentTreeItem(); if (item == null) { return; } + placeEditMode = PLACE_EDIT_FREETRANSFORM; placeImagePanel.selectDepth(-1); placeImagePanel.freeTransformDepth(placeTag.getDepth()); placeEditButton.setVisible(false); + placeFreeTransformButton.setVisible(false); placeSaveButton.setVisible(true); placeCancelButton.setVisible(true); } private void cancelPlaceTagButtonActionPerformed(ActionEvent evt) { - placeImagePanel.selectDepth(placeTag.getDepth()); - placeImagePanel.freeTransformDepth(-1); - placeTag.setMatrix(oldMatrix); - placeTag.getTimelined().resetTimeline(); - + if (placeEditMode == PLACE_EDIT_FREETRANSFORM) { + placeImagePanel.selectDepth(placeTag.getDepth()); + placeImagePanel.freeTransformDepth(-1); + placeTag.setMatrix(oldMatrix); + placeTag.getTimelined().resetTimeline(); + } + if (placeEditMode == PLACE_EDIT_RAW) { + placeGenericPanel.setEditMode(false, null); + } placeEditButton.setVisible(true); + placeFreeTransformButton.setVisible(true); placeSaveButton.setVisible(false); placeCancelButton.setVisible(false); } diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/freetransform16.png b/src/com/jpexs/decompiler/flash/gui/graphics/freetransform16.png new file mode 100644 index 0000000000000000000000000000000000000000..d5cee3a87c70ebc002963859db601342bfebdb7a GIT binary patch literal 697 zcmV;q0!ICbP)l7b)t%hHfZLcJ79&_iL<-l9M6J?c{-A%*F;iK!mQ?#^`Wro@zo9-@{(kq*&(7~|D~$GwE?h46-t#%rOfYH0I9qeoDuJ3o|=5oRT z2tV}N zt4=V+K%SQcy!2g#1Ka9AU*-@QjexXTGGOqn@c|(eQknFlSZCs-1>t^=Et0-b` z)16jX$qh|RPb?r@`Lz9oMO&i9s8r-Way4d|{iamL#@;L-JY>Ktx^TB;AgHON2jRu$ z8%Op#C8v;X$kkLTY!cT$Eu!omgo9;Y;?eGgL40wCwg+}NJnkw{gZGI9WHVWnQ65e9 zW*bdkBC0rs@^eZ)|GOhb!8G<2qc{KaFOZSyfBhbg?aZboKcxG