Bug fix, added bindings and a minor API change
[clg] / gtk / gtktree.lisp
CommitLineData
55212af1 1;; Common Lisp bindings for GTK+ v2.x
2;; Copyright 2004-2005 Espen S. Johnsen <espen@users.sf.net>
985713d7 3;;
55212af1 4;; Permission is hereby granted, free of charge, to any person obtaining
5;; a copy of this software and associated documentation files (the
6;; "Software"), to deal in the Software without restriction, including
7;; without limitation the rights to use, copy, modify, merge, publish,
8;; distribute, sublicense, and/or sell copies of the Software, and to
9;; permit persons to whom the Software is furnished to do so, subject to
10;; the following conditions:
985713d7 11;;
55212af1 12;; The above copyright notice and this permission notice shall be
13;; included in all copies or substantial portions of the Software.
985713d7 14;;
55212af1 15;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
63dbd868 23;; $Id: gtktree.lisp,v 1.28 2007/08/20 10:33:05 espen Exp $
985713d7 24
25
26(in-package "GTK")
27
28
29;;;; Cell Layout
30
31(defbinding cell-layout-pack-start () nil
32 (cell-layout cell-layout)
33 (cell cell-renderer)
34 (expand boolean))
35
36(defbinding cell-layout-pack-end () nil
37 (cell-layout cell-layout)
38 (cell cell-renderer)
39 (expand boolean))
40
41(defun cell-layout-pack (layout cell &key end expand)
42 (if end
43 (cell-layout-pack-end layout cell expand)
44 (cell-layout-pack-start layout cell expand)))
45
4e169141 46
985713d7 47(defbinding cell-layout-reorder () nil
48 (cell-layout cell-layout)
49 (cell cell-renderer)
50 (position int))
51
52(defbinding cell-layout-clear () nil
53 (cell-layout cell-layout))
54
da82be16 55(defbinding cell-layout-add-attribute (cell-layout cell attribute column) nil
985713d7 56 (cell-layout cell-layout)
57 (cell cell-renderer)
58 ((string-downcase attribute) string)
da82be16 59 (column int))
985713d7 60
a92553bd 61(define-callback-marshal %cell-layout-data-callback nil
62 (cell-layout cell-renderer tree-model tree-iter))
985713d7 63
64(defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
65 (cell-layout cell-layout)
66 (cell cell-renderer)
a92553bd 67 (%cell-layout-data-callback callback)
985713d7 68 ((register-callback-function function) unsigned-int)
a92553bd 69 (user-data-destroy-callback callback))
985713d7 70
71(defbinding cell-layout-clear-attributes () nil
72 (cell-layout cell-layout)
73 (cell cell-renderer))
74
75
038891cf 76;;;; Cell Renderer
77
f335841f 78(defmethod compute-signal-function ((gobject cell-renderer-toggle) (signal (eql 'toggled)) function object args)
79 (declare (ignore gobject signal function object args))
038891cf 80 (let ((function (call-next-method)))
81 #'(lambda (object path)
82 (funcall function object (ensure-tree-path path)))))
83
985713d7 84
85;;;; List Store
86
4e169141 87(defmethod initialize-instance ((list-store list-store) &key column-types
88 column-names initial-content)
985713d7 89 (call-next-method)
4e169141 90 (%list-store-set-column-types list-store column-types)
91 (when column-names
70b52c33 92 (setf
1e5e3e14 93 (user-data list-store 'column-names)
70b52c33 94 (coerce column-names 'vector)))
4e169141 95 (when initial-content
96 (loop
97 with iter = (make-instance 'tree-iter)
98 for row in initial-content
99 do (list-store-append list-store row iter))))
985713d7 100
985713d7 101
4e169141 102(defbinding %list-store-set-column-types () nil
985713d7 103 (list-store list-store)
4e169141 104 ((length columns) unsigned-int)
105 (columns (vector gtype)))
985713d7 106
eb0b609d 107(defbinding list-store-remove (store row) boolean
108 (store list-store)
109 ((ensure-tree-iter store row) tree-iter))
110
111(defbinding %list-store-set-value () nil
985713d7 112 (list-store list-store)
eb0b609d 113 (tree-iter tree-iter)
114 (column int)
115 (gvalue gvalue))
985713d7 116
eb0b609d 117(defmethod (setf tree-model-value) (value (store list-store) row column)
118 (let* ((index (tree-model-column-index store column))
119 (type (tree-model-get-column-type store index)))
120 (with-gvalue (gvalue type value)
121 (%list-store-set-value store (ensure-tree-iter store row) index gvalue)))
122 value)
05a3b9e4 123
eb0b609d 124(defbinding %list-store-insert-with-valuesv () nil
125 (list-store list-store)
126 (tree-iter tree-iter)
127 (position int)
128 (columns (vector int))
129 (gvalues pointer)
130 ((length columns) int))
05a3b9e4 131
4e169141 132(defbinding %list-store-insert () nil
985713d7 133 (list-store list-store)
4e169141 134 (tree-iter tree-iter)
985713d7 135 (position int))
136
eb0b609d 137(defun list-store-insert (store position &optional data (iter (make-instance 'tree-iter)))
138 (etypecase data
139 (null (%list-store-insert store iter position))
140
141 (list (with-memory (gvalues (* (/ (length data) 2) +gvalue-size+))
142 (let ((columns
143 (loop
144 for (column value) on data by #'cddr
145 as index = (tree-model-column-index store column)
146 as type = (tree-model-get-column-type store index)
147 as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
148 do (gvalue-init gvalue type value)
149 collect index)))
150 (unwind-protect
151 (%list-store-insert-with-valuesv store iter position columns gvalues)
152 (loop
153 repeat (length columns)
154 as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
155 do (gvalue-unset gvalue))))))
156
157 (vector (with-memory (gvalues (* (length data) +gvalue-size+))
158 (let ((columns
159 (loop
160 for index below (length data)
161 as type = (tree-model-get-column-type store index)
162 as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
163 do (gvalue-init gvalue type (aref data index))
164 collect index)))
165 (unwind-protect
166 (%list-store-insert-with-valuesv store iter position columns gvalues))
167 (loop
168 repeat (length data)
169 as gvalue = gvalues then (pointer+ gvalue +gvalue-size+)
170 do (gvalue-unset gvalue))))))
4e169141 171 iter)
172
173(defbinding %list-store-insert-before () nil
985713d7 174 (list-store list-store)
4e169141 175 (tree-iter tree-iter)
985713d7 176 (sibling (or null tree-iter)))
177
4e169141 178(defun list-store-insert-before
179 (store sibling &optional data (iter (make-instance 'tree-iter)))
180 (%list-store-insert-before store iter sibling)
eb0b609d 181 (when data (setf (tree-model-row-data store iter) data))
4e169141 182 iter)
183
63dbd868 184(defbinding %list-store-insert-after () nil
985713d7 185 (list-store list-store)
4e169141 186 (tree-iter tree-iter)
985713d7 187 (sibling (or null tree-iter)))
188
4e169141 189(defun list-store-insert-after
190 (store sibling &optional data (iter (make-instance 'tree-iter)))
191 (%list-store-insert-after store iter sibling)
eb0b609d 192 (when data (setf (tree-model-row-data store iter) data))
4e169141 193 iter)
194
195(defbinding %list-store-prepend () nil
985713d7 196 (list-store list-store)
4e169141 197 (tree-iter tree-iter))
198
199(defun list-store-prepend
200 (store &optional data (iter (make-instance 'tree-iter)))
201 (%list-store-prepend store iter)
eb0b609d 202 (when data (setf (tree-model-row-data store iter) data))
4e169141 203 iter)
985713d7 204
4e169141 205(defbinding %list-store-append () nil
985713d7 206 (list-store list-store)
4e169141 207 (tree-iter tree-iter))
208
209(defun list-store-append
210 (store &optional data (iter (make-instance 'tree-iter)))
211 (%list-store-append store iter)
eb0b609d 212 (when data (setf (tree-model-row-data store iter) data))
4e169141 213 iter)
985713d7 214
215(defbinding list-store-clear () nil
216 (list-store list-store))
217
218(defbinding list-store-reorder () nil
219 (list-store list-store)
220 (new-order (vector int)))
221
222(defbinding list-store-swap () nil
223 (list-store list-store)
224 (a tree-iter)
225 (b tree-iter))
226
227(defbinding list-store-move-before () nil
228 (list-store list-store)
229 (iter tree-iter)
230 (psoition (or null tree-iter)))
231
985713d7 232(defbinding list-store-move-after () nil
233 (list-store list-store)
234 (iter tree-iter)
235 (psoition tree-iter))
236
237
eb0b609d 238;;; Tree Path
985713d7 239
4e169141 240(defbinding %tree-path-free () nil
241 (location pointer))
242
243(defbinding %tree-path-get-indices () pointer
244 (location pointer))
245
246(defbinding %tree-path-get-depth () int
247 (location pointer))
248
249(defun %make-tree-path (path)
928e2b4e 250 (let* ((c-vector (make-c-vector 'int (length path) :content path))
251 (pointer-offset (adjust-offset (size-of 'int) 'pointer))
252 (location (allocate-memory (+ pointer-offset (size-of 'pointer)))))
4e169141 253 (funcall (writer-function 'int) (length path) location)
928e2b4e 254 (funcall (writer-function 'pointer) c-vector location pointer-offset)
4e169141 255 location))
256
05a3b9e4 257(defun %tree-path-to-vector (location)
258 (let ((indices (%tree-path-get-indices location))
259 (depth (%tree-path-get-depth location)))
260 (if (null-pointer-p indices)
261 #()
262 (map-c-vector 'vector #'identity indices 'int depth))))
4e169141 263
1e5e3e14 264(defmacro %with-tree-path ((var path) &body body)
928e2b4e 265 (let* ((pointer-offset (adjust-offset (size-of 'int) 'pointer))
266 (vector-offset (adjust-offset (+ pointer-offset (size-of 'pointer)) 'int)))
267 `(with-memory (,var (+ ,vector-offset (* ,(size-of 'int) (length ,path))))
1e5e3e14 268 (funcall (writer-function 'int) (length ,path) ,var)
928e2b4e 269 (setf (ref-pointer ,var ,pointer-offset) (pointer+ ,var ,vector-offset))
1e5e3e14 270 (make-c-vector 'int (length ,path) :content ,path :location (pointer+ ,var ,vector-offset))
271 ,@body)))
272
4e169141 273(eval-when (:compile-toplevel :load-toplevel :execute)
4d1fea77 274 (define-type-method alien-type ((type tree-path))
275 (declare (ignore type))
4e169141 276 (alien-type 'pointer))
277
1e5e3e14 278 (define-type-method size-of ((type tree-path) &key inlined)
279 (assert-not-inlined type inlined)
4e169141 280 (size-of 'pointer))
281
1e5e3e14 282 (define-type-method alien-arg-wrapper ((type tree-path) var path style form &optional copy-in-p)
4d1fea77 283 (declare (ignore type))
1e5e3e14 284 (cond
285 ((and (in-arg-p style) copy-in-p)
286 `(with-pointer (,var (%make-tree-path ,path))
287 ,form))
288 ((and (in-arg-p style) (not (out-arg-p style)))
289 `(%with-tree-path (,var ,path)
290 ,form))
291 ((and (in-arg-p style) (out-arg-p style))
292 (let ((tree-path (make-symbol "SYMBOL")))
293 `(%with-tree-path (,tree-path ,path)
294 (with-pointer (,var ,tree-path)
295 ,form))))
296 ((and (out-arg-p style) (not (in-arg-p style)))
297 `(with-pointer (,var)
298 ,form))))
299
300 (define-type-method to-alien-form ((type tree-path) path &optional copy-p)
301 (declare (ignore type copy-p))
4e169141 302 `(%make-tree-path ,path))
303
1e5e3e14 304 (define-type-method from-alien-form ((type tree-path) location &key (ref :free))
4d1fea77 305 (declare (ignore type))
1e5e3e14 306 `(prog1
307 (%tree-path-to-vector ,location)
308 ,(when (eq ref :free)
309 `(%tree-path-free ,location)))))
4e169141 310
1e5e3e14 311(define-type-method to-alien-function ((type tree-path) &optional copy-p)
4d1fea77 312 (declare (ignore type))
1e5e3e14 313 #'%make-tree-path
314 (unless copy-p
315 #'(lambda (tree-path location)
316 (declare (ignore tree-path))
05a3b9e4 317 (%tree-path-free location))))
05a3b9e4 318
1e5e3e14 319(define-type-method from-alien-function ((type tree-path) &key (ref :free))
4d1fea77 320 (declare (ignore type))
1e5e3e14 321 (if (eq ref :free)
322 #'(lambda (location)
323 (prog1
324 (%tree-path-to-vector location)
325 (%tree-path-free location)))
326 #'(lambda (location)
327 (%tree-path-to-vector location))))
328
329(define-type-method writer-function ((type tree-path) &key temp inlined)
330 (declare (ignore temp))
331 (assert-not-inlined type inlined)
05a3b9e4 332 (let ((writer (writer-function 'pointer)))
333 #'(lambda (path location &optional (offset 0))
334 (funcall writer (%make-tree-path path) location offset))))
335
1e5e3e14 336(define-type-method reader-function ((type tree-path) &key ref inlined)
337 (declare (ignore ref))
338 (assert-not-inlined type inlined)
339 #'(lambda (location &optional (offset 0))
340 (%tree-path-to-vector (ref-pointer location offset))))
4e169141 341
1e5e3e14 342(define-type-method destroy-function ((type tree-path) &key temp inlined)
343 (declare (ignore temp))
344 (assert-not-inlined type inlined)
345 #'(lambda (location &optional (offset 0))
346 (%tree-path-free (ref-pointer location offset))))
c8211115 347
6beb5074 348(defun ensure-tree-path (path)
349 (etypecase path
350 (string (coerce (clg-utils:split-string path :delimiter #\:) 'vector))
351 (vector path)))
352
4e169141 353
eb0b609d 354;;; Tree Model
355
f335841f 356(defgeneric tree-model-value (model row column))
357(defgeneric (setf tree-model-value) (value model row column))
358(defgeneric tree-model-row-data (model row))
359(defgeneric (setf tree-model-row-data) (data model row))
360(defgeneric tree-model-column-index (model column))
361(defgeneric tree-model-column-name (model index))
362
363
4e169141 364(defbinding %tree-row-reference-new () pointer
365 (model tree-model)
366 (path tree-path))
367
39db92d4 368(defmethod allocate-foreign ((reference tree-row-reference) &key model path)
369 (%tree-row-reference-new model path))
4e169141 370
371(defbinding tree-row-reference-get-path () tree-path
372 (reference tree-row-reference))
373
374(defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
375 (reference tree-row-reference))
376
377
eb0b609d 378(defbinding tree-model-get-column-type () gtype
4e169141 379 (tree-model tree-model)
380 (index int))
381
eb0b609d 382(defbinding tree-model-get-iter (model path &optional (iter (make-instance 'tree-iter))) boolean
4e169141 383 (model tree-model)
1e5e3e14 384 (iter tree-iter :in/return)
4e169141 385 (path tree-path))
386
eb0b609d 387(defun ensure-tree-iter (model row)
388 (etypecase row
389 (tree-iter row)
390 (tree-path
391 (multiple-value-bind (valid-p iter) (tree-model-get-iter model row)
392 (if valid-p
393 iter
394 (error "Invalid tree path for ~A: ~A" model row))))
395 (tree-row-reference
396 (let ((path (tree-row-reference-get-path row)))
397 (if path
398 (ensure-tree-iter model path)
399 (error "~A not valid" row))))))
400
4e169141 401(defbinding tree-model-get-path () tree-path
402 (tree-model tree-model)
403 (iter tree-iter))
404
405(defbinding %tree-model-get-value () nil
406 (tree-model tree-model)
407 (iter tree-iter)
408 (column int)
409 (gvalue gvalue))
410
70b52c33 411(defmethod tree-model-value ((model tree-model) row column)
eb0b609d 412 (let ((index (tree-model-column-index model column)))
780a4e24 413 (with-gvalue (gvalue)
eb0b609d 414 (%tree-model-get-value model (ensure-tree-iter model row) index gvalue))))
415
eb0b609d 416(defmethod tree-model-row-data ((model tree-model) row)
417 (coerce
418 (loop
419 with iter = (ensure-tree-iter model row)
420 for index from 0 to (tree-model-n-columns model)
421 collect (tree-model-value model iter index))
422 'vector))
423
4e169141 424
425(defbinding tree-model-iter-next () boolean
426 (tree-model tree-model)
1e5e3e14 427 (iter tree-iter :in/return))
4e169141 428
429(defbinding tree-model-iter-children
430 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
431 (tree-model tree-model)
1e5e3e14 432 (iter tree-iter :in/return)
4e169141 433 (parent (or null tree-iter)))
434
435(defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child")
436 () boolean
437 (tree-model tree-model)
438 (iter tree-iter))
439
ee950f05 440(defbinding tree-model-iter-n-children (tree-model &optional iter) int
4e169141 441 (tree-model tree-model)
ee950f05 442 (iter (or null tree-iter)))
4e169141 443
444(defbinding tree-model-iter-nth-child
3d36c5d6 445 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
4e169141 446 (tree-model tree-model)
1e5e3e14 447 (iter tree-iter :in/return)
4e169141 448 (parent (or null tree-iter))
449 (n int))
450
451(defbinding tree-model-iter-parent
452 (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
453 (tree-model tree-model)
1e5e3e14 454 (iter tree-iter :in/return)
4e169141 455 (child tree-iter))
456
a92553bd 457(define-callback-marshal %tree-model-foreach-callback boolean
458 (tree-model tree-path tree-iter))
4e169141 459
a92553bd 460(defbinding %tree-model-foreach (tree-model callback-id) nil
4e169141 461 (tree-model tree-model)
a92553bd 462 (%tree-model-foreach-callback callback)
4e169141 463 (callback-id unsigned-int))
464
465(defun tree-model-foreach (model function)
466 (with-callback-function (id function)
467 (%tree-model-foreach model id)))
468
469(defbinding tree-model-row-changed () nil
470 (tree-model tree-model)
471 (path tree-path)
472 (iter tree-iter))
473
474(defbinding tree-model-row-inserted () nil
475 (tree-model tree-model)
476 (path tree-path)
477 (iter tree-iter))
478
479(defbinding tree-model-row-has-child-toggled () nil
480 (tree-model tree-model)
481 (path tree-path)
482 (iter tree-iter))
483
484(defbinding tree-model-row-deleted () nil
485 (tree-model tree-model)
486 (path tree-path)
487 (iter tree-iter))
488
489(defbinding tree-model-rows-reordered () nil
490 (tree-model tree-model)
491 (path tree-path)
492 (iter tree-iter)
493 (new-order int))
494
eb0b609d 495(defmethod tree-model-column-index ((model tree-model) column)
4e169141 496 (or
497 (etypecase column
498 (number column)
eb0b609d 499 (string (position column (user-data model 'column-names) :test #'string=))
500 (symbol (position column (user-data model 'column-names))))
4e169141 501 (error "~A has no column ~S" model column)))
502
eb0b609d 503(defmethod tree-model-column-name ((model tree-model) index)
1e5e3e14 504 (svref (user-data model 'column-names) index))
da82be16 505
4e169141 506
eb0b609d 507(defmethod (setf tree-model-row-data) ((data list) (model tree-model) (iter tree-iter))
508 (loop
509 for (column value) on data by #'cddr
510 do (setf (tree-model-value model iter column) value))
4e169141 511 data)
512
eb0b609d 513(defmethod (setf tree-model-row-data) ((data vector) (model tree-model) row)
514 (loop
515 with iter = (ensure-tree-iter model row)
516 for index from 0
517 for value across data
518 do (setf (tree-model-value model iter index) value))
519 data)
985713d7 520
521
05a3b9e4 522;;; Tree Selection
523
a92553bd 524(define-callback-marshal %tree-selection-callback boolean
525 (tree-selection tree-model tree-path (path-currently-selected boolean)))
05a3b9e4 526
527(defbinding tree-selection-set-select-function (selection function) nil
528 (selection tree-selection)
a92553bd 529 (%tree-selection-callback callback)
05a3b9e4 530 ((register-callback-function function) unsigned-int)
a92553bd 531 (user-data-destroy-callback callback))
05a3b9e4 532
533(defbinding tree-selection-get-selected
534 (selection &optional (iter (make-instance 'tree-iter))) boolean
535 (selection tree-selection)
536 (nil null)
1e5e3e14 537 (iter tree-iter :in/return))
05a3b9e4 538
a92553bd 539(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
05a3b9e4 540
a92553bd 541(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
05a3b9e4 542 (tree-selection tree-selection)
a92553bd 543 (%tree-selection-foreach-callback callback)
05a3b9e4 544 (callback-id unsigned-int))
545
546(defun tree-selection-selected-foreach (selection function)
547 (with-callback-function (id function)
548 (%tree-selection-selected-foreach selection id)))
549
550(defbinding tree-selection-get-selected-rows () (glist tree-path)
551 (tree-selection tree-selection)
552 (nil null))
553
554(defbinding tree-selection-count-selected-rows () int
555 (tree-selection tree-selection))
556
557(defbinding %tree-selection-select-path () nil
558 (tree-selection tree-selection)
559 (tree-path tree-path))
560
561(defbinding %tree-selection-unselect-path () nil
562 (tree-selection tree-selection)
563 (tree-path tree-path))
564
565(defbinding %tree-selection-path-is-selected () boolean
566 (tree-selection tree-selection)
567 (tree-path tree-path))
568
569(defbinding %tree-selection-select-iter () nil
570 (tree-selection tree-selection)
571 (tree-path tree-path))
572
573(defbinding %tree-selection-unselect-iter () nil
574 (tree-selection tree-selection)
575 (tree-path tree-path))
576
577(defbinding %tree-selection-iter-is-selected () boolean
578 (tree-selection tree-selection)
579 (tree-path tree-path))
580
581(defun tree-selection-select (selection row)
582 (etypecase row
583 (tree-path (%tree-selection-select-path selection row))
584 (tree-iter (%tree-selection-select-iter selection row))))
585
586(defun tree-selection-unselect (selection row)
587 (etypecase row
588 (tree-path (%tree-selection-unselect-path selection row))
589 (tree-iter (%tree-selection-unselect-iter selection row))))
590
591(defun tree-selection-is-selected-p (selection row)
592 (etypecase row
593 (tree-path (%tree-selection-path-is-selected selection row))
594 (tree-iter (%tree-selection-iter-is-selected selection row))))
595
596(defbinding tree-selection-select-all () nil
597 (tree-selection tree-selection))
598
599(defbinding tree-selection-unselect-all () nil
600 (tree-selection tree-selection))
601
602(defbinding tree-selection-select-range () nil
603 (tree-selection tree-selection)
604 (start tree-path)
605 (end tree-path))
606
607(defbinding tree-selection-unselect-range () nil
608 (tree-selection tree-selection)
609 (start tree-path)
610 (end tree-path))
611
612
da82be16 613;;; Tree Sortable
614
615(eval-when (:compile-toplevel :load-toplevel :execute)
616 (define-enum-type sort-column (:default -1) (:unsorted -2))
617 (define-enum-type sort-order (:before -1) (:equal 0) (:after 1)))
618
619
a92553bd 620(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
621 (tree-model (a tree-iter) (b tree-iter)))
da82be16 622
623(defbinding tree-sortable-sort-column-changed () nil
624 (sortable tree-sortable))
625
626(defbinding %tree-sortable-get-sort-column-id () boolean
627 (sortable tree-sortable)
628 (column int :out)
629 (order sort-type :out))
630
631(defun tree-sortable-get-sort-column (sortable)
632 (multiple-value-bind (special-p column order)
633 (%tree-sortable-get-sort-column-id sortable)
634 (values
635 (if special-p
636 (int-to-sort-order column)
cc4896ef 637 (tree-model-column-name sortable column))
da82be16 638 order)))
639
640(defbinding (tree-sortable-set-sort-column
641 "gtk_tree_sortable_set_sort_column_id")
642 (sortable column order) nil
643 (sortable tree-sortable)
644 ((etypecase column
645 ((or integer sort-column) column)
eb0b609d 646 (symbol (tree-model-column-index sortable column)))
da82be16 647 (or sort-column int))
648 (order sort-type))
649
650(defbinding %tree-sortable-set-sort-func (sortable column function) nil
651 (sortable tree-sortable)
eb0b609d 652 ((tree-model-column-index sortable column) int)
a92553bd 653 (%tree-iter-compare-callback callback)
da82be16 654 ((register-callback-function function) unsigned-int)
a92553bd 655 (user-data-destroy-callback callback))
da82be16 656
657(defbinding %tree-sortable-set-default-sort-func () nil
658 (sortable tree-sortable)
a92553bd 659 (compare-func (or null callback))
da82be16 660 (callback-id unsigned-int)
a92553bd 661 (destroy-func (or null callback)))
da82be16 662
663(defun tree-sortable-set-sort-func (sortable column function)
664 "Sets the comparison function used when sorting to be FUNCTION. If
665the current sort column of SORTABLE is the same as COLUMN,
666then the model will sort using this function."
667 (cond
668 ((and (eq column :default) (not function))
669 (%tree-sortable-set-default-sort-func sortable nil 0 nil))
670 ((eq column :default)
671 (%tree-sortable-set-default-sort-func sortable
a92553bd 672 %tree-iter-compare-callback
da82be16 673 (register-callback-function function)
a92553bd 674 user-data-destroy-callback))
da82be16 675 ((%tree-sortable-set-sort-func sortable column function))))
676
677(defbinding tree-sortable-has-default-sort-func-p () boolean
678 (sortable tree-sortable))
679
05a3b9e4 680
985713d7 681;;; Tree Store
682
683(defbinding %tree-store-set-column-types () nil
684 (tree-store tree-store)
4e169141 685 ((length columns) unsigned-int)
686 (columns (vector gtype)))
985713d7 687
4e169141 688(defmethod initialize-instance ((tree-store tree-store) &key column-types
689 column-names)
985713d7 690 (call-next-method)
4e169141 691 (%tree-store-set-column-types tree-store column-types)
692 (when column-names
1e5e3e14 693 (setf (user-data tree-store 'column-names) column-names)))
985713d7 694
eb0b609d 695
696(defbinding %tree-store-set-value () nil
697 (tree-store tree-store)
698 (tree-iter tree-iter)
699 (column int)
700 (gvalue gvalue))
701
702(defmethod (setf tree-model-value) (value (store tree-store) row column)
703 (let* ((index (tree-model-column-index store column))
704 (type (tree-model-get-column-type store index)))
705 (with-gvalue (gvalue type value)
706 (%tree-store-set-value store (ensure-tree-iter store row) index gvalue)))
707 value)
708
985713d7 709
710(defbinding tree-store-remove () boolean
711 (tree-store tree-store)
712 (tree-iter tree-iter))
713
4e169141 714(defbinding %tree-store-insert () nil
985713d7 715 (tree-store tree-store)
4e169141 716 (tree-iter tree-iter)
985713d7 717 (parent (or null tree-iter))
718 (position int))
719
4e169141 720(defun tree-store-insert
721 (store parent position &optional data (iter (make-instance 'tree-iter)))
722 (%tree-store-insert store iter parent position)
eb0b609d 723 (when data (setf (tree-model-row-data store iter) data))
4e169141 724 iter)
725
726(defbinding %tree-store-insert-before () nil
985713d7 727 (tree-store tree-store)
4e169141 728 (tree-iter tree-iter)
985713d7 729 (parent (or null tree-iter))
730 (sibling (or null tree-iter)))
731
3d36c5d6 732(defun tree-store-insert-before
4e169141 733 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
734 (%tree-store-insert-before store iter parent sibling)
eb0b609d 735 (when data (setf (tree-model-row-data store iter) data))
4e169141 736 iter)
737
738(defbinding %tree-store-insert-after () nil
985713d7 739 (tree-store tree-store)
4e169141 740 (tree-iter tree-iter)
985713d7 741 (parent (or null tree-iter))
742 (sibling (or null tree-iter)))
743
4e169141 744(defun tree-store-insert-after
745 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
746 (%tree-store-insert-after store iter parent sibling)
eb0b609d 747 (when data (setf (tree-model-row-data store iter) data))
4e169141 748 iter)
749
750(defbinding %tree-store-prepend () nil
985713d7 751 (tree-store tree-store)
4e169141 752 (tree-iter tree-iter)
985713d7 753 (parent (or null tree-iter)))
754
4e169141 755(defun tree-store-prepend
756 (store parent &optional data (iter (make-instance 'tree-iter)))
757 (%tree-store-prepend store iter parent)
eb0b609d 758 (when data (setf (tree-model-row-data store iter) data))
4e169141 759 iter)
760
761(defbinding %tree-store-append () nil
985713d7 762 (tree-store tree-store)
4e169141 763 (tree-iter tree-iter)
985713d7 764 (parent (or null tree-iter)))
765
4e169141 766(defun tree-store-append
767 (store parent &optional data (iter (make-instance 'tree-iter)))
768 (%tree-store-append store iter parent)
eb0b609d 769 (when data (setf (tree-model-row-data store iter) data))
4e169141 770 iter)
771
985713d7 772(defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
773 (tree-store tree-store)
774 (tree-iter tree-iter)
775 (descendant tree-iter))
776
777(defbinding tree-store-iter-depth () int
778 (tree-store tree-store)
779 (tree-iter tree-iter))
780
781(defbinding tree-store-clear () nil
782 (tree-store tree-store))
783
784(defbinding tree-store-reorder () nil
785 (tree-store tree-store)
786 (parent tree-iter)
787 (new-order (vector int)))
788
789(defbinding tree-store-swap () nil
790 (tree-store tree-store)
791 (a tree-iter)
792 (b tree-iter))
793
794(defbinding tree-store-move-before () nil
795 (tree-store tree-store)
796 (iter tree-iter)
797 (psoition (or null tree-iter)))
798
799
800(defbinding tree-store-move-after () nil
801 (tree-store tree-store)
802 (iter tree-iter)
803 (psoition tree-iter))
804
805
806
807;;; Tree View
808
05a3b9e4 809(defmethod initialize-instance ((tree-view tree-view) &rest initargs
810 &key column)
4d1fea77 811 (declare (ignore column))
4e169141 812 (call-next-method)
813 (mapc #'(lambda (column)
814 (tree-view-append-column tree-view column))
815 (get-all initargs :column)))
816
817
985713d7 818(defbinding tree-view-columns-autosize () nil
819 (tree-view tree-view))
820
821(defbinding tree-view-append-column () int
822 (tree-view tree-view)
823 (tree-view-column tree-view-column))
824
825(defbinding tree-view-remove-column () int
826 (tree-view tree-view)
827 (tree-view-column tree-view-column))
828
3d36c5d6 829(defbinding tree-view-insert-column (view column position) int
985713d7 830 (view tree-view)
831 (column tree-view-column)
832 ((if (eq position :end) -1 position) int))
833
834(defbinding tree-view-get-column () tree-view-column
835 (tree-view tree-view)
836 (position int))
837
838(defbinding tree-view-move-column-after () nil
839 (tree-view tree-view)
840 (column tree-view-column)
841 (base-column (or null tree-view-column)))
842
63dbd868 843(define-callback-setter tree-view-set-column-drag-function tree-view boolean
844 (column tree-view-column)
845 (prev tree-view-column)
846 (next tree-view-column))
985713d7 847
848(defbinding tree-view-scroll-to-point () nil
849 (tree-view tree-view)
850 (tree-x int)
851 (tree-y int))
852
853(defbinding tree-view-scroll-to-cell () nil
854 (tree-view tree-view)
855 (path (or null tree-path))
856 (column (or null tree-view-column))
857 (use-align boolean)
858 (row-align single-float)
859 (col-align single-float))
860
63dbd868 861(defbinding (tree-view-set-cursor "gtk_tree_view_set_cursor_on_cell")
862 (tree-view path &key focus-column focus-cell start-editing) nil
985713d7 863 (tree-view tree-view)
864 (path tree-path)
865 (focus-column (or null tree-view-column))
866 (focus-cell (or null cell-renderer))
867 (start-editing boolean))
868
869(defbinding tree-view-get-cursor () nil
870 (tree-view tree-view)
871 (path tree-path :out )
872 (focus-column tree-view-column :out))
873
874(defbinding tree-view-row-activated () nil
875 (tree-view tree-view)
876 (path tree-path )
877 (column tree-view-column))
878
879(defbinding tree-view-expand-all () nil
880 (tree-view tree-view))
881
882(defbinding tree-view-collapse-all () nil
883 (tree-view tree-view))
884
885(defbinding tree-view-expand-to-path () nil
886 (tree-view tree-view)
887 (path tree-path))
888
889(defbinding tree-view-expand-row () nil
890 (tree-view tree-view)
891 (path tree-path)
892 (open-all boolean))
893
894(defbinding tree-view-collapse-row () nil
895 (tree-view tree-view)
896 (path tree-path))
897
a92553bd 898(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
985713d7 899
a92553bd 900(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
985713d7 901 (tree-view tree-view)
a92553bd 902 (%tree-view-mapping-callback callback)
985713d7 903 (callback-id unsigned-int))
904
905(defun map-expanded-rows (function tree-view)
906 (with-callback-function (id function)
907 (%tree-view-map-expanded-rows tree-view id)))
908
909(defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
910 (tree-view tree-view)
911 (path tree-path))
912
913(defbinding tree-view-get-path-at-pos
914 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
915 (tree-view tree-view)
916 (x int)
917 (y int)
918 (path tree-path :out)
919 (column tree-view-column :out)
920 (cell-x int)
921 (cell-y int))
922
923(defbinding tree-view-get-cell-area () nil
924 (tree-view tree-view)
925 (path (or null tree-path))
926 (column (or null tree-view-column))
1e5e3e14 927 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 928
929(defbinding tree-view-get-background-area () nil
930 (tree-view tree-view)
931 (path (or null tree-path))
932 (column (or null tree-view-column))
1e5e3e14 933 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 934
935(defbinding tree-view-get-visible-rect () nil
936 (tree-view tree-view)
1e5e3e14 937 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 938
939;; and many more functions which we'll add later
940
4e169141 941
da82be16 942;;;; Icon View
943
1e5e3e14 944#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
da82be16 945(progn
946 (defbinding icon-view-get-path-at-pos () tree-path
947 (icon-view icon-view)
948 (x int) (y int))
4e169141 949
a92553bd 950 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
da82be16 951
a92553bd 952 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
da82be16 953 (icon-view icon-view)
a92553bd 954 (%icon-view-foreach-callback callback)
da82be16 955 (callback-id unsigned-int))
956
957 (defun icon-view-foreach (icon-view function)
958 (with-callback-function (id function)
959 (%icon-view-selected-foreach icon-view id)))
960
961 (defbinding icon-view-select-path () nil
962 (icon-view icon-view)
963 (path tree-path))
964
965 (defbinding icon-view-unselect-path () nil
966 (icon-view icon-view)
967 (path tree-path))
968
969 (defbinding icon-view-path-is-selected-p () boolean
970 (icon-view icon-view)
971 (path tree-path))
972
973 (defbinding icon-view-get-selected-items () (glist tree-path)
974 (icon-view icon-view))
975
976 (defbinding icon-view-select-all () nil
977 (icon-view icon-view))
978
979 (defbinding icon-view-unselect-all () nil
980 (icon-view icon-view))
981
982 (defbinding icon-view-item-activated () nil
983 (icon-view icon-view)
984 (path tree-path))
985
986 (defbinding %icon-view-set-text-column (column icon-view) nil
987 (icon-view icon-view)
988 ((if (integerp column)
989 column
eb0b609d 990 (tree-model-column-index (icon-view-model icon-view) column)) int))
da82be16 991
880f23cb 992 (defbinding %%icon-view-get-text-column () int
993 (icon-view icon-view))
994
995 (defun %icon-view-get-text-column (icon-view)
eb0b609d 996 (tree-model-column-index
880f23cb 997 (icon-view-model icon-view)
998 (%%icon-view-get-text-column icon-view)))
999
1000 (defun %icon-view-text-column-boundp (icon-view)
1001 (not (eql (%%icon-view-get-text-column icon-view) -1)))
1002
1003
da82be16 1004 (defbinding %icon-view-set-markup-column (column icon-view) nil
1005 (icon-view icon-view)
1006 ((if (integerp column)
1007 column
eb0b609d 1008 (tree-model-column-index (icon-view-model icon-view) column)) int))
da82be16 1009
880f23cb 1010 (defbinding %%icon-view-get-markup-column () int
1011 (icon-view icon-view))
1012
1013 (defun %icon-view-get-markup-column (icon-view)
eb0b609d 1014 (tree-model-column-index
880f23cb 1015 (icon-view-model icon-view)
1016 (%%icon-view-get-markup-column icon-view)))
1017
1018 (defun %icon-view-markup-column-boundp (icon-view)
1019 (not (eql (%%icon-view-get-markup-column icon-view) -1)))
1020
1021
da82be16 1022 (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
1023 (icon-view icon-view)
1024 ((if (integerp column)
1025 column
eb0b609d 1026 (tree-model-column-index (icon-view-model icon-view) column)) int)))
92ba85d4 1027
880f23cb 1028 (defbinding %%icon-view-get-pixbuf-column () int
1029 (icon-view icon-view))
1030
1031 (defun %icon-view-get-pixbuf-column (icon-view)
eb0b609d 1032 (tree-model-column-index
880f23cb 1033 (icon-view-model icon-view)
1034 (%%icon-view-get-pixbuf-column icon-view)))
1035
1036 (defun %icon-view-pixbuf-column-boundp (icon-view)
1037 (not (eql (%%icon-view-get-pixbuf-column icon-view) -1)))
1038
1039
1e5e3e14 1040#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
92ba85d4 1041(progn
1042 (defbinding icon-view-get-item-at-pos () boolean
1043 (icon-view icon-view)
1044 (x int)
1045 (y int)
1046 (tree-path tree-path :out)
1047 (cell cell-renderer :out))
1048
1049 (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
1050 (icon-view icon-view)
1051 (path tree-path)
1052 (cell (or null cell-renderer))
1053 (start-editing boolean))
1054
1055 (defbinding icon-view-get-cursor () boolean
1056 (icon-view icon-view)
1057 (path tree-path :out)
1058 (cell cell-renderer :out))
1059
1060 (defbinding icon-view-get-dest-item-at-pos () boolean
1061 (icon-view icon-view)
1062 (drag-x int)
1063 (drag-y int)
1064 (tree-path tree-path :out)
1065 (pos drop-position :out))
1066
1067 (defbinding icon-view-create-drag-icon () gdk:pixmap
1068 (icon-view icon-view)
1069 (tree-path tree-path))
1070
1071 (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
1072 (icon-view icon-view)
1073 (tree-path tree-path)
1074 ((or row-align column-align) boolean)
1075 (row-align single-float)
1076 (column-align single-float))
1077
1078 (defbinding icon-view-get-visible-range () boolean
1079 (icon-view icon-view)
1080 (start-path tree-path :out)
1081 (end-path tree-path :out))
1082
63dbd868 1083 (defbinding icon-view-enable-model-drag-source () nil
1084 (icon-view icon-view)
1085 (start-button-mask gdk:modifier-type)
1086 (targets (vector (inlined target-entry)))
1087 ((length targets) unsigned-int)
1088 (actions gdk:drag-action))
1089
1090 (defbinding icon-view-enable-model-drag-dest () nil
1091 (icon-view icon-view)
1092 (targets (vector (inlined target-entry)))
1093 ((length targets) unsigned-int)
1094 (actions gdk:drag-action))
92ba85d4 1095
1096 (defbinding icon-view-unset-model-drag-source () nil
1097 (icon-view icon-view))
1098
1099 (defbinding icon-view-unset-model-drag-dest () nil
1100 (icon-view icon-view)))