4358148e |
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 | |
b7657b86 |
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)))) |
4358148e |
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)) |
b7657b86 |
47 | (attribute-value (find-attribute |
48 | (attribute-description attribute) |
49 | 'editp)) |
4358148e |
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)) |
e8d4fa45 |
58 | (if (attribute-editp object attribute) |
59 | (format *display* "This is where we'd edit") |
60 | (call-next-method))) |
4358148e |
61 | |
62 | |
63 | |