// Project 2 - This is my drawing tool. // Toolbar toolbar; PFont font; //defining font, size and alignment int currentRed = 255; //Preset values: int currentGreen = 255; //for colors int currentBlue = 255; // red, green, blue Brush currentBrush = new LittleSquareBrush(); // brush shape float currentScale = 1.0; // brush size boolean crazyScale = false; //Setup method ------------------------------------------------------------------------ void setup() { size(500,500); background (0); frameRate (60); smooth(); stroke(255); font = loadFont("ComicSansMS-Bold.vlw"); textFont(font, 26); textAlign(CENTER); toolbar = new Toolbar(); toolbar.addButton(new CircleButton(255,0,0)); toolbar.addButton(new CircleButton(0,255,0)); toolbar.addButton(new CircleButton(0,0,255)); toolbar.addButton(new CircleButton(249,252,30)); toolbar.addButton(new CircleButton(255,62,248)); toolbar.addButton(new CircleButton(255,255,255)); toolbar.addButton(new BrushChangingButton(new LittleCircleBrush())); toolbar.addButton(new BrushChangingButton(new LittleSquareBrush())); toolbar.addButton(new BrushChangingButton(new LittleTriangleBrush())); toolbar.addButton(new BrushChangingButton(new LittleDiamBrush())); toolbar.addButton(new ScaleChangingButton(1.0)); toolbar.addButton(new ScaleChangingButton(2.0)); toolbar.addButton(new ScaleChangingButton(4.0)); toolbar.addButton(new ScaleChangingButton(8.0)); toolbar.addButton(new CrazyScaleChangingButton()); } void mouseClicked() { toolbar.onMouseClick(mouseX, mouseY); } //draw method------------------------------------------------------------------------- void draw() { if (mousePressed == true && mouseY > 32) { drawing(); } if(keyPressed) { if (key == ' ') { fill (0); rect(0,32,width, height); } } toolbar.draw(); } void drawing() { pushMatrix(); fill(currentRed,currentGreen,currentBlue,75); translate(mouseX, mouseY); float finalScale = currentScale; if(crazyScale) { finalScale =(abs(mouseX-pmouseX)+ abs(mouseY-pmouseY))%35; } scale(finalScale); currentBrush.draw(); popMatrix(); } // GUI LIBRARY ------------------------------------------------------------------------ //Brush class-------------------------------------------------------- class Brush { void draw() { } } //Round brush----subclass of brush------------------ class LittleCircleBrush extends Brush { void draw() { noStroke(); smooth(); pushMatrix(); ellipse(0,0,8,8); popMatrix(); } } //Square brush----subclass of brush------------------ class LittleSquareBrush extends Brush { void draw() { noStroke(); smooth(); rectMode(CENTER); pushMatrix(); rect(0,0,8,8); popMatrix(); rectMode(CORNER); } } //Triangular brush----subclass of brush------------------ class LittleTriangleBrush extends Brush { void draw() { noStroke(); smooth(); pushMatrix(); triangle(-5,5,0,-5,5,5); popMatrix(); } } //Diamond brush----subclass of brush------------------ class LittleDiamBrush extends Brush { void draw() { noStroke(); smooth(); pushMatrix(); quad(0,-10,5,0,0,10,-5,0); popMatrix(); } } //Clickable class---- detecs when a button is clicked---------------------------- class Clickable { int x, y, w, h; Clickable() { } Clickable(int x, int y, int w, int h) { this.x = x; this.y = y; this.w = w; this.h = h; } boolean isInside(int x, int y) { return (this.x <= x && this.x + w >= x && this.y <= y && this.y + h >= y); } void onMouseClick(int x, int y) // this method must be called when processing detects a mouse click { if(isInside(x,y)) { onClick(); } } void onClick() { } void draw() { } } //Subclass from clickable for changing brush shape---------------- class BrushChangingButton extends Clickable { Brush brushToAssign; BrushChangingButton(Brush brushToAssign) { this.brushToAssign = brushToAssign; } void onClick() { currentBrush = brushToAssign; } void draw() { pushMatrix(); stroke (50,50,50); fill(150,150,150); rect(x,y,w,h); fill(255,255,255); translate(x+w/2, y+h/2); brushToAssign.draw(); popMatrix(); } } //Subclass from clickable for changing brush size---------------- class ScaleChangingButton extends Clickable { float scaleToAssign; ScaleChangingButton(float scaleToAssign) { this.scaleToAssign = scaleToAssign; } void onClick() { currentScale = scaleToAssign; } void draw() { pushMatrix(); stroke (50,50,50); fill(120,120,120); rect(x,y,w,h); fill(255,255,255); translate(x+w/2, y+h); textSize (16); //textAlign(CENTER); text("x"+(int)scaleToAssign,0,-10); popMatrix(); } } //Subclass from clickable for changing brush size // using what user is doing as parameter---------------- class CrazyScaleChangingButton extends Clickable { void onClick() { crazyScale = !crazyScale; } void draw() { pushMatrix(); stroke (50,50,50); fill(120,120,120); rect(x,y,w,h); fill(255,255,255); translate(x+w/2, y+h); textSize (12); text((crazyScale? "on":"off"),0,-10); popMatrix(); } } //Subclass from clickable for changing brush color---------------- class CircleButton extends Clickable { int r,g,b; CircleButton(int colorR, int colorG, int colorB) { super(); r = colorR; g = colorG; b = colorB; } void onClick() { currentRed = r; currentGreen = g; currentBlue = b; } void draw() { stroke (50,50,50); fill(r,g,b); ellipse(x+w/2,y+h/2,w,h); } } //Subclass from clickable for placing buttons in a toolbar---------------- class Toolbar extends Clickable // a toolbar that gets its place in the upper part of the screen { ArrayList buttons = new ArrayList(); int offsetX = 0; int buttonHeight = 30; int buttonWidth = 30; Toolbar() { super(); x = 0; y = 0; w = width; h = buttonHeight; } void addButton(Clickable clickableToAdd) { // position the button in the toolbar clickableToAdd.x = offsetX; clickableToAdd.w = buttonWidth; clickableToAdd.y = 0; clickableToAdd.h = buttonHeight; offsetX += buttonWidth; buttons.add(clickableToAdd); } void onMouseClick(int x,int y) { for (int i = 0; i < buttons.size(); i++) { Clickable loop_button = (Clickable) buttons.get(i); loop_button.onMouseClick(x,y); // ((Clickable)buttons.get(i)).onMouseClick(x,y); } } void draw() { stroke (255); fill(180,180,180); rect(x-1,y-1,w+1,h+2); for (int i = 0; i < buttons.size(); i++) { ((Clickable)buttons.get(i)).draw(); } } }