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