diff --git a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java index 8601a9c..537202f 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/sprites/SpriteChooser.java @@ -1,43 +1,34 @@ package com.gpl.rpg.atcontentstudio.ui.sprites; -import java.awt.BorderLayout; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Image; -import java.awt.Point; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - -import javax.swing.ButtonGroup; -import javax.swing.ImageIcon; -import javax.swing.JDialog; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JToggleButton; -import javax.swing.ScrollPaneConstants; +import javax.swing.*; import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet.Category; +import com.gpl.rpg.atcontentstudio.utils.SpriteUtils; public class SpriteChooser extends JDialog { private static final long serialVersionUID = -6018113265015159521L; - + private static final int STD_WIDTH = 32; private static final int STD_HEIGHT = 32; private static final int MAX_PER_ROW = 10; - - public static Map> cache = new LinkedHashMap>(); - public static Map>> cacheValidator = new LinkedHashMap>>(); - - + + public static Map> cache = new LinkedHashMap>(); + public static Map>> cacheValidator = new LinkedHashMap>>(); + + public static SpriteChooser getChooser(Project proj, Spritesheet.Category category) { if (cache.get(proj) == null) { cache.put(proj, new LinkedHashMap()); @@ -46,13 +37,13 @@ public class SpriteChooser extends JDialog { cache.get(proj).put(category, new SpriteChooser(proj, category)); } else { List spritesheets = new ArrayList(); - for (int i=0; i spritesheets = new ArrayList(); - for (int i=0; i>()); } cacheValidator.get(proj).put(category, spritesheets); - - + + JPanel pane = new JPanel(); pane.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); @@ -101,16 +92,19 @@ public class SpriteChooser extends JDialog { c.gridheight = 1; c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.BOTH; - + List reservedSlots = new ArrayList(); Point nextFreeSlot = new Point(0, 0); - + int i; - Image img; + BufferedImage img; group = new ButtonGroup(); for (Spritesheet sheet : spritesheets) { - i = 0; - while ((img = sheet.getImage(i)) != null) { + i = -1; + while ((img = sheet.getImage(++i)) != null) { + if (SpriteUtils.checkIsImageEmpty(img)) { + continue; + } IconButton button = new IconButton(img, sheet.id, i); group.add(button); if (sheet.spriteWidth == STD_WIDTH && sheet.spriteHeight == STD_HEIGHT) { @@ -120,7 +114,7 @@ public class SpriteChooser extends JDialog { c.gridx = 0; c.gridy++; } - nextFreeSlot.setLocation(c.gridx, c.gridy); + nextFreeSlot.setLocation(c.gridx, c.gridy); } else { c.gridwidth = (sheet.spriteWidth / STD_WIDTH) + (sheet.spriteWidth % STD_WIDTH == 0 ? 0 : 1); c.gridheight = (sheet.spriteHeight / STD_HEIGHT) + (sheet.spriteHeight % STD_HEIGHT == 0 ? 0 : 1); @@ -157,15 +151,14 @@ public class SpriteChooser extends JDialog { c.gridx = 0; c.gridy++; } - nextFreeSlot.setLocation(c.gridx, c.gridy); + nextFreeSlot.setLocation(c.gridx, c.gridy); } - i++; } } - + // ok = new JButton("Ok"); // cancel = new JButton("Cancel"); - + c.gridx = 0; boolean emptyLine = false; while (!emptyLine) { @@ -178,7 +171,7 @@ public class SpriteChooser extends JDialog { } } } - + // JPanel buttonPane = new JPanel(); // buttonPane.add(cancel, BorderLayout.WEST); // buttonPane.add(ok, BorderLayout.EAST); @@ -190,7 +183,7 @@ public class SpriteChooser extends JDialog { scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); wrapper.add(scroller, BorderLayout.CENTER); // wrapper.add(buttonPane, BorderLayout.SOUTH); - + // ok.addActionListener(new ActionListener() { // @Override // public void actionPerformed(ActionEvent e) { @@ -200,7 +193,7 @@ public class SpriteChooser extends JDialog { // if (listener != null) listener.iconSelected(selectedIconId); // } // }); - + // cancel.addActionListener(new ActionListener() { // @Override // public void actionPerformed(ActionEvent e) { @@ -210,21 +203,21 @@ public class SpriteChooser extends JDialog { // if (listener != null) listener.iconSelected(null); // } // }); - + setContentPane(wrapper); } - + private SpriteChooser.SelectionListener listener = null; - + public void setSelectionListener(SpriteChooser.SelectionListener l) { listener = l; } - - + + public class IconButton extends JToggleButton { - + private static final long serialVersionUID = 7559407153561178455L; - + public String sheetId; public int spriteIndex; @@ -232,12 +225,12 @@ public class SpriteChooser extends JDialog { super(new ImageIcon(img)); this.sheetId = sheetId; this.spriteIndex = spriteIndex; - setToolTipText(sheetId+":"+spriteIndex); + setToolTipText(sheetId + ":" + spriteIndex); addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (IconButton.this.isSelected()) { - selectedIconId = IconButton.this.sheetId+":"+IconButton.this.spriteIndex; + selectedIconId = IconButton.this.sheetId + ":" + IconButton.this.spriteIndex; SpriteChooser.this.setVisible(false); SpriteChooser.this.dispose(); if (listener != null) listener.iconSelected(selectedIconId); @@ -246,9 +239,9 @@ public class SpriteChooser extends JDialog { }); } } - + public static interface SelectionListener { public void iconSelected(String selected); } - + } diff --git a/src/com/gpl/rpg/atcontentstudio/utils/SpriteUtils.java b/src/com/gpl/rpg/atcontentstudio/utils/SpriteUtils.java new file mode 100644 index 0000000..05af148 --- /dev/null +++ b/src/com/gpl/rpg/atcontentstudio/utils/SpriteUtils.java @@ -0,0 +1,34 @@ +package com.gpl.rpg.atcontentstudio.utils; + +import java.awt.image.BufferedImage; +import java.awt.image.WritableRaster; + +public final class SpriteUtils { + + /** + * Check if the image is empty (transparent ) + * + * @param img The image to check + * @return true if the image is empty + */ + public static boolean checkIsImageEmpty(BufferedImage img) { + int width = img.getWidth(null); + int height = img.getHeight(null); + WritableRaster raster = img.getAlphaRaster(); + if (raster == null) { + return false; + } + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + //get pixel alpha value + int alpha = raster.getSample(x, y, 0); + //if alpha is not 0 then the pixel is not transparent + if (alpha != 0) { + return false; + } + } + } + //no non-transparent pixel found + return true; + } +}