Author: junrue Date: Mon Jul 3 12:31:37 2006 New Revision: 172
Modified: trunk/README.txt trunk/docs/manual/api.texinfo trunk/src/uitoolkit/widgets/menu-language.lisp trunk/src/uitoolkit/widgets/menu.lisp trunk/src/uitoolkit/widgets/widget-generics.lisp trunk/src/uitoolkit/widgets/widget-with-items.lisp Log: refactored menu item/submenu/separator convenience functions and fixed behavior of :disabled in menu language
Modified: trunk/README.txt ============================================================================== --- trunk/README.txt (original) +++ trunk/README.txt Mon Jul 3 12:31:37 2006 @@ -61,18 +61,13 @@ has not been tested with all of them. Therefore, images may not display properly, expecially when a transparency is selected.
-3. The event-tester application's menu definition specifies that the - Test Menu | Submenu | Item A item should be disabled but it does - not get disabled. However, the GFW:ENABLE function does otherwise - work correctly for menu items. - -4. The src/demos/unblocked directory contains a start at a demo +3. The src/demos/unblocked directory contains a start at a demo program (a simple game where one clicks on block shapes to score points, where the rest of the blocks fall down to fill in the gaps). This demo program is not yet finished, but the source code can still serve as sample code.
-5. The text-extent generic function currently does not return +4. The text-extent generic function currently does not return the correct text height. As a workaround, get the text metrics for the desired font and base height calculations on that value. The text-extent function does return the correct width.
Modified: trunk/docs/manual/api.texinfo ============================================================================== --- trunk/docs/manual/api.texinfo (original) +++ trunk/docs/manual/api.texinfo Mon Jul 3 12:31:37 2006 @@ -939,9 +939,11 @@ Returns T if ancestor is an ancestor of descendant; nil otherwise. @end deffn
-@deffn GenericFunction append-item self text image dispatcher -Adds the new item with the specified text to the object, and returns -the newly-created item. +@deffn GenericFunction append-item self text image dispatcher &optional disabled checked +Adds the new item with the specified @code{text}, @code{image}, and +@ref{event-dispatcher} to the object, and returns the newly-created item. +The optional @code{checked} and @code{disabled} arguments can be used +to set the item's initial state. @end deffn
@deffn GenericFunction append-separator self @@ -949,8 +951,10 @@ item. @end deffn
-@deffn GenericFunction append-submenu self text submenu dispatcher -Adds a submenu anchored to a parent menu and returns the corresponding item. +@deffn GenericFunction append-submenu self text submenu dispatcher &optional disabled checked +Adds a submenu anchored to a parent menu and returns the corresponding +menu item. The optional @code{checked} and @code{disabled} arguments can +be used to set the menu item's initial state. @end deffn
@deffn GenericFunction cancel-widget self
Modified: trunk/src/uitoolkit/widgets/menu-language.lisp ============================================================================== --- trunk/src/uitoolkit/widgets/menu-language.lisp (original) +++ trunk/src/uitoolkit/widgets/menu-language.lisp Mon Jul 3 12:31:37 2006 @@ -196,21 +196,16 @@ (push m (menu-stack-of gen))))
(defmethod define-item ((gen win32-menu-generator) label dispatcher disabled checked image) - (let* ((owner (first (menu-stack-of gen))) - (item (append-item owner label image dispatcher))) - (enable item (not disabled)) - (check item checked))) + (append-item (first (menu-stack-of gen)) label image dispatcher disabled checked))
(defmethod define-separator ((gen win32-menu-generator)) (let ((owner (first (menu-stack-of gen)))) (append-separator owner)))
(defmethod define-submenu ((gen win32-menu-generator) label dispatcher disabled) - (let* ((submenu (make-instance 'menu :handle (gfs::create-popup-menu))) - (parent (first (menu-stack-of gen))) - (item (append-submenu parent label submenu dispatcher))) - (push submenu (menu-stack-of gen)) - (enable item (not disabled)))) + (let ((submenu (make-instance 'menu :handle (gfs::create-popup-menu)))) + (append-submenu (first (menu-stack-of gen)) label submenu dispatcher disabled) + (push submenu (menu-stack-of gen))))
(defmethod complete-submenu ((gen win32-menu-generator)) (pop (menu-stack-of gen)))
Modified: trunk/src/uitoolkit/widgets/menu.lisp ============================================================================== --- trunk/src/uitoolkit/widgets/menu.lisp (original) +++ trunk/src/uitoolkit/widgets/menu.lisp Mon Jul 3 12:31:37 2006 @@ -37,8 +37,14 @@ ;;; helper functions ;;;
-(defun insert-menuitem (hmenu mid label hbmp) - (cffi:with-foreign-string (str-ptr label) +(defun insert-menuitem (hmenu mid label hbmp hchildmenu disabled checked) + (declare (ignore hbmp)) ; FIXME: ignore hbmp until we support images in menu items + (let ((info-mask (logior gfs::+miim-id+ + (if label (logior gfs::+miim-state+ gfs::+miim-string+) gfs::+miim-ftype+) + (if hchildmenu gfs::+miim-submenu+))) + (info-type (if label 0 gfs::+mft-separator+)) + (info-state (logior (if checked gfs::+mfs-checked+ 0) + (if disabled gfs::+mfs-disabled+ 0)))) (cffi:with-foreign-object (mii-ptr 'gfs::menuiteminfo) (cffi:with-foreign-slots ((gfs::cbsize gfs::mask gfs::type gfs::state gfs::id gfs::hsubmenu @@ -46,69 +52,23 @@ gfs::idata gfs::tdata gfs::cch gfs::hbmpitem) mii-ptr gfs::menuiteminfo) - (setf gfs::cbsize (cffi:foreign-type-size 'gfs::menuiteminfo)) - (setf gfs::mask (logior gfs::+miim-id+ gfs::+miim-string+)) - (setf gfs::type 0) - (setf gfs::state 0) - (setf gfs::id mid) - (setf gfs::hsubmenu (cffi:null-pointer)) - (setf gfs::hbmpchecked (cffi:null-pointer)) - (setf gfs::hbmpunchecked (cffi:null-pointer)) - (setf gfs::idata 0) - (setf gfs::tdata str-ptr) - (setf gfs::cch (length label)) - (setf gfs::hbmpitem hbmp)) - (if (zerop (gfs::insert-menu-item hmenu #x7FFFFFFF 1 mii-ptr)) - (error 'gfs::win32-error :detail "insert-menu-item failed"))))) - -(defun insert-submenu (hparent mid label hbmp hchildmenu) - (cffi:with-foreign-string (str-ptr label) - (cffi:with-foreign-object (mii-ptr 'gfs::menuiteminfo) - (cffi:with-foreign-slots ((gfs::cbsize gfs::mask gfs::type - gfs::state gfs::id gfs::hsubmenu - gfs::hbmpchecked gfs::hbmpunchecked - gfs::idata gfs::tdata gfs::cch - gfs::hbmpitem) - mii-ptr gfs::menuiteminfo) - (setf gfs::cbsize (cffi:foreign-type-size 'gfs::menuiteminfo)) - (setf gfs::mask (logior gfs::+miim-id+ - gfs::+miim-string+ - gfs::+miim-submenu+)) - (setf gfs::type 0) - (setf gfs::state 0) - (setf gfs::id mid) - (setf gfs::hsubmenu hchildmenu) - (setf gfs::hbmpchecked (cffi:null-pointer)) - (setf gfs::hbmpunchecked (cffi:null-pointer)) - (setf gfs::idata 0) - (setf gfs::tdata str-ptr) - (setf gfs::cch (length label)) - (setf gfs::hbmpitem hbmp)) - (if (zerop (gfs::insert-menu-item hparent #x7FFFFFFF 1 mii-ptr)) - (error 'gfs::win32-error :detail "insert-menu-item failed"))))) - -(defun insert-separator (hmenu mid) - (cffi:with-foreign-object (mii-ptr 'gfs::menuiteminfo) - (cffi:with-foreign-slots ((gfs::cbsize gfs::mask gfs::type - gfs::state gfs::id gfs::hsubmenu - gfs::hbmpchecked gfs::hbmpunchecked - gfs::idata gfs::tdata gfs::cch - gfs::hbmpitem) - mii-ptr gfs::menuiteminfo) - (setf gfs::cbsize (cffi:foreign-type-size 'gfs::menuiteminfo)) - (setf gfs::mask (logior gfs::+miim-id+ gfs::+miim-ftype+)) - (setf gfs::type gfs::+mft-separator+) - (setf gfs::state 0) - (setf gfs::id mid) - (setf gfs::hsubmenu (cffi:null-pointer)) - (setf gfs::hbmpchecked (cffi:null-pointer)) - (setf gfs::hbmpunchecked (cffi:null-pointer)) - (setf gfs::idata 0) - (setf gfs::tdata (cffi:null-pointer)) - (setf gfs::cch 0) - (setf gfs::hbmpitem (cffi:null-pointer))) - (if (zerop (gfs::insert-menu-item hmenu #x7FFFFFFF 1 mii-ptr)) - (error 'gfs::win32-error :detail "insert-menu-item failed")))) + (setf gfs::cbsize (cffi:foreign-type-size 'gfs::menuiteminfo) + gfs::mask info-mask + gfs::type info-type + gfs::state info-state + gfs::id mid + gfs::hsubmenu hchildmenu + gfs::hbmpchecked (cffi:null-pointer) + gfs::hbmpunchecked (cffi:null-pointer) + gfs::idata 0 + gfs::tdata (cffi:null-pointer)) + (if label + (cffi:with-foreign-string (str-ptr label) + (setf gfs::tdata str-ptr) + (if (zerop (gfs::insert-menu-item hmenu #x7FFFFFFF 1 mii-ptr)) + (error 'gfs::win32-error :detail "insert-menu-item failed"))) + (if (zerop (gfs::insert-menu-item hmenu #x7FFFFFFF 1 mii-ptr)) + (error 'gfs::win32-error :detail "insert-menu-item failed")))))))
(defun sub-menu (m index) (if (gfs:disposed-p m) @@ -130,13 +90,13 @@ ;;; methods ;;;
-(defmethod append-item ((owner menu) text image disp) +(defmethod append-item ((owner menu) text image disp &optional disabled checked) (declare (ignore image)) ; FIXME: temporary measure until we support images in menu items (let* ((tc (thread-context)) (id (increment-menuitem-id tc)) (hmenu (gfs:handle owner)) (item (create-menuitem-with-callback hmenu disp))) - (insert-menuitem hmenu id text (cffi:null-pointer)) + (insert-menuitem hmenu id text (cffi:null-pointer) (cffi:null-pointer) disabled checked) (setf (item-id item) id) (put-menuitem tc item) (vector-push-extend item (items owner)) @@ -149,13 +109,13 @@ (id (increment-menuitem-id tc)) (howner (gfs:handle owner)) (item (make-instance 'menu-item :handle howner))) - (insert-separator howner id) + (insert-menuitem howner id nil (cffi:null-pointer) (cffi:null-pointer) nil nil) (setf (item-id item) id) (put-menuitem tc item) (vector-push-extend item (items owner)) item))
-(defmethod append-submenu ((parent menu) text (submenu menu) disp) +(defmethod append-submenu ((parent menu) text (submenu menu) disp &optional disabled checked) (if (or (gfs:disposed-p parent) (gfs:disposed-p submenu)) (error 'gfs:disposed-error)) (let* ((tc (thread-context)) @@ -163,7 +123,7 @@ (hparent (gfs:handle parent)) (hmenu (gfs:handle submenu)) (item (make-instance 'menu-item :handle hparent))) - (insert-submenu hparent id text (cffi:null-pointer) hmenu) + (insert-menuitem hparent id text (cffi:null-pointer) hmenu disabled checked) (setf (item-id item) id) (put-menuitem tc item) (vector-push-extend item (items parent))
Modified: trunk/src/uitoolkit/widgets/widget-generics.lisp ============================================================================== --- trunk/src/uitoolkit/widgets/widget-generics.lisp (original) +++ trunk/src/uitoolkit/widgets/widget-generics.lisp Mon Jul 3 12:31:37 2006 @@ -45,13 +45,13 @@ (defgeneric ancestor-p (ancestor descendant) (:documentation "Returns T if ancestor is an ancestor of descendant; nil otherwise."))
-(defgeneric append-item (self text image dispatcher) +(defgeneric append-item (self text image dispatcher &optional checked disabled) (:documentation "Adds the new item with the specified text to the object, and returns the newly-created item."))
(defgeneric append-separator (self) (:documentation "Add a separator item to the object, and returns the newly-created item."))
-(defgeneric append-submenu (self text submenu dispatcher) +(defgeneric append-submenu (self text submenu dispatcher &optional checked disabled) (:documentation "Adds a submenu anchored to a parent menu and returns the corresponding item."))
(defgeneric border-width (self)
Modified: trunk/src/uitoolkit/widgets/widget-with-items.lisp ============================================================================== --- trunk/src/uitoolkit/widgets/widget-with-items.lisp (original) +++ trunk/src/uitoolkit/widgets/widget-with-items.lisp Mon Jul 3 12:31:37 2006 @@ -33,8 +33,8 @@
(in-package :graphic-forms.uitoolkit.widgets)
-(defmethod append-item :before ((w widget-with-items) text (image gfg:image) (disp event-dispatcher)) - (declare (ignore text image disp)) +(defmethod append-item :before ((w widget-with-items) text (image gfg:image) (disp event-dispatcher) &optional checked disabled) + (declare (ignore text image disp checked disabled)) (if (gfs:disposed-p w) (error 'gfs:disposed-error)))
graphic-forms-cvs@common-lisp.net