203 lines
7.6 KiB
Java
203 lines
7.6 KiB
Java
package net.machinemuse.general.gui.frame;
|
|
|
|
import net.machinemuse.api.IPowerModule;
|
|
import net.machinemuse.api.ModuleManager;
|
|
import net.machinemuse.general.gui.clickable.ClickableItem;
|
|
import net.machinemuse.general.gui.clickable.ClickableModule;
|
|
import net.machinemuse.general.sound.SoundDictionary;
|
|
import net.machinemuse.numina.geometry.Colour;
|
|
import net.machinemuse.numina.geometry.MusePoint2D;
|
|
import net.machinemuse.numina.geometry.MuseRect;
|
|
import net.machinemuse.numina.geometry.MuseRelativeRect;
|
|
import net.machinemuse.numina.sound.Musique;
|
|
import net.machinemuse.utils.render.MuseRenderer;
|
|
import org.lwjgl.opengl.GL11;
|
|
|
|
import java.util.*;
|
|
|
|
public class ModuleSelectionFrame extends ScrollableFrame {
|
|
protected ItemSelectionFrame target;
|
|
protected Map<String, ModuleSelectionSubFrame> categories;
|
|
protected List<ClickableModule> moduleButtons;
|
|
protected int selectedModule = -1;
|
|
protected IPowerModule prevSelection;
|
|
protected ClickableItem lastItem;
|
|
protected MuseRect lastPosition;
|
|
|
|
public ModuleSelectionFrame(MusePoint2D topleft, MusePoint2D bottomright,
|
|
Colour borderColour, Colour insideColour, ItemSelectionFrame target) {
|
|
super(topleft, bottomright, borderColour, insideColour);
|
|
this.target = target;
|
|
|
|
moduleButtons = new ArrayList<ClickableModule>();
|
|
categories = new HashMap<String, ModuleSelectionSubFrame>();
|
|
}
|
|
|
|
@Override
|
|
public void update(double mousex, double mousey) {
|
|
super.update(mousex, mousey);
|
|
}
|
|
|
|
@Override
|
|
public void draw() {
|
|
for (ModuleSelectionSubFrame frame : categories.values()) {
|
|
frame.refreshButtonPositions();
|
|
}
|
|
if (target.getSelectedItem() != null) {
|
|
if (lastItem != target.getSelectedItem()) {
|
|
loadModules();
|
|
}
|
|
this.totalsize = 0;
|
|
for (ModuleSelectionSubFrame frame : categories.values()) {
|
|
totalsize = (int) Math.max(frame.border.bottom() - this.border.top(), totalsize);
|
|
}
|
|
this.currentscrollpixels = Math.min(currentscrollpixels, getMaxScrollPixels());
|
|
|
|
super.preDraw();
|
|
GL11.glPushMatrix();
|
|
GL11.glTranslatef(0, -currentscrollpixels, 0);
|
|
drawItems();
|
|
drawSelection();
|
|
GL11.glPopMatrix();
|
|
super.postDraw();
|
|
}
|
|
}
|
|
|
|
private void drawItems() {
|
|
for (ModuleSelectionSubFrame frame : categories.values()) {
|
|
frame.drawPartial((int) (this.currentscrollpixels + border.top() + 4),
|
|
(int) (this.currentscrollpixels + border.top() + border.height() - 4));
|
|
}
|
|
}
|
|
|
|
private void drawSelection() {
|
|
ClickableModule module = getSelectedModule();
|
|
if (module != null) {
|
|
MusePoint2D pos = moduleButtons.get(selectedModule).getPosition();
|
|
if (pos.y() > this.currentscrollpixels + border.top() + 4 && pos.y() < this.currentscrollpixels + border.top() + border.height() - 4) {
|
|
MuseRenderer.drawCircleAround(pos.x(), pos.y(), 10);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public ClickableModule getSelectedModule() {
|
|
if (moduleButtons.size() > selectedModule && selectedModule != -1) {
|
|
return moduleButtons.get(selectedModule);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public void loadModules() {
|
|
this.lastPosition = null;
|
|
ClickableItem selectedItem = target.getSelectedItem();
|
|
if (selectedItem != null) {
|
|
moduleButtons = new ArrayList<ClickableModule>();
|
|
categories = new HashMap<String, ModuleSelectionSubFrame>();
|
|
|
|
List<IPowerModule> workingModules = ModuleManager.getValidModulesForItem(null, selectedItem.getItem());
|
|
|
|
// Prune the list of disallowed modules, if not installed on this
|
|
// item.
|
|
for (Iterator<IPowerModule> it = workingModules.iterator(); it.hasNext(); ) {
|
|
IPowerModule module = it.next();
|
|
if (module.isAllowed() == false &&
|
|
ModuleManager.itemHasModule(selectedItem.getItem(), module.getDataName()) == false) {
|
|
it.remove();
|
|
}
|
|
}
|
|
|
|
if (workingModules.size() > 0) {
|
|
this.selectedModule = -1;
|
|
for (IPowerModule module : workingModules) {
|
|
ModuleSelectionSubFrame frame = getOrCreateCategory(module.getCategory());
|
|
ClickableModule moduleClickable = frame.addModule(module);
|
|
// Indicate installed modules
|
|
if (!module.isAllowed()) {
|
|
// If a disallowed module made it to the list, indicate
|
|
// it as disallowed
|
|
moduleClickable.setAllowed(false);
|
|
} else if (ModuleManager.itemHasModule(selectedItem.getItem(), module.getDataName())) {
|
|
moduleClickable.setInstalled(true);
|
|
}
|
|
if (moduleClickable.getModule().equals(this.prevSelection)) {
|
|
this.selectedModule = moduleButtons.size();
|
|
}
|
|
moduleButtons.add(moduleClickable);
|
|
}
|
|
}
|
|
for (ModuleSelectionSubFrame frame : categories.values()) {
|
|
frame.refreshButtonPositions();
|
|
}
|
|
}
|
|
}
|
|
|
|
private ModuleSelectionSubFrame getOrCreateCategory(String category) {
|
|
if (categories.containsKey(category)) {
|
|
return categories.get(category);
|
|
} else {
|
|
MuseRelativeRect position = new MuseRelativeRect(
|
|
border.left() + 4,
|
|
border.top() + 4,
|
|
border.right() - 4,
|
|
border.top() + 32);
|
|
position.setBelow(lastPosition);
|
|
lastPosition = position;
|
|
ModuleSelectionSubFrame frame = new ModuleSelectionSubFrame(
|
|
category,
|
|
position);
|
|
|
|
categories.put(category, frame);
|
|
return frame;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onMouseDown(double x, double y, int button) {
|
|
super.onMouseDown(x, y, button);
|
|
if (border.left() < x && border.right() > x && border.top() < y && border.bottom() > y) {
|
|
y += currentscrollpixels;
|
|
// loadModules();
|
|
int i = 0;
|
|
for (ClickableModule module : moduleButtons) {
|
|
if (module.hitBox(x, y)) {
|
|
Musique.playClientSound(SoundDictionary.SOUND_GUI_SELECT, 1);
|
|
selectedModule = i;
|
|
prevSelection = module.getModule();
|
|
break;
|
|
} else {
|
|
i++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public List<String> getToolTip(int x, int y) {
|
|
if (border.left() < x && border.right() > x && border.top() < y && border.bottom() > y) {
|
|
y += currentscrollpixels;
|
|
if (moduleButtons != null) {
|
|
int moduleHover = -1;
|
|
int i = 0;
|
|
for (ClickableModule module : moduleButtons) {
|
|
if (module.hitBox(x, y)) {
|
|
moduleHover = i;
|
|
break;
|
|
} else {
|
|
i++;
|
|
}
|
|
}
|
|
if (moduleHover > -1) {
|
|
return moduleButtons.get(moduleHover).getToolTip();
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
}
|