(require "clim") (in-package :clim-user) ;; call it with ;; (clim-user::show-painter) (defclass lines-pane (basic-pane) ((x :initform 0) (y :initform 0) (mouse-pressed :initform nil))) (defmethod initialize-instance :after ((pane lines-pane) &key &allow-other-keys) (setf (sheet-enabled-p pane) t)) (defmethod compose-space ((pane lines-pane) &key width height) (declare (ignore width height)) (make-space-requirement :max-width 100000 :max-height 100000)) (defmethod handle-event ((pane lines-pane) (event pointer-button-press-event)) (with-slots (x y mouse-pressed) pane (setf x (pointer-event-x event)) (setf y (pointer-event-y event)) (setf mouse-pressed t))) (defmethod handle-event ((pane lines-pane) (event pointer-motion-event)) (with-slots (x y mouse-pressed) pane (when mouse-pressed (let ((x2 (pointer-event-x event)) (y2 (pointer-event-y event))) (draw-line* pane x y x2 y2) (setf x x2) (setf y y2))))) (defmethod handle-event ((pane lines-pane) (event pointer-button-release-event)) (setf (slot-value pane 'mouse-pressed) nil)) (define-application-frame painter-frame () () (:pane (clim:make-pane 'lines-pane)) (:geometry :width 400 :height 400)) (defun show-painter () (let ((frame (make-application-frame 'painter-frame))) (run-frame-top-level frame)))