mirror of
https://github.com/OMGeeky/ATCS.git
synced 2026-02-23 15:38:23 +01:00
First implementation of a bookmarks system.
Not persistent yet, so you lose them all when you close ATCS.
This commit is contained in:
Binary file not shown.
BIN
src/com/gpl/rpg/atcontentstudio/img/bookmark_active.png
Normal file
BIN
src/com/gpl/rpg/atcontentstudio/img/bookmark_active.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png
Normal file
BIN
src/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png
Normal file
BIN
src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png
Normal file
BIN
src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.3 KiB |
@@ -11,6 +11,8 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
import javax.swing.tree.TreeNode;
|
import javax.swing.tree.TreeNode;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarkEntry;
|
||||||
|
|
||||||
public abstract class GameDataElement implements ProjectTreeNode, Serializable {
|
public abstract class GameDataElement implements ProjectTreeNode, Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2028934451226743389L;
|
private static final long serialVersionUID = 2028934451226743389L;
|
||||||
@@ -31,6 +33,8 @@ public abstract class GameDataElement implements ProjectTreeNode, Serializable {
|
|||||||
|
|
||||||
public boolean writable = false;
|
public boolean writable = false;
|
||||||
|
|
||||||
|
public BookmarkEntry bookmark = null;
|
||||||
|
|
||||||
//List of objects whose transition to "linked" state made them point to this instance.
|
//List of objects whose transition to "linked" state made them point to this instance.
|
||||||
private Map<GameDataElement, Integer> backlinks = new ConcurrentHashMap<GameDataElement, Integer>();
|
private Map<GameDataElement, Integer> backlinks = new ConcurrentHashMap<GameDataElement, Integer>();
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import com.gpl.rpg.atcontentstudio.Notification;
|
|||||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarksRoot;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
||||||
@@ -87,6 +88,8 @@ public class Project implements ProjectTreeNode, Serializable {
|
|||||||
public GameSource referencedContent; //Pointers to base content
|
public GameSource referencedContent; //Pointers to base content
|
||||||
public transient GameSource alteredContent; //Copied from base content (does not overwrite yet)
|
public transient GameSource alteredContent; //Copied from base content (does not overwrite yet)
|
||||||
public transient GameSource createdContent; //Stand-alone.
|
public transient GameSource createdContent; //Stand-alone.
|
||||||
|
public transient BookmarksRoot bookmarks;
|
||||||
|
|
||||||
|
|
||||||
public SavedGamesSet saves; //For simulations.
|
public SavedGamesSet saves; //For simulations.
|
||||||
|
|
||||||
@@ -135,6 +138,7 @@ public class Project implements ProjectTreeNode, Serializable {
|
|||||||
|
|
||||||
alteredContent = new GameSource(this, GameSource.Type.altered);
|
alteredContent = new GameSource(this, GameSource.Type.altered);
|
||||||
createdContent = new GameSource(this, GameSource.Type.created);
|
createdContent = new GameSource(this, GameSource.Type.created);
|
||||||
|
bookmarks = new BookmarksRoot(this);
|
||||||
|
|
||||||
saves = new SavedGamesSet(this);
|
saves = new SavedGamesSet(this);
|
||||||
|
|
||||||
@@ -143,6 +147,7 @@ public class Project implements ProjectTreeNode, Serializable {
|
|||||||
// v.add(referencedContent);
|
// v.add(referencedContent);
|
||||||
v.add(baseContent);
|
v.add(baseContent);
|
||||||
v.add(saves);
|
v.add(saves);
|
||||||
|
v.add(bookmarks);
|
||||||
|
|
||||||
linkAll();
|
linkAll();
|
||||||
|
|
||||||
@@ -262,6 +267,7 @@ public class Project implements ProjectTreeNode, Serializable {
|
|||||||
// referencedContent.refreshTransients(this);
|
// referencedContent.refreshTransients(this);
|
||||||
alteredContent = new GameSource(this, GameSource.Type.altered);
|
alteredContent = new GameSource(this, GameSource.Type.altered);
|
||||||
createdContent = new GameSource(this, GameSource.Type.created);
|
createdContent = new GameSource(this, GameSource.Type.created);
|
||||||
|
bookmarks = new BookmarksRoot(this);
|
||||||
|
|
||||||
saves.refreshTransients();
|
saves.refreshTransients();
|
||||||
|
|
||||||
@@ -271,6 +277,7 @@ public class Project implements ProjectTreeNode, Serializable {
|
|||||||
// v.add(referencedContent);
|
// v.add(referencedContent);
|
||||||
v.add(baseContent);
|
v.add(baseContent);
|
||||||
v.add(saves);
|
v.add(saves);
|
||||||
|
v.add(bookmarks);
|
||||||
|
|
||||||
|
|
||||||
linkAll();
|
linkAll();
|
||||||
@@ -970,6 +977,10 @@ public class Project implements ProjectTreeNode, Serializable {
|
|||||||
fireElementAdded(node, getNodeIndex(node));
|
fireElementAdded(node, getNodeIndex(node));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void bookmark(GameDataElement gde) {
|
||||||
|
bookmarks.addBookmark(gde);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public GameDataSet getDataSet() {
|
||||||
|
|||||||
@@ -0,0 +1,155 @@
|
|||||||
|
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.tree.TreeNode;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
|
||||||
|
|
||||||
|
public class BookmarkEntry implements BookmarkNode {
|
||||||
|
|
||||||
|
public GameDataElement bookmarkedElement;
|
||||||
|
public BookmarkFolder parent;
|
||||||
|
|
||||||
|
public BookmarkEntry(BookmarkFolder parent, GameDataElement target) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.bookmarkedElement = target;
|
||||||
|
target.bookmark = this;
|
||||||
|
parent.contents.add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getAllowsChildren() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getChildAt(int childIndex) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getChildCount() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIndex(TreeNode node) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getParent() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLeaf() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0,this);
|
||||||
|
parent.childrenAdded(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0,this);
|
||||||
|
parent.childrenChanged(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0,this);
|
||||||
|
parent.childrenRemoved(path);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void notifyCreated() {
|
||||||
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDesc() {
|
||||||
|
if (bookmarkedElement instanceof QuestStage) {
|
||||||
|
String text = ((GameDataElement)bookmarkedElement).getDesc();
|
||||||
|
if (text.length() > 60) {
|
||||||
|
text = text.substring(0, 57)+"...";
|
||||||
|
}
|
||||||
|
return ((GameDataElement)bookmarkedElement).getDataType().toString()+"/"+((Quest)((QuestStage)bookmarkedElement).parent).id+"#"+((QuestStage)bookmarkedElement).progress+":"+text;
|
||||||
|
} else {
|
||||||
|
return ((GameDataElement)bookmarkedElement).getDataType().toString()+"/"+((GameDataElement)bookmarkedElement).getDesc();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Project getProject() {
|
||||||
|
return parent.getProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GameDataSet getDataSet() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getIcon() {
|
||||||
|
return bookmarkedElement.getIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getOpenIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getClosedIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getLeafIcon() {
|
||||||
|
return getIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getDataType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsSaving() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete() {
|
||||||
|
bookmarkedElement.bookmark = null;
|
||||||
|
parent.delete(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save() {
|
||||||
|
parent.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.tree.TreeNode;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
public class BookmarkFolder implements BookmarkNode {
|
||||||
|
|
||||||
|
List<BookmarkNode> contents = new LinkedList<BookmarkNode>();
|
||||||
|
BookmarkNode parent;
|
||||||
|
String name;
|
||||||
|
Image closedIcon, openIcon;
|
||||||
|
|
||||||
|
public BookmarkFolder(BookmarkNode parent, String name) {
|
||||||
|
this(parent, name, DefaultIcons.getStdClosedIcon(), DefaultIcons.getStdOpenIcon());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BookmarkFolder(BookmarkNode parent, String name, Image closedIcon, Image openIcon) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.name = name;
|
||||||
|
this.closedIcon = closedIcon;
|
||||||
|
this.openIcon = openIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enumeration<? extends ProjectTreeNode> children() {
|
||||||
|
return Collections.enumeration(contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getAllowsChildren() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getChildAt(int childIndex) {
|
||||||
|
return contents.get(childIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getChildCount() {
|
||||||
|
return contents.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIndex(TreeNode node) {
|
||||||
|
return contents.indexOf(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getParent() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLeaf() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0,this);
|
||||||
|
parent.childrenAdded(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0,this);
|
||||||
|
parent.childrenChanged(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
|
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||||
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
|
} else {
|
||||||
|
path.add(0, this);
|
||||||
|
parent.childrenRemoved(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void notifyCreated() {
|
||||||
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDesc() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Project getProject() {
|
||||||
|
return parent.getProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GameDataSet getDataSet() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getIcon() {
|
||||||
|
return getClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getOpenIcon() {
|
||||||
|
return openIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getClosedIcon() {
|
||||||
|
return closedIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getLeafIcon() {
|
||||||
|
return getClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getDataType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return contents.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsSaving() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(BookmarkEntry bookmarkEntry) {
|
||||||
|
if (contents.contains(bookmarkEntry)) {
|
||||||
|
bookmarkEntry.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
|
contents.remove(bookmarkEntry);
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(BookmarkFolder bookmarkFolder) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
parent.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
|
|
||||||
|
public interface BookmarkNode extends ProjectTreeNode{
|
||||||
|
|
||||||
|
public void save();
|
||||||
|
public void delete();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,210 @@
|
|||||||
|
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.tree.TreeNode;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||||
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
public class BookmarksRoot implements BookmarkNode {
|
||||||
|
|
||||||
|
SavedSlotCollection v = new SavedSlotCollection();
|
||||||
|
|
||||||
|
public transient Project parent = null;
|
||||||
|
|
||||||
|
BookmarkFolder ac, diag, dl, it, ic, npc, q, tmx, sp, wm;
|
||||||
|
|
||||||
|
public BookmarksRoot(Project parent) {
|
||||||
|
this.parent = parent;
|
||||||
|
|
||||||
|
v.add(ac = new BookmarkFolder(this, ActorCondition.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
v.add(diag = new BookmarkFolder(this, Dialogue.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
v.add(dl = new BookmarkFolder(this, Droplist.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
v.add(it = new BookmarkFolder(this, Item.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
v.add(ic = new BookmarkFolder(this, ItemCategory.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
v.add(npc = new BookmarkFolder(this, NPC.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
v.add(q = new BookmarkFolder(this, Quest.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
|
|
||||||
|
v.add(tmx = new BookmarkFolder(this, "TMX Maps", DefaultIcons.getTmxClosedIcon(), DefaultIcons.getTmxOpenIcon()));
|
||||||
|
v.add(sp = new BookmarkFolder(this, "Spritesheets", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||||
|
v.add(wm = new BookmarkFolder(this, "Worldmap", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
|
return v.getNonEmptyElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getAllowsChildren() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getChildAt(int arg0) {
|
||||||
|
return v.getNonEmptyElementAt(arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getChildCount() {
|
||||||
|
return v.getNonEmptySize();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIndex(TreeNode arg0) {
|
||||||
|
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getParent() {
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isLeaf() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0, this);
|
||||||
|
parent.childrenAdded(path);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
|
path.add(0, this);
|
||||||
|
parent.childrenChanged(path);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
|
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||||
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
|
} else {
|
||||||
|
path.add(0, this);
|
||||||
|
parent.childrenRemoved(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void notifyCreated() {
|
||||||
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||||
|
node.notifyCreated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDesc() {
|
||||||
|
return (needsSaving() ? "*" : "")+"Bookmarks";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Project getProject() {
|
||||||
|
return parent == null ? null : parent.getProject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GameDataSet getDataSet() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getIcon() {
|
||||||
|
return getOpenIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getOpenIcon() {
|
||||||
|
return DefaultIcons.getBookmarkOpenIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getClosedIcon() {
|
||||||
|
return DefaultIcons.getBookmarkClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getLeafIcon() {
|
||||||
|
return getClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Type getDataType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return v.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsSaving() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete() {}
|
||||||
|
|
||||||
|
public void addBookmark(GameDataElement target) {
|
||||||
|
BookmarkEntry node;
|
||||||
|
BookmarkFolder folder = null;
|
||||||
|
if (target instanceof ActorCondition) {
|
||||||
|
folder = ac;
|
||||||
|
} else if (target instanceof Dialogue) {
|
||||||
|
folder = diag;
|
||||||
|
} else if (target instanceof Droplist) {
|
||||||
|
folder = dl;
|
||||||
|
} else if (target instanceof Item) {
|
||||||
|
folder = it;
|
||||||
|
} else if (target instanceof ItemCategory) {
|
||||||
|
folder = ic;
|
||||||
|
} else if (target instanceof NPC) {
|
||||||
|
folder = npc;
|
||||||
|
} else if (target instanceof Quest) {
|
||||||
|
folder = q;
|
||||||
|
} else if (target instanceof TMXMap) {
|
||||||
|
folder = tmx;
|
||||||
|
} else if (target instanceof Spritesheet) {
|
||||||
|
folder = sp;
|
||||||
|
} else if (target instanceof WorldmapSegment) {
|
||||||
|
folder = wm;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ProjectTreeNode higherEmptyParent = folder;
|
||||||
|
while (higherEmptyParent != null) {
|
||||||
|
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||||
|
|
||||||
|
node = new BookmarkEntry(folder, target);
|
||||||
|
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||||
|
else node.notifyCreated();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -75,6 +75,14 @@ public class DefaultIcons {
|
|||||||
private static String FOLDER_AT_OPEN_RES = "/com/gpl/rpg/atcontentstudio/img/folder_at_open.png";
|
private static String FOLDER_AT_OPEN_RES = "/com/gpl/rpg/atcontentstudio/img/folder_at_open.png";
|
||||||
public static Image getATOpenImage() { return getImage(FOLDER_AT_OPEN_RES); }
|
public static Image getATOpenImage() { return getImage(FOLDER_AT_OPEN_RES); }
|
||||||
public static Image getATOpenIcon() { return getIcon(FOLDER_AT_OPEN_RES); }
|
public static Image getATOpenIcon() { return getIcon(FOLDER_AT_OPEN_RES); }
|
||||||
|
|
||||||
|
private static String FOLDER_BOOKMARK_CLOSED_RES = "/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png";
|
||||||
|
public static Image getBookmarkClosedImage() { return getImage(FOLDER_BOOKMARK_CLOSED_RES); }
|
||||||
|
public static Image getBookmarkClosedIcon() { return getIcon(FOLDER_BOOKMARK_CLOSED_RES); }
|
||||||
|
|
||||||
|
private static String FOLDER_BOOKMARK_OPEN_RES = "/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png";
|
||||||
|
public static Image getBookmarkOpenImage() { return getImage(FOLDER_BOOKMARK_OPEN_RES); }
|
||||||
|
public static Image getBookmarkOpenIcon() { return getIcon(FOLDER_BOOKMARK_OPEN_RES); }
|
||||||
|
|
||||||
private static String TILED_ICON_RES = "/com/gpl/rpg/atcontentstudio/img/tiled-icon.png";
|
private static String TILED_ICON_RES = "/com/gpl/rpg/atcontentstudio/img/tiled-icon.png";
|
||||||
public static Image getTiledIconImage() { return getImage(TILED_ICON_RES); }
|
public static Image getTiledIconImage() { return getImage(TILED_ICON_RES); }
|
||||||
@@ -276,6 +284,14 @@ public class DefaultIcons {
|
|||||||
public static Image getStatusUnknownImage() { return getImage(STATUS_UNKNOWN_RES); }
|
public static Image getStatusUnknownImage() { return getImage(STATUS_UNKNOWN_RES); }
|
||||||
public static Image getStatusUnknownIcon() { return getIcon(STATUS_UNKNOWN_RES); }
|
public static Image getStatusUnknownIcon() { return getIcon(STATUS_UNKNOWN_RES); }
|
||||||
|
|
||||||
|
private static String BOOKMARK_INACTIVE = "/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png";
|
||||||
|
public static Image getBookmarkInactiveImage() { return getImage(BOOKMARK_INACTIVE); }
|
||||||
|
public static Image getBookmarkInactiveIcon() { return getIcon(BOOKMARK_INACTIVE); }
|
||||||
|
|
||||||
|
private static String BOOKMARK_ACTIVE = "/com/gpl/rpg/atcontentstudio/img/bookmark_active.png";
|
||||||
|
public static Image getBookmarkActiveImage() { return getImage(BOOKMARK_ACTIVE); }
|
||||||
|
public static Image getBookmarkActiveIcon() { return getIcon(BOOKMARK_ACTIVE); }
|
||||||
|
|
||||||
|
|
||||||
private static Image getImage(String res) {
|
private static Image getImage(String res) {
|
||||||
if (imageCache.get(res) == null) {
|
if (imageCache.get(res) == null) {
|
||||||
|
|||||||
@@ -812,7 +812,7 @@ public abstract class Editor extends JPanel implements ProjectElementListener {
|
|||||||
if (text.length() > 60) {
|
if (text.length() > 60) {
|
||||||
text = text.substring(0, 57)+"...";
|
text = text.substring(0, 57)+"...";
|
||||||
}
|
}
|
||||||
label.setText(((GameDataElement)value).getDataType().toString()+"/"+((Quest)((QuestStage)value).parent).id+":"+text);
|
label.setText(((GameDataElement)value).getDataType().toString()+"/"+((Quest)((QuestStage)value).parent).id+"#"+((QuestStage)value).progress+":"+text);
|
||||||
} else {
|
} else {
|
||||||
label.setText(((GameDataElement)value).getDataType().toString()+"/"+((GameDataElement)value).getDesc());
|
label.setText(((GameDataElement)value).getDataType().toString()+"/"+((GameDataElement)value).getDesc());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import com.gpl.rpg.andorstrainer.AndorsTrainer;
|
|||||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarkEntry;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||||
@@ -595,6 +596,8 @@ public class ProjectsTree extends JPanel {
|
|||||||
ATContentStudio.frame.openEditor((WorldmapSegment)node);
|
ATContentStudio.frame.openEditor((WorldmapSegment)node);
|
||||||
} else if (node instanceof WriterModeData) {
|
} else if (node instanceof WriterModeData) {
|
||||||
ATContentStudio.frame.openEditor((WriterModeData)node);
|
ATContentStudio.frame.openEditor((WriterModeData)node);
|
||||||
|
} else if (node instanceof BookmarkEntry) {
|
||||||
|
ATContentStudio.frame.openEditor(((BookmarkEntry)node).bookmarkedElement);
|
||||||
} else if (node instanceof SavedGame) {
|
} else if (node instanceof SavedGame) {
|
||||||
if (konamiCodeEntered) {
|
if (konamiCodeEntered) {
|
||||||
ATContentStudio.frame.openEditor((SavedGame)node);
|
ATContentStudio.frame.openEditor((SavedGame)node);
|
||||||
|
|||||||
@@ -213,6 +213,8 @@ public class StudioFrame extends JFrame {
|
|||||||
openEditor((Spritesheet) node);
|
openEditor((Spritesheet) node);
|
||||||
} else if (node instanceof TMXMap) {
|
} else if (node instanceof TMXMap) {
|
||||||
openEditor((TMXMap) node);
|
openEditor((TMXMap) node);
|
||||||
|
} else if (node instanceof WorldmapSegment) {
|
||||||
|
openEditor((WorldmapSegment) node);
|
||||||
} else if (node instanceof WriterModeData) {
|
} else if (node instanceof WriterModeData) {
|
||||||
openEditor((WriterModeData) node);
|
openEditor((WriterModeData) node);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ public abstract class JSONElementEditor extends Editor {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
savePane.add(delete, JideBoxLayout.FIX);
|
savePane.add(delete, JideBoxLayout.FIX);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (proj.alteredContent.gameData.getGameDataElement(concreteNodeClass, node.id) != null) {
|
if (proj.alteredContent.gameData.getGameDataElement(concreteNodeClass, node.id) != null) {
|
||||||
savePane.add(message = new JLabel(ALTERED_EXISTS_MESSAGE), JideBoxLayout.FIX);
|
savePane.add(message = new JLabel(ALTERED_EXISTS_MESSAGE), JideBoxLayout.FIX);
|
||||||
@@ -242,8 +243,10 @@ public abstract class JSONElementEditor extends Editor {
|
|||||||
}
|
}
|
||||||
JButton prev = new JButton(new ImageIcon(DefaultIcons.getArrowLeftIcon()));
|
JButton prev = new JButton(new ImageIcon(DefaultIcons.getArrowLeftIcon()));
|
||||||
JButton next = new JButton(new ImageIcon(DefaultIcons.getArrowRightIcon()));
|
JButton next = new JButton(new ImageIcon(DefaultIcons.getArrowRightIcon()));
|
||||||
|
final JButton bookmark = new JButton(new ImageIcon(node.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
savePane.add(prev, JideBoxLayout.FIX);
|
savePane.add(prev, JideBoxLayout.FIX);
|
||||||
savePane.add(next, JideBoxLayout.FIX);
|
savePane.add(next, JideBoxLayout.FIX);
|
||||||
|
savePane.add(bookmark, JideBoxLayout.FIX);
|
||||||
if (node.getParent().getIndex(node) == 0) {
|
if (node.getParent().getIndex(node) == 0) {
|
||||||
prev.setEnabled(false);
|
prev.setEnabled(false);
|
||||||
}
|
}
|
||||||
@@ -268,6 +271,20 @@ public abstract class JSONElementEditor extends Editor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
bookmark.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if (node.bookmark == null) {
|
||||||
|
node.getProject().bookmark(node);
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon()));
|
||||||
|
} else {
|
||||||
|
node.bookmark.delete();
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
//Placeholder. Fills the eventual remaining space.
|
//Placeholder. Fills the eventual remaining space.
|
||||||
savePane.add(new JPanel(), JideBoxLayout.VARY);
|
savePane.add(new JPanel(), JideBoxLayout.VARY);
|
||||||
pane.add(savePane, JideBoxLayout.FIX);
|
pane.add(savePane, JideBoxLayout.FIX);
|
||||||
|
|||||||
@@ -1779,6 +1779,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
savePane.add(delete, JideBoxLayout.FIX);
|
savePane.add(delete, JideBoxLayout.FIX);
|
||||||
|
final JButton bookmark = new JButton(new ImageIcon(map.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
savePane.add(bookmark, JideBoxLayout.FIX);
|
||||||
|
bookmark.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if (map.bookmark == null) {
|
||||||
|
map.getProject().bookmark(map);
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon()));
|
||||||
|
} else {
|
||||||
|
map.bookmark.delete();
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
if (proj.getMap(map.id) != map) {
|
if (proj.getMap(map.id) != map) {
|
||||||
savePane.add(message = new JLabel(ALTERED_EXISTS_MESSAGE), JideBoxLayout.FIX);
|
savePane.add(message = new JLabel(ALTERED_EXISTS_MESSAGE), JideBoxLayout.FIX);
|
||||||
@@ -1842,6 +1856,20 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
final JButton bookmark = new JButton(new ImageIcon(map.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
savePane.add(bookmark, JideBoxLayout.FIX);
|
||||||
|
bookmark.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if (map.bookmark == null) {
|
||||||
|
map.getProject().bookmark(map);
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon()));
|
||||||
|
} else {
|
||||||
|
map.bookmark.delete();
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
//Placeholder. Fills the eventual remaining space.
|
//Placeholder. Fills the eventual remaining space.
|
||||||
savePane.add(new JPanel(), JideBoxLayout.VARY);
|
savePane.add(new JPanel(), JideBoxLayout.VARY);
|
||||||
pane.add(savePane, JideBoxLayout.FIX);
|
pane.add(savePane, JideBoxLayout.FIX);
|
||||||
|
|||||||
@@ -986,6 +986,20 @@ public class WorldMapEditor extends Editor implements FieldUpdateListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
final JButton bookmark = new JButton(new ImageIcon(node.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
savePane.add(bookmark, JideBoxLayout.FIX);
|
||||||
|
bookmark.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if (node.bookmark == null) {
|
||||||
|
node.getProject().bookmark(node);
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon()));
|
||||||
|
} else {
|
||||||
|
node.bookmark.delete();
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
//Placeholder. Fills the eventual remaining space.
|
//Placeholder. Fills the eventual remaining space.
|
||||||
savePane.add(new JPanel(), JideBoxLayout.VARY);
|
savePane.add(new JPanel(), JideBoxLayout.VARY);
|
||||||
return savePane;
|
return savePane;
|
||||||
|
|||||||
@@ -100,6 +100,20 @@ public class SpritesheetEditor extends Editor {
|
|||||||
});
|
});
|
||||||
buttonPane.add(openImage, JideBoxLayout.FIX);
|
buttonPane.add(openImage, JideBoxLayout.FIX);
|
||||||
buttonPane.add(getWarningLabel(), JideBoxLayout.FIX);
|
buttonPane.add(getWarningLabel(), JideBoxLayout.FIX);
|
||||||
|
final JButton bookmark = new JButton(new ImageIcon(sheet.bookmark != null ? DefaultIcons.getBookmarkActiveIcon() : DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
buttonPane.add(bookmark, JideBoxLayout.FIX);
|
||||||
|
bookmark.addActionListener(new ActionListener() {
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if (target.bookmark == null) {
|
||||||
|
target.getProject().bookmark(target);
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkActiveIcon()));
|
||||||
|
} else {
|
||||||
|
target.bookmark.delete();
|
||||||
|
bookmark.setIcon(new ImageIcon(DefaultIcons.getBookmarkInactiveIcon()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
buttonPane.add(new JPanel(), JideBoxLayout.VARY);
|
buttonPane.add(new JPanel(), JideBoxLayout.VARY);
|
||||||
pane.add(buttonPane, JideBoxLayout.FIX);
|
pane.add(buttonPane, JideBoxLayout.FIX);
|
||||||
addLabelField(pane, "Spritesheet ID: ", sheet.id);
|
addLabelField(pane, "Spritesheet ID: ", sheet.id);
|
||||||
|
|||||||
Reference in New Issue
Block a user