initial import
Annotate for file src/repl.lisp
2009-04-05 tobias 1 (in-package :qt.examples)
15:36:46 ' 2
' 3 (defclass repl (qt:widget)
' 4 ((model :reader model
' 5 :initform (make-instance 'qt:string-list-model))
' 6 (output :reader output
' 7 :initform (make-instance 'qt:list-view))
' 8 (input :reader input
' 9 :initform (make-instance 'qt:line-edit)))
' 10 (:metaclass cxx:class))
' 11
' 12 (defun append-list-model (list-model string)
' 13 "Appends STRING to LIST-MODEL."
' 14 (let ((index (cxx:row-count list-model)))
' 15 (unless (cxx:insert-row list-model index)
' 16 (error "insert-row ~A for ~A failed." index list-model))
' 17 (cxx:set-data list-model (cxx:index list-model index 0)
' 18 (qt::make-variant string))))
' 19
' 20 (defmethod initialize-instance :after ((repl repl) &rest args)
' 21 (declare (ignore args))
' 22 (cxx:set-model (output repl) (model repl))
' 23 (qt:connect (qt:get-signal (input repl) "returnPressed()")
' 24 #'(lambda ()
' 25 (append-list-model ;; Input
' 26 (model repl)
' 27 (format nil "> ~A" (cxx:text (input repl))))
' 28 (append-list-model ;; return value
' 29 (model repl)
' 30 (format nil "~S"
' 31 (handler-case (eval (read-from-string (cxx:text (input repl))))
' 32 (error (condition) condition))))
' 33 (cxx:set-text (input repl) "")))
' 34 (let ((layout (make-instance 'qt:vbox-layout)))
' 35 (cxx:add-widget layout (output repl))
' 36 (cxx:add-widget layout (input repl))
' 37 (cxx:set-layout repl layout))
' 38 (cxx:set-focus (input repl)))
' 39
' 40 (defun repl ()
' 41 "Lisp REPL"
' 42 (qt:with-app
' 43 (let ((repl (make-instance 'repl)))
' 44 (cxx:show repl)
' 45 (qt:exec repl))))