Vector nodes = new Vector(); Vector lines = new Vector(); // for drawing new lines Line tempLine = new Line(null,null); // current line, for editing street names Line selectedLine; PFont font; int NODE = 0, LINE = 1, NAME = 2; int mode = NODE; void setup() { size(400,400); smooth(); font = loadFont("Tahoma-Bold-11.vlw"); } void draw() { background(200); drawButtons(); // draw lines strokeWeight(15); stroke(0); for (int i = 0; i < lines.size(); i++) { Line l = (Line)lines.elementAt(i); l.draw(); } strokeWeight(13); for (int i = 0; i < lines.size(); i++) { Line l = (Line)lines.elementAt(i); stroke(mode == NAME && l.mouseOver() ? #ffff80 : 255); l.draw(); } // draw temp line stroke(255,80); if (start != null) { tempLine.a = start; tempLine.b = new Node(mouseX,mouseY); tempLine.draw(); } // draw selected line stroke(255,0,0,80); if (selectedLine != null) { selectedLine.draw(); } // draw nodes noStroke(); ellipseMode(CENTER); for (int i = 0; i < nodes.size(); i++) { Node n = (Node)nodes.elementAt(i); fill(n.fill()); n.draw(); } // draw street names fill(0); textFont(font); textSize(11); textAlign(CENTER); for (int i = 0; i < lines.size(); i++) { Line l = (Line)lines.elementAt(i); pushMatrix(); translate(l.a.x,l.a.y); rotate(l.angle()); text(l.name,l.length()/2.0,4); popMatrix(); } } Node start = null; void mousePressed() { if (mode == NODE) { // do nothing } else if (mode == LINE) { for (int i = 0; i < nodes.size(); i++) { Node n = (Node)nodes.elementAt(i); if(n.mouseOver()) { start = n; break; } } } else if (mode == NAME) { // do nothing } } void mouseReleased() { // buttons? if (mouseY > 5 && mouseY < 15) { if (mouseX > 5 && mouseX < 15) { mode = NODE; } else if (mouseX > 15 && mouseX < 25) { mode = LINE; } else if (mouseX > 25 && mouseX < 35) { mode = NAME; } } else if (mode == NODE) { boolean overOne = false; // nodes can't overlap for (int i = 0; i < nodes.size(); i++) { Node n = (Node)nodes.elementAt(i); if(n.mouseOver()) { overOne = true; break; } } if (!overOne) { nodes.add(new Node(mouseX,mouseY)); } } else if (mode == LINE) { boolean gotOne = false; for (int i = 0; i < nodes.size(); i++) { Node n = (Node)nodes.elementAt(i); if(n.mouseOver()) { if (start != null) { lines.add(new Line(start,n)); } gotOne = true; break; } } start = null; tempLine.a = null; tempLine.b = null; } else if (mode == NAME) { selectedLine = null; for (int i = 0; i < lines.size(); i++) { Line l = (Line)lines.elementAt(i); if (l.mouseOver()) { selectedLine = l; break; } } } } void keyPressed() { if (mode == NAME) { if (selectedLine != null) { if (keyCode == BACKSPACE && selectedLine.name.length() > 0) { selectedLine.name = selectedLine.name.substring(0,selectedLine.name.length()-1); } else if (keyCode == ENTER) { selectedLine = null; } else { selectedLine.name += key; } } } // else if (key == ' ') { // nodes.clear(); // lines.clear(); // } } boolean overButton = false; void drawButtons() { overButton = false; fill(0); noStroke(); ellipseMode(CENTER); ellipse(10,10,5,5); noFill(); stroke(0); strokeWeight(5); line(17,7,23,13); stroke(255); strokeWeight(4); line(17,7,23,13); fill(0); textFont(font); textSize(10); textAlign(CENTER); text("a",32,14); strokeWeight(1); noFill(); boolean over = false; over = mouseX > 5 && mouseX < 15 && mouseY < 15 && mouseY > 5; stroke(over || mode == NODE ? 255 : 0); rect(5,5,10,10); overButton = overButton || over; over = mouseX > 15 && mouseX < 25 && mouseY < 15 && mouseY > 5; stroke(over || mode == LINE ? 255 : 0); rect(15,5,10,10); overButton = overButton || over; over = mouseX > 25 && mouseX < 35 && mouseY < 15 && mouseY > 5; stroke(over || mode == NAME ? 255 : 0); rect(25,5,10,10); overButton = overButton || over; }