diff --git a/README.md b/README.md index 577fb8d..a53e33a 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,7 @@ I (Jan) haven't tested the below commands on windows, but they should * Multiple windows (so that moving the control window around doesn't move what's on the projector. * Drawing using primitive shapes (lines, ellipses) and arbitrary colors. -* Does NOT currently support freeform drawing... should be pretty easy to add though. - +* Freehand drawing and erasing ## Compiling diff --git a/src/DragGetter.java b/src/DragGetter.java new file mode 100644 index 0000000..edb7408 --- /dev/null +++ b/src/DragGetter.java @@ -0,0 +1,47 @@ +/* + Interface for handling mouse drags + */ + +public interface DragGetter { + boolean drag(int x1, int y1, int x2, int y2); +} + + +//public interface Shape { +// public int numVertices(); +//} +// +// +//class Circle2 implements Shape { +// Circle2() { +// blah; +// } +// +// int numVertices() { +// return 0; +// } +// +// void expand() { +// blah2; +// } +//} +// +//class Square implements Shape { +// int numVertices() { +// return 4; +// } +//} +// +// +//Shape g = new Circle2(); +////g.expand(); // bad +//println(g.numVertices()); //good +//g = new Square(); +//println(g.numVertices()); +// +//void printNumberOfVertices(Shape s) { +// println(s.numVertices()); +//} +// +//printNumberOfVertices(new Circle2()); +//printNumberOfVertices(new Square()); diff --git a/src/EuglenaApplet.java b/src/EuglenaApplet.java index 27949f3..9c34d4b 100644 --- a/src/EuglenaApplet.java +++ b/src/EuglenaApplet.java @@ -22,6 +22,7 @@ public class EuglenaApplet extends PApplet { Menu menu; Calibrator calibrator; ClickGetter clickGetter; + DragGetter dragGetter; //Pen int penColor = color(200); @@ -77,7 +78,7 @@ public class EuglenaApplet extends PApplet { @Override - public void mouseClicked(){ + public void mouseClicked() { // Ignore mouse clicks in menu area if (mouseX > width - menu.width) { return; @@ -92,6 +93,22 @@ public class EuglenaApplet extends PApplet { } } + @Override + public void mouseDragged() { + // Ignore mouse drags from menu area + if (pmouseX > width - menu.width) { + return; + } + + // If we have a clickGetter, use that to handle the mouse click + if (dragGetter != null) { + boolean done = dragGetter.drag(pmouseX, pmouseY, mouseX, mouseY); + if (done) { + dragGetter = null; + } + } + } + @Override public void keyPressed() { /* diff --git a/src/Freehand.java b/src/Freehand.java new file mode 100644 index 0000000..5302edd --- /dev/null +++ b/src/Freehand.java @@ -0,0 +1,27 @@ +class Freehand { + /* + Class for freehand drawing + */ + + int color, brushSize; + + Freehand(int color, int penWidth) { + this.color = color; + this.brushSize = penWidth; + } + + DragGetter makeDragGetter(ProjectorApplet p) { + /* + Create a DragGetter which can accept incoming mouse drags + and use them to draw lines + */ + + return (int x1, int y1, int x2, int y2) -> { + Line line = new Line(x1, y1, x2, y2, this.color, this.brushSize); + p.commandQueue.add(line.makeProjectorCommand()); + + // Keep using this DragGetter, don't stop + return false; + }; + } +} diff --git a/src/Menu.java b/src/Menu.java index 9eac439..e16aee2 100644 --- a/src/Menu.java +++ b/src/Menu.java @@ -200,6 +200,7 @@ class Menu { //println(theEvent); if (theEvent.isFrom(shapesList)) { + parent.dragGetter = null; switch((int) shapesList.getValue()) { case 0: parent.clickGetter = new Ellipse(parent.penColor, parent.penWidth) @@ -215,6 +216,7 @@ class Menu { break; } } else if (theEvent.isFrom(animateList)){ + parent.dragGetter = null; switch((int) animateList.getValue()) { case 0: parent.clickGetter = new Shrink(parent.operationSpeed) @@ -275,11 +277,20 @@ class Menu { parent.projectorApplet.calibrator.toggle(); break; + case "Freehand": + parent.clickGetter = null; + parent.dragGetter = new Freehand(parent.penColor, parent.penWidth) + .makeDragGetter(parent.projectorApplet); + break; + case "Eraser": - parent.penColor = parent.color(0, 0, 0); + parent.clickGetter = null; + parent.dragGetter = new Freehand(parent.projectorApplet.bgColor, parent.penWidth) + .makeDragGetter(parent.projectorApplet); break; case "Line": + parent.dragGetter = null; parent.clickGetter = new Line(parent.penColor, parent.penWidth) .makeClickGetter(parent.projectorApplet); break;