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);
}
}