package com.badlogic.gdx.tools.flame; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.graphics.glutils.FileTextureData; import com.badlogic.gdx.utils.Array; /** @author Inferno */ public class TexturePanel extends ImagePanel { private Color selectedColor = Color.GREEN, unselectedColor = Color.BLUE, indexBackgroundColor = Color.BLACK, indexColor = Color.WHITE; Array<TextureRegion> selectedRegions; Array<TextureRegion> unselectedRegions; Texture texture; public TexturePanel(){ selectedRegions = new Array<TextureRegion>(); unselectedRegions = new Array<TextureRegion>(); addMouseListener(new MouseAdapter() { public void mouseClicked (MouseEvent event) { float x = event.getX(), y = event.getY(); for(TextureRegion region : unselectedRegions){ if(isInsideRegion(region, x, y)){ select(region); return; } } for(TextureRegion region : selectedRegions){ if(isInsideRegion(region, x, y)){ unselect(region); return; } } } }); } protected boolean isInsideRegion (TextureRegion region, float x, float y) { float rx = region.getRegionX(), ry = region.getRegionY(); return rx <= x && x <= rx +region.getRegionWidth() && ry <= y && y <= ry +region.getRegionHeight(); } public TexturePanel(Texture texture, Array<TextureRegion> regions){ this(); setTexture(texture); setRegions(regions); } public void setTexture(Texture texture){ if(this.texture == texture) return; this.texture = texture; FileTextureData data = (FileTextureData)texture.getTextureData(); setImage(data.getFileHandle().file().getAbsolutePath()); } public Texture getTexture(){ return texture; } public void clear(){ selectedRegions.clear(); unselectedRegions.clear(); } public void clearSelection(){ unselectedRegions.addAll(selectedRegions); selectedRegions.clear(); repaint(); } public void setRegions(Array<TextureRegion> regions){ unselectedRegions.clear(); selectedRegions.clear(); unselectedRegions.addAll(regions); } private void swap(TextureRegion region, Array<TextureRegion> src, Array<TextureRegion> dst) { int index = src.indexOf(region, true); if(index > -1){ src.removeIndex(index); dst.add(region); repaint(); } } public void select(TextureRegion region){ swap(region, unselectedRegions, selectedRegions); } public void unselect(TextureRegion region){ swap(region, selectedRegions, unselectedRegions); } public void selectAll () { selectedRegions.addAll(unselectedRegions); unselectedRegions.clear(); repaint(); } @Override protected void paintComponent (Graphics g) { super.paintComponent(g); draw(g, unselectedRegions, unselectedColor, false); draw(g, selectedRegions, selectedColor, true); } private void draw (Graphics g, Array<TextureRegion> regions, Color color, boolean drawIndex) { int i=0; for(TextureRegion region : regions){ int x = region.getRegionX(), y = region.getRegionY(), h = region.getRegionHeight(); if(drawIndex){ String indexString = ""+i; Rectangle bounds = g.getFontMetrics().getStringBounds(indexString, g).getBounds(); g.setColor(indexBackgroundColor); g.fillRect(x, y+h-bounds.height, bounds.width, bounds.height); g.setColor(indexColor); g.drawString(indexString, x, y+h); ++i; } g.setColor(color); g.drawRect(x, y, region.getRegionWidth(), h); } } }