chiark / gitweb /
Modified DEFAULT-ALIEN-FNAME
[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
1e5e3e14 23;; $Id: gtktree.lisp,v 1.19 2006/04/26 12:13:38 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
76
77;;;; List Store
78
4e169141 79(defmethod initialize-instance ((list-store list-store) &key column-types
80 column-names initial-content)
985713d7 81 (call-next-method)
4e169141 82 (%list-store-set-column-types list-store column-types)
83 (when column-names
70b52c33 84 (setf
1e5e3e14 85 (user-data list-store 'column-names)
70b52c33 86 (coerce column-names 'vector)))
4e169141 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))))
985713d7 92
fddb02b4 93(defgeneric column-setter-name (store))
985713d7 94
4e169141 95(defmethod column-setter-name ((list-store list-store))
96 (declare (ignore list-store))
97 "gtk_list_store_set")
985713d7 98
4e169141 99(defbinding %list-store-set-column-types () nil
985713d7 100 (list-store list-store)
4e169141 101 ((length columns) unsigned-int)
102 (columns (vector gtype)))
985713d7 103
05a3b9e4 104(defbinding %list-store-remove () boolean
985713d7 105 (list-store list-store)
106 (tree-iter tree-iter))
107
05a3b9e4 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)
da82be16 116 (error "~A not poiniting to a valid iterator in ~A" row store))))
05a3b9e4 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
4e169141 124(defbinding %list-store-insert () nil
985713d7 125 (list-store list-store)
4e169141 126 (tree-iter tree-iter)
985713d7 127 (position int))
128
4e169141 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
985713d7 136 (list-store list-store)
4e169141 137 (tree-iter tree-iter)
985713d7 138 (sibling (or null tree-iter)))
139
4e169141 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
985713d7 148 (list-store list-store)
4e169141 149 (tree-iter tree-iter)
985713d7 150 (sibling (or null tree-iter)))
151
4e169141 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
985713d7 159 (list-store list-store)
4e169141 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)
985713d7 167
4e169141 168(defbinding %list-store-append () nil
985713d7 169 (list-store list-store)
4e169141 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)
985713d7 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
985713d7 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
4e169141 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)
1e5e3e14 213 (let ((c-vector (make-c-vector 'int (length path) :content path))
4e169141 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
05a3b9e4 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))))
4e169141 225
1e5e3e14 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
4e169141 234(eval-when (:compile-toplevel :load-toplevel :execute)
4d1fea77 235 (define-type-method alien-type ((type tree-path))
236 (declare (ignore type))
4e169141 237 (alien-type 'pointer))
238
1e5e3e14 239 (define-type-method size-of ((type tree-path) &key inlined)
240 (assert-not-inlined type inlined)
4e169141 241 (size-of 'pointer))
242
1e5e3e14 243 (define-type-method alien-arg-wrapper ((type tree-path) var path style form &optional copy-in-p)
4d1fea77 244 (declare (ignore type))
1e5e3e14 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))
4e169141 263 `(%make-tree-path ,path))
264
1e5e3e14 265 (define-type-method from-alien-form ((type tree-path) location &key (ref :free))
4d1fea77 266 (declare (ignore type))
1e5e3e14 267 `(prog1
268 (%tree-path-to-vector ,location)
269 ,(when (eq ref :free)
270 `(%tree-path-free ,location)))))
4e169141 271
1e5e3e14 272(define-type-method to-alien-function ((type tree-path) &optional copy-p)
4d1fea77 273 (declare (ignore type))
1e5e3e14 274 #'%make-tree-path
275 (unless copy-p
276 #'(lambda (tree-path location)
277 (declare (ignore tree-path))
05a3b9e4 278 (%tree-path-free location))))
05a3b9e4 279
1e5e3e14 280(define-type-method from-alien-function ((type tree-path) &key (ref :free))
4d1fea77 281 (declare (ignore type))
1e5e3e14 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)
05a3b9e4 293 (let ((writer (writer-function 'pointer)))
294 #'(lambda (path location &optional (offset 0))
295 (funcall writer (%make-tree-path path) location offset))))
296
1e5e3e14 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))))
4e169141 302
1e5e3e14 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))))
c8211115 308
4e169141 309
310(defbinding %tree-row-reference-new () pointer
311 (model tree-model)
312 (path tree-path))
313
39db92d4 314(defmethod allocate-foreign ((reference tree-row-reference) &key model path)
315 (%tree-row-reference-new model path))
4e169141 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
9bdb89f4 324(defbinding tree-model-get-column-type () gtype ;type-number
4e169141 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)
1e5e3e14 331 (iter tree-iter :in/return)
4e169141 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
70b52c33 344(defgeneric tree-model-value (model row column))
345
346(defmethod tree-model-value ((model tree-model) row column)
da82be16 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)))))))
780a4e24 355 (with-gvalue (gvalue)
4e169141 356 (%tree-model-get-value model iter index gvalue))))
357
358(defbinding tree-model-iter-next () boolean
359 (tree-model tree-model)
1e5e3e14 360 (iter tree-iter :in/return))
4e169141 361
362(defbinding tree-model-iter-children
363 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
364 (tree-model tree-model)
1e5e3e14 365 (iter tree-iter :in/return)
4e169141 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
3d36c5d6 378 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
4e169141 379 (tree-model tree-model)
1e5e3e14 380 (iter tree-iter :in/return)
4e169141 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)
1e5e3e14 387 (iter tree-iter :in/return)
4e169141 388 (child tree-iter))
389
a92553bd 390(define-callback-marshal %tree-model-foreach-callback boolean
391 (tree-model tree-path tree-iter))
4e169141 392
a92553bd 393(defbinding %tree-model-foreach (tree-model callback-id) nil
4e169141 394 (tree-model tree-model)
a92553bd 395 (%tree-model-foreach-callback callback)
4e169141 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)
4d1fea77 430 (declare (ignore model))
4e169141 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)
1e5e3e14 440 (symbol (position column (user-data model 'column-names)))
441 (string (position column (user-data model 'column-names)
4e169141 442 :test #'string=)))
443 (error "~A has no column ~S" model column)))
444
da82be16 445(defun column-name (model index)
1e5e3e14 446 (svref (user-data model 'column-names) index))
da82be16 447
4e169141 448(defun tree-model-column-value-setter (model column)
449 (let ((setters (or
1e5e3e14 450 (user-data model 'column-setters)
4e169141 451 (setf
1e5e3e14 452 (user-data model 'column-setters)
4e169141 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
9bdb89f4 463 (tree-model-get-column-type model index)
4e169141 464 'int)))
465 #'(lambda (value iter)
466 (funcall setter model iter index value -1))))))))
467
468(defun tree-model-row-setter (model)
469 (or
1e5e3e14 470 (user-data model 'row-setter)
4e169141 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))
1e5e3e14 476 (let ((setters (user-data model 'column-setters)))
4e169141 477 (setf
1e5e3e14 478 (user-data model 'row-setter)
4e169141 479 #'(lambda (row iter)
480 (map nil #'(lambda (value setter)
481 (funcall setter value iter))
482 row setters)))))))
483
70b52c33 484(defgeneric (setf tree-model-value) (value model row column))
485
486(defmethod (setf tree-model-value) (value (model tree-model) row column)
da82be16 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))
4e169141 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
da82be16 507 do (setf (tree-model-value model iter column) value)
4e169141 508 while rest))))
985713d7 509
510
05a3b9e4 511;;; Tree Selection
512
a92553bd 513(define-callback-marshal %tree-selection-callback boolean
514 (tree-selection tree-model tree-path (path-currently-selected boolean)))
05a3b9e4 515
516(defbinding tree-selection-set-select-function (selection function) nil
517 (selection tree-selection)
a92553bd 518 (%tree-selection-callback callback)
05a3b9e4 519 ((register-callback-function function) unsigned-int)
a92553bd 520 (user-data-destroy-callback callback))
05a3b9e4 521
522(defbinding tree-selection-get-selected
523 (selection &optional (iter (make-instance 'tree-iter))) boolean
524 (selection tree-selection)
525 (nil null)
1e5e3e14 526 (iter tree-iter :in/return))
05a3b9e4 527
a92553bd 528(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
05a3b9e4 529
a92553bd 530(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
05a3b9e4 531 (tree-selection tree-selection)
a92553bd 532 (%tree-selection-foreach-callback callback)
05a3b9e4 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
da82be16 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
a92553bd 609(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
610 (tree-model (a tree-iter) (b tree-iter)))
da82be16 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)
a92553bd 642 (%tree-iter-compare-callback callback)
da82be16 643 ((register-callback-function function) unsigned-int)
a92553bd 644 (user-data-destroy-callback callback))
da82be16 645
646(defbinding %tree-sortable-set-default-sort-func () nil
647 (sortable tree-sortable)
a92553bd 648 (compare-func (or null callback))
da82be16 649 (callback-id unsigned-int)
a92553bd 650 (destroy-func (or null callback)))
da82be16 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
a92553bd 661 %tree-iter-compare-callback
da82be16 662 (register-callback-function function)
a92553bd 663 user-data-destroy-callback))
da82be16 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
05a3b9e4 669
985713d7 670;;; Tree Store
671
672(defbinding %tree-store-set-column-types () nil
673 (tree-store tree-store)
4e169141 674 ((length columns) unsigned-int)
675 (columns (vector gtype)))
985713d7 676
4e169141 677(defmethod initialize-instance ((tree-store tree-store) &key column-types
678 column-names)
985713d7 679 (call-next-method)
4e169141 680 (%tree-store-set-column-types tree-store column-types)
681 (when column-names
1e5e3e14 682 (setf (user-data tree-store 'column-names) column-names)))
985713d7 683
4e169141 684(defmethod column-setter-name ((tree-store tree-store))
685 (declare (ignore tree-store))
686 "gtk_tree_store_set")
985713d7 687
688(defbinding tree-store-remove () boolean
689 (tree-store tree-store)
690 (tree-iter tree-iter))
691
4e169141 692(defbinding %tree-store-insert () nil
985713d7 693 (tree-store tree-store)
4e169141 694 (tree-iter tree-iter)
985713d7 695 (parent (or null tree-iter))
696 (position int))
697
4e169141 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
985713d7 705 (tree-store tree-store)
4e169141 706 (tree-iter tree-iter)
985713d7 707 (parent (or null tree-iter))
708 (sibling (or null tree-iter)))
709
3d36c5d6 710(defun tree-store-insert-before
4e169141 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
985713d7 717 (tree-store tree-store)
4e169141 718 (tree-iter tree-iter)
985713d7 719 (parent (or null tree-iter))
720 (sibling (or null tree-iter)))
721
4e169141 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
985713d7 729 (tree-store tree-store)
4e169141 730 (tree-iter tree-iter)
985713d7 731 (parent (or null tree-iter)))
732
4e169141 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
985713d7 740 (tree-store tree-store)
4e169141 741 (tree-iter tree-iter)
985713d7 742 (parent (or null tree-iter)))
743
4e169141 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
985713d7 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
05a3b9e4 787(defmethod initialize-instance ((tree-view tree-view) &rest initargs
788 &key column)
4d1fea77 789 (declare (ignore column))
4e169141 790 (call-next-method)
791 (mapc #'(lambda (column)
792 (tree-view-append-column tree-view column))
793 (get-all initargs :column)))
794
795
985713d7 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
3d36c5d6 807(defbinding tree-view-insert-column (view column position) int
985713d7 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
a92553bd 878(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
985713d7 879
a92553bd 880(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
985713d7 881 (tree-view tree-view)
a92553bd 882 (%tree-view-mapping-callback callback)
985713d7 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))
1e5e3e14 907 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 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))
1e5e3e14 913 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 914
915(defbinding tree-view-get-visible-rect () nil
916 (tree-view tree-view)
1e5e3e14 917 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
985713d7 918
919;; and many more functions which we'll add later
920
4e169141 921
da82be16 922;;;; Icon View
923
1e5e3e14 924#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
da82be16 925(progn
926 (defbinding icon-view-get-path-at-pos () tree-path
927 (icon-view icon-view)
928 (x int) (y int))
4e169141 929
a92553bd 930 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
da82be16 931
a92553bd 932 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
da82be16 933 (icon-view icon-view)
a92553bd 934 (%icon-view-foreach-callback callback)
da82be16 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)))
92ba85d4 983
1e5e3e14 984#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
92ba85d4 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)))