chiark / gitweb /
Modified DEFAULT-ALIEN-FNAME
[clg] / gtk / gtktree.lisp
... / ...
CommitLineData
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.19 2006-04-26 12:13:38 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
77;;;; List Store
78
79(defmethod initialize-instance ((list-store list-store) &key column-types
80 column-names initial-content)
81 (call-next-method)
82 (%list-store-set-column-types list-store column-types)
83 (when column-names
84 (setf
85 (user-data list-store 'column-names)
86 (coerce column-names 'vector)))
87 (when initial-content
88 (loop
89 with iter = (make-instance 'tree-iter)
90 for row in initial-content
91 do (list-store-append list-store row iter))))
92
93(defgeneric column-setter-name (store))
94
95(defmethod column-setter-name ((list-store list-store))
96 (declare (ignore list-store))
97 "gtk_list_store_set")
98
99(defbinding %list-store-set-column-types () nil
100 (list-store list-store)
101 ((length columns) unsigned-int)
102 (columns (vector gtype)))
103
104(defbinding %list-store-remove () boolean
105 (list-store list-store)
106 (tree-iter tree-iter))
107
108(defun list-store-remove (store row)
109 (etypecase row
110 (tree-iter
111 (%list-store-remove store row))
112 (tree-path
113 (multiple-value-bind (valid iter) (tree-model-get-iter store row)
114 (if valid
115 (%list-store-remove store iter)
116 (error "~A not poiniting to a valid iterator in ~A" row store))))
117 (tree-row-reference
118 (let ((path (tree-row-reference-get-path row)))
119 (if path
120 (list-store-remove store path)
121 (error "~A not valid" row))))))
122
123
124(defbinding %list-store-insert () nil
125 (list-store list-store)
126 (tree-iter tree-iter)
127 (position int))
128
129(defun list-store-insert
130 (store position &optional data (iter (make-instance 'tree-iter)))
131 (%list-store-insert store iter position)
132 (when data (%tree-model-set store iter data))
133 iter)
134
135(defbinding %list-store-insert-before () nil
136 (list-store list-store)
137 (tree-iter tree-iter)
138 (sibling (or null tree-iter)))
139
140(defun list-store-insert-before
141 (store sibling &optional data (iter (make-instance 'tree-iter)))
142 (%list-store-insert-before store iter sibling)
143 (when data (%tree-model-set store iter data))
144 iter)
145
146(defbinding %list-store-insert-after
147 (list-store &optional sibling (tree-iter (make-instance 'tree-iter))) nil
148 (list-store list-store)
149 (tree-iter tree-iter)
150 (sibling (or null tree-iter)))
151
152(defun list-store-insert-after
153 (store sibling &optional data (iter (make-instance 'tree-iter)))
154 (%list-store-insert-after store iter sibling)
155 (when data (%tree-model-set store iter data))
156 iter)
157
158(defbinding %list-store-prepend () nil
159 (list-store list-store)
160 (tree-iter tree-iter))
161
162(defun list-store-prepend
163 (store &optional data (iter (make-instance 'tree-iter)))
164 (%list-store-prepend store iter)
165 (when data (%tree-model-set store iter data))
166 iter)
167
168(defbinding %list-store-append () nil
169 (list-store list-store)
170 (tree-iter tree-iter))
171
172(defun list-store-append
173 (store &optional data (iter (make-instance 'tree-iter)))
174 (%list-store-append store iter)
175 (when data (%tree-model-set store iter data))
176 iter)
177
178(defbinding list-store-clear () nil
179 (list-store list-store))
180
181(defbinding list-store-reorder () nil
182 (list-store list-store)
183 (new-order (vector int)))
184
185(defbinding list-store-swap () nil
186 (list-store list-store)
187 (a tree-iter)
188 (b tree-iter))
189
190(defbinding list-store-move-before () nil
191 (list-store list-store)
192 (iter tree-iter)
193 (psoition (or null tree-iter)))
194
195(defbinding list-store-move-after () nil
196 (list-store list-store)
197 (iter tree-iter)
198 (psoition tree-iter))
199
200
201;;; Tree Model
202
203(defbinding %tree-path-free () nil
204 (location pointer))
205
206(defbinding %tree-path-get-indices () pointer
207 (location pointer))
208
209(defbinding %tree-path-get-depth () int
210 (location pointer))
211
212(defun %make-tree-path (path)
213 (let ((c-vector (make-c-vector 'int (length path) :content path))
214 (location (allocate-memory (+ (size-of 'int) (size-of 'pointer)))))
215 (funcall (writer-function 'int) (length path) location)
216 (funcall (writer-function 'pointer) c-vector location (size-of 'int))
217 location))
218
219(defun %tree-path-to-vector (location)
220 (let ((indices (%tree-path-get-indices location))
221 (depth (%tree-path-get-depth location)))
222 (if (null-pointer-p indices)
223 #()
224 (map-c-vector 'vector #'identity indices 'int depth))))
225
226(defmacro %with-tree-path ((var path) &body body)
227 (let ((vector-offset (+ (size-of 'int) (size-of 'pointer))))
228 `(with-memory (,var (+ ,(size-of 'int) ,(size-of 'pointer) (* ,(size-of 'int) (length ,path))))
229 (funcall (writer-function 'int) (length ,path) ,var)
230 (setf (ref-pointer ,var ,(size-of 'int)) (pointer+ ,var ,vector-offset))
231 (make-c-vector 'int (length ,path) :content ,path :location (pointer+ ,var ,vector-offset))
232 ,@body)))
233
234(eval-when (:compile-toplevel :load-toplevel :execute)
235 (define-type-method alien-type ((type tree-path))
236 (declare (ignore type))
237 (alien-type 'pointer))
238
239 (define-type-method size-of ((type tree-path) &key inlined)
240 (assert-not-inlined type inlined)
241 (size-of 'pointer))
242
243 (define-type-method alien-arg-wrapper ((type tree-path) var path style form &optional copy-in-p)
244 (declare (ignore type))
245 (cond
246 ((and (in-arg-p style) copy-in-p)
247 `(with-pointer (,var (%make-tree-path ,path))
248 ,form))
249 ((and (in-arg-p style) (not (out-arg-p style)))
250 `(%with-tree-path (,var ,path)
251 ,form))
252 ((and (in-arg-p style) (out-arg-p style))
253 (let ((tree-path (make-symbol "SYMBOL")))
254 `(%with-tree-path (,tree-path ,path)
255 (with-pointer (,var ,tree-path)
256 ,form))))
257 ((and (out-arg-p style) (not (in-arg-p style)))
258 `(with-pointer (,var)
259 ,form))))
260
261 (define-type-method to-alien-form ((type tree-path) path &optional copy-p)
262 (declare (ignore type copy-p))
263 `(%make-tree-path ,path))
264
265 (define-type-method from-alien-form ((type tree-path) location &key (ref :free))
266 (declare (ignore type))
267 `(prog1
268 (%tree-path-to-vector ,location)
269 ,(when (eq ref :free)
270 `(%tree-path-free ,location)))))
271
272(define-type-method to-alien-function ((type tree-path) &optional copy-p)
273 (declare (ignore type))
274 #'%make-tree-path
275 (unless copy-p
276 #'(lambda (tree-path location)
277 (declare (ignore tree-path))
278 (%tree-path-free location))))
279
280(define-type-method from-alien-function ((type tree-path) &key (ref :free))
281 (declare (ignore type))
282 (if (eq ref :free)
283 #'(lambda (location)
284 (prog1
285 (%tree-path-to-vector location)
286 (%tree-path-free location)))
287 #'(lambda (location)
288 (%tree-path-to-vector location))))
289
290(define-type-method writer-function ((type tree-path) &key temp inlined)
291 (declare (ignore temp))
292 (assert-not-inlined type inlined)
293 (let ((writer (writer-function 'pointer)))
294 #'(lambda (path location &optional (offset 0))
295 (funcall writer (%make-tree-path path) location offset))))
296
297(define-type-method reader-function ((type tree-path) &key ref inlined)
298 (declare (ignore ref))
299 (assert-not-inlined type inlined)
300 #'(lambda (location &optional (offset 0))
301 (%tree-path-to-vector (ref-pointer location offset))))
302
303(define-type-method destroy-function ((type tree-path) &key temp inlined)
304 (declare (ignore temp))
305 (assert-not-inlined type inlined)
306 #'(lambda (location &optional (offset 0))
307 (%tree-path-free (ref-pointer location offset))))
308
309
310(defbinding %tree-row-reference-new () pointer
311 (model tree-model)
312 (path tree-path))
313
314(defmethod allocate-foreign ((reference tree-row-reference) &key model path)
315 (%tree-row-reference-new model path))
316
317(defbinding tree-row-reference-get-path () tree-path
318 (reference tree-row-reference))
319
320(defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
321 (reference tree-row-reference))
322
323
324(defbinding tree-model-get-column-type () gtype ;type-number
325 (tree-model tree-model)
326 (index int))
327
328(defbinding tree-model-get-iter
329 (model path &optional (iter (make-instance 'tree-iter))) boolean
330 (model tree-model)
331 (iter tree-iter :in/return)
332 (path tree-path))
333
334(defbinding tree-model-get-path () tree-path
335 (tree-model tree-model)
336 (iter tree-iter))
337
338(defbinding %tree-model-get-value () nil
339 (tree-model tree-model)
340 (iter tree-iter)
341 (column int)
342 (gvalue gvalue))
343
344(defgeneric tree-model-value (model row column))
345
346(defmethod tree-model-value ((model tree-model) row column)
347 (let ((index (column-index model column))
348 (iter (etypecase row
349 (tree-iter row)
350 (tree-path (multiple-value-bind (valid iter)
351 (tree-model-get-iter model row)
352 (if valid
353 iter
354 (error "Invalid tree path: ~A" row)))))))
355 (with-gvalue (gvalue)
356 (%tree-model-get-value model iter index gvalue))))
357
358(defbinding tree-model-iter-next () boolean
359 (tree-model tree-model)
360 (iter tree-iter :in/return))
361
362(defbinding tree-model-iter-children
363 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
364 (tree-model tree-model)
365 (iter tree-iter :in/return)
366 (parent (or null tree-iter)))
367
368(defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child")
369 () boolean
370 (tree-model tree-model)
371 (iter tree-iter))
372
373(defbinding tree-model-iter-n-children () int
374 (tree-model tree-model)
375 (iter tree-iter))
376
377(defbinding tree-model-iter-nth-child
378 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
379 (tree-model tree-model)
380 (iter tree-iter :in/return)
381 (parent (or null tree-iter))
382 (n int))
383
384(defbinding tree-model-iter-parent
385 (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
386 (tree-model tree-model)
387 (iter tree-iter :in/return)
388 (child tree-iter))
389
390(define-callback-marshal %tree-model-foreach-callback boolean
391 (tree-model tree-path tree-iter))
392
393(defbinding %tree-model-foreach (tree-model callback-id) nil
394 (tree-model tree-model)
395 (%tree-model-foreach-callback callback)
396 (callback-id unsigned-int))
397
398(defun tree-model-foreach (model function)
399 (with-callback-function (id function)
400 (%tree-model-foreach model id)))
401
402(defbinding tree-model-row-changed () nil
403 (tree-model tree-model)
404 (path tree-path)
405 (iter tree-iter))
406
407(defbinding tree-model-row-inserted () nil
408 (tree-model tree-model)
409 (path tree-path)
410 (iter tree-iter))
411
412(defbinding tree-model-row-has-child-toggled () nil
413 (tree-model tree-model)
414 (path tree-path)
415 (iter tree-iter))
416
417(defbinding tree-model-row-deleted () nil
418 (tree-model tree-model)
419 (path tree-path)
420 (iter tree-iter))
421
422(defbinding tree-model-rows-reordered () nil
423 (tree-model tree-model)
424 (path tree-path)
425 (iter tree-iter)
426 (new-order int))
427
428
429(defun column-types (model columns)
430 (declare (ignore model))
431 (map 'vector
432 #'(lambda (column)
433 (find-type-number (first (mklist column))))
434 columns))
435
436(defun column-index (model column)
437 (or
438 (etypecase column
439 (number column)
440 (symbol (position column (user-data model 'column-names)))
441 (string (position column (user-data model 'column-names)
442 :test #'string=)))
443 (error "~A has no column ~S" model column)))
444
445(defun column-name (model index)
446 (svref (user-data model 'column-names) index))
447
448(defun tree-model-column-value-setter (model column)
449 (let ((setters (or
450 (user-data model 'column-setters)
451 (setf
452 (user-data model 'column-setters)
453 (make-array (tree-model-n-columns model)
454 :initial-element nil)))))
455 (let ((index (column-index model column)))
456 (or
457 (svref setters index)
458 (setf
459 (svref setters index)
460 (let ((setter
461 (mkbinding (column-setter-name model)
462 nil (type-of model) 'tree-iter 'int
463 (tree-model-get-column-type model index)
464 'int)))
465 #'(lambda (value iter)
466 (funcall setter model iter index value -1))))))))
467
468(defun tree-model-row-setter (model)
469 (or
470 (user-data model 'row-setter)
471 (progn
472 ;; This will create any missing column setter
473 (loop
474 for i from 0 below (tree-model-n-columns model)
475 do (tree-model-column-value-setter model i))
476 (let ((setters (user-data model 'column-setters)))
477 (setf
478 (user-data model 'row-setter)
479 #'(lambda (row iter)
480 (map nil #'(lambda (value setter)
481 (funcall setter value iter))
482 row setters)))))))
483
484(defgeneric (setf tree-model-value) (value model row column))
485
486(defmethod (setf tree-model-value) (value (model tree-model) row column)
487 (let ((iter (etypecase row
488 (tree-iter row)
489 (tree-path (multiple-value-bind (valid iter)
490 (tree-model-get-iter model row)
491 (if valid
492 iter
493 (error "Invalid tree path: ~A" row)))))))
494 (funcall (tree-model-column-value-setter model column) value iter)
495 value))
496
497(defun (setf tree-model-row-data) (data model iter)
498 (funcall (tree-model-row-setter model) data iter)
499 data)
500
501(defun %tree-model-set (model iter data)
502 (etypecase data
503 (vector (setf (tree-model-row-data model iter) data))
504 (cons
505 (loop
506 as (column value . rest) = data then rest
507 do (setf (tree-model-value model iter column) value)
508 while rest))))
509
510
511;;; Tree Selection
512
513(define-callback-marshal %tree-selection-callback boolean
514 (tree-selection tree-model tree-path (path-currently-selected boolean)))
515
516(defbinding tree-selection-set-select-function (selection function) nil
517 (selection tree-selection)
518 (%tree-selection-callback callback)
519 ((register-callback-function function) unsigned-int)
520 (user-data-destroy-callback callback))
521
522(defbinding tree-selection-get-selected
523 (selection &optional (iter (make-instance 'tree-iter))) boolean
524 (selection tree-selection)
525 (nil null)
526 (iter tree-iter :in/return))
527
528(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
529
530(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
531 (tree-selection tree-selection)
532 (%tree-selection-foreach-callback callback)
533 (callback-id unsigned-int))
534
535(defun tree-selection-selected-foreach (selection function)
536 (with-callback-function (id function)
537 (%tree-selection-selected-foreach selection id)))
538
539(defbinding tree-selection-get-selected-rows () (glist tree-path)
540 (tree-selection tree-selection)
541 (nil null))
542
543(defbinding tree-selection-count-selected-rows () int
544 (tree-selection tree-selection))
545
546(defbinding %tree-selection-select-path () nil
547 (tree-selection tree-selection)
548 (tree-path tree-path))
549
550(defbinding %tree-selection-unselect-path () nil
551 (tree-selection tree-selection)
552 (tree-path tree-path))
553
554(defbinding %tree-selection-path-is-selected () boolean
555 (tree-selection tree-selection)
556 (tree-path tree-path))
557
558(defbinding %tree-selection-select-iter () nil
559 (tree-selection tree-selection)
560 (tree-path tree-path))
561
562(defbinding %tree-selection-unselect-iter () nil
563 (tree-selection tree-selection)
564 (tree-path tree-path))
565
566(defbinding %tree-selection-iter-is-selected () boolean
567 (tree-selection tree-selection)
568 (tree-path tree-path))
569
570(defun tree-selection-select (selection row)
571 (etypecase row
572 (tree-path (%tree-selection-select-path selection row))
573 (tree-iter (%tree-selection-select-iter selection row))))
574
575(defun tree-selection-unselect (selection row)
576 (etypecase row
577 (tree-path (%tree-selection-unselect-path selection row))
578 (tree-iter (%tree-selection-unselect-iter selection row))))
579
580(defun tree-selection-is-selected-p (selection row)
581 (etypecase row
582 (tree-path (%tree-selection-path-is-selected selection row))
583 (tree-iter (%tree-selection-iter-is-selected selection row))))
584
585(defbinding tree-selection-select-all () nil
586 (tree-selection tree-selection))
587
588(defbinding tree-selection-unselect-all () nil
589 (tree-selection tree-selection))
590
591(defbinding tree-selection-select-range () nil
592 (tree-selection tree-selection)
593 (start tree-path)
594 (end tree-path))
595
596(defbinding tree-selection-unselect-range () nil
597 (tree-selection tree-selection)
598 (start tree-path)
599 (end tree-path))
600
601
602;;; Tree Sortable
603
604(eval-when (:compile-toplevel :load-toplevel :execute)
605 (define-enum-type sort-column (:default -1) (:unsorted -2))
606 (define-enum-type sort-order (:before -1) (:equal 0) (:after 1)))
607
608
609(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
610 (tree-model (a tree-iter) (b tree-iter)))
611
612(defbinding tree-sortable-sort-column-changed () nil
613 (sortable tree-sortable))
614
615(defbinding %tree-sortable-get-sort-column-id () boolean
616 (sortable tree-sortable)
617 (column int :out)
618 (order sort-type :out))
619
620(defun tree-sortable-get-sort-column (sortable)
621 (multiple-value-bind (special-p column order)
622 (%tree-sortable-get-sort-column-id sortable)
623 (values
624 (if special-p
625 (int-to-sort-order column)
626 (column-name sortable column))
627 order)))
628
629(defbinding (tree-sortable-set-sort-column
630 "gtk_tree_sortable_set_sort_column_id")
631 (sortable column order) nil
632 (sortable tree-sortable)
633 ((etypecase column
634 ((or integer sort-column) column)
635 (symbol (column-index sortable column)))
636 (or sort-column int))
637 (order sort-type))
638
639(defbinding %tree-sortable-set-sort-func (sortable column function) nil
640 (sortable tree-sortable)
641 ((column-index sortable column) int)
642 (%tree-iter-compare-callback callback)
643 ((register-callback-function function) unsigned-int)
644 (user-data-destroy-callback callback))
645
646(defbinding %tree-sortable-set-default-sort-func () nil
647 (sortable tree-sortable)
648 (compare-func (or null callback))
649 (callback-id unsigned-int)
650 (destroy-func (or null callback)))
651
652(defun tree-sortable-set-sort-func (sortable column function)
653 "Sets the comparison function used when sorting to be FUNCTION. If
654the current sort column of SORTABLE is the same as COLUMN,
655then the model will sort using this function."
656 (cond
657 ((and (eq column :default) (not function))
658 (%tree-sortable-set-default-sort-func sortable nil 0 nil))
659 ((eq column :default)
660 (%tree-sortable-set-default-sort-func sortable
661 %tree-iter-compare-callback
662 (register-callback-function function)
663 user-data-destroy-callback))
664 ((%tree-sortable-set-sort-func sortable column function))))
665
666(defbinding tree-sortable-has-default-sort-func-p () boolean
667 (sortable tree-sortable))
668
669
670;;; Tree Store
671
672(defbinding %tree-store-set-column-types () nil
673 (tree-store tree-store)
674 ((length columns) unsigned-int)
675 (columns (vector gtype)))
676
677(defmethod initialize-instance ((tree-store tree-store) &key column-types
678 column-names)
679 (call-next-method)
680 (%tree-store-set-column-types tree-store column-types)
681 (when column-names
682 (setf (user-data tree-store 'column-names) column-names)))
683
684(defmethod column-setter-name ((tree-store tree-store))
685 (declare (ignore tree-store))
686 "gtk_tree_store_set")
687
688(defbinding tree-store-remove () boolean
689 (tree-store tree-store)
690 (tree-iter tree-iter))
691
692(defbinding %tree-store-insert () nil
693 (tree-store tree-store)
694 (tree-iter tree-iter)
695 (parent (or null tree-iter))
696 (position int))
697
698(defun tree-store-insert
699 (store parent position &optional data (iter (make-instance 'tree-iter)))
700 (%tree-store-insert store iter parent position)
701 (when data (%tree-model-set store iter data))
702 iter)
703
704(defbinding %tree-store-insert-before () nil
705 (tree-store tree-store)
706 (tree-iter tree-iter)
707 (parent (or null tree-iter))
708 (sibling (or null tree-iter)))
709
710(defun tree-store-insert-before
711 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
712 (%tree-store-insert-before store iter parent sibling)
713 (when data (%tree-model-set store iter data))
714 iter)
715
716(defbinding %tree-store-insert-after () nil
717 (tree-store tree-store)
718 (tree-iter tree-iter)
719 (parent (or null tree-iter))
720 (sibling (or null tree-iter)))
721
722(defun tree-store-insert-after
723 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
724 (%tree-store-insert-after store iter parent sibling)
725 (when data (%tree-model-set store iter data))
726 iter)
727
728(defbinding %tree-store-prepend () nil
729 (tree-store tree-store)
730 (tree-iter tree-iter)
731 (parent (or null tree-iter)))
732
733(defun tree-store-prepend
734 (store parent &optional data (iter (make-instance 'tree-iter)))
735 (%tree-store-prepend store iter parent)
736 (when data (%tree-model-set store iter data))
737 iter)
738
739(defbinding %tree-store-append () nil
740 (tree-store tree-store)
741 (tree-iter tree-iter)
742 (parent (or null tree-iter)))
743
744(defun tree-store-append
745 (store parent &optional data (iter (make-instance 'tree-iter)))
746 (%tree-store-append store iter parent)
747 (when data (%tree-model-set store iter data))
748 iter)
749
750(defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
751 (tree-store tree-store)
752 (tree-iter tree-iter)
753 (descendant tree-iter))
754
755(defbinding tree-store-iter-depth () int
756 (tree-store tree-store)
757 (tree-iter tree-iter))
758
759(defbinding tree-store-clear () nil
760 (tree-store tree-store))
761
762(defbinding tree-store-reorder () nil
763 (tree-store tree-store)
764 (parent tree-iter)
765 (new-order (vector int)))
766
767(defbinding tree-store-swap () nil
768 (tree-store tree-store)
769 (a tree-iter)
770 (b tree-iter))
771
772(defbinding tree-store-move-before () nil
773 (tree-store tree-store)
774 (iter tree-iter)
775 (psoition (or null tree-iter)))
776
777
778(defbinding tree-store-move-after () nil
779 (tree-store tree-store)
780 (iter tree-iter)
781 (psoition tree-iter))
782
783
784
785;;; Tree View
786
787(defmethod initialize-instance ((tree-view tree-view) &rest initargs
788 &key column)
789 (declare (ignore column))
790 (call-next-method)
791 (mapc #'(lambda (column)
792 (tree-view-append-column tree-view column))
793 (get-all initargs :column)))
794
795
796(defbinding tree-view-columns-autosize () nil
797 (tree-view tree-view))
798
799(defbinding tree-view-append-column () int
800 (tree-view tree-view)
801 (tree-view-column tree-view-column))
802
803(defbinding tree-view-remove-column () int
804 (tree-view tree-view)
805 (tree-view-column tree-view-column))
806
807(defbinding tree-view-insert-column (view column position) int
808 (view tree-view)
809 (column tree-view-column)
810 ((if (eq position :end) -1 position) int))
811
812(defbinding tree-view-get-column () tree-view-column
813 (tree-view tree-view)
814 (position int))
815
816(defbinding tree-view-move-column-after () nil
817 (tree-view tree-view)
818 (column tree-view-column)
819 (base-column (or null tree-view-column)))
820
821;;(defbinding tree-view-set-column drag-function ...)
822
823(defbinding tree-view-scroll-to-point () nil
824 (tree-view tree-view)
825 (tree-x int)
826 (tree-y int))
827
828(defbinding tree-view-scroll-to-cell () nil
829 (tree-view tree-view)
830 (path (or null tree-path))
831 (column (or null tree-view-column))
832 (use-align boolean)
833 (row-align single-float)
834 (col-align single-float))
835
836(defbinding tree-view-set-cursor () nil
837 (tree-view tree-view)
838 (path tree-path)
839 (focus-column tree-view-column)
840 (start-editing boolean))
841
842(defbinding tree-view-set-cursor-on-cell () nil
843 (tree-view tree-view)
844 (path tree-path)
845 (focus-column (or null tree-view-column))
846 (focus-cell (or null cell-renderer))
847 (start-editing boolean))
848
849(defbinding tree-view-get-cursor () nil
850 (tree-view tree-view)
851 (path tree-path :out )
852 (focus-column tree-view-column :out))
853
854(defbinding tree-view-row-activated () nil
855 (tree-view tree-view)
856 (path tree-path )
857 (column tree-view-column))
858
859(defbinding tree-view-expand-all () nil
860 (tree-view tree-view))
861
862(defbinding tree-view-collapse-all () nil
863 (tree-view tree-view))
864
865(defbinding tree-view-expand-to-path () nil
866 (tree-view tree-view)
867 (path tree-path))
868
869(defbinding tree-view-expand-row () nil
870 (tree-view tree-view)
871 (path tree-path)
872 (open-all boolean))
873
874(defbinding tree-view-collapse-row () nil
875 (tree-view tree-view)
876 (path tree-path))
877
878(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
879
880(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
881 (tree-view tree-view)
882 (%tree-view-mapping-callback callback)
883 (callback-id unsigned-int))
884
885(defun map-expanded-rows (function tree-view)
886 (with-callback-function (id function)
887 (%tree-view-map-expanded-rows tree-view id)))
888
889(defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
890 (tree-view tree-view)
891 (path tree-path))
892
893(defbinding tree-view-get-path-at-pos
894 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
895 (tree-view tree-view)
896 (x int)
897 (y int)
898 (path tree-path :out)
899 (column tree-view-column :out)
900 (cell-x int)
901 (cell-y int))
902
903(defbinding tree-view-get-cell-area () nil
904 (tree-view tree-view)
905 (path (or null tree-path))
906 (column (or null tree-view-column))
907 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
908
909(defbinding tree-view-get-background-area () nil
910 (tree-view tree-view)
911 (path (or null tree-path))
912 (column (or null tree-view-column))
913 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
914
915(defbinding tree-view-get-visible-rect () nil
916 (tree-view tree-view)
917 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
918
919;; and many more functions which we'll add later
920
921
922;;;; Icon View
923
924#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
925(progn
926 (defbinding icon-view-get-path-at-pos () tree-path
927 (icon-view icon-view)
928 (x int) (y int))
929
930 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
931
932 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
933 (icon-view icon-view)
934 (%icon-view-foreach-callback callback)
935 (callback-id unsigned-int))
936
937 (defun icon-view-foreach (icon-view function)
938 (with-callback-function (id function)
939 (%icon-view-selected-foreach icon-view id)))
940
941 (defbinding icon-view-select-path () nil
942 (icon-view icon-view)
943 (path tree-path))
944
945 (defbinding icon-view-unselect-path () nil
946 (icon-view icon-view)
947 (path tree-path))
948
949 (defbinding icon-view-path-is-selected-p () boolean
950 (icon-view icon-view)
951 (path tree-path))
952
953 (defbinding icon-view-get-selected-items () (glist tree-path)
954 (icon-view icon-view))
955
956 (defbinding icon-view-select-all () nil
957 (icon-view icon-view))
958
959 (defbinding icon-view-unselect-all () nil
960 (icon-view icon-view))
961
962 (defbinding icon-view-item-activated () nil
963 (icon-view icon-view)
964 (path tree-path))
965
966 (defbinding %icon-view-set-text-column (column icon-view) nil
967 (icon-view icon-view)
968 ((if (integerp column)
969 column
970 (column-index (icon-view-model icon-view) column)) int))
971
972 (defbinding %icon-view-set-markup-column (column icon-view) nil
973 (icon-view icon-view)
974 ((if (integerp column)
975 column
976 (column-index (icon-view-model icon-view) column)) int))
977
978 (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
979 (icon-view icon-view)
980 ((if (integerp column)
981 column
982 (column-index (icon-view-model icon-view) column)) int)))
983
984#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
985(progn
986 (defbinding icon-view-get-item-at-pos () boolean
987 (icon-view icon-view)
988 (x int)
989 (y int)
990 (tree-path tree-path :out)
991 (cell cell-renderer :out))
992
993 (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
994 (icon-view icon-view)
995 (path tree-path)
996 (cell (or null cell-renderer))
997 (start-editing boolean))
998
999 (defbinding icon-view-get-cursor () boolean
1000 (icon-view icon-view)
1001 (path tree-path :out)
1002 (cell cell-renderer :out))
1003
1004 (defbinding icon-view-get-dest-item-at-pos () boolean
1005 (icon-view icon-view)
1006 (drag-x int)
1007 (drag-y int)
1008 (tree-path tree-path :out)
1009 (pos drop-position :out))
1010
1011 (defbinding icon-view-create-drag-icon () gdk:pixmap
1012 (icon-view icon-view)
1013 (tree-path tree-path))
1014
1015 (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
1016 (icon-view icon-view)
1017 (tree-path tree-path)
1018 ((or row-align column-align) boolean)
1019 (row-align single-float)
1020 (column-align single-float))
1021
1022 (defbinding icon-view-get-visible-range () boolean
1023 (icon-view icon-view)
1024 (start-path tree-path :out)
1025 (end-path tree-path :out))
1026
1027;; (defbinding icon-view-enable-model-drag-source () nil
1028;; (icon-view icon-view)
1029;; (start-button-mask gdk:modifier-type)
1030;; (targets (vector target-entry))
1031;; ((length targets) unsigned-int)
1032;; (actions gdk:drag-action))
1033
1034;; (defbinding icon-view-enable-model-drag-dest () nil
1035;; (icon-view icon-view)
1036;; (targets (vector target-entry))
1037;; ((length targets) unsigned-int)
1038;; (actions gdk:drag-action))
1039
1040 (defbinding icon-view-unset-model-drag-source () nil
1041 (icon-view icon-view))
1042
1043 (defbinding icon-view-unset-model-drag-dest () nil
1044 (icon-view icon-view)))