X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/112ac1d33aa8f9b7f3d2f9542d15431f152b1d35..8f49b7a10a9717890ca98dff2b01799b80ce2761:/gtk/gtkcontainer.lisp diff --git a/gtk/gtkcontainer.lisp b/gtk/gtkcontainer.lisp index 2987297..f352b25 100644 --- a/gtk/gtkcontainer.lisp +++ b/gtk/gtkcontainer.lisp @@ -20,14 +20,37 @@ ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -;; $Id: gtkcontainer.lisp,v 1.18 2005-04-23 16:48:52 espen Exp $ +;; $Id: gtkcontainer.lisp,v 1.26 2008-05-06 00:04:42 espen Exp $ (in-package "GTK") +(defgeneric container-add (container widget &rest args)) +(defgeneric container-remove (container widget)) +(defgeneric container-all-children (container)) +(defgeneric container-internal-children (container)) +(defgeneric (setf container-children) (children container)) + + +(defun initial-add (object function initargs key pkey) + (loop + as (initarg value . rest) = initargs then rest + do (cond + ((eq initarg key) (funcall function object value)) + ((eq initarg pkey) (mapc #'(lambda (value) + (funcall function object value)) + value))) + while rest)) + +(defun initial-apply-add (object function initargs key pkey) + (initial-add object #'(lambda (object value) + (apply function object (mklist value))) + initargs key pkey)) + + (defmethod shared-initialize ((container container) names &rest initargs &key child children child-args - (show-children nil show-children-p)) - (declare (ignore child children)) + (show-children nil show-children-p)) + (declare (ignore names child children)) (when show-children-p (if (not show-children) (setf (user-data container 'show-recursive-p) nil) @@ -41,12 +64,14 @@ initargs :child :children)) -(defmethod compute-signal-function ((container container) signal function object) +(defmethod compute-signal-function ((container container) signal function object args) + (declare (ignore signal)) (if (eq object :children) - #'(lambda (&rest args) - (mapc #'(lambda (child) - (apply function child (rest args))) - (container-children container))) + #'(lambda (container &rest emission-args) + (let ((all-args (nconc emission-args args))) + (container-foreach container + #'(lambda (child) + (apply function child all-args))))) (call-next-method))) @@ -54,15 +79,31 @@ (container container) (widget widget)) -(defmethod container-add ((container container) (widget widget) &rest args) - (%container-add container widget) +(defun find-child-class (container-class) + (or + (gethash container-class *container-to-child-class-mappings*) + (setf (gethash container-class *container-to-child-class-mappings*) + (or + (when (eq container-class (find-class 'container)) + (find-class 'container-child)) + (find-child-class (find-class (supertype container-class))))))) + +(defun init-child-slots (container child args) (when args (setf - (slot-value widget 'child-properties) + (slot-value child 'child-properties) (apply - #'make-instance - (gethash (class-of container) *container-to-child-class-mappings*) - :parent container :child widget args)))) + #'make-instance (find-child-class (class-of container)) + :parent container :child child args)))) + +(defmethod container-add ((container container) (widget widget) &rest args) + (%container-add container widget) + (init-child-slots container widget args) + widget) + +(defmethod container-add ((container container) (widgets list) &rest args) + (dolist (widget widgets) + (apply #'container-add container widget args))) (defbinding %container-remove () nil (container container) @@ -89,11 +130,11 @@ (defbinding container-check-resize () nil (container container)) -(def-callback-marshal %foreach-callback (nil widget)) +(define-callback-marshal %foreach-callback nil (widget)) (defbinding %container-foreach (container callback-id) nil (container container) - ((callback %foreach-callback) pointer) + (%foreach-callback callback) (callback-id unsigned-int)) (defun container-foreach (container function) @@ -102,7 +143,7 @@ (defbinding %container-forall (container callback-id) nil (container container) - ((callback %foreach-callback) pointer) + (%foreach-callback callback) (callback-id unsigned-int)) (defun container-forall (container function) @@ -116,23 +157,33 @@ nil) (list (let ((list nil)) - (container-foreach - container + (container-foreach container #'(lambda (child) (push (funcall func child) list))) (nreverse list))) (t (let ((seq (make-sequence seqtype (container-length container))) (index 0)) - (container-foreach - container + (container-foreach container #'(lambda (child) (setf (elt seq index) (funcall func child)) (incf index))) seq)))) -(defmethod container-children ((container container)) - (map-container 'list #'identity container)) +(defmethod container-all-children ((container container)) + (let ((internal ())) + (container-forall container + #'(lambda (child) + (push child internal))) + (nreverse internal))) + +(defmethod container-internal-children ((container container)) + (let ((external-children (container-children container)) + (all-children (container-all-children container))) + (loop + for child in all-children + unless (find child external-children) + collect child))) (defmethod (setf container-children) (children (container container)) (dolist (child (container-children container)) @@ -182,7 +233,7 @@ (defgeneric container-show-recursive (container)) (defmethod container-show-recursive ((container container)) - "Recursively shows any child widgets except widgets explicit hidden during construction." + "Recursively show any child widgets except widgets explicit hidden during construction." (labels ((recursive-show (widget) (when (typep widget 'container) (if (not (user-data-p widget 'show-recursive-p))