package tk.amberide.ide.gui.editor.map.res;
import tk.amberide.Amber;
import tk.amberide.ide.data.res.Resource;
import tk.amberide.engine.gl.model.obj.WavefrontObject;
import tk.amberide.ide.gui.editor.map.MapContext;
import tk.amberide.ide.gui.misc.ErrorHandler;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
/**
*
* @author Tudor
*/
public class ModelSelector extends JPanel {
protected ButtonGroup group = new ButtonGroup();
protected int index = 0;
protected JPanel holder = new JPanel();
protected MapContext context;
public ModelSelector(MapContext context) {
this.context = context;
setLayout(new BorderLayout());
JScrollPane scroller = new JScrollPane(holder);
scroller.setBorder(BorderFactory.createEmptyBorder());
holder.setLayout(new GridLayout(0, 3));
scroller.getVerticalScrollBar().setUnitIncrement(16);
add(scroller, BorderLayout.NORTH);
}
public void addModel(WavefrontObject model, String name) {
addModel(new ImageIcon(ModelThumbnail.getModelImage(model, 60, 60)), model, name);
}
private void addModel(final ImageIcon icon, final WavefrontObject model, final String name) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JToggleButton button = new JToggleButton();
button.setSize(85, 85);
button.setMargin(new Insets(2, 2, 2, 2));
button.setMaximumSize(new Dimension(85, 85));
button.setMinimumSize(new Dimension(85, 85));
button.setPreferredSize(new Dimension(85, 85));
button.setIcon(icon);
button.addActionListener(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
if (context.EXT_modelSelectionSupported) {
context.EXT_modelSelection = model;
}
}
});
button.setToolTipText(String.format(
"<html>"
+ "<b>%s</b>"
+ "<br/>"
+ " %s vertices"
+ "<br/>"
+ " %s normals"
+ "<br/>"
+ "<br/>"
+ " %s textures"
+ "<br/>"
+ " %s groups"
+ "<br/>"
+ " %s materials"
+ "</html>",
name,
model.getVertices().size(),
model.getNormals().size(),
model.getGroups().size(),
model.getMaterials().size(),
model.getTextures().size()));
group.add(button);
holder.add(button);
holder.revalidate();
}
});
}
public void synchronize() {
group = new ButtonGroup();
holder.removeAll();
new Thread("Model thumbnail generator") {
@Override
public void run() {
for (Resource<WavefrontObject> model : Amber.getResourceManager().getModels()) {
try {
addModel(model.get(), model.getName());
} catch (Exception ex) {
ErrorHandler.alert(ex);
}
}
}
}.start();
}
}