;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Package: AUTOLASKURI; Base: 10; Lowercase: Yes -*- (in-package :common-lisp-user) (defpackage "AUTOLASKURI" (:use :clim :clim-lisp) (:export "app-main")) (in-package :AUTOLASKURI) (defclass laskuri () ((arvo :initform 0 :accessor arvo :type number) (kohde :initform "" :initarg :kohde :accessor kohde :type string))) (defun make-laskuri (kohde) (make-instance 'laskuri :kohde kohde)) (defmethod lisää ((laskuri laskuri)) (incf (arvo laskuri))) (defmethod nollaa ((laskuri laskuri)) (setf (slot-value laskuri 'arvo) 0)) ;;; ------------------- (defvar *laskurit* nil) (defun lisää-laskuri (laskuri) (pushnew laskuri *laskurit* :key #'kohde :test #'string-equal)) (progn (lisää-laskuri (make-laskuri "Kuorma-autoja")) (lisää-laskuri (make-laskuri "Henkilöautoja")) ) (define-application-frame autolaskuri () ((laskurit) (nykyinen :initform nil)) (:pointer-documentation t) (:panes (app :application :height 600 :width 600 :incremental-redisplay t :display-function #'näytä-laskuri) (laskurit :application :incremental-redisplay t :display-function #'näytä-laskurit) (int :interactor :height 200 :width 600)) (:layouts (default (vertically () (horizontally () app laskurit) int)))) (defmethod näytä-laskurit ((frame autolaskuri) stream) (dolist (laskuri *laskurit*) (updating-output (stream :unique-id laskuri) (present laskuri 'laskuri :stream stream) (terpri stream)))) (defmethod näytä-laskuri ((frame autolaskuri) stream) (let ((laskuri (slot-value frame 'nykyinen))) (unless (eq laskuri nil) (updating-output (stream :unique-id laskuri) (format stream "~&~A ~D~%" (kohde laskuri) (arvo laskuri)) ;(terpri stream) )))) (define-presentation-type laskuri ()) (define-presentation-method present (object (type laskuri) stream view &key) (declare (ignore view)) (write-string (kohde object) stream)) (define-presentation-type kohde ()) (define-presentation-type arvo ()) (defun app-main () (run-frame-top-level (make-application-frame 'autolaskuri))) (define-autolaskuri-command (com-quit :name t) () (frame-exit *application-frame*)) (define-autolaskuri-command (com-lisää :name t) ((laskuri 'laskuri :gesture :select)) (setf (slot-value *application-frame* 'nykyinen) laskuri) (lisää laskuri)) (define-autolaskuri-command (com-nollaa :name t) ((laskuri 'laskuri :gesture :delete)) (setf (slot-value *application-frame* 'nykyinen) laskuri) (nollaa laskuri)) ;;; ------- (defun testaa () (let ((laskuri (make-instance 'laskuri :kohde "Kuorma-autoja"))) (lisää laskuri) (lisää laskuri) (format t "~%~A ~D" (kohde laskuri) (arvo laskuri)) (nollaa laskuri) (format t "~%arvo ~A" (arvo laskuri))))