chiark / gitweb /
Added functions to copy paths
[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
d892130b 23;; $Id: gtktree.lisp,v 1.31 2007-10-17 14:47:10 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
351 (string (coerce (clg-utils:split-string path :delimiter #\:) 'vector))
352 (vector path)))
353
2a8752b0 354
030b4286 355;;; Tree Model
356
b8de3ff8 357(defgeneric tree-model-value (model row column))
358(defgeneric (setf tree-model-value) (value model row column))
359(defgeneric tree-model-row-data (model row))
360(defgeneric (setf tree-model-row-data) (data model row))
361(defgeneric tree-model-column-index (model column))
362(defgeneric tree-model-column-name (model index))
363
364
2a8752b0 365(defbinding %tree-row-reference-new () pointer
366 (model tree-model)
367 (path tree-path))
368
9176d301 369(defmethod allocate-foreign ((reference tree-row-reference) &key model path)
370 (%tree-row-reference-new model path))
2a8752b0 371
372(defbinding tree-row-reference-get-path () tree-path
373 (reference tree-row-reference))
374
375(defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
376 (reference tree-row-reference))
377
378
030b4286 379(defbinding tree-model-get-column-type () gtype
2a8752b0 380 (tree-model tree-model)
381 (index int))
382
030b4286 383(defbinding tree-model-get-iter (model path &optional (iter (make-instance 'tree-iter))) boolean
2a8752b0 384 (model tree-model)
b6d4ac86 385 (iter tree-iter :in/return)
2a8752b0 386 (path tree-path))
d892130b 387
388(defmethod allocate-foreign ((tree-iter tree-iter) &rest initargs)
389 (declare (ignore initargs))
390 (let ((size (foreign-size (class-of tree-iter))))
391 (slice-alloc size)))
2a8752b0 392
030b4286 393(defun ensure-tree-iter (model row)
394 (etypecase row
395 (tree-iter row)
396 (tree-path
397 (multiple-value-bind (valid-p iter) (tree-model-get-iter model row)
398 (if valid-p
399 iter
400 (error "Invalid tree path for ~A: ~A" model row))))
401 (tree-row-reference
402 (let ((path (tree-row-reference-get-path row)))
403 (if path
404 (ensure-tree-iter model path)
405 (error "~A not valid" row))))))
406
2a8752b0 407(defbinding tree-model-get-path () tree-path
408 (tree-model tree-model)
409 (iter tree-iter))
410
411(defbinding %tree-model-get-value () nil
412 (tree-model tree-model)
413 (iter tree-iter)
414 (column int)
415 (gvalue gvalue))
416
cc9d465b 417(defmethod tree-model-value ((model tree-model) row column)
030b4286 418 (let ((index (tree-model-column-index model column)))
0d46865d 419 (with-gvalue (gvalue)
030b4286 420 (%tree-model-get-value model (ensure-tree-iter model row) index gvalue))))
421
030b4286 422(defmethod tree-model-row-data ((model tree-model) row)
423 (coerce
424 (loop
425 with iter = (ensure-tree-iter model row)
5d7ab8e9 426 for index from 0 below (tree-model-n-columns model)
030b4286 427 collect (tree-model-value model iter index))
428 'vector))
429
2a8752b0 430
431(defbinding tree-model-iter-next () boolean
432 (tree-model tree-model)
b6d4ac86 433 (iter tree-iter :in/return))
2a8752b0 434
435(defbinding tree-model-iter-children
436 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
437 (tree-model tree-model)
b6d4ac86 438 (iter tree-iter :in/return)
2a8752b0 439 (parent (or null tree-iter)))
440
441(defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child")
442 () boolean
443 (tree-model tree-model)
444 (iter tree-iter))
445
995eb841 446(defbinding tree-model-iter-n-children (tree-model &optional iter) int
2a8752b0 447 (tree-model tree-model)
995eb841 448 (iter (or null tree-iter)))
2a8752b0 449
450(defbinding tree-model-iter-nth-child
73572c12 451 (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
2a8752b0 452 (tree-model tree-model)
b6d4ac86 453 (iter tree-iter :in/return)
2a8752b0 454 (parent (or null tree-iter))
455 (n int))
456
457(defbinding tree-model-iter-parent
458 (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
459 (tree-model tree-model)
b6d4ac86 460 (iter tree-iter :in/return)
2a8752b0 461 (child tree-iter))
462
56ccd5b7 463(define-callback-marshal %tree-model-foreach-callback boolean
464 (tree-model tree-path tree-iter))
2a8752b0 465
56ccd5b7 466(defbinding %tree-model-foreach (tree-model callback-id) nil
2a8752b0 467 (tree-model tree-model)
56ccd5b7 468 (%tree-model-foreach-callback callback)
2a8752b0 469 (callback-id unsigned-int))
470
471(defun tree-model-foreach (model function)
472 (with-callback-function (id function)
473 (%tree-model-foreach model id)))
474
475(defbinding tree-model-row-changed () nil
476 (tree-model tree-model)
477 (path tree-path)
478 (iter tree-iter))
479
480(defbinding tree-model-row-inserted () nil
481 (tree-model tree-model)
482 (path tree-path)
483 (iter tree-iter))
484
485(defbinding tree-model-row-has-child-toggled () nil
486 (tree-model tree-model)
487 (path tree-path)
488 (iter tree-iter))
489
490(defbinding tree-model-row-deleted () nil
491 (tree-model tree-model)
492 (path tree-path)
493 (iter tree-iter))
494
495(defbinding tree-model-rows-reordered () nil
496 (tree-model tree-model)
497 (path tree-path)
498 (iter tree-iter)
499 (new-order int))
500
030b4286 501(defmethod tree-model-column-index ((model tree-model) column)
2a8752b0 502 (or
503 (etypecase column
504 (number column)
030b4286 505 (string (position column (user-data model 'column-names) :test #'string=))
506 (symbol (position column (user-data model 'column-names))))
2a8752b0 507 (error "~A has no column ~S" model column)))
508
030b4286 509(defmethod tree-model-column-name ((model tree-model) index)
b6d4ac86 510 (svref (user-data model 'column-names) index))
78a17735 511
2a8752b0 512
030b4286 513(defmethod (setf tree-model-row-data) ((data list) (model tree-model) (iter tree-iter))
514 (loop
515 for (column value) on data by #'cddr
516 do (setf (tree-model-value model iter column) value))
2a8752b0 517 data)
518
030b4286 519(defmethod (setf tree-model-row-data) ((data vector) (model tree-model) row)
520 (loop
521 with iter = (ensure-tree-iter model row)
522 for index from 0
523 for value across data
524 do (setf (tree-model-value model iter index) value))
525 data)
167450a3 526
527
f4175703 528;;; Tree Selection
529
56ccd5b7 530(define-callback-marshal %tree-selection-callback boolean
531 (tree-selection tree-model tree-path (path-currently-selected boolean)))
f4175703 532
533(defbinding tree-selection-set-select-function (selection function) nil
534 (selection tree-selection)
56ccd5b7 535 (%tree-selection-callback callback)
f4175703 536 ((register-callback-function function) unsigned-int)
56ccd5b7 537 (user-data-destroy-callback callback))
f4175703 538
539(defbinding tree-selection-get-selected
540 (selection &optional (iter (make-instance 'tree-iter))) boolean
541 (selection tree-selection)
542 (nil null)
b6d4ac86 543 (iter tree-iter :in/return))
f4175703 544
56ccd5b7 545(define-callback-marshal %tree-selection-foreach-callback nil (tree-model tree-path tree-iter))
f4175703 546
56ccd5b7 547(defbinding %tree-selection-selected-foreach (tree-selection callback-id) nil
f4175703 548 (tree-selection tree-selection)
56ccd5b7 549 (%tree-selection-foreach-callback callback)
f4175703 550 (callback-id unsigned-int))
551
552(defun tree-selection-selected-foreach (selection function)
553 (with-callback-function (id function)
554 (%tree-selection-selected-foreach selection id)))
555
556(defbinding tree-selection-get-selected-rows () (glist tree-path)
557 (tree-selection tree-selection)
558 (nil null))
559
560(defbinding tree-selection-count-selected-rows () int
561 (tree-selection tree-selection))
562
563(defbinding %tree-selection-select-path () nil
564 (tree-selection tree-selection)
565 (tree-path tree-path))
566
567(defbinding %tree-selection-unselect-path () nil
568 (tree-selection tree-selection)
569 (tree-path tree-path))
570
571(defbinding %tree-selection-path-is-selected () boolean
572 (tree-selection tree-selection)
573 (tree-path tree-path))
574
575(defbinding %tree-selection-select-iter () nil
576 (tree-selection tree-selection)
577 (tree-path tree-path))
578
579(defbinding %tree-selection-unselect-iter () nil
580 (tree-selection tree-selection)
581 (tree-path tree-path))
582
583(defbinding %tree-selection-iter-is-selected () boolean
584 (tree-selection tree-selection)
585 (tree-path tree-path))
586
587(defun tree-selection-select (selection row)
588 (etypecase row
589 (tree-path (%tree-selection-select-path selection row))
590 (tree-iter (%tree-selection-select-iter selection row))))
591
592(defun tree-selection-unselect (selection row)
593 (etypecase row
594 (tree-path (%tree-selection-unselect-path selection row))
595 (tree-iter (%tree-selection-unselect-iter selection row))))
596
597(defun tree-selection-is-selected-p (selection row)
598 (etypecase row
599 (tree-path (%tree-selection-path-is-selected selection row))
600 (tree-iter (%tree-selection-iter-is-selected selection row))))
601
602(defbinding tree-selection-select-all () nil
603 (tree-selection tree-selection))
604
605(defbinding tree-selection-unselect-all () nil
606 (tree-selection tree-selection))
607
608(defbinding tree-selection-select-range () nil
609 (tree-selection tree-selection)
610 (start tree-path)
611 (end tree-path))
612
613(defbinding tree-selection-unselect-range () nil
614 (tree-selection tree-selection)
615 (start tree-path)
616 (end tree-path))
617
618
78a17735 619;;; Tree Sortable
620
621(eval-when (:compile-toplevel :load-toplevel :execute)
622 (define-enum-type sort-column (:default -1) (:unsorted -2))
623 (define-enum-type sort-order (:before -1) (:equal 0) (:after 1)))
624
625
56ccd5b7 626(define-callback-marshal %tree-iter-compare-callback (or int sort-order)
627 (tree-model (a tree-iter) (b tree-iter)))
78a17735 628
629(defbinding tree-sortable-sort-column-changed () nil
630 (sortable tree-sortable))
631
632(defbinding %tree-sortable-get-sort-column-id () boolean
633 (sortable tree-sortable)
634 (column int :out)
635 (order sort-type :out))
636
637(defun tree-sortable-get-sort-column (sortable)
638 (multiple-value-bind (special-p column order)
639 (%tree-sortable-get-sort-column-id sortable)
640 (values
641 (if special-p
642 (int-to-sort-order column)
9f321c75 643 (tree-model-column-name sortable column))
78a17735 644 order)))
645
646(defbinding (tree-sortable-set-sort-column
647 "gtk_tree_sortable_set_sort_column_id")
648 (sortable column order) nil
649 (sortable tree-sortable)
650 ((etypecase column
651 ((or integer sort-column) column)
030b4286 652 (symbol (tree-model-column-index sortable column)))
78a17735 653 (or sort-column int))
654 (order sort-type))
655
656(defbinding %tree-sortable-set-sort-func (sortable column function) nil
657 (sortable tree-sortable)
030b4286 658 ((tree-model-column-index sortable column) int)
56ccd5b7 659 (%tree-iter-compare-callback callback)
78a17735 660 ((register-callback-function function) unsigned-int)
56ccd5b7 661 (user-data-destroy-callback callback))
78a17735 662
663(defbinding %tree-sortable-set-default-sort-func () nil
664 (sortable tree-sortable)
56ccd5b7 665 (compare-func (or null callback))
78a17735 666 (callback-id unsigned-int)
56ccd5b7 667 (destroy-func (or null callback)))
78a17735 668
669(defun tree-sortable-set-sort-func (sortable column function)
670 "Sets the comparison function used when sorting to be FUNCTION. If
671the current sort column of SORTABLE is the same as COLUMN,
672then the model will sort using this function."
673 (cond
674 ((and (eq column :default) (not function))
675 (%tree-sortable-set-default-sort-func sortable nil 0 nil))
676 ((eq column :default)
677 (%tree-sortable-set-default-sort-func sortable
56ccd5b7 678 %tree-iter-compare-callback
78a17735 679 (register-callback-function function)
56ccd5b7 680 user-data-destroy-callback))
78a17735 681 ((%tree-sortable-set-sort-func sortable column function))))
682
683(defbinding tree-sortable-has-default-sort-func-p () boolean
684 (sortable tree-sortable))
685
f4175703 686
167450a3 687;;; Tree Store
688
689(defbinding %tree-store-set-column-types () nil
690 (tree-store tree-store)
2a8752b0 691 ((length columns) unsigned-int)
692 (columns (vector gtype)))
167450a3 693
2a8752b0 694(defmethod initialize-instance ((tree-store tree-store) &key column-types
695 column-names)
167450a3 696 (call-next-method)
2a8752b0 697 (%tree-store-set-column-types tree-store column-types)
698 (when column-names
b6d4ac86 699 (setf (user-data tree-store 'column-names) column-names)))
167450a3 700
030b4286 701
702(defbinding %tree-store-set-value () nil
703 (tree-store tree-store)
704 (tree-iter tree-iter)
705 (column int)
706 (gvalue gvalue))
707
708(defmethod (setf tree-model-value) (value (store tree-store) row column)
709 (let* ((index (tree-model-column-index store column))
710 (type (tree-model-get-column-type store index)))
711 (with-gvalue (gvalue type value)
712 (%tree-store-set-value store (ensure-tree-iter store row) index gvalue)))
713 value)
714
167450a3 715
716(defbinding tree-store-remove () boolean
717 (tree-store tree-store)
718 (tree-iter tree-iter))
719
2a8752b0 720(defbinding %tree-store-insert () nil
167450a3 721 (tree-store tree-store)
2a8752b0 722 (tree-iter tree-iter)
167450a3 723 (parent (or null tree-iter))
724 (position int))
725
2a8752b0 726(defun tree-store-insert
727 (store parent position &optional data (iter (make-instance 'tree-iter)))
728 (%tree-store-insert store iter parent position)
030b4286 729 (when data (setf (tree-model-row-data store iter) data))
2a8752b0 730 iter)
731
732(defbinding %tree-store-insert-before () nil
167450a3 733 (tree-store tree-store)
2a8752b0 734 (tree-iter tree-iter)
167450a3 735 (parent (or null tree-iter))
736 (sibling (or null tree-iter)))
737
73572c12 738(defun tree-store-insert-before
2a8752b0 739 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
740 (%tree-store-insert-before store iter parent sibling)
030b4286 741 (when data (setf (tree-model-row-data store iter) data))
2a8752b0 742 iter)
743
744(defbinding %tree-store-insert-after () nil
167450a3 745 (tree-store tree-store)
2a8752b0 746 (tree-iter tree-iter)
167450a3 747 (parent (or null tree-iter))
748 (sibling (or null tree-iter)))
749
2a8752b0 750(defun tree-store-insert-after
751 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
752 (%tree-store-insert-after store iter parent sibling)
030b4286 753 (when data (setf (tree-model-row-data store iter) data))
2a8752b0 754 iter)
755
756(defbinding %tree-store-prepend () nil
167450a3 757 (tree-store tree-store)
2a8752b0 758 (tree-iter tree-iter)
167450a3 759 (parent (or null tree-iter)))
760
2a8752b0 761(defun tree-store-prepend
762 (store parent &optional data (iter (make-instance 'tree-iter)))
763 (%tree-store-prepend store iter parent)
030b4286 764 (when data (setf (tree-model-row-data store iter) data))
2a8752b0 765 iter)
766
767(defbinding %tree-store-append () nil
167450a3 768 (tree-store tree-store)
2a8752b0 769 (tree-iter tree-iter)
167450a3 770 (parent (or null tree-iter)))
771
2a8752b0 772(defun tree-store-append
773 (store parent &optional data (iter (make-instance 'tree-iter)))
774 (%tree-store-append store iter parent)
030b4286 775 (when data (setf (tree-model-row-data store iter) data))
2a8752b0 776 iter)
777
167450a3 778(defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
779 (tree-store tree-store)
780 (tree-iter tree-iter)
781 (descendant tree-iter))
782
783(defbinding tree-store-iter-depth () int
784 (tree-store tree-store)
785 (tree-iter tree-iter))
786
787(defbinding tree-store-clear () nil
788 (tree-store tree-store))
789
790(defbinding tree-store-reorder () nil
791 (tree-store tree-store)
792 (parent tree-iter)
793 (new-order (vector int)))
794
795(defbinding tree-store-swap () nil
796 (tree-store tree-store)
797 (a tree-iter)
798 (b tree-iter))
799
800(defbinding tree-store-move-before () nil
801 (tree-store tree-store)
802 (iter tree-iter)
803 (psoition (or null tree-iter)))
804
805
806(defbinding tree-store-move-after () nil
807 (tree-store tree-store)
808 (iter tree-iter)
809 (psoition tree-iter))
810
811
812
813;;; Tree View
814
f4175703 815(defmethod initialize-instance ((tree-view tree-view) &rest initargs
816 &key column)
75689fea 817 (declare (ignore column))
2a8752b0 818 (call-next-method)
819 (mapc #'(lambda (column)
820 (tree-view-append-column tree-view column))
821 (get-all initargs :column)))
822
823
167450a3 824(defbinding tree-view-columns-autosize () nil
825 (tree-view tree-view))
826
827(defbinding tree-view-append-column () int
828 (tree-view tree-view)
829 (tree-view-column tree-view-column))
830
831(defbinding tree-view-remove-column () int
832 (tree-view tree-view)
833 (tree-view-column tree-view-column))
834
73572c12 835(defbinding tree-view-insert-column (view column position) int
167450a3 836 (view tree-view)
837 (column tree-view-column)
838 ((if (eq position :end) -1 position) int))
839
840(defbinding tree-view-get-column () tree-view-column
841 (tree-view tree-view)
842 (position int))
843
844(defbinding tree-view-move-column-after () nil
845 (tree-view tree-view)
846 (column tree-view-column)
847 (base-column (or null tree-view-column)))
848
d53cf0ec 849(define-callback-setter tree-view-set-column-drag-function tree-view boolean
850 (column tree-view-column)
851 (prev tree-view-column)
852 (next tree-view-column))
167450a3 853
854(defbinding tree-view-scroll-to-point () nil
855 (tree-view tree-view)
856 (tree-x int)
857 (tree-y int))
858
859(defbinding tree-view-scroll-to-cell () nil
860 (tree-view tree-view)
861 (path (or null tree-path))
862 (column (or null tree-view-column))
863 (use-align boolean)
864 (row-align single-float)
865 (col-align single-float))
866
d53cf0ec 867(defbinding (tree-view-set-cursor "gtk_tree_view_set_cursor_on_cell")
868 (tree-view path &key focus-column focus-cell start-editing) nil
167450a3 869 (tree-view tree-view)
870 (path tree-path)
871 (focus-column (or null tree-view-column))
872 (focus-cell (or null cell-renderer))
873 (start-editing boolean))
874
875(defbinding tree-view-get-cursor () nil
876 (tree-view tree-view)
877 (path tree-path :out )
878 (focus-column tree-view-column :out))
879
880(defbinding tree-view-row-activated () nil
881 (tree-view tree-view)
882 (path tree-path )
883 (column tree-view-column))
884
885(defbinding tree-view-expand-all () nil
886 (tree-view tree-view))
887
888(defbinding tree-view-collapse-all () nil
889 (tree-view tree-view))
890
891(defbinding tree-view-expand-to-path () nil
892 (tree-view tree-view)
893 (path tree-path))
894
895(defbinding tree-view-expand-row () nil
896 (tree-view tree-view)
897 (path tree-path)
898 (open-all boolean))
899
900(defbinding tree-view-collapse-row () nil
901 (tree-view tree-view)
902 (path tree-path))
903
56ccd5b7 904(define-callback-marshal %tree-view-mapping-callback nil (tree-view tree-path))
167450a3 905
56ccd5b7 906(defbinding %tree-view-map-expanded-rows (tree-view callback-id) nil
167450a3 907 (tree-view tree-view)
56ccd5b7 908 (%tree-view-mapping-callback callback)
167450a3 909 (callback-id unsigned-int))
910
911(defun map-expanded-rows (function tree-view)
912 (with-callback-function (id function)
913 (%tree-view-map-expanded-rows tree-view id)))
914
915(defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
916 (tree-view tree-view)
917 (path tree-path))
918
919(defbinding tree-view-get-path-at-pos
920 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
921 (tree-view tree-view)
922 (x int)
923 (y int)
924 (path tree-path :out)
925 (column tree-view-column :out)
926 (cell-x int)
927 (cell-y int))
928
929(defbinding tree-view-get-cell-area () nil
930 (tree-view tree-view)
931 (path (or null tree-path))
932 (column (or null tree-view-column))
b6d4ac86 933 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
167450a3 934
935(defbinding tree-view-get-background-area () nil
936 (tree-view tree-view)
937 (path (or null tree-path))
938 (column (or null tree-view-column))
b6d4ac86 939 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
167450a3 940
941(defbinding tree-view-get-visible-rect () nil
942 (tree-view tree-view)
b6d4ac86 943 ((make-instance 'gdk:rectangle) gdk:rectangle :in/return))
167450a3 944
945;; and many more functions which we'll add later
946
2a8752b0 947
78a17735 948;;;; Icon View
949
b6d4ac86 950#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.6.0")
78a17735 951(progn
952 (defbinding icon-view-get-path-at-pos () tree-path
953 (icon-view icon-view)
954 (x int) (y int))
2a8752b0 955
56ccd5b7 956 (define-callback-marshal %icon-view-foreach-callback nil (icon-view tree-path))
78a17735 957
56ccd5b7 958 (defbinding %icon-view-selected-foreach (icon-view callback-id) tree-path
78a17735 959 (icon-view icon-view)
56ccd5b7 960 (%icon-view-foreach-callback callback)
78a17735 961 (callback-id unsigned-int))
962
963 (defun icon-view-foreach (icon-view function)
964 (with-callback-function (id function)
965 (%icon-view-selected-foreach icon-view id)))
966
967 (defbinding icon-view-select-path () nil
968 (icon-view icon-view)
969 (path tree-path))
970
971 (defbinding icon-view-unselect-path () nil
972 (icon-view icon-view)
973 (path tree-path))
974
975 (defbinding icon-view-path-is-selected-p () boolean
976 (icon-view icon-view)
977 (path tree-path))
978
979 (defbinding icon-view-get-selected-items () (glist tree-path)
980 (icon-view icon-view))
981
982 (defbinding icon-view-select-all () nil
983 (icon-view icon-view))
984
985 (defbinding icon-view-unselect-all () nil
986 (icon-view icon-view))
987
988 (defbinding icon-view-item-activated () nil
989 (icon-view icon-view)
990 (path tree-path))
991
992 (defbinding %icon-view-set-text-column (column icon-view) nil
993 (icon-view icon-view)
994 ((if (integerp column)
995 column
030b4286 996 (tree-model-column-index (icon-view-model icon-view) column)) int))
78a17735 997
c46ca281 998 (defbinding %%icon-view-get-text-column () int
999 (icon-view icon-view))
1000
1001 (defun %icon-view-get-text-column (icon-view)
030b4286 1002 (tree-model-column-index
c46ca281 1003 (icon-view-model icon-view)
1004 (%%icon-view-get-text-column icon-view)))
1005
1006 (defun %icon-view-text-column-boundp (icon-view)
1007 (not (eql (%%icon-view-get-text-column icon-view) -1)))
1008
1009
78a17735 1010 (defbinding %icon-view-set-markup-column (column icon-view) nil
1011 (icon-view icon-view)
1012 ((if (integerp column)
1013 column
030b4286 1014 (tree-model-column-index (icon-view-model icon-view) column)) int))
78a17735 1015
c46ca281 1016 (defbinding %%icon-view-get-markup-column () int
1017 (icon-view icon-view))
1018
1019 (defun %icon-view-get-markup-column (icon-view)
030b4286 1020 (tree-model-column-index
c46ca281 1021 (icon-view-model icon-view)
1022 (%%icon-view-get-markup-column icon-view)))
1023
1024 (defun %icon-view-markup-column-boundp (icon-view)
1025 (not (eql (%%icon-view-get-markup-column icon-view) -1)))
1026
1027
78a17735 1028 (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
1029 (icon-view icon-view)
1030 ((if (integerp column)
1031 column
030b4286 1032 (tree-model-column-index (icon-view-model icon-view) column)) int)))
bdc0e300 1033
c46ca281 1034 (defbinding %%icon-view-get-pixbuf-column () int
1035 (icon-view icon-view))
1036
1037 (defun %icon-view-get-pixbuf-column (icon-view)
030b4286 1038 (tree-model-column-index
c46ca281 1039 (icon-view-model icon-view)
1040 (%%icon-view-get-pixbuf-column icon-view)))
1041
1042 (defun %icon-view-pixbuf-column-boundp (icon-view)
1043 (not (eql (%%icon-view-get-pixbuf-column icon-view) -1)))
1044
1045
b6d4ac86 1046#?(pkg-exists-p "gtk+-2.0" :atleast-version "2.8.0")
bdc0e300 1047(progn
1048 (defbinding icon-view-get-item-at-pos () boolean
1049 (icon-view icon-view)
1050 (x int)
1051 (y int)
1052 (tree-path tree-path :out)
1053 (cell cell-renderer :out))
1054
1055 (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
1056 (icon-view icon-view)
1057 (path tree-path)
1058 (cell (or null cell-renderer))
1059 (start-editing boolean))
1060
1061 (defbinding icon-view-get-cursor () boolean
1062 (icon-view icon-view)
1063 (path tree-path :out)
1064 (cell cell-renderer :out))
1065
1066 (defbinding icon-view-get-dest-item-at-pos () boolean
1067 (icon-view icon-view)
1068 (drag-x int)
1069 (drag-y int)
1070 (tree-path tree-path :out)
1071 (pos drop-position :out))
1072
1073 (defbinding icon-view-create-drag-icon () gdk:pixmap
1074 (icon-view icon-view)
1075 (tree-path tree-path))
1076
1077 (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
1078 (icon-view icon-view)
1079 (tree-path tree-path)
1080 ((or row-align column-align) boolean)
1081 (row-align single-float)
1082 (column-align single-float))
1083
1084 (defbinding icon-view-get-visible-range () boolean
1085 (icon-view icon-view)
1086 (start-path tree-path :out)
1087 (end-path tree-path :out))
1088
d53cf0ec 1089 (defbinding icon-view-enable-model-drag-source () nil
1090 (icon-view icon-view)
1091 (start-button-mask gdk:modifier-type)
1092 (targets (vector (inlined target-entry)))
1093 ((length targets) unsigned-int)
1094 (actions gdk:drag-action))
1095
1096 (defbinding icon-view-enable-model-drag-dest () nil
1097 (icon-view icon-view)
1098 (targets (vector (inlined target-entry)))
1099 ((length targets) unsigned-int)
1100 (actions gdk:drag-action))
bdc0e300 1101
1102 (defbinding icon-view-unset-model-drag-source () nil
1103 (icon-view icon-view))
1104
1105 (defbinding icon-view-unset-model-drag-dest () nil
1106 (icon-view icon-view)))