package com.badlogic.gdx.tools.flame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSeparator; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.utils.Array; /** @author Inferno */ public class RegionPickerPanel extends JPanel{ private enum GenerationMode { ByRows("Generate By Rows"), ByColumns("Generate By Columns"); String string; private GenerationMode(String string){ this.string = string; } @Override public String toString () { return string; } } public interface Listener{ void onRegionsSelected(Array<TextureRegion> regions); } TextureAtlasPanel atlasPanel; TexturePanel texturePanel; JButton selectButton, selectAllButton, clearButton, generateButton, reverseButton; JComboBox generateBox; Slider rowSlider, columnSlider; JPanel generationPanel, content; Listener listener; public RegionPickerPanel(Listener listener){ initializeComponents(); this.listener = listener; } private void initializeComponents () { setLayout(new GridBagLayout()); content = new JPanel(); atlasPanel = new TextureAtlasPanel(); texturePanel = new TexturePanel(); CustomCardLayout cardLayout = new CustomCardLayout(); content.setLayout(cardLayout); content.add(atlasPanel, "atlas"); content.add(texturePanel, "texture"); add(content, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); JPanel controls = new JPanel(new GridBagLayout()); controls.add(selectButton = new JButton("Select"), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); controls.add(new JSeparator(JSeparator.HORIZONTAL), new GridBagConstraints(0, -1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 6, 0), 0, 0)); //Pick JPanel pickPanel = new JPanel(new GridBagLayout()); pickPanel.add(selectAllButton = new JButton("Pick All"), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); pickPanel.add(clearButton = new JButton("Clear Selection"), new GridBagConstraints(1, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); pickPanel.add(reverseButton = new JButton("Reverse Selection"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); controls.add(pickPanel, new GridBagConstraints(0, -1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); //Generation generationPanel = new JPanel(new GridBagLayout()); generationPanel.add(new JLabel("Rows"), new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); generationPanel.add(rowSlider = new Slider(1, 1, 9999, 1), new GridBagConstraints(1, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); generationPanel.add(new JLabel("Columns"), new GridBagConstraints(0, 1, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); generationPanel.add(columnSlider = new Slider(1, 1, 9999, 1), new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); generationPanel.add(generateBox = new JComboBox(new DefaultComboBoxModel(GenerationMode.values())), new GridBagConstraints(0, 2, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); generationPanel.add(generateButton = new JButton("Generate"), new GridBagConstraints(1, 2, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); controls.add(new JSeparator(JSeparator.HORIZONTAL), new GridBagConstraints(0, -1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 6, 0), 0, 0)); controls.add(generationPanel, new GridBagConstraints(0, -1, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); add(controls, new GridBagConstraints(1, 0, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); selectButton.addActionListener(new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { JPanel panel = ((CustomCardLayout)content.getLayout()).getCurrentCard(content); TexturePanel currentTexturePanel = panel == atlasPanel ? atlasPanel.getCurrentRegionPanel() : texturePanel; listener.onRegionsSelected(currentTexturePanel.selectedRegions); } }); selectAllButton.addActionListener(new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { JPanel panel = ((CustomCardLayout)content.getLayout()).getCurrentCard(content); TexturePanel currentTexturePanel = panel == atlasPanel ? atlasPanel.getCurrentRegionPanel() : texturePanel; currentTexturePanel.selectAll(); } }); reverseButton.addActionListener(new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { JPanel panel = ((CustomCardLayout)content.getLayout()).getCurrentCard(content); TexturePanel currentTexturePanel = panel == atlasPanel ? atlasPanel.getCurrentRegionPanel() : texturePanel; currentTexturePanel.selectedRegions.reverse(); currentTexturePanel.revalidate(); currentTexturePanel.repaint(); } }); clearButton.addActionListener(new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { JPanel panel = ((CustomCardLayout)content.getLayout()).getCurrentCard(content); TexturePanel currentPanel = panel == atlasPanel ? atlasPanel.getCurrentRegionPanel() : texturePanel; currentPanel.clearSelection(); } }); generateButton.addActionListener(new ActionListener() { @Override public void actionPerformed (ActionEvent arg0) { generateRegions((GenerationMode)generateBox.getSelectedItem()); texturePanel.revalidate(); texturePanel.repaint(); } }); } void generateRegions(GenerationMode mode){ //generate regions texturePanel.clear(); Texture texture = texturePanel.getTexture(); int rows = (int)rowSlider.getValue(), columns = (int)columnSlider.getValue(), yOffset = texture.getHeight()/rows, xOffset = texture.getWidth()/columns; if(mode == GenerationMode.ByRows){ for(int j=0; j < rows; ++j){ int rowOffset = j*yOffset; for(int i=0; i < columns; ++i){ texturePanel.unselectedRegions.add(new TextureRegion(texture, i*xOffset, rowOffset, xOffset, yOffset) ); } } } else if(mode == GenerationMode.ByColumns){ for(int i=0; i < columns; ++i){ int columnOffset = i*xOffset; for(int j=0; j <rows; ++j){ texturePanel.unselectedRegions.add(new TextureRegion(texture, columnOffset, j*yOffset, xOffset, yOffset) ); } } } } public void setAtlas (TextureAtlas atlas) { atlasPanel.clearSelection(); atlasPanel.setAtlas(atlas); CustomCardLayout cardLayout = (CustomCardLayout)content.getLayout(); cardLayout.show(content, "atlas"); showGenerationPanel(false); content.revalidate(); content.repaint(); revalidate(); repaint(); } public void setTexture(Texture texture){ texturePanel.clearSelection(); texturePanel.setTexture(texture); CustomCardLayout cardLayout = (CustomCardLayout)content.getLayout(); cardLayout.show(content, "texture"); showGenerationPanel(true); content.revalidate(); content.repaint(); revalidate(); repaint(); } private void showGenerationPanel(boolean isShown){ generationPanel.setVisible(isShown); } }