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