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