> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.DphPsN1XAl2/rev.10
 * 
 * authors: 
 *   GoToLoop

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



/**
 * Rectangle Toggle 3 (v3.31)
 * by  szaboa1 (2013/Jun)
 * mod GoToLoop
 * for PillowPenguin
 *
 * http://forum.processing.org/topic/problem-with-my-rectangle-class
 *
 * http://forum.processing.org/topic/draggable-balls-to-any-cell
 *
 * http://forum.processing.org/topic
 * /how-to-change-the-colour-of-an-objec-in-an-2d-arrayt-permanently
 *
 * http://studio.processingtogether.com/sp/pad/export/ro.93MhRWK35nIP8/latest
 */

final static byte GRID = 25, MARGIN = 10;
final static byte DIM = 30, GAP = 0, LEN = DIM + GAP;
final static Square[][] boxes = new Square[GRID][GRID];

final static color BORDER = 0, BG = 0100;
final static float BOLD = 2.5;

final static String GFX = JAVA2D; // Use JAVA2D or P2D

void setup() {
  size(GRID*LEN + MARGIN*2 - GAP, GRID*LEN + MARGIN*2 - GAP, GFX);
  noLoop();
  background(BG);

  for (int row=0; row!=GRID; ++row)  for (int col=0; col!=GRID; ++col)
    boxes[row][col] = new Square(col*LEN + MARGIN, row*LEN + MARGIN, 
    DIM, DIM, random(1) < Square.CHANCE? Square.COLOR_1:Square.COLOR_0);
}

void draw() {
  for (int row=0; row!=GRID; ++row)  for (int col=0; col!=GRID; ++col)
    boxes[row][col].display();
}

void keyPressed() {
  for (int row=0; row!=GRID; ++row)  for (int col=0; col!=GRID; ++col)
    boxes[row][col].redo();

  redraw();
}

void mousePressed() {
  final int btn = mouseButton;
  final color chosenColor;

  if (btn == LEFT)        chosenColor = Square.COLOR_1;
  else if (btn == RIGHT)  chosenColor = Square.COLOR_2;
  else                    chosenColor = Square.COLOR_3;

  for (int row=0; row!=GRID; ++row)  for (int col=0; col!=GRID; ++col)
    if ( boxes[row][col].click() ) {
      boxes[row][col].setOrTurnOff(chosenColor);
      redraw();
      return;
    }
}

final class Square {
  final static color COLOR_0 = 0200, COLOR_1 = #90D0F0;
  final static color COLOR_2 = #FF0000, COLOR_3 = #00FF00;

  final static float CHANCE = .3;

  final short x, y, w, h, xw, yh;
  color c; // current active color.

  Square(int xx, int yy, int ww, int hh) {
    this(xx, yy, ww, hh, COLOR_0);
  }

  Square(int xx, int yy, int ww, int hh, color cc) {
    x = (short) xx;
    y = (short) yy;
    w = (short) ww;
    h = (short) hh;

    xw = (short) (x+w);
    yh = (short) (y+h);

    c = cc;
  }

  color redo() {
    return c = random(1) < CHANCE? COLOR_1:COLOR_0;
  }

  color setOrTurnOff(color cc) {
    return c = c == COLOR_0? cc:COLOR_0;
  }

  boolean click() {
    return mouseX > x & mouseX < xw & mouseY > y & mouseY < yh;
  }

  void display() {
    fill(c);
    rect(x, y, w, h);
  }
}