gtk/gtktree.lisp: Fixing string representations of tree paths.
[clg] / gtk / gtktree.lisp
1 ;; Common Lisp bindings for GTK+ v2.x
2 ;; Copyright 2004-2005 Espen S. Johnsen <espen@users.sf.net>
3 ;;
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:
11 ;;
12 ;; The above copyright notice and this permission notice shall be
13 ;; included in all copies or substantial portions of the Software.
14 ;;
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
23 ;; $Id: gtktree.lisp,v 1.34 2008-04-11 20:53:32 espen Exp $
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
46
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
55 (defbinding cell-layout-add-attribute (cell-layout cell attribute column) nil
56 (cell-layout cell-layout)
57 (cell cell-renderer)
58 ((string-downcase attribute) string)
59 (column int))
60
61 (define-callback-marshal %cell-layout-data-callback nil
62 (cell-layout cell-renderer tree-model tree-iter))
63
64 (defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
65 (cell-layout cell-layout)
66 (cell cell-renderer)
67 (%cell-layout-data-callback callback)
68 ((register-callback-function function) unsigned-int)
69 (user-data-destroy-callback callback))
70
71 (defbinding cell-layout-clear-attributes () nil
72 (cell-layout cell-layout)
73 (cell cell-renderer))
74
75
76 ;;;; Cell Renderer
77
78 (defmethod compute-signal-function ((gobject cell-renderer-toggle) (signal (eql 'toggled)) function object args)
79 (declare (ignore gobject signal function object args))
80 (let ((function (call-next-method)))
81 #'(lambda (object path)
82 (funcall function object (ensure-tree-path path)))))
83
84
85 ;;;; List Store
86
87 (defmethod initialize-instance ((list-store list-store) &key column-types
88 column-names initial-content)
89 (call-next-method)
90 (%list-store-set-column-types list-store column-types)
91 (when column-names
92 (setf
93 (user-data list-store 'column-names)
94 (coerce column-names 'vector)))
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))))
100
101
102 (defbinding %list-store-set-column-types () nil
103 (list-store list-store)
104 ((length columns) unsigned-int)
105 (columns (vector gtype)))
106
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
112 (list-store list-store)
113 (tree-iter tree-iter)
114 (column int)
115 (gvalue gvalue))
116
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)
123
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))
131
132 (defbinding %list-store-insert () nil
133 (list-store list-store)
134 (tree-iter tree-iter)
135 (position int))
136
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))))))
171 iter)
172
173 (defbinding %list-store-insert-before () nil
174 (list-store list-store)
175 (tree-iter tree-iter)
176 (sibling (or null tree-iter)))
177
178 (defun list-store-insert-before
179 (store sibling &optional data (iter (make-instance 'tree-iter)))
180 (%list-store-insert-before store iter sibling)
181 (when data (setf (tree-model-row-data store iter) data))
182 iter)
183
184 (defbinding %list-store-insert-after () nil
185 (list-store list-store)
186 (tree-iter tree-iter)
187 (sibling (or null tree-iter)))
188
189 (defun list-store-insert-after
190 (store sibling &optional data (iter (make-instance 'tree-iter)))
191 (%list-store-insert-after store iter sibling)
192 (when data (setf (tree-model-row-data store iter) data))
193 iter)
194
195 (defbinding %list-store-prepend () nil
196 (list-store list-store)
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)
202 (when data (setf (tree-model-row-data store iter) data))
203 iter)
204
205 (defbinding %list-store-append () nil
206 (list-store list-store)
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)
212 (when data (setf (tree-model-row-data store iter) data))
213 iter)
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
232 (defbinding list-store-move-after () nil
233 (list-store list-store)
234 (iter tree-iter)
235 (psoition tree-iter))
236
237
238 ;;; Tree Path
239
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)
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)))))
253 (funcall (writer-function 'int) (length path) location)
254 (funcall (writer-function 'pointer) c-vector location pointer-offset)
255 location))
256
257 (defun %tree-path-to-vector (location)
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)))))
264
265 (defmacro %with-tree-path ((var path) &body body)
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))))
269 (funcall (writer-function 'int) (length ,path) ,var)
270 (setf (ref-pointer ,var ,pointer-offset) (pointer+ ,var ,vector-offset))
271 (make-c-vector 'int (length ,path) :content ,path :location (pointer+ ,var ,vector-offset))
272 ,@body)))
273
274 (eval-when (:compile-toplevel :load-toplevel :execute)
275 (define-type-method alien-type ((type tree-path))
276 (declare (ignore type))
277 (alien-type 'pointer))
278
279 (define-type-method size-of ((type tree-path) &key inlined)
280 (assert-not-inlined type inlined)
281 (size-of 'pointer))
282
283 (define-type-method alien-arg-wrapper ((type tree-path) var path style form &optional copy-in-p)
284 (declare (ignore type))
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))
303 `(%make-tree-path ,path))
304
305 (define-type-method from-alien-form ((type tree-path) location &key (ref :free))
306 (declare (ignore type))
307 `(prog1
308 (%tree-path-to-vector ,location)
309 ,(when (eq ref :free)
310 `(%tree-path-free ,location)))))
311
312 (define-type-method to-alien-function ((type tree-path) &optional copy-p)
313 (declare (ignore type))
314 #'%make-tree-path
315 (unless copy-p
316 #'(lambda (tree-path location)
317 (declare (ignore tree-path))
318 (%tree-path-free location))))
319
320 (define-type-method from-alien-function ((type tree-path) &key (ref :free))
321 (declare (ignore type))
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)
333 (let ((writer (writer-function 'pointer)))
334 #'(lambda (path location &optional (offset 0))
335 (funcall writer (%make-tree-path path) location offset))))
336
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))))
342
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))))
348
349 (defun ensure-tree-path (path)
350 (etypecase path
351 (string (map 'vector #'parse-integer
352 (clg-utils:split-string path :delimiter #\:)))
353 (vector path)))
354
355
356 ;;; Tree Model
357
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
366 (defbinding %tree-row-reference-new () pointer
367 (model tree-model)
368 (path tree-path))
369
370 (defmethod allocate-foreign ((reference tree-row-reference) &key model path)
371 (%tree-row-reference-new model path))
372
373 (defbinding tree-row-reference-get-path () (or null tree-path)
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
380 (defbinding tree-model-get-column-type () gtype
381 (tree-model tree-model)
382 (index int))
383
384 (defbinding tree-model-get-iter (model path &optional (iter (make-instance 'tree-iter))) boolean
385 (model tree-model)
386 (iter tree-iter :in/return)
387 ((ensure-tree-path path) tree-path))
388
389 #?(pkg-exists-p "gtk+-2.0" :atleast-version "2.12.0")
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)))
394
395 (defun ensure-tree-iter (model row)
396 (etypecase row
397 (tree-iter row)
398 ((or tree-path string)
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
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
419 (defmethod tree-model-value ((model tree-model) row column)
420 (let ((index (tree-model-column-index model column)))
421 (with-gvalue (gvalue)
422 (%tree-model-get-value model (ensure-tree-iter model row) index gvalue))))
423
424 (defmethod tree-model-row-data ((model tree-model) row)
425 (coerce
426 (loop
427 with iter = (ensure-tree-iter model row)
428 for index from 0 below (tree-model-n-columns model)
429 collect (tree-model-value model iter index))
430 'vector))
431
432
433 (defbinding tree-model-iter-next () boolean
434 (tree-model tree-model)
435 (iter tree-iter :in/return))
436
437 (defbinding tree-model-iter-children
438 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
439 (tree-model tree-model)
440 (iter tree-iter :in/return)
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
448 (defbinding tree-model-iter-n-children (tree-model &optional iter) int
449 (tree-model tree-model)
450 (iter (or null tree-iter)))
451
452 (defbinding tree-model-iter-nth-child
453 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
454 (tree-model tree-model)
455 (iter tree-iter :in/return)
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)
462 (iter tree-iter :in/return)
463 (child tree-iter))
464
465 (define-callback-marshal %tree-model-foreach-callback boolean
466 (tree-model tree-path tree-iter))
467
468 (defbinding %tree-model-foreach (tree-model callback-id) nil
469 (tree-model tree-model)
470 (%tree-model-foreach-callback callback)
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
503 (defmethod tree-model-column-index ((model tree-model) column)
504 (or
505 (etypecase column
506 (number column)
507 (string (position column (user-data model 'column-names) :test #'string=))
508 (symbol (position column (user-data model 'column-names))))
509 (error "~A has no column ~S" model column)))
510
511 (defmethod tree-model-column-name ((model tree-model) index)
512 (svref (user-data model 'column-names) index))
513
514
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))
519 data)
520
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)
528
529
530 ;;; Tree Selection
531
532 (define-callback-marshal %tree-selection-callback boolean
533 (tree-selection tree-model tree-path (path-currently-selected boolean)))
534
535 (defbinding tree-selection-set-select-function (selection function) nil
536 (selection tree-selection)
537 (%tree-selection-callback callback)
538 ((register-callback-function function) unsigned-int)
539 (user-data-destroy-callback callback))
540
541 (defbinding tree-selection-get-selected
542 (selection &optional (iter (make-instance 'tree-iter))) boolean
543 (selection tree-selection)
544 (nil null)
545 (iter tree-iter :in/return))
546
547 (define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
548
549 (defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
550 (tree-selection tree-selection)
551 (%tree-selection-foreach-callback callback)
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)
579 (tree-iter tree-iter))
580
581 (defbinding %tree-selection-unselect-iter () nil
582 (tree-selection tree-selection)
583 (tree-iter tree-iter))
584
585 (defbinding %tree-selection-iter-is-selected () boolean
586 (tree-selection tree-selection)
587 (tree-iter tree-iter))
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
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
628 (define-callback-marshal %tree-iter-compare-callback (or int sort-order)
629 (tree-model (a tree-iter) (b tree-iter)))
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)
645 (tree-model-column-name sortable column))
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)
654 (symbol (tree-model-column-index sortable column)))
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)
660 ((tree-model-column-index sortable column) int)
661 (%tree-iter-compare-callback callback)
662 ((register-callback-function function) unsigned-int)
663 (user-data-destroy-callback callback))
664
665 (defbinding %tree-sortable-set-default-sort-func () nil
666 (sortable tree-sortable)
667 (compare-func (or null callback))
668 (callback-id unsigned-int)
669 (destroy-func (or null callback)))
670
671 (defun tree-sortable-set-sort-func (sortable column function)
672 "Sets the comparison function used when sorting to be FUNCTION. If
673 the current sort column of SORTABLE is the same as COLUMN,
674 then 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
680 %tree-iter-compare-callback
681 (register-callback-function function)
682 user-data-destroy-callback))
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
688
689 ;;; Tree Store
690
691 (defbinding %tree-store-set-column-types () nil
692 (tree-store tree-store)
693 ((length columns) unsigned-int)
694 (columns (vector gtype)))
695
696 (defmethod initialize-instance ((tree-store tree-store) &key column-types
697 column-names)
698 (call-next-method)
699 (%tree-store-set-column-types tree-store column-types)
700 (when column-names
701 (setf (user-data tree-store 'column-names) column-names)))
702
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
717
718 (defbinding tree-store-remove () boolean
719 (tree-store tree-store)
720 (tree-iter tree-iter))
721
722 (defbinding %tree-store-insert () nil
723 (tree-store tree-store)
724 (tree-iter tree-iter)
725 (parent (or null tree-iter))
726 (position int))
727
728 (defun tree-store-insert
729 (store parent position &optional data (iter (make-instance 'tree-iter)))
730 (%tree-store-insert store iter parent position)
731 (when data (setf (tree-model-row-data store iter) data))
732 iter)
733
734 (defbinding %tree-store-insert-before () nil
735 (tree-store tree-store)
736 (tree-iter tree-iter)
737 (parent (or null tree-iter))
738 (sibling (or null tree-iter)))
739
740 (defun tree-store-insert-before
741 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
742 (%tree-store-insert-before store iter parent sibling)
743 (when data (setf (tree-model-row-data store iter) data))
744 iter)
745
746 (defbinding %tree-store-insert-after () nil
747 (tree-store tree-store)
748 (tree-iter tree-iter)
749 (parent (or null tree-iter))
750 (sibling (or null tree-iter)))
751
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)
755 (when data (setf (tree-model-row-data store iter) data))
756 iter)
757
758 (defbinding %tree-store-prepend () nil
759 (tree-store tree-store)
760 (tree-iter tree-iter)
761 (parent (or null tree-iter)))
762
763 (defun tree-store-prepend
764 (store parent &optional data (iter (make-instance 'tree-iter)))
765 (%tree-store-prepend store iter parent)
766 (when data (setf (tree-model-row-data store iter) data))
767 iter)
768
769 (defbinding %tree-store-append () nil
770 (tree-store tree-store)
771 (tree-iter tree-iter)
772 (parent (or null tree-iter)))
773
774 (defun tree-store-append
775 (store parent &optional data (iter (make-instance 'tree-iter)))
776 (%tree-store-append store iter parent)
777 (when data (setf (tree-model-row-data store iter) data))
778 iter)
779
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
817 (defmethod initialize-instance ((tree-view tree-view) &rest initargs
818 &key column)
819 (declare (ignore column))
820 (call-next-method)
821 (mapc #'(lambda (column)
822 (tree-view-append-column tree-view column))
823 (get-all initargs :column)))
824
825
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
837 (defbinding tree-view-insert-column (view column position) int
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
851 #+(or)
852 (define-callback-setter tree-view-set-column-drag-function tree-view boolean
853 (column tree-view-column)
854 (prev tree-view-column)
855 (next tree-view-column))
856
857 (defbinding tree-view-scroll-to-point () nil
858 (tree-view tree-view)
859 (tree-x int)
860 (tree-y int))
861
862 (defbinding tree-view-scroll-to-cell () nil
863 (tree-view tree-view)
864 (path (or null tree-path))
865 (column (or null tree-view-column))
866 (use-align boolean)
867 (row-align single-float)
868 (col-align single-float))
869
870 (defbinding (tree-view-set-cursor "gtk_tree_view_set_cursor_on_cell")
871 (tree-view path &key focus-column focus-cell start-editing) nil
872 (tree-view tree-view)
873 (path tree-path)
874 (focus-column (or null tree-view-column))
875 (focus-cell (or null cell-renderer))
876 (start-editing boolean))
877
878 (defbinding tree-view-get-cursor () nil
879 (tree-view tree-view)
880 (path tree-path :out )
881 (focus-column tree-view-column :out))
882
883 (defbinding tree-view-row-activated () nil
884 (tree-view tree-view)
885 (path tree-path )
886 (column tree-view-column))
887
888 (defbinding tree-view-expand-all () nil
889 (tree-view tree-view))
890
891 (defbinding tree-view-collapse-all () nil
892 (tree-view tree-view))
893
894 (defbinding tree-view-expand-to-path () nil
895 (tree-view tree-view)
896 (path tree-path))
897
898 (defbinding tree-view-expand-row () nil
899 (tree-view tree-view)
900 (path tree-path)
901 (open-all boolean))
902
903 (defbinding tree-view-collapse-row () nil
904 (tree-view tree-view)
905 (path tree-path))
906
907 (define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
908
909 (defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
910 (tree-view tree-view)
911 (%tree-view-mapping-callback callback)
912 (callback-id unsigned-int))
913
914 (defun map-expanded-rows (function tree-view)
915 (with-callback-function (id function)
916 (%tree-view-map-expanded-rows tree-view id)))
917
918 (defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
919 (tree-view tree-view)
920 (path tree-path))
921
922 (defbinding tree-view-get-path-at-pos
923 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
924 (tree-view tree-view)
925 (x int)
926 (y int)
927 (path tree-path :out)
928 (column tree-view-column :out)
929 (cell-x int)
930 (cell-y int))
931
932 (defbinding tree-view-get-cell-area () nil
933 (tree-view tree-view)
934 (path (or null tree-path))
935 (column (or null tree-view-column))
936 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
937
938 (defbinding tree-view-get-background-area () nil
939 (tree-view tree-view)
940 (path (or null tree-path))
941 (column (or null tree-view-column))
942 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
943
944 (defbinding tree-view-get-visible-rect () nil
945 (tree-view tree-view)
946 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
947
948 ;; and many more functions which we'll add later
949
950
951 ;;;; Icon View
952
953 #?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
954 (progn
955 (defbinding icon-view-get-path-at-pos () tree-path
956 (icon-view icon-view)
957 (x int) (y int))
958
959 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
960
961 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
962 (icon-view icon-view)
963 (%icon-view-foreach-callback callback)
964 (callback-id unsigned-int))
965
966 (defun icon-view-foreach (icon-view function)
967 (with-callback-function (id function)
968 (%icon-view-selected-foreach icon-view id)))
969
970 (defbinding icon-view-select-path () nil
971 (icon-view icon-view)
972 (path tree-path))
973
974 (defbinding icon-view-unselect-path () nil
975 (icon-view icon-view)
976 (path tree-path))
977
978 (defbinding icon-view-path-is-selected-p () boolean
979 (icon-view icon-view)
980 (path tree-path))
981
982 (defbinding icon-view-get-selected-items () (glist tree-path)
983 (icon-view icon-view))
984
985 (defbinding icon-view-select-all () nil
986 (icon-view icon-view))
987
988 (defbinding icon-view-unselect-all () nil
989 (icon-view icon-view))
990
991 (defbinding icon-view-item-activated () nil
992 (icon-view icon-view)
993 (path tree-path))
994
995 (defbinding %icon-view-set-text-column (column icon-view) nil
996 (icon-view icon-view)
997 ((if (integerp column)
998 column
999 (tree-model-column-index (icon-view-model icon-view) column)) int))
1000
1001 (defbinding %%icon-view-get-text-column () int
1002 (icon-view icon-view))
1003
1004 (defun %icon-view-get-text-column (icon-view)
1005 (tree-model-column-index
1006 (icon-view-model icon-view)
1007 (%%icon-view-get-text-column icon-view)))
1008
1009 (defun %icon-view-text-column-boundp (icon-view)
1010 (not (eql (%%icon-view-get-text-column icon-view) -1)))
1011
1012
1013 (defbinding %icon-view-set-markup-column (column icon-view) nil
1014 (icon-view icon-view)
1015 ((if (integerp column)
1016 column
1017 (tree-model-column-index (icon-view-model icon-view) column)) int))
1018
1019 (defbinding %%icon-view-get-markup-column () int
1020 (icon-view icon-view))
1021
1022 (defun %icon-view-get-markup-column (icon-view)
1023 (tree-model-column-index
1024 (icon-view-model icon-view)
1025 (%%icon-view-get-markup-column icon-view)))
1026
1027 (defun %icon-view-markup-column-boundp (icon-view)
1028 (not (eql (%%icon-view-get-markup-column icon-view) -1)))
1029
1030
1031 (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
1032 (icon-view icon-view)
1033 ((if (integerp column)
1034 column
1035 (tree-model-column-index (icon-view-model icon-view) column)) int)))
1036
1037 (defbinding %%icon-view-get-pixbuf-column () int
1038 (icon-view icon-view))
1039
1040 (defun %icon-view-get-pixbuf-column (icon-view)
1041 (tree-model-column-index
1042 (icon-view-model icon-view)
1043 (%%icon-view-get-pixbuf-column icon-view)))
1044
1045 (defun %icon-view-pixbuf-column-boundp (icon-view)
1046 (not (eql (%%icon-view-get-pixbuf-column icon-view) -1)))
1047
1048
1049 #?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
1050 (progn
1051 (defbinding icon-view-get-item-at-pos () boolean
1052 (icon-view icon-view)
1053 (x int)
1054 (y int)
1055 (tree-path tree-path :out)
1056 (cell cell-renderer :out))
1057
1058 (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
1059 (icon-view icon-view)
1060 (path tree-path)
1061 (cell (or null cell-renderer))
1062 (start-editing boolean))
1063
1064 (defbinding icon-view-get-cursor () boolean
1065 (icon-view icon-view)
1066 (path tree-path :out)
1067 (cell cell-renderer :out))
1068
1069 (defbinding icon-view-get-dest-item-at-pos () boolean
1070 (icon-view icon-view)
1071 (drag-x int)
1072 (drag-y int)
1073 (tree-path tree-path :out)
1074 (pos drop-position :out))
1075
1076 (defbinding icon-view-create-drag-icon () gdk:pixmap
1077 (icon-view icon-view)
1078 (tree-path tree-path))
1079
1080 (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
1081 (icon-view icon-view)
1082 (tree-path tree-path)
1083 ((or row-align column-align) boolean)
1084 (row-align single-float)
1085 (column-align single-float))
1086
1087 (defbinding icon-view-get-visible-range () boolean
1088 (icon-view icon-view)
1089 (start-path tree-path :out)
1090 (end-path tree-path :out))
1091
1092 (defbinding icon-view-enable-model-drag-source () nil
1093 (icon-view icon-view)
1094 (start-button-mask gdk:modifier-type)
1095 (targets (vector (inlined target-entry)))
1096 ((length targets) unsigned-int)
1097 (actions gdk:drag-action))
1098
1099 (defbinding icon-view-enable-model-drag-dest () nil
1100 (icon-view icon-view)
1101 (targets (vector (inlined target-entry)))
1102 ((length targets) unsigned-int)
1103 (actions gdk:drag-action))
1104
1105 (defbinding icon-view-unset-model-drag-source () nil
1106 (icon-view icon-view))
1107
1108 (defbinding icon-view-unset-model-drag-dest () nil
1109 (icon-view icon-view)))