X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=gtk%2Fgtk.tree-model.lisp;h=6bd65bb8df0a5109c2d02a9b8d84db76d5717824;hb=8c8796df4f570c34c85a44a95a7838326ce156b3;hp=6cbdb962c0ea723456b53042172bb84824a3e21a;hpb=8840814d7e7abd83690593344ab7f156d9c99253;p=cl-gtk2.git diff --git a/gtk/gtk.tree-model.lisp b/gtk/gtk.tree-model.lisp index 6cbdb96..6bd65bb 100644 --- a/gtk/gtk.tree-model.lisp +++ b/gtk/gtk.tree-model.lisp @@ -30,6 +30,7 @@ ; TODO: GtkTreeModelFilter + (defclass array-list-store (g-object tree-model) ((items :initform (make-array 0 :adjustable t :fill-pointer t) :reader store-items) (columns-getters :initform (make-array 0 :adjustable t :fill-pointer t) :reader store-getters) @@ -39,16 +40,37 @@ (register-object-type-implementation "LispArrayListStore" array-list-store "GObject" ("GtkTreeModel") nil) +(defun store-items-count (store) + (length (store-items store))) + +(export 'store-items-count) + +(defun store-item (store index) + (aref (store-items store) index)) + +(export 'store-item) + (defun store-add-item (store item) (vector-push-extend item (store-items store)) (using* ((path (make-instance 'tree-path)) - (iter (make-instance 'tree-iter))) + (iter (make-instance 'tree-iter))) (setf (tree-path-indices path) (list (1- (length (store-items store))))) (setf (tree-iter-stamp iter) 0 (tree-iter-user-data iter) (1- (length (store-items store)))) (emit-signal store "row-inserted" path iter))) (export 'store-add-item) +(defun store-remove-item (store item &key (test 'eq)) + (with-slots (items) store + (let ((index (position item items :test test))) + (unless index (error "No such item~%~A~%in list-store~%~A" item store)) + (setf items (delete item items :test test)) + (using (path (make-instance 'tree-path)) + (setf (tree-path-indices path) (list index)) + (emit-signal store "row-deleted" path))))) + +(export 'store-remove-item) + (defun store-add-column (store type getter) (vector-push-extend (ensure-g-type type) (store-types store)) (vector-push-extend getter (store-getters store)) @@ -96,9 +118,10 @@ (defmethod tree-model-get-path-impl ((model array-list-store) iter) (using* (iter) - (anaphora:aprog1 (make-instance 'tree-path) - (setf (tree-path-indices anaphora:it) (list (tree-iter-user-data iter))) - (disown-boxed-ref anaphora:it)))) + (let ((path (make-instance 'tree-path))) + (setf (tree-path-indices path) (list (tree-iter-user-data iter))) + (disown-boxed-ref path) + path))) (defmethod tree-model-iter-has-child-impl ((model array-list-store) iter) (release iter) @@ -124,22 +147,6 @@ (aref (store-items model) n-row)) (aref (store-types model) n))))) -(defstruct tree-node - store - (columns-values (make-array 0 :adjustable t :fill-pointer t) :type vector) - (children (make-array 0 :adjustable t :fill-pointer t) :type (vector tree-node))) - -(export 'tree-node) - -(defclass tree-store (g-object tree-model) - ((root :reader tree-store-root) - (columns-types :initform (make-array 0 :adjustable t :fill-pointer t) :reader tree-store-types) - (columns-getters :initform (make-array 0 :adjustable t :fill-pointer t) :reader tree-store-getters))) - -(export 'tree-store) - -(register-object-type-implementation "LispTreeStore" tree-store "GObject" ("GtkTreeModel") nil) - (defcfun (tree-model-flags "gtk_tree_model_get_flags") tree-model-flags (tree-model g-object)) @@ -210,7 +217,7 @@ (with-foreign-object (v 'g-value) (g-value-zero v) (gtk-tree-model-get-value tree-model iter column v) - (prog1 (parse-gvalue v) + (prog1 (parse-g-value v) (g-value-unset v)))) (export 'tree-model-value)