repos
/
qt.gui
/ annotate_shade
summary
|
shortlog
|
log
|
tree
|
commit
|
commitdiff
|
headdiff
|
annotate
|
filehistory
normal
|
plain
|
shade
|
zebra
Better Lisp vector to QList<*> conversion.
Annotate for file src/list.lisp
2010-01-10 tobias
1
(in-package :cl-smoke.qt-impl)
08:52:49 '
2
2009-09-02 tobias
3
(defmacro define-qlist-wrapper (type-name element-type &optional c-name)
2010-01-10 tobias
4
(let* ((c-name (or c-name type-name))
08:52:49 '
5
(type (string-upcase c-name))
'
6
(list-type (symbolicate 'qlist- type)))
'
7
`(progn
'
8
(defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_size") :int
'
9
"Returns the size of LIST."
'
10
(list :pointer))
'
11
(defcfun ,(concatenate 'string "qt_smoke_free_list_" c-name) :void
'
12
"Frees LIST."
'
13
(list :pointer))
'
14
(defcfun ,(concatenate 'string "qt_smoke_make_list_" c-name) :pointer
'
15
"Makes a list.")
'
16
(defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_at") :pointer
'
17
"Returns the a newly constructed copy of the element at position AT of LIST."
'
18
(list :pointer)
'
19
(index :int))
'
20
(defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_append") :pointer
'
21
"Appends NEW-ELEMENT to LIST."
'
22
(list :pointer)
'
23
(new-element :pointer))
'
24
;; To Lisp
'
25
,@(loop for type-name in (ensure-list type-name) collect
'
26
`(defun ,(symbolicate 'from- type-name) (list-pointer)
'
27
(let ((vector (make-array (,(symbolicate 'qt-smoke-list-
'
28
type '-size)
'
29
list-pointer))))
'
30
(dotimes (index (length vector) vector)
'
31
(setf (aref vector index)
'
32
;; FIXME the returned object is not wrapped by Smoke
'
33
;; -> change this?
'
34
(smoke::object-to-lisp
'
35
(,(symbolicate 'qt-smoke-list-
'
36
type '-at)
'
37
list-pointer index)
'
38
(smoke::make-smoke-type *smoke-module*
'
39
,type-name)))))))
'
40
,@(loop for type-name in (ensure-list type-name) collect
'
41
`(define-to-lisp-translation
'
42
(,(format nil "const QList<~A>&" type-name)
'
43
,(format nil "QList<~A>" type-name))
'
44
,(symbolicate 'from- type-name)
'
45
,(symbolicate 'qt-smoke-free-list- type)))
'
46
;; From Lisp
'
47
(defun ,(symbolicate 'coerce- list-type) (list)
'
48
(let ((qlist (,(symbolicate 'qt-smoke-make-list- type))))
2009-09-02 tobias
49
(loop for element across list do
2010-01-10 tobias
50
(,(symbolicate 'qt-smoke-list- type '-append)
2009-09-02 tobias
51
qlist (pointer (make-instance ',element-type :args (list element)))))
2010-01-10 tobias
52
(make-cleanup-pointer
08:52:49 '
53
qlist
'
54
(function ,(symbolicate 'qt-smoke-free-list- type)))))
2009-09-02 tobias
55
(defun ,(symbolicate list-type '-p) (list)
12:00:35 '
56
(every #'(lambda (element)
'
57
(typep element ',element-type))
'
58
list))
2010-01-10 tobias
59
,@(loop for type-name in (ensure-list type-name) collect
08:52:49 '
60
`(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
'
61
,(format nil "QList<~A>" type-name))
2009-09-02 tobias
62
;; FIXME allow sequence
12:00:35 '
63
(and (vector ,element-type)
'
64
(satisfies ,(symbolicate list-type '-p)))
2010-01-10 tobias
65
,(symbolicate 'coerce- list-type))))))
08:52:49 '
66
2009-09-02 tobias
67
;; FIXME it would be nice to have QList<QVariant> as fallback for any
12:00:35 '
68
;; list we can not convert otherwise. e.g.: '("a" 1)
'
69
(define-qlist-wrapper "QVariant" qt:variant)
'
70
'
71
(define-qlist-wrapper ("QObject*" "QWidget*") qt:object "void")
'
72
(define-qlist-wrapper "QByteArray" qt:byte-array)