; 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)
(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))
(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)
(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))
(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)