[mcclim-devel] question about display functions and control apps
Paul Werkowski
pw at snoopy.mv.com
Fri Jan 7 20:50:00 UTC 2005
| | 1. Do I just make an event that will translate into setting
| | frame-needs-redisplay?
| |
|
| I tried this approach in Lispworks CLIM and it seems to work pretty well.
It is even easier than I thought. Here is a refinement of yesterdays code.
Paul
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(in-package :clim-user)
(defclass thing ()
((x :initarg :x)
(y :initarg :y))
(:default-initargs :x (random 100) :y (random 100)))
(define-application-frame a-test ()
((things :initform nil))
(:pointer-documentation nil)
(:menu-bar nil)
(:panes
(p1 :application
:width 300 :height 200
:end-of-line-action :allow
:display-function 'p1df
:incremental-redisplay t))
(:layouts
(default p1)))
(defun p1df (frame pane)
(with-output-recording-options (pane :record t)
(with-slots (things) frame
(dolist (thing things)
(with-slots (x y) thing
(updating-output (pane :unique-id thing
:cache-value (list x y)
:cache-test #'equal)
(draw-rectangle* pane x y (+ x 10) (+ y 10) :ink +blue+)))))))
(defvar *frame* nil)
(defun doit ()
;; display A-TEST application
(setq *frame* (make-application-frame 'a-test))
(run-frame-top-level *frame*))
(defclass my-event (device-event)()
(:default-initargs :modifier-state 0))
(defmethod handle-event (client (event my-event))
(with-application-frame (frame)
(redisplay-frame-pane frame client))))
(defun stuffit (frame)
;; do something to "update the database"
(let ((tls (frame-top-level-sheet frame))
(pane (frame-standard-output frame)))
(with-slots (things) frame
(push (make-instance 'thing) things))
;; Inform frame that something has changed
(queue-event
tls
;; :sheet causes event-handler client to be that
(make-instance 'my-event :sheet pane))))
More information about the mcclim-devel
mailing list