#lang racket/gui

(require "Entorno-0.rkt")
;(require "Entorno-1.rkt")
;(require "Entorno-2.rkt")
;(require "Entorno-3.rkt")
;(require "Entorno-celular.rkt")
;;;;;;;;;;;;;;
(define filas 49)
(define columnas 49)
(define radio 10)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LAS FUNCIONES DE DIBUJO
;;; LAS HERRAMIENTAS GRÁFICAS
;;; PROCEDIMIENTOS DE DIBUJO
(define pinta-una-fila
  (lambda (output x y hoffset)
    (cond
      ((null? output) )
      (else
       (let* ((rgbo (send (car output) get-rgb))
              (color (send (car output) get-color))
              (pen 
               (make-object pen%
                 "lightgray";color;(car output)
                 1
                 (if (< (last rgbo) 0.6) 'transparent 'solid)))
              (brush 
               (make-object brush%
                 color;(car output)
                 (if (< (last rgbo) 0.6) 'transparent 'solid)))
              )
         (send dc set-pen pen)
         (send dc set-brush brush)
         (send dc draw-rectangle x y radio radio)
         (pinta-una-fila (cdr output) (+ x hoffset) y hoffset)) )
      ) 
    ))
(define pinta-configuracion
  (lambda (configuracion)
    (do
        ((voffset radio (+ voffset radio))
         (i 1 (add1 i))
         (config configuracion (cdr config))
         )
      ((null? config) #t)
      (pinta-una-fila
       (car config)
       4 voffset radio)
      )
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define dibujo
  (lambda (dc)
    (pinta-configuracion (send M get-configuracion))
    ))
;;; La ventana
(define ventana
  (make-object frame% 
    "Monitor de Animat" 
    #f 
    (+ 10 (* radio (add1 columnas))) (* radio (+ 10 filas))
    1200 0))
;;; El lienzo
(define lienzo
  (instantiate canvas%
    (ventana)
    (style '(border))
    (paint-callback
     (lambda (lienzo dc) (dibujo dc)))
    ))
(define dc (send lienzo get-dc))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define driver
  (lambda (dc)
    (let go ((i 0)
             (j 600)
             )
      (if (= i j)
          #t
          (begin
            (dibujo dc)
            (send M procesar! i)
            ;(sleep/yield (/ 1 columnas));(/ 1 10) 0.2)
            (go (add1 i) j)
            )
          )
      )
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(send ventana show #t)
(sleep/yield 1)



(driver dc)
