003350248d85d2eb703a0a12362e5965b08a1dc0
[clinton/lisp-on-lines.git] / src / standard-descriptions / edit.lisp
1 (in-package :lisp-on-lines)
2
3
4 (define-description editable ()
5 ()
6 (:mixinp t))
7
8 (define-description T ()
9 ((editp :label "Edit by Default?"
10 :value nil
11 :editp nil)
12 (identity :editp nil)
13 (type :editp nil)
14 (class :editp nil))
15 (:in-description editable))
16
17 (define-layered-method (setf attribute-value-using-object)
18 :in-layer #.(defining-description 'editable)(value object attribute)
19
20 (let ((setter (attribute-setter attribute)))
21 (if setter
22 (funcall setter value object)
23 (error "No setter in ~A for ~A" attribute object))))
24
25 (define-layered-class standard-attribute
26 :in-layer #.(defining-description 'editable)
27 ()
28 ((edit-attribute-p
29 :initform :inherit
30 :accessor %attribute-editp
31 :initarg :editp
32 :layered t)
33 (setter
34 :initarg :setter
35 :layered t
36 :accessor attribute-setter
37 :initform nil)))
38
39 (define-layered-function attribute-editp (object attribute)
40 (:method (object attribute) nil))
41
42 (define-layered-method attribute-editp
43 :in-layer #.(defining-description 'editable)
44 (object (attribute standard-attribute))
45
46 (if (eq :inherit (%attribute-editp attribute))
47 (attribute-value (find-attribute
48 (attribute-description attribute)
49 'editp))
50 (%attribute-editp attribute)))
51
52
53 (define-layered-method display-using-description
54 :in-layer #.(defining-description 'editable)
55 ((attribute standard-attribute) display object &rest args)
56
57 (declare (ignore args))
58 (if (attribute-editp object attribute)
59 (format *display* "This is where we'd edit")
60 (call-next-method)))
61
62
63