;;;; 13-menus.lisp (defpackage #:ww.examples/13 (:use #:cl) (:export #:start)) (in-package :ww.examples/13) (defclass menus-demo (ww::application) ()) (defclass numbered-image (ww::image) ((n :initarg :num :reader num) (menu :initarg :menu :accessor item-menu))) (defmethod ww::add-menu-item :after ((menu ww::menu) (item numbered-image)) (setf (item-menu item) menu)) (ww:defhandler item-clicked (ww::on-mousedown (img) (ww::remove-menu-item (item-menu img) img))) (ww::defhandler indicate-focus (ww::on-focus (img) (format t "~a got focus~%" (num img)))) (ww::defhandler indicate-blur (ww::on-blur (img) (format t "~a lost focus~%" (num img)))) (defmethod ww::boot ((app menus-demo)) (let ((vscroller (make-instance 'ww::vscroller :scroll-speed 10 :region (make-instance 'ww::region :left 0 :right 100 :top 250 :bottom 0)))) (loop for i to 10 for img = (make-instance 'numbered-image :num i :texture (ww:get-asset "Fezghoul.png")) do (ww:add-handler img #'item-clicked) (ww:add-handler img #'indicate-blur) (ww:add-handler img #'indicate-focus) (ww::add-menu-item vscroller img)) (ww:add-unit vscroller) (ww:refocus-on vscroller))) (defun start (&optional (scale 1.0) (side 500)) (ww:start (make-instance 'menus-demo :fps 30 :width (round (* scale side)) :height (round (* scale side)) :scale scale :title "Scrolling menues demo" :asset-root (merge-pathnames "examples/" (asdf:system-source-directory :wheelwork)))))