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