[mcclim-cvs] CVS mcclim/Backends/gtkairo

dlichteblau dlichteblau at common-lisp.net
Sat Dec 23 21:44:04 UTC 2006


Update of /project/mcclim/cvsroot/mcclim/Backends/gtkairo
In directory clnet:/tmp/cvs-serv20070/Backends/gtkairo

Modified Files:
	ffi.lisp gadgets.lisp 
Log Message:

Implement (SETF LIST-PANE-ITEMS) as discussed on IRC.

	* package.lisp (CLIM-EXTENSIONS): Export LIST-PANE-ITEMS.

	* Examples/demodemo.lisp: Extend the LIST-TEST to demonstrate the
	new functionality.
	
	* gadgets.lisp ((SETF LIST-PANE-ITEMS)): Add a new generic
	function.  Implement it for GENERIC-LIST-PANE, with some general
	code specialized on META-LIST-PANE.

	* Backends/gtkairo/gadgets.lisp: Implement (SETF LIST-PANE-ITEMS)
	for GTK-LIST, too.

	* Backends/gtkairo/ffi.lisp: regenerated.


--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/ffi.lisp	2006/12/20 19:26:14	1.10
+++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/ffi.lisp	2006/12/23 21:44:03	1.11
@@ -1042,6 +1042,11 @@
   (iter :pointer)                       ;GtkTreeIter *
   )
 
+(defcfun "gtk_list_store_clear"
+    :void
+  (list_store :pointer)                 ;GtkListStore *
+  )
+
 (defcfun "gtk_list_store_newv"
     :pointer
   (n_columns :int)                      ;gint
@@ -1215,6 +1220,11 @@
   (tree_view :pointer)                  ;GtkTreeView *
   )
 
+(defcfun "gtk_tree_view_get_model"
+    :pointer
+  (tree_view :pointer)                  ;GtkTreeView *
+  )
+
 (defcfun "gtk_tree_view_get_selection"
     :pointer
   (tree_view :pointer)                  ;GtkTreeView *
--- /project/mcclim/cvsroot/mcclim/Backends/gtkairo/gadgets.lisp	2006/12/20 12:01:36	1.16
+++ /project/mcclim/cvsroot/mcclim/Backends/gtkairo/gadgets.lisp	2006/12/23 21:44:03	1.17
@@ -49,7 +49,9 @@
 
 (defclass gtk-list (native-widget-mixin list-pane climi::meta-list-pane)
     ((title :initarg :title :initform "" :accessor list-pane-title)
-     (tree-view :accessor list-pane-tree-view)))
+     (tree-view :accessor list-pane-tree-view))
+  ;; fixme?
+  (:default-initargs :value nil))
 
 (defclass gtk-option-pane
     (native-widget-mixin option-pane climi::meta-list-pane)
@@ -151,7 +153,6 @@
     (setf (cffi:mem-aref types :long 1) 0)
     (let* ((model (gtk_list_store_newv 1 types))
 	   (tv (gtk_tree_view_new_with_model model))
-	   (name-key (climi::list-pane-name-key sheet))
 	   (column (gtk_tree_view_column_new))
 	   (renderer (gtk_cell_renderer_text_new)))
       (setf (list-pane-tree-view sheet) tv)
@@ -159,15 +160,7 @@
       (gtk_tree_view_insert_column tv column -1)
       (gtk_tree_view_column_add_attribute column renderer "text" 0)
       (gtk_tree_view_column_set_title column (list-pane-title sheet))
-      (cffi:with-foreign-object (&iter 'gtktreeiter)
-	(dolist (i (climi::list-pane-items sheet))
-	  (gtk_list_store_append model &iter)
-	  (cffi:with-foreign-string (n (funcall name-key i))
-	    (cffi:with-foreign-object (&value 'gvalue)
-	      (setf (cffi:foreign-slot-value &value 'gvalue 'type) 0)
-	      (g_value_init &value +g-type-string+)
-	      (g_value_set_string &value n)
-	      (gtk_list_store_set_value model &iter 0 &value)))))
+      (reset-list-pane-items sheet)
       (gtk_tree_selection_set_mode
        (list-pane-selection sheet)
        (if (eq (climi::list-pane-mode sheet) :exclusive)
@@ -192,6 +185,20 @@
 	 (cffi:null-pointer))
 	result))))
 
+(defun reset-list-pane-items (sheet)
+  (let ((model (gtk_tree_view_get_model (list-pane-tree-view sheet)))
+	(name-key (climi::list-pane-name-key sheet)))
+    (gtk_list_store_clear model)  
+    (cffi:with-foreign-object (&iter 'gtktreeiter)
+      (dolist (i (climi::list-pane-items sheet))
+	(gtk_list_store_append model &iter)
+	(cffi:with-foreign-string (n (funcall name-key i))
+	  (cffi:with-foreign-object (&value 'gvalue)
+	    (setf (cffi:foreign-slot-value &value 'gvalue 'type) 0)
+	    (g_value_init &value +g-type-string+)
+	    (g_value_set_string &value n)
+	    (gtk_list_store_set_value model &iter 0 &value)))))))
+
 (defmethod realize-native-widget ((sheet gtk-option-pane))
   (let* ((widget (gtk_combo_box_new_text))
 	 (name-key (climi::list-pane-name-key sheet)))
@@ -216,7 +223,8 @@
   (gtk_tree_selection_unselect_all (list-pane-selection sheet))
   (let ((value (gadget-value sheet)))
     (if (eq (climi::list-pane-mode sheet) :exclusive)
-	(gtk-list-select-value sheet value)
+	(when value			;fixme?
+	  (gtk-list-select-value sheet value))
 	(dolist (v value)
 	  (gtk-list-select-value sheet v)))))
 
@@ -228,6 +236,17 @@
       (when mirror
 	(gtk-list-reset-selection gadget)))))
 
+(defmethod (setf climi::list-pane-items)
+    (newval (pane gtk-list) &key invoke-callback)
+  (declare (ignore invoke-callback))
+  (call-next-method)
+  (with-gtk ()
+    (reset-list-pane-items pane)))
+
+(defmethod climi::generic-list-pane-item-values ((pane gtk-list))
+  (mapcar (climi::list-pane-value-key pane)
+	  (climi::list-pane-items pane)))
+
 (defun option-pane-set-active (sheet widget)
   (gtk_combo_box_set_active
    widget




More information about the Mcclim-cvs mailing list