Padrão

2023-04-27

"""2023-04-27"""
from helpers import HEIGHT
from helpers import save_image
from helpers import WIDTH
from helpers import write_legend
from random import choice
from pathlib import Path

import py5


IMG_NAME = Path(__file__).name.replace(".py", "")


GRADE = []

FUNDO = py5.color(248, 241, 219)

CORES = [
    py5.color(31, 73, 180),
    py5.color(39, 39, 39),
    # py5.color(80, 127, 180),
    # py5.color(51, 51, 52),
]


class Celula:
    """
    nova = Celula(x, y, largura, [func_desenho0, func_desenho1, ...])
    .desenha()    desenha celula na sua posição
    .gira()       gira 90 graus
    .sob_mouse()  True ou False se o mouse está sobre a célula
    .espelha()    Inverte espelhamento
    .muda_desenho()   Muda função de desenho para a próxima
    .espelhada    Estado atual de espelhamento
    .rot          Rotação atual
    .func_ativa   Índice da função de desenho atual
    """

    def __init__(self, x, y, largura, funcs):
        self.x, self.y = x, y
        self.largura = largura
        self.funcs = funcs
        self.func_ativa = choice(range(0, len(funcs)))
        self.rot = choice(range(0, 360, 90))
        self.espelhada = False
        self.cor = choice(CORES)

    def desenha(self):
        with py5.push_matrix():
            py5.translate(self.x, self.y)
            if self.espelhada:
                py5.scale(-1, 1)
            py5.rotate(py5.radians(self.rot))
            funcao_desenho = self.funcs[self.func_ativa]
            funcao_desenho(0, 0, self.largura, self.cor)

    def sob_mouse(self, x, y):
        return (
            self.x - self.largura / 2 < x < self.x + self.largura / 2
            and self.y - self.largura / 2 < y < self.y + self.largura / 2
        )

    def gira(self, rot=90):
        self.rot = self.rot + rot if self.rot < 360 else rot

    def muda_cor(self):
        self.cor = choice(CORES)

    def muda_desenho(self, i=None):
        self.func_ativa = (self.func_ativa + 1) % len(self.funcs) if i is None else i

    def espelha(self):
        self.espelhada = not self.espelhada


def modulo_01(x, y, largura, cor):
    x0 = x - largura / 2
    y0 = y - largura / 2
    py5.fill(cor)
    py5.stroke(cor)
    py5.arc(x0, y0, 2 * largura, 2 * largura, py5.radians(0), py5.radians(90))


def modulo_02(x, y, largura, cor):
    x0 = x - largura / 2
    y0 = y - largura / 2
    py5.no_fill()
    py5.stroke_weight(2)
    py5.stroke(cor)
    passos = 20
    passo = largura * 2 / passos
    for i in range(0, passos):
        largura_ = passo * i + passo
        py5.arc(x0, y0, largura_, largura_, py5.radians(0), py5.radians(90))


def popula_grade():
    linhas = 6
    colunas = 6
    margem = 100
    largura = (py5.width - (2 * margem)) / colunas
    for i in range(colunas):
        x = margem + largura / 2 + i * largura
        for j in range(linhas):
            y = margem + largura / 2 + j * largura
            celula = Celula(x, y, largura, [modulo_01, modulo_02])
            print(x, y)
            GRADE.append(celula)


def desenha_grade():
    for celula in GRADE:
        celula.desenha()


def settings():
    py5.size(WIDTH, HEIGHT)


def setup():
    popula_grade()
    # save_image(IMG_NAME, "png")


def draw():
    py5.background(FUNDO)
    write_legend(["#000000"], IMG_NAME)
    desenha_grade()


def mouse_pressed():
    for celula in GRADE:
        if celula.sob_mouse(py5.mouse_x, py5.mouse_y):
            if (
                py5.mouse_button == py5.LEFT
                and py5.is_key_pressed
                and py5.key_code == py5.SHIFT
            ):
                celula.muda_cor()
                print("Altera cor")
            elif py5.mouse_button == py5.LEFT:
                rot = celula.rot
                celula.gira()
                print(f"Gira de {rot} até {celula.rot}")
            elif py5.mouse_button == py5.RIGHT:
                celula.muda_desenho()
                print("Muda desenho")


def key_pressed():
    key = py5.key
    if key == " ":
        py5.no_loop()
        save_image(IMG_NAME, "png")
        py5.exit_sketch()


py5.run_sketch()