Fixed #2337, #2339 Replace shape update bounds - allow selecting multiple shapes

This commit is contained in:
Jindra Petřík
2024-10-10 20:08:03 +02:00
parent baf408e776
commit d1fe8b2b5c
4 changed files with 21 additions and 57 deletions

View File

@@ -32,6 +32,7 @@ All notable changes to this project will be documented in this file.
- [#2334] AS1/2 P-code export - Do not export on(xxx) header
- [#2338] AS decompiling threads got stuck after cancelling / timeout
- [#2338] AS2 class detection in some minor cases
- [#2337], [#2339] Replace shape update bounds - allow selecting multiple shapes
## [21.1.0] - 2024-09-23
### Added
@@ -3618,6 +3619,8 @@ Major version of SWF to XML export changed to 2.
[#2335]: https://www.free-decompiler.com/flash/issues/2335
[#2334]: https://www.free-decompiler.com/flash/issues/2334
[#2338]: https://www.free-decompiler.com/flash/issues/2338
[#2337]: https://www.free-decompiler.com/flash/issues/2337
[#2339]: https://www.free-decompiler.com/flash/issues/2339
[#943]: https://www.free-decompiler.com/flash/issues/943
[#1812]: https://www.free-decompiler.com/flash/issues/1812
[#2287]: https://www.free-decompiler.com/flash/issues/2287

View File

@@ -5006,6 +5006,9 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
}
public boolean replace(List<TreeItem> items, boolean create) {
return replace(items, create, true);
}
public boolean replace(List<TreeItem> items, boolean create, boolean fill) {
if (items.isEmpty()) {
return false;
}
@@ -5037,12 +5040,12 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
return false;
}
for (TreeItem ti : items) {
doReplaceAction(ti, file, create);
doReplaceAction(ti, file, create, fill);
}
return true;
}
private void doReplaceAction(TreeItem item, File selectedFile, boolean create) {
private void doReplaceAction(TreeItem item, File selectedFile, boolean create, boolean fill) {
if (selectedFile == null) {
return;
}
@@ -5118,16 +5121,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
Tag newTag = null;
if (st instanceof ShapeTag) {
if (svgText != null) {
newTag = new SvgImporter().importSvg((ShapeTag) st, svgText);
newTag = new SvgImporter().importSvg((ShapeTag) st, svgText, fill);
} else {
newTag = new ShapeImporter().importImage((ShapeTag) st, data);
newTag = new ShapeImporter().importImage((ShapeTag) st, data, 0, fill);
}
}
if (st instanceof MorphShapeTag) {
if (svgText != null) {
newTag = new SvgImporter().importSvg((MorphShapeTag) st, svgText);
newTag = new SvgImporter().importSvg((MorphShapeTag) st, svgText, fill);
} else {
newTag = new ShapeImporter().importImage((MorphShapeTag) st, data);
newTag = new ShapeImporter().importImage((MorphShapeTag) st, data, 0, fill);
}
}
SWF swf = st.getSwf();
@@ -5210,58 +5213,16 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se
replaceSpriteWithGif(item);
}
public void replaceNoFillButtonActionPerformed(TreeItem item) {
replaceNoFill(item);
}
public void replaceNoFillButtonActionPerformed(List<TreeItem> items) {
replace(items, false, false);
}
public boolean replaceNoFill(TreeItem item) {
if (item == null) {
return false;
}
if (item instanceof MorphShapeTag) {
return replaceMorphShape((MorphShapeTag) item, false, false);
}
if (item instanceof ShapeTag) {
ShapeTag st = (ShapeTag) item;
String filter = "filter.images|*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.svg";
File selectedFile = showImportFileChooser(filter, true, "importshape");
if (selectedFile != null) {
File selfile = Helper.fixDialogFile(selectedFile);
byte[] data = null;
String svgText = null;
if (".svg".equals(Path.getExtension(selfile))) {
svgText = Helper.readTextFile(selfile.getAbsolutePath());
showSvgImportWarning();
} else {
data = Helper.readFile(selfile.getAbsolutePath());
}
try {
Tag newTag = null;
if (svgText != null) {
newTag = new SvgImporter().importSvg(st, svgText, false);
} else {
newTag = new ShapeImporter().importImage(st, data, 0, false);
}
SWF swf = st.getSwf();
if (newTag != null) {
refreshTree(swf);
setTagTreeSelectedNode(getCurrentTree(), newTag);
}
swf.clearImageCache();
swf.clearShapeCache();
} catch (IOException ex) {
logger.log(Level.SEVERE, "Invalid image", ex);
ViewMessages.showMessageDialog(this, translate("error.image.invalid"), translate("error"), JOptionPane.ERROR_MESSAGE);
}
reload(true);
return true;
}
}
return false;
List<TreeItem> items = new ArrayList<>();
items.add(item);
return replace(items, false, false);
}
private void showSvgImportWarning() {
ViewMessages.showMessageDialog(this, AppStrings.translate("message.warning.svgImportExperimental"), AppStrings.translate("message.warning"), JOptionPane.WARNING_MESSAGE, Configuration.warningSvgImport);
}

View File

@@ -1426,7 +1426,7 @@ public class PreviewPanel extends JPersistentSplitPane implements TagEditorPanel
replaceShapeUpdateBoundsButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainPanel.replaceNoFillButtonActionPerformed(mainPanel.getCurrentTree().getCurrentTreeItem());
mainPanel.replaceNoFill(mainPanel.getCurrentTree().getCurrentTreeItem());
}
});
replaceShapeUpdateBoundsButton.setVisible(false);

View File

@@ -517,7 +517,7 @@ public class TagTreeContextMenu extends JPopupMenu {
replaceNoFillMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mainPanel.replaceNoFillButtonActionPerformed(getCurrentItem());
mainPanel.replaceNoFillButtonActionPerformed(getSelectedItems());
}
});
replaceNoFillMenuItem.setIcon(View.getIcon("replaceitem16"));