;;; -*- Mode:LISP; Package:USER; Readtable:ZL; Base:10 -*-

;;; Compile this and run (start-my-scroll).

;;; Until you press C-Abort, the window will display and update the
;;; numbers maintained in the window's value array. In this example, the
;;; values are just incremented forever; a real application would
;;; presumably be monitoring the values maintained by an external source.

(defflavor my-scroll-window ()
	   (tv:scroll-window))

(defvar *my-scroll-window* nil "Current scroll window [for debugging]")

(defvar *my-scroll-size* 5 "Number of entries in the value array")

;;; UPDATE-MY-SCROLL demonstrates how to insert new values into 
;;; the value array. INIT-MY-SCROLL provides the initial values.

(defun init-my-scroll(window)
  (let((v (send window :value-array)))
    (dotimes(i *my-scroll-size*)
      (setf (aref v i) 100.0))))

(defun update-my-scroll(window)
  (let((v (send window :value-array)))
    (do-forever
      (dotimes (j 100)
	(dotimes(i *my-scroll-size*)
	  (setf (aref v i) (+ (aref v i) i)))
	;;Force window to redisplay values
	(send window :redisplay))
      ;emergency escape by C-Abort
      (sleep 1))))

(defun start-my-scroll()
  (setq *my-scroll-window*
	(make-instance 'my-scroll-window
		       :value-array (make-array *my-scroll-size*)
		       :display-item
		       (append
			 (list () (tv:scroll-parse-item '(:string "The root item")))
			 (set-scroll-items))))
  (unwind-protect
      (progn
	(init-my-scroll *my-scroll-window*)
	(send *my-scroll-window* :activate)
	(send *my-scroll-window* :expose)
	(send *my-scroll-window* :select)
	(update-my-scroll *my-scroll-window*))
    (progn
      (send terminal-io :select)
      (if (y-or-n-p "Kill scroll window (answer 'N' to debug it) ?")
	(send *my-scroll-window* :kill)))))

(defun set-scroll-items (&rest ignore)
  (loop for i from 0 to (1- *my-scroll-size*)
	collect
	  (tv:scroll-parse-item
	    `(:value ,i nil (,(string-append
				(format nil "  This is item ~s" i)
				" = ~s"))))))
