chiark / gitweb /
Manual slot definitions for icon-view
[clg] / gtk / gtktree.lisp
CommitLineData
112ac1d3 1;; Common Lisp bindings for GTK+ v2.x
2;; Copyright 2004-2005 Espen S. Johnsen <espen@users.sf.net>
167450a3 3;;
112ac1d3 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:
167450a3 11;;
112ac1d3 12;; The above copyright notice and this permission notice shall be
13;; included in all copies or substantial portions of the Software.
167450a3 14;;
112ac1d3 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
c46ca281 23;; $Id: gtktree.lisp,v 1.20 2006-04-26 20:31:12 espen Exp $
167450a3 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
2a8752b0 46
167450a3 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
78a17735 55(defbinding cell-layout-add-attribute (cell-layout cell attribute column) nil
167450a3 56 (cell-layout cell-layout)
57 (cell cell-renderer)
58 ((string-downcase attribute) string)
78a17735 59 (column int))
167450a3 60
56ccd5b7 61(define-callback-marshal %cell-layout-data-callback nil
62 (cell-layout cell-renderer tree-model tree-iter))
167450a3 63
64(defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
65 (cell-layout cell-layout)
66 (cell cell-renderer)
56ccd5b7 67 (%cell-layout-data-callback callback)
167450a3 68 ((register-callback-function function) unsigned-int)
56ccd5b7 69 (user-data-destroy-callback callback))
167450a3 70
71(defbinding cell-layout-clear-attributes () nil
72 (cell-layout cell-layout)
73 (cell cell-renderer))
74
75
76
77;;;; List Store
78
2a8752b0 79(defmethod initialize-instance ((list-store list-store) &key column-types
80 column-names initial-content)
167450a3 81 (call-next-method)
2a8752b0 82 (%list-store-set-column-types list-store column-types)
83 (when column-names
cc9d465b 84 (setf
b6d4ac86 85 (user-data list-store 'column-names)
cc9d465b 86 (coerce column-names 'vector)))
2a8752b0 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))))
167450a3 92
5f0ccd62 93(defgeneric column-setter-name (store))
167450a3 94
2a8752b0 95(defmethod column-setter-name ((list-store list-store))
96 (declare (ignore list-store))
97 "gtk_list_store_set")
167450a3 98
2a8752b0 99(defbinding %list-store-set-column-types () nil
167450a3 100 (list-store list-store)
2a8752b0 101 ((length columns) unsigned-int)
102 (columns (vector gtype)))
167450a3 103
f4175703 104(defbinding %list-store-remove () boolean
167450a3 105 (list-store list-store)
106 (tree-iter tree-iter))
107
f4175703 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)
78a17735 116 (error "~A not poiniting to a valid iterator in ~A" row store))))
f4175703 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
2a8752b0 124(defbinding %list-store-insert () nil
167450a3 125 (list-store list-store)
2a8752b0 126 (tree-iter tree-iter)
167450a3 127 (position int))
128
2a8752b0 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
167450a3 136 (list-store list-store)
2a8752b0 137 (tree-iter tree-iter)
167450a3 138 (sibling (or null tree-iter)))
139
2a8752b0 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
167450a3 148 (list-store list-store)
2a8752b0 149 (tree-iter tree-iter)
167450a3 150 (sibling (or null tree-iter)))
151
2a8752b0 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
167450a3 159 (list-store list-store)
2a8752b0 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)
167450a3 167
2a8752b0 168(defbinding %list-store-append () nil
167450a3 169 (list-store list-store)
2a8752b0 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)
167450a3 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
167450a3 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
2a8752b0 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)
b6d4ac86 213 (let ((c-vector (make-c-vector 'int (length path) :content path))
2a8752b0 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
f4175703 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))))
2a8752b0 225
b6d4ac86 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
2a8752b0 234(eval-when (:compile-toplevel :load-toplevel :execute)
75689fea 235 (define-type-method alien-type ((type tree-path))
236 (declare (ignore type))
2a8752b0 237 (alien-type 'pointer))
238
b6d4ac86 239 (define-type-method size-of ((type tree-path) &key inlined)
240 (assert-not-inlined type inlined)
2a8752b0 241 (size-of 'pointer))
242
b6d4ac86 243 (define-type-method alien-arg-wrapper ((type tree-path) var path style form &optional copy-in-p)
75689fea 244 (declare (ignore type))
b6d4ac86 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))
2a8752b0 263 `(%make-tree-path ,path))
264
b6d4ac86 265 (define-type-method from-alien-form ((type tree-path) location &key (ref :free))
75689fea 266 (declare (ignore type))
b6d4ac86 267 `(prog1
268 (%tree-path-to-vector ,location)
269 ,(when (eq ref :free)
270 `(%tree-path-free ,location)))))
2a8752b0 271
b6d4ac86 272(define-type-method to-alien-function ((type tree-path) &optional copy-p)
75689fea 273 (declare (ignore type))
b6d4ac86 274 #'%make-tree-path
275 (unless copy-p
276 #'(lambda (tree-path location)
277 (declare (ignore tree-path))
f4175703 278 (%tree-path-free location))))
f4175703 279
b6d4ac86 280(define-type-method from-alien-function ((type tree-path) &key (ref :free))
75689fea 281 (declare (ignore type))
b6d4ac86 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)
f4175703 293 (let ((writer (writer-function 'pointer)))
294 #'(lambda (path location &optional (offset 0))
295 (funcall writer (%make-tree-path path) location offset))))
296
b6d4ac86 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))))
2a8752b0 302
b6d4ac86 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))))
f433f8a7 308
2a8752b0 309
310(defbinding %tree-row-reference-new () pointer
311 (model tree-model)
312 (path tree-path))
313
9176d301 314(defmethod allocate-foreign ((reference tree-row-reference) &key model path)
315 (%tree-row-reference-new model path))
2a8752b0 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
18e45ba6 324(defbinding tree-model-get-column-type () gtype ;type-number
2a8752b0 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)
b6d4ac86 331 (iter tree-iter :in/return)
2a8752b0 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
cc9d465b 344(defgeneric tree-model-value (model row column))
345
346(defmethod tree-model-value ((model tree-model) row column)
78a17735 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)))))))
0d46865d 355 (with-gvalue (gvalue)
2a8752b0 356 (%tree-model-get-value model iter index gvalue))))
357
358(defbinding tree-model-iter-next () boolean
359 (tree-model tree-model)
b6d4ac86 360 (iter tree-iter :in/return))
2a8752b0 361
362(defbinding tree-model-iter-children
363 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
364 (tree-model tree-model)
b6d4ac86 365 (iter tree-iter :in/return)
2a8752b0 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
73572c12 378 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
2a8752b0 379 (tree-model tree-model)
b6d4ac86 380 (iter tree-iter :in/return)
2a8752b0 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)
b6d4ac86 387 (iter tree-iter :in/return)
2a8752b0 388 (child tree-iter))
389
56ccd5b7 390(define-callback-marshal %tree-model-foreach-callback boolean
391 (tree-model tree-path tree-iter))
2a8752b0 392
56ccd5b7 393(defbinding %tree-model-foreach (tree-model callback-id) nil
2a8752b0 394 (tree-model tree-model)
56ccd5b7 395 (%tree-model-foreach-callback callback)
2a8752b0 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)
75689fea 430 (declare (ignore model))
2a8752b0 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)
b6d4ac86 440 (symbol (position column (user-data model 'column-names)))
441 (string (position column (user-data model 'column-names)
2a8752b0 442 :test #'string=)))
443 (error "~A has no column ~S" model column)))
444
78a17735 445(defun column-name (model index)
b6d4ac86 446 (svref (user-data model 'column-names) index))
78a17735 447
2a8752b0 448(defun tree-model-column-value-setter (model column)
449 (let ((setters (or
b6d4ac86 450 (user-data model 'column-setters)
2a8752b0 451 (setf
b6d4ac86 452 (user-data model 'column-setters)
2a8752b0 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
18e45ba6 463 (tree-model-get-column-type model index)
2a8752b0 464 'int)))
465 #'(lambda (value iter)
466 (funcall setter model iter index value -1))))))))
467
468(defun tree-model-row-setter (model)
469 (or
b6d4ac86 470 (user-data model 'row-setter)
2a8752b0 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))
b6d4ac86 476 (let ((setters (user-data model 'column-setters)))
2a8752b0 477 (setf
b6d4ac86 478 (user-data model 'row-setter)
2a8752b0 479 #'(lambda (row iter)
480 (map nil #'(lambda (value setter)
481 (funcall setter value iter))
482 row setters)))))))
483
cc9d465b 484(defgeneric (setf tree-model-value) (value model row column))
485
486(defmethod (setf tree-model-value) (value (model tree-model) row column)
78a17735 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))
2a8752b0 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
78a17735 507 do (setf (tree-model-value model iter column) value)
2a8752b0 508 while rest))))
167450a3 509
510
f4175703 511;;; Tree Selection
512
56ccd5b7 513(define-callback-marshal %tree-selection-callback boolean
514 (tree-selection tree-model tree-path (path-currently-selected boolean)))
f4175703 515
516(defbinding tree-selection-set-select-function (selection function) nil
517 (selection tree-selection)
56ccd5b7 518 (%tree-selection-callback callback)
f4175703 519 ((register-callback-function function) unsigned-int)
56ccd5b7 520 (user-data-destroy-callback callback))
f4175703 521
522(defbinding tree-selection-get-selected
523 (selection &optional (iter (make-instance 'tree-iter))) boolean
524 (selection tree-selection)
525 (nil null)
b6d4ac86 526 (iter tree-iter :in/return))
f4175703 527
56ccd5b7 528(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
f4175703 529
56ccd5b7 530(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
f4175703 531 (tree-selection tree-selection)
56ccd5b7 532 (%tree-selection-foreach-callback callback)
f4175703 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
78a17735 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
56ccd5b7 609(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
610 (tree-model (a tree-iter) (b tree-iter)))
78a17735 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)
56ccd5b7 642 (%tree-iter-compare-callback callback)
78a17735 643 ((register-callback-function function) unsigned-int)
56ccd5b7 644 (user-data-destroy-callback callback))
78a17735 645
646(defbinding %tree-sortable-set-default-sort-func () nil
647 (sortable tree-sortable)
56ccd5b7 648 (compare-func (or null callback))
78a17735 649 (callback-id unsigned-int)
56ccd5b7 650 (destroy-func (or null callback)))
78a17735 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
56ccd5b7 661 %tree-iter-compare-callback
78a17735 662 (register-callback-function function)
56ccd5b7 663 user-data-destroy-callback))
78a17735 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
f4175703 669
167450a3 670;;; Tree Store
671
672(defbinding %tree-store-set-column-types () nil
673 (tree-store tree-store)
2a8752b0 674 ((length columns) unsigned-int)
675 (columns (vector gtype)))
167450a3 676
2a8752b0 677(defmethod initialize-instance ((tree-store tree-store) &key column-types
678 column-names)
167450a3 679 (call-next-method)
2a8752b0 680 (%tree-store-set-column-types tree-store column-types)
681 (when column-names
b6d4ac86 682 (setf (user-data tree-store 'column-names) column-names)))
167450a3 683
2a8752b0 684(defmethod column-setter-name ((tree-store tree-store))
685 (declare (ignore tree-store))
686 "gtk_tree_store_set")
167450a3 687
688(defbinding tree-store-remove () boolean
689 (tree-store tree-store)
690 (tree-iter tree-iter))
691
2a8752b0 692(defbinding %tree-store-insert () nil
167450a3 693 (tree-store tree-store)
2a8752b0 694 (tree-iter tree-iter)
167450a3 695 (parent (or null tree-iter))
696 (position int))
697
2a8752b0 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
167450a3 705 (tree-store tree-store)
2a8752b0 706 (tree-iter tree-iter)
167450a3 707 (parent (or null tree-iter))
708 (sibling (or null tree-iter)))
709
73572c12 710(defun tree-store-insert-before
2a8752b0 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
167450a3 717 (tree-store tree-store)
2a8752b0 718 (tree-iter tree-iter)
167450a3 719 (parent (or null tree-iter))
720 (sibling (or null tree-iter)))
721
2a8752b0 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
167450a3 729 (tree-store tree-store)
2a8752b0 730 (tree-iter tree-iter)
167450a3 731 (parent (or null tree-iter)))
732
2a8752b0 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
167450a3 740 (tree-store tree-store)
2a8752b0 741 (tree-iter tree-iter)
167450a3 742 (parent (or null tree-iter)))
743
2a8752b0 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
167450a3 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
f4175703 787(defmethod initialize-instance ((tree-view tree-view) &rest initargs
788 &key column)
75689fea 789 (declare (ignore column))
2a8752b0 790 (call-next-method)
791 (mapc #'(lambda (column)
792 (tree-view-append-column tree-view column))
793 (get-all initargs :column)))
794
795
167450a3 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
73572c12 807(defbinding tree-view-insert-column (view column position) int
167450a3 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
56ccd5b7 878(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
167450a3 879
56ccd5b7 880(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
167450a3 881 (tree-view tree-view)
56ccd5b7 882 (%tree-view-mapping-callback callback)
167450a3 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))
b6d4ac86 907 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
167450a3 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))
b6d4ac86 913 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
167450a3 914
915(defbinding tree-view-get-visible-rect () nil
916 (tree-view tree-view)
b6d4ac86 917 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
167450a3 918
919;; and many more functions which we'll add later
920
2a8752b0 921
78a17735 922;;;; Icon View
923
b6d4ac86 924#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
78a17735 925(progn
926 (defbinding icon-view-get-path-at-pos () tree-path
927 (icon-view icon-view)
928 (x int) (y int))
2a8752b0 929
56ccd5b7 930 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
78a17735 931
56ccd5b7 932 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
78a17735 933 (icon-view icon-view)
56ccd5b7 934 (%icon-view-foreach-callback callback)
78a17735 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
c46ca281 972 (defbinding %%icon-view-get-text-column () int
973 (icon-view icon-view))
974
975 (defun %icon-view-get-text-column (icon-view)
976 (column-index
977 (icon-view-model icon-view)
978 (%%icon-view-get-text-column icon-view)))
979
980 (defun %icon-view-text-column-boundp (icon-view)
981 (not (eql (%%icon-view-get-text-column icon-view) -1)))
982
983
78a17735 984 (defbinding %icon-view-set-markup-column (column icon-view) nil
985 (icon-view icon-view)
986 ((if (integerp column)
987 column
988 (column-index (icon-view-model icon-view) column)) int))
989
c46ca281 990 (defbinding %%icon-view-get-markup-column () int
991 (icon-view icon-view))
992
993 (defun %icon-view-get-markup-column (icon-view)
994 (column-index
995 (icon-view-model icon-view)
996 (%%icon-view-get-markup-column icon-view)))
997
998 (defun %icon-view-markup-column-boundp (icon-view)
999 (not (eql (%%icon-view-get-markup-column icon-view) -1)))
1000
1001
78a17735 1002 (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
1003 (icon-view icon-view)
1004 ((if (integerp column)
1005 column
1006 (column-index (icon-view-model icon-view) column)) int)))
bdc0e300 1007
c46ca281 1008 (defbinding %%icon-view-get-pixbuf-column () int
1009 (icon-view icon-view))
1010
1011 (defun %icon-view-get-pixbuf-column (icon-view)
1012 (column-index
1013 (icon-view-model icon-view)
1014 (%%icon-view-get-pixbuf-column icon-view)))
1015
1016 (defun %icon-view-pixbuf-column-boundp (icon-view)
1017 (not (eql (%%icon-view-get-pixbuf-column icon-view) -1)))
1018
1019
b6d4ac86 1020#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
bdc0e300 1021(progn
1022 (defbinding icon-view-get-item-at-pos () boolean
1023 (icon-view icon-view)
1024 (x int)
1025 (y int)
1026 (tree-path tree-path :out)
1027 (cell cell-renderer :out))
1028
1029 (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
1030 (icon-view icon-view)
1031 (path tree-path)
1032 (cell (or null cell-renderer))
1033 (start-editing boolean))
1034
1035 (defbinding icon-view-get-cursor () boolean
1036 (icon-view icon-view)
1037 (path tree-path :out)
1038 (cell cell-renderer :out))
1039
1040 (defbinding icon-view-get-dest-item-at-pos () boolean
1041 (icon-view icon-view)
1042 (drag-x int)
1043 (drag-y int)
1044 (tree-path tree-path :out)
1045 (pos drop-position :out))
1046
1047 (defbinding icon-view-create-drag-icon () gdk:pixmap
1048 (icon-view icon-view)
1049 (tree-path tree-path))
1050
1051 (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
1052 (icon-view icon-view)
1053 (tree-path tree-path)
1054 ((or row-align column-align) boolean)
1055 (row-align single-float)
1056 (column-align single-float))
1057
1058 (defbinding icon-view-get-visible-range () boolean
1059 (icon-view icon-view)
1060 (start-path tree-path :out)
1061 (end-path tree-path :out))
1062
1063;; (defbinding icon-view-enable-model-drag-source () nil
1064;; (icon-view icon-view)
1065;; (start-button-mask gdk:modifier-type)
1066;; (targets (vector target-entry))
1067;; ((length targets) unsigned-int)
1068;; (actions gdk:drag-action))
1069
1070;; (defbinding icon-view-enable-model-drag-dest () nil
1071;; (icon-view icon-view)
1072;; (targets (vector target-entry))
1073;; ((length targets) unsigned-int)
1074;; (actions gdk:drag-action))
1075
1076 (defbinding icon-view-unset-model-drag-source () nil
1077 (icon-view icon-view))
1078
1079 (defbinding icon-view-unset-model-drag-dest () nil
1080 (icon-view icon-view)))