This repository has been archived by the owner on Apr 2, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathselectable.lisp
68 lines (53 loc) · 2.81 KB
/
selectable.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#|
This file is a part of Qtools-UI
(c) 2015 Shirakumo http://tymoon.eu (shinmera@tymoon.eu)
Author: Nicolas Hafner <shinmera@tymoon.eu>
|#
(in-package #:org.shirakumo.qtools.ui)
(in-readtable :qtools)
(defgeneric active-widget (listing))
(defgeneric (setf active-widget) (widget listing))
(defgeneric active-item (listing))
(defgeneric (setf active-item) (item listing))
(defgeneric selectable (selectable-layout))
(defgeneric (setf selectable) (value selectable-layout))
(define-widget selectable-layout (QWidget item-layout)
((active-widget :initarg :active-widget :accessor active-widget)
(selectable :initarg :selectable :accessor selectable))
(:default-initargs
:active-widget NIL
:selectable T))
(defmethod clear-layout :before ((layout selectable-layout) &optional finalize)
(declare (ignore finalize))
(setf (slot-value layout 'active-widget) NIL))
(define-widget selectable-item (QWidget item-widget repaintable mouse-propagator)
((active :initform NIL :accessor active-p)))
(defmethod (setf active-widget) (widget (selectable-layout selectable-layout))
(error "~a is not a selectable-item." widget))
(defmethod (setf active-widget) :around (widget (selectable-layout selectable-layout))
(unless (eq widget (active-widget selectable-layout))
(call-next-method)))
(defmethod (setf active-widget) ((null null) (selectable-layout selectable-layout))
(when (active-widget selectable-layout)
(setf (active-p (active-widget selectable-layout)) NIL))
(setf (slot-value selectable-layout 'active-widget) NIL))
(defmethod (setf active-widget) ((selectable-item selectable-item) (selectable-layout selectable-layout))
(when (active-widget selectable-layout)
(setf (active-p (active-widget selectable-layout)) NIL))
(when (selectable selectable-layout)
(setf (slot-value selectable-layout 'active-widget) selectable-item)
(setf (active-p selectable-item) T)))
(defmethod (setf active-widget) ((widget qobject) (selectable-layout selectable-layout))
(setf (active-widget selectable-layout) (item-widget widget selectable-layout)))
(defmethod (setf active-widget) ((place integer) (selectable-layout selectable-layout))
(setf (active-widget selectable-layout) (widget place selectable-layout)))
(defmethod active-item ((selectable-layout selectable-layout))
(when (active-widget selectable-layout)
(widget-item (active-widget selectable-layout))))
(defmethod (setf active-item) (item (selectable-layout selectable-layout))
(setf (active-widget selectable-layout) (item-widget item selectable-layout)))
(defmethod (setf active-p) :after (value (selectable-item selectable-item))
(signal! selectable-item (repaint))
(setf (active-widget (container selectable-item)) selectable-item))
(defmethod widget-acceptable-p ((selectable-item selectable-item) (selectable-layout selectable-layout))
T)