Add sprite initialization script - DoInitAction (#clipinit pragma)

This commit is contained in:
Jindra Petřík
2021-02-15 12:30:21 +01:00
parent 1efcbe3296
commit 2b7f5869d3
7 changed files with 175 additions and 35 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -26,6 +26,7 @@ import com.jpexs.decompiler.flash.gui.View;
import com.jpexs.decompiler.flash.tags.DefineButton2Tag;
import com.jpexs.decompiler.flash.tags.DefineSpriteTag;
import com.jpexs.decompiler.flash.tags.DoActionTag;
import com.jpexs.decompiler.flash.tags.DoInitActionTag;
import com.jpexs.decompiler.flash.tags.ExportAssetsTag;
import com.jpexs.decompiler.flash.tags.ImportAssetsTag;
import com.jpexs.decompiler.flash.tags.ShowFrameTag;
@@ -83,15 +84,18 @@ public class AddScriptDialog extends AppDialog {
private JTextField frameTextField;
private JTextField spriteFrameTextField;
private PreviewPanel framePreviewPanel;
private PreviewPanel spritePreviewPanel;
private PreviewPanel spriteFramePreviewPanel;
private PreviewPanel spriteInitPreviewPanel;
private PreviewPanel buttonPreviewPanel;
private PreviewPanel instancePreviewPanel;
private JList<DefineSpriteTag> spriteInitList;
private JTextField classNameTextField;
private JTree instanceTree;
private JTree spriteTree;
private JTree spriteFrameTree;
private JList<DefineButton2Tag> buttonList;
@@ -105,15 +109,17 @@ public class AddScriptDialog extends AppDialog {
public static final int TYPE_FRAME = 0;
public static final int TYPE_SPRITE_FRAME = 1;
public static final int TYPE_BUTTON_EVENT = 2;
public static final int TYPE_INSTANCE_EVENT = 3;
public static final int TYPE_CLASS = 4;
public static final int TYPE_SPRITE_INIT = 2;
public static final int TYPE_BUTTON_EVENT = 3;
public static final int TYPE_INSTANCE_EVENT = 4;
public static final int TYPE_CLASS = 5;
private final SWF swf;
private final JComboBox<String> typeComboBox;
private List<String> existingClasses = new ArrayList<>();
private List<Integer> spriteIdsWithDoInitAction;
public AddScriptDialog(SWF swf) {
setDefaultCloseOperation(HIDE_ON_CLOSE);
@@ -149,6 +155,7 @@ public class AddScriptDialog extends AppDialog {
typeComboBox = new JComboBox<>(new String[]{
translate("type.frame"),
translate("type.sprite.frame"),
translate("type.sprite.init"),
translate("type.button.event"),
translate("type.instance.event"),
translate("type.class")
@@ -183,7 +190,8 @@ public class AddScriptDialog extends AppDialog {
centerPanel = new JPanel(new CardLayout());
centerPanel.add(createFramePanel(checkEnabledDocumentListener), "" + TYPE_FRAME);
centerPanel.add(createSpritePanel(checkEnabledDocumentListener), "" + TYPE_SPRITE_FRAME);
centerPanel.add(createSpriteFramePanel(checkEnabledDocumentListener), "" + TYPE_SPRITE_FRAME);
centerPanel.add(createSpriteInitPanel(), "" + TYPE_SPRITE_INIT);
centerPanel.add(createButtonPanel(), "" + TYPE_BUTTON_EVENT);
centerPanel.add(createInstancePanel(), "" + TYPE_INSTANCE_EVENT);
centerPanel.add(createClassPanel(), "" + TYPE_CLASS);
@@ -296,7 +304,59 @@ public class AddScriptDialog extends AppDialog {
}
}
private JPanel createSpritePanel(DocumentListener documentListener) {
private JPanel createSpriteInitPanel() {
spriteInitPreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel(), null);
spriteInitPreviewPanel.setReadOnly(true);
spriteInitPreviewPanel.setPreferredSize(new Dimension(300, 1));
spriteInitPreviewPanel.showEmpty();
spriteInitPreviewPanel.setParametersPanelVisible(false);
List<DefineSpriteTag> sprites = new ArrayList<>();
ReadOnlyTagList tags = swf.getTags();
spriteIdsWithDoInitAction = new ArrayList<>();
for (Tag t : tags) {
if (t instanceof DoInitActionTag) {
spriteIdsWithDoInitAction.add(((DoInitActionTag) t).spriteId);
}
if (t instanceof DefineSpriteTag) {
sprites.add((DefineSpriteTag) t);
}
}
spriteInitList = new JList<>(sprites.toArray(new DefineSpriteTag[sprites.size()]));
final ImageIcon spriteIcon = View.getIcon("sprite16");
final ImageIcon spriteInvalidIcon = View.getIcon("spriteinvalid16");
spriteInitList.setBackground(Color.white);
spriteInitList.setCellRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component renderer = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (renderer instanceof JLabel) {
if (spriteIdsWithDoInitAction.contains(((DefineSpriteTag) value).spriteId)) {
((JLabel) renderer).setIcon(spriteInvalidIcon);
} else {
((JLabel) renderer).setIcon(spriteIcon);
}
}
return renderer;
}
});
spriteInitList.addListSelectionListener(this::spriteInitValueChanged);
JScrollPane spriteInitListScrollPane = new JScrollPane(spriteInitList);
//spriteTreeScrollPane.setMinimumSize(new Dimension(400, 1));
JSplitPane spriteInitSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, spriteInitListScrollPane, spriteInitPreviewPanel);
spriteInitSplitPane.setDividerLocation(400);
JPanel spriteInitPanel = new JPanel(new BorderLayout());
spriteInitPanel.add(spriteInitSplitPane, BorderLayout.CENTER);
return spriteInitPanel;
}
private JPanel createSpriteFramePanel(DocumentListener documentListener) {
JPanel spriteFramePanel = new JPanel(new BorderLayout());
JLabel spriteFrameLabel = new JLabel(translate("framenum"));
@@ -315,12 +375,12 @@ public class AddScriptDialog extends AppDialog {
root.setData("root");
populateSpriteNodes(root, swf);
spriteTree = new JTree(root);
spriteFrameTree = new JTree(root);
final ImageIcon spriteIcon = View.getIcon("sprite16");
final ImageIcon frameIcon = View.getIcon("frame16");
final ImageIcon frameInvalidIcon = View.getIcon("frameinvalid16");
spriteTree.setCellRenderer(new DefaultTreeCellRenderer() {
spriteFrameTree.setCellRenderer(new DefaultTreeCellRenderer() {
{
setUI(new BasicLabelUI());
setOpaque(false);
@@ -350,11 +410,11 @@ public class AddScriptDialog extends AppDialog {
}
});
spriteTree.setBackground(Color.white);
spriteTree.setRootVisible(false);
spriteTree.setShowsRootHandles(true);
spriteTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
spriteTree.addTreeSelectionListener(this::spriteValueChanged);
spriteFrameTree.setBackground(Color.white);
spriteFrameTree.setRootVisible(false);
spriteFrameTree.setShowsRootHandles(true);
spriteFrameTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
spriteFrameTree.addTreeSelectionListener(this::spriteValueChanged);
//spriteTree.setPreferredSize(new Dimension(500, 1));
spriteFrameLabel.setLabelFor(spriteFrameTextField);
@@ -365,17 +425,17 @@ public class AddScriptDialog extends AppDialog {
spriteFramePanel.add(spriteFrameTopPanel, BorderLayout.NORTH);
spritePreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel(), null);
spritePreviewPanel.setReadOnly(true);
spritePreviewPanel.setPreferredSize(new Dimension(300, 1));
spritePreviewPanel.showEmpty();
spritePreviewPanel.setParametersPanelVisible(false);
spriteFramePreviewPanel = new PreviewPanel(Main.getMainFrame().getPanel(), null);
spriteFramePreviewPanel.setReadOnly(true);
spriteFramePreviewPanel.setPreferredSize(new Dimension(300, 1));
spriteFramePreviewPanel.showEmpty();
spriteFramePreviewPanel.setParametersPanelVisible(false);
JScrollPane spriteTreeScrollPane = new JScrollPane(spriteTree);
JScrollPane spriteFrameTreeScrollPane = new JScrollPane(spriteFrameTree);
//spriteTreeScrollPane.setMinimumSize(new Dimension(400, 1));
JSplitPane spriteSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, spriteTreeScrollPane, spritePreviewPanel);
spriteSplitPane.setDividerLocation(400);
spriteFramePanel.add(spriteSplitPane, BorderLayout.CENTER);
JSplitPane spriteFrameSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, spriteFrameTreeScrollPane, spriteFramePreviewPanel);
spriteFrameSplitPane.setDividerLocation(400);
spriteFramePanel.add(spriteFrameSplitPane, BorderLayout.CENTER);
return spriteFramePanel;
}
@@ -676,6 +736,18 @@ public class AddScriptDialog extends AppDialog {
checkEnabled();
}
private void spriteInitValueChanged(ListSelectionEvent e) {
spriteInitPreviewPanel.showEmpty();
int selectedIndex = spriteInitList.getSelectedIndex();
if (selectedIndex == -1) {
spriteInitPreviewPanel.showEmpty();
checkEnabled();
return;
}
spriteInitPreviewPanel.showImagePanel(spriteInitList.getSelectedValue(), swf, -1);
checkEnabled();
}
private void frameValueChanged(ListSelectionEvent e) {
framePreviewPanel.showEmpty();
int selectedIndex = frameList.getSelectedIndex();
@@ -704,22 +776,22 @@ public class AddScriptDialog extends AppDialog {
private void spriteValueChanged(TreeSelectionEvent e) {
TreePath selection = spriteTree.getSelectionPath();
TreePath selection = spriteFrameTree.getSelectionPath();
if (selection == null) {
spritePreviewPanel.showEmpty();
spriteFramePreviewPanel.showEmpty();
checkEnabled();
return;
}
MyTreeNode tnode = (MyTreeNode) selection.getLastPathComponent();
if (tnode.getData() instanceof DefineSpriteTag) {
spritePreviewPanel.showImagePanel((DefineSpriteTag) tnode.getData(), swf, -1);
spriteFramePreviewPanel.showImagePanel((DefineSpriteTag) tnode.getData(), swf, -1);
} else if (tnode.getData() instanceof MyFrame) {
int f = ((MyFrame) tnode.getData()).frame;
Object parent = ((MyTreeNode) tnode.getParent()).getData();
if (parent instanceof DefineSpriteTag) {
spritePreviewPanel.showImagePanel((DefineSpriteTag) parent, swf, f - 1);
spriteFramePreviewPanel.showImagePanel((DefineSpriteTag) parent, swf, f - 1);
} else {
spritePreviewPanel.showImagePanel(swf, swf, f - 1);
spriteFramePreviewPanel.showImagePanel(swf, swf, f - 1);
}
if (!spriteFrameTextField.getText().equals("" + f)) {
spriteFrameTextField.setText("" + f);
@@ -758,7 +830,7 @@ public class AddScriptDialog extends AppDialog {
}
}
if (type == TYPE_SPRITE_FRAME) {
TreePath selection = spriteTree.getSelectionPath();
TreePath selection = spriteFrameTree.getSelectionPath();
if (selection != null) {
int f = -1;
@@ -782,18 +854,18 @@ public class AddScriptDialog extends AppDialog {
node = (MyTreeNode) node.getParent();
TreePath spritePath = selection.getParentPath();
if (spriteTree.isExpanded(spritePath)) {
if (spriteFrameTree.isExpanded(spritePath)) {
boolean found = false;
for (int i = 0; i < node.getChildCount(); i++) {
if (((MyFrame) ((MyTreeNode) node.getChildAt(i)).data).frame == f) {
TreePath framePath = spritePath.pathByAddingChild(node.getChildAt(i));
spriteTree.setSelectionPath(framePath);
spriteFrameTree.setSelectionPath(framePath);
found = true;
break;
}
}
if (!found) {
spriteTree.setSelectionPath(spritePath);
spriteFrameTree.setSelectionPath(spritePath);
}
}
}
@@ -818,10 +890,10 @@ public class AddScriptDialog extends AppDialog {
if (invalid) {
okButton.setEnabled(false);
}
if (spriteTree.getSelectionPath() == null) {
if (spriteFrameTree.getSelectionPath() == null) {
okButton.setEnabled(false);
} else {
MyTreeNode node = (MyTreeNode) spriteTree.getSelectionPath().getLastPathComponent();
MyTreeNode node = (MyTreeNode) spriteFrameTree.getSelectionPath().getLastPathComponent();
if (node.getData() instanceof MyFrame) {
if (((MyFrame) node.getData()).isInvalid()) {
okButton.setEnabled(false);
@@ -829,6 +901,18 @@ public class AddScriptDialog extends AppDialog {
}
}
}
if (type == TYPE_SPRITE_INIT) {
DefineSpriteTag sprite = spriteInitList.getSelectedValue();
if (sprite == null) {
okButton.setEnabled(false);
} else {
if (spriteIdsWithDoInitAction.contains(sprite.spriteId)) {
okButton.setEnabled(false);
}
}
}
if (type == TYPE_FRAME) {
boolean invalid = false;
try {
@@ -913,7 +997,7 @@ public class AddScriptDialog extends AppDialog {
public DefineSpriteTag getSprite() {
if (getScriptType() == TYPE_SPRITE_FRAME) {
MyTreeNode tnode = (MyTreeNode) spriteTree.getSelectionPath().getLastPathComponent();
MyTreeNode tnode = (MyTreeNode) spriteFrameTree.getSelectionPath().getLastPathComponent();
if (tnode.getData() instanceof DefineSpriteTag) {
return (DefineSpriteTag) tnode.getData();
}
@@ -928,6 +1012,10 @@ public class AddScriptDialog extends AppDialog {
return null;
}
}
if (getScriptType() == TYPE_SPRITE_INIT) {
return spriteInitList.getSelectedValue();
}
return null;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 B

View File

@@ -5,6 +5,7 @@ button.cancel = Cancel
type = Script type:
type.frame = Main timeline frame script (DoAction)
type.sprite.frame = Sprite frame script (DoAction)
type.sprite.init = Sprite init script (DoInitAction)
type.button.event = Button event (BUTTONCONDACTION)
type.instance.event = Instance event (CLIPACTIONRECORD)
type.class = AS2 Class

View File

@@ -9,3 +9,4 @@ type.button.event = Ud\u00e1lost tla\u010d\u00edtka (BUTTONCONDACTION)
type.instance.event = Ud\u00e1lost instance (CLIPACTIONRECORD)
type.class=AS2 T\u0159\u00edda
classname=Pln\u011b kvalifikovan\u00fd n\u00e1zev t\u0159\u00eddy
type.sprite.init=Inicializa\u010dn\u00ed skript Spritu (DoInitAction)

View File

@@ -1040,12 +1040,62 @@ public class TagTreeContextMenu extends JPopupMenu {
}
}
} else if (addScriptDialog.getScriptType() == AddScriptDialog.TYPE_SPRITE_INIT) {
DefineSpriteTag sprite = addScriptDialog.getSprite();
DoInitActionTag doinit = new DoInitActionTag(swf);
doinit.spriteId = sprite.spriteId;
ReadOnlyTagList tags = swf.getTags();
int addPos = -1;
for (int i = 0; i < tags.size(); i++) {
Tag t = tags.get(i);
if (t instanceof PlaceObjectTypeTag) {
int placeCharacterId = ((PlaceObjectTypeTag) t).getCharacterId();
if (usesCharacter(swf, placeCharacterId, sprite.spriteId)) {
addPos = i;
break;
}
}
}
if (addPos == -1) {
addPos = tags.size();
}
swf.addTag(addPos, doinit);
swf.clearAllCache();
swf.setModified(true);
mainPanel.refreshTree(swf);
TreePath selection = mainPanel.tagTree.getSelectionPath();
TreePath swfPath = selection.getParentPath();
FolderItem scriptsNode = (FolderItem) mainPanel.tagTree.getModel().getScriptsNode(swf);
TreePath scriptsPath = swfPath.pathByAddingChild(scriptsNode);
TreePath doinitPath = scriptsPath.pathByAddingChild(doinit);
mainPanel.tagTree.setSelectionPath(doinitPath);
}
}
}
}
}
private boolean usesCharacter(SWF swf, int characterId, int searchedCharacterId) {
if (characterId == searchedCharacterId) {
return true;
}
CharacterTag character = swf.getCharacter(characterId);
if (character instanceof DefineSpriteTag) {
DefineSpriteTag sprite = (DefineSpriteTag) character;
for (Tag t : sprite.getTags()) {
if (t instanceof PlaceObjectTypeTag) {
int placeCharacterId = ((PlaceObjectTypeTag) t).getCharacterId();
if (usesCharacter(swf, placeCharacterId, searchedCharacterId)) {
return true;
}
}
}
}
return false;
}
private void removeItemActionPerformed(ActionEvent evt, boolean removeDependencies) {
List<TreeItem> sel = tagTree.getSelected();