gtk/gtktree.lisp: Fixing string representations of tree paths.
[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
073378a5 23;; $Id: gtktree.lisp,v 1.34 2008/04/11 20:53:32 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)
b66270aa 258 (unless (null-pointer-p location)
259 (let ((indices (%tree-path-get-indices location))
260 (depth (%tree-path-get-depth location)))
261 (if (null-pointer-p indices)
262 #()
263 (map-c-vector 'vector #'identity indices 'int depth)))))
4e169141 264
1e5e3e14 265(defmacro %with-tree-path ((var path) &body body)
928e2b4e 266 (let* ((pointer-offset (adjust-offset (size-of 'int) 'pointer))
267 (vector-offset (adjust-offset (+ pointer-offset (size-of 'pointer)) 'int)))
268 `(with-memory (,var (+ ,vector-offset (* ,(size-of 'int) (length ,path))))
1e5e3e14 269 (funcall (writer-function 'int) (length ,path) ,var)
928e2b4e 270 (setf (ref-pointer ,var ,pointer-offset) (pointer+ ,var ,vector-offset))
1e5e3e14 271 (make-c-vector 'int (length ,path) :content ,path :location (pointer+ ,var ,vector-offset))
272 ,@body)))
273
4e169141 274(eval-when (:compile-toplevel :load-toplevel :execute)
4d1fea77 275 (define-type-method alien-type ((type tree-path))
276 (declare (ignore type))
4e169141 277 (alien-type 'pointer))
278
1e5e3e14 279 (define-type-method size-of ((type tree-path) &key inlined)
280 (assert-not-inlined type inlined)
4e169141 281 (size-of 'pointer))
282
1e5e3e14 283 (define-type-method alien-arg-wrapper ((type tree-path) var path style form &optional copy-in-p)
4d1fea77 284 (declare (ignore type))
1e5e3e14 285 (cond
286 ((and (in-arg-p style) copy-in-p)
287 `(with-pointer (,var (%make-tree-path ,path))
288 ,form))
289 ((and (in-arg-p style) (not (out-arg-p style)))
290 `(%with-tree-path (,var ,path)
291 ,form))
292 ((and (in-arg-p style) (out-arg-p style))
293 (let ((tree-path (make-symbol "SYMBOL")))
294 `(%with-tree-path (,tree-path ,path)
295 (with-pointer (,var ,tree-path)
296 ,form))))
297 ((and (out-arg-p style) (not (in-arg-p style)))
298 `(with-pointer (,var)
299 ,form))))
300
301 (define-type-method to-alien-form ((type tree-path) path &optional copy-p)
302 (declare (ignore type copy-p))
4e169141 303 `(%make-tree-path ,path))
304
1e5e3e14 305 (define-type-method from-alien-form ((type tree-path) location &key (ref :free))
4d1fea77 306 (declare (ignore type))
1e5e3e14 307 `(prog1
308 (%tree-path-to-vector ,location)
309 ,(when (eq ref :free)
310 `(%tree-path-free ,location)))))
4e169141 311
1e5e3e14 312(define-type-method to-alien-function ((type tree-path) &optional copy-p)
4d1fea77 313 (declare (ignore type))
1e5e3e14 314 #'%make-tree-path
315 (unless copy-p
316 #'(lambda (tree-path location)
317 (declare (ignore tree-path))
05a3b9e4 318 (%tree-path-free location))))
05a3b9e4 319
1e5e3e14 320(define-type-method from-alien-function ((type tree-path) &key (ref :free))
4d1fea77 321 (declare (ignore type))
1e5e3e14 322 (if (eq ref :free)
323 #'(lambda (location)
324 (prog1
325 (%tree-path-to-vector location)
326 (%tree-path-free location)))
327 #'(lambda (location)
328 (%tree-path-to-vector location))))
329
330(define-type-method writer-function ((type tree-path) &key temp inlined)
331 (declare (ignore temp))
332 (assert-not-inlined type inlined)
05a3b9e4 333 (let ((writer (writer-function 'pointer)))
334 #'(lambda (path location &optional (offset 0))
335 (funcall writer (%make-tree-path path) location offset))))
336
1e5e3e14 337(define-type-method reader-function ((type tree-path) &key ref inlined)
338 (declare (ignore ref))
339 (assert-not-inlined type inlined)
340 #'(lambda (location &optional (offset 0))
341 (%tree-path-to-vector (ref-pointer location offset))))
4e169141 342
1e5e3e14 343(define-type-method destroy-function ((type tree-path) &key temp inlined)
344 (declare (ignore temp))
345 (assert-not-inlined type inlined)
346 #'(lambda (location &optional (offset 0))
347 (%tree-path-free (ref-pointer location offset))))
c8211115 348
6beb5074 349(defun ensure-tree-path (path)
350 (etypecase path
1c4d0e47
MW
351 (string (map 'vector #'parse-integer
352 (clg-utils:split-string path :delimiter #\:)))
6beb5074 353 (vector path)))
354
4e169141 355
eb0b609d 356;;; Tree Model
357
f335841f 358(defgeneric tree-model-value (model row column))
359(defgeneric (setf tree-model-value) (value model row column))
360(defgeneric tree-model-row-data (model row))
361(defgeneric (setf tree-model-row-data) (data model row))
362(defgeneric tree-model-column-index (model column))
363(defgeneric tree-model-column-name (model index))
364
365
4e169141 366(defbinding %tree-row-reference-new () pointer
367 (model tree-model)
368 (path tree-path))
369
39db92d4 370(defmethod allocate-foreign ((reference tree-row-reference) &key model path)
371 (%tree-row-reference-new model path))
4e169141 372
073378a5 373(defbinding tree-row-reference-get-path () (or null tree-path)
4e169141 374 (reference tree-row-reference))
375
376(defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
377 (reference tree-row-reference))
378
379
eb0b609d 380(defbinding tree-model-get-column-type () gtype
4e169141 381 (tree-model tree-model)
382 (index int))
383
eb0b609d 384(defbinding tree-model-get-iter (model path &optional (iter (make-instance 'tree-iter))) boolean
4e169141 385 (model tree-model)
1e5e3e14 386 (iter tree-iter :in/return)
1c4d0e47 387 ((ensure-tree-path path) tree-path))
9fb0a6d3 388
cf444f63 389#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.12.0")
9fb0a6d3 390(defmethod allocate-foreign ((tree-iter tree-iter) &rest initargs)
391 (declare (ignore initargs))
392 (let ((size (foreign-size (class-of tree-iter))))
393 (slice-alloc size)))
4e169141 394
eb0b609d 395(defun ensure-tree-iter (model row)
396 (etypecase row
397 (tree-iter row)
1c4d0e47 398 ((or tree-path string)
eb0b609d 399 (multiple-value-bind (valid-p iter) (tree-model-get-iter model row)
400 (if valid-p
401 iter
402 (error "Invalid tree path for ~A: ~A" model row))))
403 (tree-row-reference
404 (let ((path (tree-row-reference-get-path row)))
405 (if path
406 (ensure-tree-iter model path)
407 (error "~A not valid" row))))))
408
4e169141 409(defbinding tree-model-get-path () tree-path
410 (tree-model tree-model)
411 (iter tree-iter))
412
413(defbinding %tree-model-get-value () nil
414 (tree-model tree-model)
415 (iter tree-iter)
416 (column int)
417 (gvalue gvalue))
418
70b52c33 419(defmethod tree-model-value ((model tree-model) row column)
eb0b609d 420 (let ((index (tree-model-column-index model column)))
780a4e24 421 (with-gvalue (gvalue)
eb0b609d 422 (%tree-model-get-value model (ensure-tree-iter model row) index gvalue))))
423
eb0b609d 424(defmethod tree-model-row-data ((model tree-model) row)
425 (coerce
426 (loop
427 with iter = (ensure-tree-iter model row)
985e276d 428 for index from 0 below (tree-model-n-columns model)
eb0b609d 429 collect (tree-model-value model iter index))
430 'vector))
431
4e169141 432
433(defbinding tree-model-iter-next () boolean
434 (tree-model tree-model)
1e5e3e14 435 (iter tree-iter :in/return))
4e169141 436
437(defbinding tree-model-iter-children
438 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
439 (tree-model tree-model)
1e5e3e14 440 (iter tree-iter :in/return)
4e169141 441 (parent (or null tree-iter)))
442
443(defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child")
444 () boolean
445 (tree-model tree-model)
446 (iter tree-iter))
447
ee950f05 448(defbinding tree-model-iter-n-children (tree-model &optional iter) int
4e169141 449 (tree-model tree-model)
ee950f05 450 (iter (or null tree-iter)))
4e169141 451
452(defbinding tree-model-iter-nth-child
3d36c5d6 453 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
4e169141 454 (tree-model tree-model)
1e5e3e14 455 (iter tree-iter :in/return)
4e169141 456 (parent (or null tree-iter))
457 (n int))
458
459(defbinding tree-model-iter-parent
460 (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
461 (tree-model tree-model)
1e5e3e14 462 (iter tree-iter :in/return)
4e169141 463 (child tree-iter))
464
a92553bd 465(define-callback-marshal %tree-model-foreach-callback boolean
466 (tree-model tree-path tree-iter))
4e169141 467
a92553bd 468(defbinding %tree-model-foreach (tree-model callback-id) nil
4e169141 469 (tree-model tree-model)
a92553bd 470 (%tree-model-foreach-callback callback)
4e169141 471 (callback-id unsigned-int))
472
473(defun tree-model-foreach (model function)
474 (with-callback-function (id function)
475 (%tree-model-foreach model id)))
476
477(defbinding tree-model-row-changed () nil
478 (tree-model tree-model)
479 (path tree-path)
480 (iter tree-iter))
481
482(defbinding tree-model-row-inserted () nil
483 (tree-model tree-model)
484 (path tree-path)
485 (iter tree-iter))
486
487(defbinding tree-model-row-has-child-toggled () nil
488 (tree-model tree-model)
489 (path tree-path)
490 (iter tree-iter))
491
492(defbinding tree-model-row-deleted () nil
493 (tree-model tree-model)
494 (path tree-path)
495 (iter tree-iter))
496
497(defbinding tree-model-rows-reordered () nil
498 (tree-model tree-model)
499 (path tree-path)
500 (iter tree-iter)
501 (new-order int))
502
eb0b609d 503(defmethod tree-model-column-index ((model tree-model) column)
4e169141 504 (or
505 (etypecase column
506 (number column)
eb0b609d 507 (string (position column (user-data model 'column-names) :test #'string=))
508 (symbol (position column (user-data model 'column-names))))
4e169141 509 (error "~A has no column ~S" model column)))
510
eb0b609d 511(defmethod tree-model-column-name ((model tree-model) index)
1e5e3e14 512 (svref (user-data model 'column-names) index))
da82be16 513
4e169141 514
eb0b609d 515(defmethod (setf tree-model-row-data) ((data list) (model tree-model) (iter tree-iter))
516 (loop
517 for (column value) on data by #'cddr
518 do (setf (tree-model-value model iter column) value))
4e169141 519 data)
520
eb0b609d 521(defmethod (setf tree-model-row-data) ((data vector) (model tree-model) row)
522 (loop
523 with iter = (ensure-tree-iter model row)
524 for index from 0
525 for value across data
526 do (setf (tree-model-value model iter index) value))
527 data)
985713d7 528
529
05a3b9e4 530;;; Tree Selection
531
a92553bd 532(define-callback-marshal %tree-selection-callback boolean
533 (tree-selection tree-model tree-path (path-currently-selected boolean)))
05a3b9e4 534
535(defbinding tree-selection-set-select-function (selection function) nil
536 (selection tree-selection)
a92553bd 537 (%tree-selection-callback callback)
05a3b9e4 538 ((register-callback-function function) unsigned-int)
a92553bd 539 (user-data-destroy-callback callback))
05a3b9e4 540
541(defbinding tree-selection-get-selected
542 (selection &optional (iter (make-instance 'tree-iter))) boolean
543 (selection tree-selection)
544 (nil null)
1e5e3e14 545 (iter tree-iter :in/return))
05a3b9e4 546
a92553bd 547(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
05a3b9e4 548
a92553bd 549(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
05a3b9e4 550 (tree-selection tree-selection)
a92553bd 551 (%tree-selection-foreach-callback callback)
05a3b9e4 552 (callback-id unsigned-int))
553
554(defun tree-selection-selected-foreach (selection function)
555 (with-callback-function (id function)
556 (%tree-selection-selected-foreach selection id)))
557
558(defbinding tree-selection-get-selected-rows () (glist tree-path)
559 (tree-selection tree-selection)
560 (nil null))
561
562(defbinding tree-selection-count-selected-rows () int
563 (tree-selection tree-selection))
564
565(defbinding %tree-selection-select-path () nil
566 (tree-selection tree-selection)
567 (tree-path tree-path))
568
569(defbinding %tree-selection-unselect-path () nil
570 (tree-selection tree-selection)
571 (tree-path tree-path))
572
573(defbinding %tree-selection-path-is-selected () boolean
574 (tree-selection tree-selection)
575 (tree-path tree-path))
576
577(defbinding %tree-selection-select-iter () nil
578 (tree-selection tree-selection)
4a4c441d 579 (tree-iter tree-iter))
05a3b9e4 580
581(defbinding %tree-selection-unselect-iter () nil
582 (tree-selection tree-selection)
4a4c441d 583 (tree-iter tree-iter))
05a3b9e4 584
585(defbinding %tree-selection-iter-is-selected () boolean
586 (tree-selection tree-selection)
4a4c441d 587 (tree-iter tree-iter))
05a3b9e4 588
589(defun tree-selection-select (selection row)
590 (etypecase row
591 (tree-path (%tree-selection-select-path selection row))
592 (tree-iter (%tree-selection-select-iter selection row))))
593
594(defun tree-selection-unselect (selection row)
595 (etypecase row
596 (tree-path (%tree-selection-unselect-path selection row))
597 (tree-iter (%tree-selection-unselect-iter selection row))))
598
599(defun tree-selection-is-selected-p (selection row)
600 (etypecase row
601 (tree-path (%tree-selection-path-is-selected selection row))
602 (tree-iter (%tree-selection-iter-is-selected selection row))))
603
604(defbinding tree-selection-select-all () nil
605 (tree-selection tree-selection))
606
607(defbinding tree-selection-unselect-all () nil
608 (tree-selection tree-selection))
609
610(defbinding tree-selection-select-range () nil
611 (tree-selection tree-selection)
612 (start tree-path)
613 (end tree-path))
614
615(defbinding tree-selection-unselect-range () nil
616 (tree-selection tree-selection)
617 (start tree-path)
618 (end tree-path))
619
620
da82be16 621;;; Tree Sortable
622
623(eval-when (:compile-toplevel :load-toplevel :execute)
624 (define-enum-type sort-column (:default -1) (:unsorted -2))
625 (define-enum-type sort-order (:before -1) (:equal 0) (:after 1)))
626
627
a92553bd 628(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
629 (tree-model (a tree-iter) (b tree-iter)))
da82be16 630
631(defbinding tree-sortable-sort-column-changed () nil
632 (sortable tree-sortable))
633
634(defbinding %tree-sortable-get-sort-column-id () boolean
635 (sortable tree-sortable)
636 (column int :out)
637 (order sort-type :out))
638
639(defun tree-sortable-get-sort-column (sortable)
640 (multiple-value-bind (special-p column order)
641 (%tree-sortable-get-sort-column-id sortable)
642 (values
643 (if special-p
644 (int-to-sort-order column)
cc4896ef 645 (tree-model-column-name sortable column))
da82be16 646 order)))
647
648(defbinding (tree-sortable-set-sort-column
649 "gtk_tree_sortable_set_sort_column_id")
650 (sortable column order) nil
651 (sortable tree-sortable)
652 ((etypecase column
653 ((or integer sort-column) column)
eb0b609d 654 (symbol (tree-model-column-index sortable column)))
da82be16 655 (or sort-column int))
656 (order sort-type))
657
658(defbinding %tree-sortable-set-sort-func (sortable column function) nil
659 (sortable tree-sortable)
eb0b609d 660 ((tree-model-column-index sortable column) int)
a92553bd 661 (%tree-iter-compare-callback callback)
da82be16 662 ((register-callback-function function) unsigned-int)
a92553bd 663 (user-data-destroy-callback callback))
da82be16 664
665(defbinding %tree-sortable-set-default-sort-func () nil
666 (sortable tree-sortable)
a92553bd 667 (compare-func (or null callback))
da82be16 668 (callback-id unsigned-int)
a92553bd 669 (destroy-func (or null callback)))
da82be16 670
671(defun tree-sortable-set-sort-func (sortable column function)
672 "Sets the comparison function used when sorting to be FUNCTION. If
673the current sort column of SORTABLE is the same as COLUMN,
674then the model will sort using this function."
675 (cond
676 ((and (eq column :default) (not function))
677 (%tree-sortable-set-default-sort-func sortable nil 0 nil))
678 ((eq column :default)
679 (%tree-sortable-set-default-sort-func sortable
a92553bd 680 %tree-iter-compare-callback
da82be16 681 (register-callback-function function)
a92553bd 682 user-data-destroy-callback))
da82be16 683 ((%tree-sortable-set-sort-func sortable column function))))
684
685(defbinding tree-sortable-has-default-sort-func-p () boolean
686 (sortable tree-sortable))
687
05a3b9e4 688
985713d7 689;;; Tree Store
690
691(defbinding %tree-store-set-column-types () nil
692 (tree-store tree-store)
4e169141 693 ((length columns) unsigned-int)
694 (columns (vector gtype)))
985713d7 695
4e169141 696(defmethod initialize-instance ((tree-store tree-store) &key column-types
697 column-names)
985713d7 698 (call-next-method)
4e169141 699 (%tree-store-set-column-types tree-store column-types)
700 (when column-names
1e5e3e14 701 (setf (user-data tree-store 'column-names) column-names)))
985713d7 702
eb0b609d 703
704(defbinding %tree-store-set-value () nil
705 (tree-store tree-store)
706 (tree-iter tree-iter)
707 (column int)
708 (gvalue gvalue))
709
710(defmethod (setf tree-model-value) (value (store tree-store) row column)
711 (let* ((index (tree-model-column-index store column))
712 (type (tree-model-get-column-type store index)))
713 (with-gvalue (gvalue type value)
714 (%tree-store-set-value store (ensure-tree-iter store row) index gvalue)))
715 value)
716
985713d7 717
718(defbinding tree-store-remove () boolean
719 (tree-store tree-store)
720 (tree-iter tree-iter))
721
4e169141 722(defbinding %tree-store-insert () nil
985713d7 723 (tree-store tree-store)
4e169141 724 (tree-iter tree-iter)
985713d7 725 (parent (or null tree-iter))
726 (position int))
727
4e169141 728(defun tree-store-insert
729 (store parent position &optional data (iter (make-instance 'tree-iter)))
730 (%tree-store-insert store iter parent position)
eb0b609d 731 (when data (setf (tree-model-row-data store iter) data))
4e169141 732 iter)
733
734(defbinding %tree-store-insert-before () nil
985713d7 735 (tree-store tree-store)
4e169141 736 (tree-iter tree-iter)
985713d7 737 (parent (or null tree-iter))
738 (sibling (or null tree-iter)))
739
3d36c5d6 740(defun tree-store-insert-before
4e169141 741 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
742 (%tree-store-insert-before store iter parent sibling)
eb0b609d 743 (when data (setf (tree-model-row-data store iter) data))
4e169141 744 iter)
745
746(defbinding %tree-store-insert-after () nil
985713d7 747 (tree-store tree-store)
4e169141 748 (tree-iter tree-iter)
985713d7 749 (parent (or null tree-iter))
750 (sibling (or null tree-iter)))
751
4e169141 752(defun tree-store-insert-after
753 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
754 (%tree-store-insert-after store iter parent sibling)
eb0b609d 755 (when data (setf (tree-model-row-data store iter) data))
4e169141 756 iter)
757
758(defbinding %tree-store-prepend () nil
985713d7 759 (tree-store tree-store)
4e169141 760 (tree-iter tree-iter)
985713d7 761 (parent (or null tree-iter)))
762
4e169141 763(defun tree-store-prepend
764 (store parent &optional data (iter (make-instance 'tree-iter)))
765 (%tree-store-prepend store iter parent)
eb0b609d 766 (when data (setf (tree-model-row-data store iter) data))
4e169141 767 iter)
768
769(defbinding %tree-store-append () nil
985713d7 770 (tree-store tree-store)
4e169141 771 (tree-iter tree-iter)
985713d7 772 (parent (or null tree-iter)))
773
4e169141 774(defun tree-store-append
775 (store parent &optional data (iter (make-instance 'tree-iter)))
776 (%tree-store-append store iter parent)
eb0b609d 777 (when data (setf (tree-model-row-data store iter) data))
4e169141 778 iter)
779
985713d7 780(defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
781 (tree-store tree-store)
782 (tree-iter tree-iter)
783 (descendant tree-iter))
784
785(defbinding tree-store-iter-depth () int
786 (tree-store tree-store)
787 (tree-iter tree-iter))
788
789(defbinding tree-store-clear () nil
790 (tree-store tree-store))
791
792(defbinding tree-store-reorder () nil
793 (tree-store tree-store)
794 (parent tree-iter)
795 (new-order (vector int)))
796
797(defbinding tree-store-swap () nil
798 (tree-store tree-store)
799 (a tree-iter)
800 (b tree-iter))
801
802(defbinding tree-store-move-before () nil
803 (tree-store tree-store)
804 (iter tree-iter)
805 (psoition (or null tree-iter)))
806
807
808(defbinding tree-store-move-after () nil
809 (tree-store tree-store)
810 (iter tree-iter)
811 (psoition tree-iter))
812
813
814
815;;; Tree View
816
05a3b9e4 817(defmethod initialize-instance ((tree-view tree-view) &rest initargs
818 &key column)
4d1fea77 819 (declare (ignore column))
4e169141 820 (call-next-method)
821 (mapc #'(lambda (column)
822 (tree-view-append-column tree-view column))
823 (get-all initargs :column)))
824
825
985713d7 826(defbinding tree-view-columns-autosize () nil
827 (tree-view tree-view))
828
829(defbinding tree-view-append-column () int
830 (tree-view tree-view)
831 (tree-view-column tree-view-column))
832
833(defbinding tree-view-remove-column () int
834 (tree-view tree-view)
835 (tree-view-column tree-view-column))
836
3d36c5d6 837(defbinding tree-view-insert-column (view column position) int
985713d7 838 (view tree-view)
839 (column tree-view-column)
840 ((if (eq position :end) -1 position) int))
841
842(defbinding tree-view-get-column () tree-view-column
843 (tree-view tree-view)
844 (position int))
845
846(defbinding tree-view-move-column-after () nil
847 (tree-view tree-view)
848 (column tree-view-column)
849 (base-column (or null tree-view-column)))
850
63dbd868 851(define-callback-setter tree-view-set-column-drag-function tree-view boolean
852 (column tree-view-column)
853 (prev tree-view-column)
854 (next tree-view-column))
985713d7 855
856(defbinding tree-view-scroll-to-point () nil
857 (tree-view tree-view)
858 (tree-x int)
859 (tree-y int))
860
861(defbinding tree-view-scroll-to-cell () nil
862 (tree-view tree-view)
863 (path (or null tree-path))
864 (column (or null tree-view-column))
865 (use-align boolean)
866 (row-align single-float)
867 (col-align single-float))
868
63dbd868 869(defbinding (tree-view-set-cursor "gtk_tree_view_set_cursor_on_cell")
870 (tree-view path &key focus-column focus-cell start-editing) nil
985713d7 871 (tree-view tree-view)
872 (path tree-path)
873 (focus-column (or null tree-view-column))
874 (focus-cell (or null cell-renderer))
875 (start-editing boolean))
876
877(defbinding tree-view-get-cursor () nil
878 (tree-view tree-view)
879 (path tree-path :out )
880 (focus-column tree-view-column :out))
881
882(defbinding tree-view-row-activated () nil
883 (tree-view tree-view)
884 (path tree-path )
885 (column tree-view-column))
886
887(defbinding tree-view-expand-all () nil
888 (tree-view tree-view))
889
890(defbinding tree-view-collapse-all () nil
891 (tree-view tree-view))
892
893(defbinding tree-view-expand-to-path () nil
894 (tree-view tree-view)
895 (path tree-path))
896
897(defbinding tree-view-expand-row () nil
898 (tree-view tree-view)
899 (path tree-path)
900 (open-all boolean))
901
902(defbinding tree-view-collapse-row () nil
903 (tree-view tree-view)
904 (path tree-path))
905
a92553bd 906(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
985713d7 907
a92553bd 908(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
985713d7 909 (tree-view tree-view)
a92553bd 910 (%tree-view-mapping-callback callback)
985713d7 911 (callback-id unsigned-int))
912
913(defun map-expanded-rows (function tree-view)
914 (with-callback-function (id function)
915 (%tree-view-map-expanded-rows tree-view id)))
916
917(defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
918 (tree-view tree-view)
919 (path tree-path))
920
921(defbinding tree-view-get-path-at-pos
922 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
923 (tree-view tree-view)
924 (x int)
925 (y int)
926 (path tree-path :out)
927 (column tree-view-column :out)
928 (cell-x int)
929 (cell-y int))
930
931(defbinding tree-view-get-cell-area () nil
932 (tree-view tree-view)
933 (path (or null tree-path))
934 (column (or null tree-view-column))
1e5e3e14 935 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 936
937(defbinding tree-view-get-background-area () nil
938 (tree-view tree-view)
939 (path (or null tree-path))
940 (column (or null tree-view-column))
1e5e3e14 941 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 942
943(defbinding tree-view-get-visible-rect () nil
944 (tree-view tree-view)
1e5e3e14 945 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 946
947;; and many more functions which we'll add later
948
4e169141 949
da82be16 950;;;; Icon View
951
1e5e3e14 952#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
da82be16 953(progn
954 (defbinding icon-view-get-path-at-pos () tree-path
955 (icon-view icon-view)
956 (x int) (y int))
4e169141 957
a92553bd 958 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
da82be16 959
a92553bd 960 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
da82be16 961 (icon-view icon-view)
a92553bd 962 (%icon-view-foreach-callback callback)
da82be16 963 (callback-id unsigned-int))
964
965 (defun icon-view-foreach (icon-view function)
966 (with-callback-function (id function)
967 (%icon-view-selected-foreach icon-view id)))
968
969 (defbinding icon-view-select-path () nil
970 (icon-view icon-view)
971 (path tree-path))
972
973 (defbinding icon-view-unselect-path () nil
974 (icon-view icon-view)
975 (path tree-path))
976
977 (defbinding icon-view-path-is-selected-p () boolean
978 (icon-view icon-view)
979 (path tree-path))
980
981 (defbinding icon-view-get-selected-items () (glist tree-path)
982 (icon-view icon-view))
983
984 (defbinding icon-view-select-all () nil
985 (icon-view icon-view))
986
987 (defbinding icon-view-unselect-all () nil
988 (icon-view icon-view))
989
990 (defbinding icon-view-item-activated () nil
991 (icon-view icon-view)
992 (path tree-path))
993
994 (defbinding %icon-view-set-text-column (column icon-view) nil
995 (icon-view icon-view)
996 ((if (integerp column)
997 column
eb0b609d 998 (tree-model-column-index (icon-view-model icon-view) column)) int))
da82be16 999
880f23cb 1000 (defbinding %%icon-view-get-text-column () int
1001 (icon-view icon-view))
1002
1003 (defun %icon-view-get-text-column (icon-view)
eb0b609d 1004 (tree-model-column-index
880f23cb 1005 (icon-view-model icon-view)
1006 (%%icon-view-get-text-column icon-view)))
1007
1008 (defun %icon-view-text-column-boundp (icon-view)
1009 (not (eql (%%icon-view-get-text-column icon-view) -1)))
1010
1011
da82be16 1012 (defbinding %icon-view-set-markup-column (column icon-view) nil
1013 (icon-view icon-view)
1014 ((if (integerp column)
1015 column
eb0b609d 1016 (tree-model-column-index (icon-view-model icon-view) column)) int))
da82be16 1017
880f23cb 1018 (defbinding %%icon-view-get-markup-column () int
1019 (icon-view icon-view))
1020
1021 (defun %icon-view-get-markup-column (icon-view)
eb0b609d 1022 (tree-model-column-index
880f23cb 1023 (icon-view-model icon-view)
1024 (%%icon-view-get-markup-column icon-view)))
1025
1026 (defun %icon-view-markup-column-boundp (icon-view)
1027 (not (eql (%%icon-view-get-markup-column icon-view) -1)))
1028
1029
da82be16 1030 (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
1031 (icon-view icon-view)
1032 ((if (integerp column)
1033 column
eb0b609d 1034 (tree-model-column-index (icon-view-model icon-view) column)) int)))
92ba85d4 1035
880f23cb 1036 (defbinding %%icon-view-get-pixbuf-column () int
1037 (icon-view icon-view))
1038
1039 (defun %icon-view-get-pixbuf-column (icon-view)
eb0b609d 1040 (tree-model-column-index
880f23cb 1041 (icon-view-model icon-view)
1042 (%%icon-view-get-pixbuf-column icon-view)))
1043
1044 (defun %icon-view-pixbuf-column-boundp (icon-view)
1045 (not (eql (%%icon-view-get-pixbuf-column icon-view) -1)))
1046
1047
1e5e3e14 1048#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
92ba85d4 1049(progn
1050 (defbinding icon-view-get-item-at-pos () boolean
1051 (icon-view icon-view)
1052 (x int)
1053 (y int)
1054 (tree-path tree-path :out)
1055 (cell cell-renderer :out))
1056
1057 (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
1058 (icon-view icon-view)
1059 (path tree-path)
1060 (cell (or null cell-renderer))
1061 (start-editing boolean))
1062
1063 (defbinding icon-view-get-cursor () boolean
1064 (icon-view icon-view)
1065 (path tree-path :out)
1066 (cell cell-renderer :out))
1067
1068 (defbinding icon-view-get-dest-item-at-pos () boolean
1069 (icon-view icon-view)
1070 (drag-x int)
1071 (drag-y int)
1072 (tree-path tree-path :out)
1073 (pos drop-position :out))
1074
1075 (defbinding icon-view-create-drag-icon () gdk:pixmap
1076 (icon-view icon-view)
1077 (tree-path tree-path))
1078
1079 (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
1080 (icon-view icon-view)
1081 (tree-path tree-path)
1082 ((or row-align column-align) boolean)
1083 (row-align single-float)
1084 (column-align single-float))
1085
1086 (defbinding icon-view-get-visible-range () boolean
1087 (icon-view icon-view)
1088 (start-path tree-path :out)
1089 (end-path tree-path :out))
1090
63dbd868 1091 (defbinding icon-view-enable-model-drag-source () nil
1092 (icon-view icon-view)
1093 (start-button-mask gdk:modifier-type)
1094 (targets (vector (inlined target-entry)))
1095 ((length targets) unsigned-int)
1096 (actions gdk:drag-action))
1097
1098 (defbinding icon-view-enable-model-drag-dest () nil
1099 (icon-view icon-view)
1100 (targets (vector (inlined target-entry)))
1101 ((length targets) unsigned-int)
1102 (actions gdk:drag-action))
92ba85d4 1103
1104 (defbinding icon-view-unset-model-drag-source () nil
1105 (icon-view icon-view))
1106
1107 (defbinding icon-view-unset-model-drag-dest () nil
1108 (icon-view icon-view)))