package org.codecranachan.asteroidpush.base.ui.workshop; import java.util.Vector; import org.codecranachan.asteroidpush.base.ui.widget.BasicWidget; import org.codecranachan.asteroidpush.base.ui.widget.Label; import org.codecranachan.asteroidpush.base.workshop.PartFactory; import org.codecranachan.asteroidpush.base.workshop.WorkshopCoordinator; import org.newdawn.slick.Color; import org.newdawn.slick.Font; import org.newdawn.slick.Graphics; import org.newdawn.slick.Input; import org.newdawn.slick.geom.Rectangle; import org.newdawn.slick.geom.Vector2f; public class SelectorWidget extends BasicWidget { private WorkshopCoordinator coordinator; private Label itemLabel; public SelectorWidget(WorkshopCoordinator coordinator, Font font) { this.coordinator = coordinator; this.itemLabel = new Label(); itemLabel.setFont(font); } @Override public void render(Graphics g) { if (getFrame() == null) { return; } Vector<PartFactory> factories = coordinator.getAvailablePartFactories(); for (int index = 0; index < factories.size(); index++) { itemLabel.resize(getItemFrame(index)); itemLabel.setText(factories.get(index).getName()); if (coordinator.getSelectedPartFactory() == factories.get(index)) { itemLabel.setBackgroundColor(Color.blue); itemLabel.setForegroundColor(Color.black); } else { itemLabel.setBackgroundColor(Color.black); itemLabel.setForegroundColor(Color.white); } if (getHoveredIndex() == index) { itemLabel.setBorderColor(Color.white); } else { itemLabel.setBorderColor(Color.blue); } itemLabel.render(g); } } private Rectangle getItemFrame(int index) { float itemHeight = getItemHeight(); float y = (itemHeight) * index; return new Rectangle(getFrame().getMinX(), y, getFrame().getWidth(), itemHeight); } private float getItemHeight() { return (float) itemLabel.getFont().getLineHeight() * 1.5f; } private int getHoveredIndex() { Vector2f hover = getHover(); if (hover == null) { return -1; } else { return getMousedIndex(hover); } } private int getMousedIndex(Vector2f cursor) { float index = (cursor.getY() - getFrame().getMinY()) / getItemHeight(); return (int) index; } @Override public void mousePressed(int button, int x, int y) { if (getFrame() == null) { return; } int index = getMousedIndex(new Vector2f(x, y)); switch (button) { case Input.MOUSE_LEFT_BUTTON: coordinator.selectPart(index); break; case Input.MOUSE_RIGHT_BUTTON: coordinator.clearSelection(); break; } } }