|
|
|
import processing.core.*;
|
|
|
|
import static processing.core.PApplet.*;
|
|
|
|
import controlP5.*;
|
|
|
|
|
|
|
|
class Menu {
|
|
|
|
final int width = 200; // Width of toolbar on left side of display
|
|
|
|
|
|
|
|
EuglenaApplet parent;
|
|
|
|
|
|
|
|
private Button resetButton, calibrateButton, commitButton, lineButton, freehandButton, eraserButton, goButton;
|
|
|
|
private Textfield redField, greenField, blueField, backgroundField, penwidthField,
|
|
|
|
lagField, totaltimeField, speedField;
|
|
|
|
private DropdownList shapesList, animateList, presetsList, gamesList;
|
|
|
|
|
|
|
|
private ControlP5 cp5;
|
|
|
|
|
|
|
|
private Group g1, g2, g3;
|
|
|
|
|
|
|
|
Menu(EuglenaApplet applet){
|
|
|
|
parent = applet;
|
|
|
|
|
|
|
|
cp5 = new ControlP5(applet).setPosition(applet.width - width, 0);
|
|
|
|
|
|
|
|
g1 = cp5.addGroup("Textfields");
|
|
|
|
g2 = cp5.addGroup("Dropdown2");
|
|
|
|
g3 = cp5.addGroup("Dropdown1");
|
|
|
|
|
|
|
|
resetButton = cp5.addButton("Reset")
|
|
|
|
.setPosition(20, 200)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.moveTo(g1);
|
|
|
|
calibrateButton = cp5.addButton("Calibrate")
|
|
|
|
.setPosition(110, 200)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.moveTo(g1);
|
|
|
|
|
|
|
|
redField = cp5.addTextfield("Red (0-255)")
|
|
|
|
.setPosition(20, 275)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
greenField = cp5.addTextfield("Green (0-255)")
|
|
|
|
.setPosition(20, 325)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
blueField = cp5.addTextfield("Blue (0-255)")
|
|
|
|
.setPosition(20, 375)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
backgroundField = cp5.addTextfield("Background (0-255)")
|
|
|
|
.setPosition(20, 425)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
penwidthField = cp5.addTextfield("Pen Width")
|
|
|
|
.setPosition(20, 475)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
|
|
|
|
speedField = cp5.addTextfield("Speed")
|
|
|
|
.setPosition(110, 275)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
lagField = cp5.addTextfield("Timelapse lag")
|
|
|
|
.setPosition(110, 325)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
totaltimeField = cp5.addTextfield("Total time")
|
|
|
|
.setPosition(110, 375)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.setAutoClear(false)
|
|
|
|
.moveTo(g1);
|
|
|
|
|
|
|
|
|
|
|
|
commitButton = cp5.addButton("Commit")
|
|
|
|
.setPosition(110, 450)
|
|
|
|
.setSize(70, 35)
|
|
|
|
.moveTo(g1);
|
|
|
|
|
|
|
|
lineButton = cp5.addButton("Line")
|
|
|
|
.setPosition(20, 550)
|
|
|
|
.setSize(50, 35)
|
|
|
|
.moveTo(g1);
|
|
|
|
freehandButton = cp5.addButton("Freehand")
|
|
|
|
.setPosition(75, 550)
|
|
|
|
.setSize(50, 35)
|
|
|
|
.moveTo(g1);
|
|
|
|
eraserButton = cp5.addButton("Eraser")
|
|
|
|
.setPosition(130, 550)
|
|
|
|
.setSize(50, 35)
|
|
|
|
.moveTo(g1);
|
|
|
|
|
|
|
|
shapesList = cp5.addDropdownList("Shapes")
|
|
|
|
.setPosition(20, 650)
|
|
|
|
.setSize(70, 100)
|
|
|
|
.setBarHeight(35)
|
|
|
|
.addItem("Ellipse", "Ellipse")
|
|
|
|
.addItem("Rectangle", "Rectangle")
|
|
|
|
.addItem("Triangle", "Triangle")
|
|
|
|
.addItem("None", "Default")
|
|
|
|
.close()
|
|
|
|
.moveTo(g3);
|
|
|
|
|
|
|
|
animateList = cp5.addDropdownList("Animate")
|
|
|
|
.setPosition(110, 650)
|
|
|
|
.setSize(70, 100)
|
|
|
|
.setBarHeight(35)
|
|
|
|
.addItem("Shrink", "Shrink")
|
|
|
|
.addItem("Expand", "Expand")
|
|
|
|
.addItem("Translate", "Translate")
|
|
|
|
.addItem("Rotate", "Rotate")
|
|
|
|
.addItem("None", "Default")
|
|
|
|
.close()
|
|
|
|
.moveTo(g3);
|
|
|
|
|
|
|
|
presetsList = cp5.addDropdownList("Presets")
|
|
|
|
.setPosition(20, 700)
|
|
|
|
.setSize(70, 100)
|
|
|
|
.setBarHeight(35)
|
|
|
|
.addItem("Clear screen", "Clear screen")
|
|
|
|
.addItem("Flow up", "Flow up")
|
|
|
|
.addItem("Flow down", "Flow down")
|
|
|
|
.addItem("Flow right", "Flow right")
|
|
|
|
.addItem("Flow left", "Flow left")
|
|
|
|
.addItem("Contain", "Contain")
|
|
|
|
.addItem("Split", "Split")
|
|
|
|
.addItem("Merge", "Merge")
|
|
|
|
.addItem("Slow move", "Slow move")
|
|
|
|
.addItem("Fast move", "Fast move")
|
|
|
|
.addItem("Slow compress", "Slow compress")
|
|
|
|
.addItem("Fast compress", "Fast compress")
|
|
|
|
.addItem("??","??")
|
|
|
|
.close()
|
|
|
|
.moveTo(g2);
|
|
|
|
|
|
|
|
// goButton = cp5.addButton("Go")
|
|
|
|
// .setPosition(20, 750)
|
|
|
|
// .setSize(70, 20)
|
|
|
|
// .moveTo(g1);
|
|
|
|
|
|
|
|
gamesList = cp5.addDropdownList("Games")
|
|
|
|
.setPosition(110, 700)
|
|
|
|
.setSize(70, 100)
|
|
|
|
.setBarHeight(35)
|
|
|
|
.addItem("Level 1", "Level 1")
|
|
|
|
.addItem("Level 2", "Level 2")
|
|
|
|
.addItem("Level 3", "Level 3")
|
|
|
|
.close()
|
|
|
|
.moveTo(g2);
|
|
|
|
}
|
|
|
|
|
|
|
|
void draw(EuglenaApplet a, LEDControl led) {
|
|
|
|
drawBackground(a);
|
|
|
|
drawArrows(a, led);
|
|
|
|
}
|
|
|
|
|
|
|
|
void drawArrows(EuglenaApplet a, LEDControl leds) {
|
|
|
|
a.strokeWeight(8);
|
|
|
|
|
|
|
|
int onColor = a.color(255, 255, 51);
|
|
|
|
int offColor = a.color(255, 255, 255);
|
|
|
|
|
|
|
|
int xOffset = a.width - width;
|
|
|
|
|
|
|
|
a.stroke(leds.isActive(LEDControl.Direction.RIGHT) ? onColor : offColor);
|
|
|
|
a.drawArrow(xOffset + 120, 80, 30, 0);
|
|
|
|
|
|
|
|
a.stroke(leds.isActive(LEDControl.Direction.DOWN) ? onColor : offColor);
|
|
|
|
a.drawArrow(xOffset + 100, 100, 30, 90);
|
|
|
|
|
|
|
|
a.stroke(leds.isActive(LEDControl.Direction.LEFT) ? onColor : offColor);
|
|
|
|
a.drawArrow(xOffset + 80, 80, 30, 180);
|
|
|
|
|
|
|
|
a.stroke(leds.isActive(LEDControl.Direction.UP) ? onColor : offColor);
|
|
|
|
a.drawArrow(xOffset + 100, 60, 30, 270);
|
|
|
|
}
|
|
|
|
|
|
|
|
void drawBackground(EuglenaApplet a) {
|
|
|
|
a.rectMode(EuglenaApplet.CORNER);
|
|
|
|
|
|
|
|
a.noStroke();
|
|
|
|
a.fill(0);
|
|
|
|
a.rect(a.width - width, 0, width, a.height);
|
|
|
|
}
|
|
|
|
|
|
|
|
void controlEvent(ControlEvent theEvent) {
|
|
|
|
//println(theEvent);
|
|
|
|
if (theEvent.isFrom(shapesList)) {
|
|
|
|
switch((int) shapesList.getValue()) {
|
|
|
|
case 0:
|
|
|
|
parent.clickGetter = new Ellipse(parent.penColor, parent.penWidth)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
parent.clickGetter = new Rectangle(parent.penColor, parent.penWidth)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
parent.clickGetter = new Triangle(parent.penColor, parent.penWidth)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else if (theEvent.isFrom(animateList)){
|
|
|
|
switch((int) animateList.getValue()) {
|
|
|
|
case 0:
|
|
|
|
parent.clickGetter = new Shrink(parent.operationSpeed)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
parent.clickGetter = new Expand(parent.operationSpeed)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
parent.clickGetter = new Translate(parent.operationSpeed)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
parent.clickGetter = new Rotate(parent.operationSpeed)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} else if (theEvent.isFrom(presetsList)){
|
|
|
|
// preset = (int) presetsList.getValue();
|
|
|
|
} else {
|
|
|
|
switch (theEvent.getLabel()) {
|
|
|
|
case "Commit":
|
|
|
|
try {
|
|
|
|
int rVal = Integer.parseInt(redField.getText());
|
|
|
|
int gVal = Integer.parseInt(greenField.getText());
|
|
|
|
int bVal = Integer.parseInt(blueField.getText());
|
|
|
|
parent.penColor = parent.color(rVal, gVal, bVal);
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
println("Ignored non-numeric color.");
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
parent.penWidth = Integer.parseInt(penwidthField.getText());
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
println("Ignored bad pen width");
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
parent.projectorApplet.setBgColor(Integer.parseInt(backgroundField.getText()));
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
println("Ignored bad background color.");
|
|
|
|
}
|
|
|
|
// parent.lagTime = Integer.parseInt(lagField.getText());
|
|
|
|
// parent.totalTime = Integer.parseInt(totaltimeField.getText());
|
|
|
|
try {
|
|
|
|
parent.operationSpeed = Integer.parseInt(speedField.getText());
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
println("Ignored bad background color.");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Reset":
|
|
|
|
parent.reset();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Calibrate":
|
|
|
|
parent.projectorApplet.calibrator.toggle();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Eraser":
|
|
|
|
parent.penColor = parent.color(0, 0, 0);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Line":
|
|
|
|
parent.clickGetter = new Line(parent.penColor, parent.penWidth)
|
|
|
|
.makeClickGetter(parent.projectorApplet);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|