Hello,
I noticed that a text-field created with an explicit :width option
nevertheless had a width calculated from its initial contents. Fixed
by the attached patch, which also introduces a fast path for the
common case of no user-supplied options.
There's still work to be done in the layout code, e.g. the following
code creates a frame 100px wide (I'd expect 500):
(define-application-frame textedit-frame () ()
(:panes (edit :text-field :value "edit" :width 500))
(:layouts (:default
(vertically (:min-width 1 :width 100 :max-width +fill+)
edit))))
Nevertheless, it's better than what's there currently, so I'll commit
it shortly if there are no objections.
Cheers,
Rudi
Index: panes.lisp
===================================================================
RCS file: /project/mcclim/cvsroot/mcclim/panes.lisp,v
retrieving revision 1.155
diff -u -r1.155 panes.lisp
--- panes.lisp 29 Aug 2005 22:39:31 -0000 1.155
+++ panes.lisp 24 Sep 2005 12:37:08 -0000
@@ -538,63 +538,48 @@
(defun merge-one-option
(pane foo user-foo user-min-foo user-max-foo min-foo max-foo)
-
+ ;; Some of the hair in the code below is because the user-supplied
+ ;; values need not be given in device units
- ;; NOTE: The defaulting for :min-foo and :max-foo is different
from MAKE-SPACE-REQUIREMENT.
- ;; MAKE-SPACE-REQUIREMENT has kind of &key foo (min-foo 0)
(max-foo +fill+)
- ;; While user space requirements has &key foo (min-foo foo)
(max-foo foo).
- ;; I as a user would pretty much expect the same behavior,
therefore I'll take the
- ;; following route:
- ;; When the :foo option is given, I'll let MAKE-SPACE-
REQUIREMENT decide.
- ;;
- ;; old code:
- ;;
- ;; ;; Then we resolve defaulting. sec 29.3.1 says:
- ;; ;; | If either of the :max-width or :min-width options is not
- ;; ;; | supplied, it defaults to the value of the :width option. If
- ;; ;; | either of the :max-height or :min-height options is not
- ;; ;; | supplied, it defaults to the value of the :height option.
- ;; (setf user-max-foo (or user-max-foo user-foo)
- ;; user-min-foo (or user-min-foo user-foo))
- ;; --GB 2003-01-23
+ (cond
+ ((not (or user-min-foo user-max-foo user-foo))
+ ;; fast path
+ (values foo min-foo max-foo))
+ (t
+ ;; sec 29.3.1 says:
+ ;; | If either of the :max-width or :min-width options is not
+ ;; | supplied, it defaults to the value of the :width option. If
+ ;; | either of the :max-height or :min-height options is not
+ ;; | supplied, it defaults to the value of the :height option.
+ (setf user-min-foo (or user-min-foo user-foo min-foo)
+ user-max-foo (or user-max-foo user-foo max-foo))
- (when (and (null user-max-foo) (not (null user-foo)))
- (setf user-max-foo (space-requirement-max-width
- (make-space-requirement
- :width (spacing-value-to-device-units pane foo)))))
- (when (and (null user-min-foo) (not (null user-foo)))
- (setf user-min-foo (space-requirement-min-width
- (make-space-requirement
- :width (spacing-value-to-device-units pane foo)))))
-
- ;; when the user has no idea about the preferred size just take the
- ;; panes preferred size.
- (setf user-foo (or user-foo foo))
- (setf user-foo (spacing-value-to-device-units pane user-foo))
+ ;; when the user has no idea about the preferred size just take
+ ;; the panes preferred size.
+ (setf user-foo (or user-foo foo))
+ (setf user-foo (spacing-value-to-device-units pane user-foo))
- ;; dito for min/max
- (setf user-min-foo (or user-min-foo min-foo)
- user-max-foo (or user-max-foo max-foo))
-
- ;; | :max-width, :min-width, :max-height, and :min-height can
- ;; | also be specified as a relative size by supplying a list of
- ;; | the form (number :relative). In this case, the number
- ;; | indicates the number of device units that the pane is
- ;; | willing to stretch or shrink.
- (labels ((resolve-relative (dimension sign base)
- (if (and (consp dimension) (eq (car dimension) :relative))
- (+ base (* sign (cadr dimension)))
- (spacing-value-to-device-units pane dimension))))
- (setf user-min-foo (and user-min-foo
- (resolve-relative user-min-foo -1 user-foo))
- user-max-foo (and user-max-foo
- (resolve-relative user-max-foo +1 user-foo))))
-
- ;; Now we have two space requirements which need to be 'merged'.
- (setf min-foo (clamp user-min-foo min-foo max-foo)
- max-foo (clamp user-max-foo min-foo max-foo)
- foo (clamp user-foo min-foo max-foo))
- (values foo min-foo max-foo))
+ ;; | :max-width, :min-width, :max-height, and :min-height can
+ ;; | also be specified as a relative size by supplying a list of
+ ;; | the form (number :relative). In this case, the number
+ ;; | indicates the number of device units that the pane is
+ ;; | willing to stretch or shrink.
+ (labels ((resolve-relative (dimension sign base)
+ (if (and (consp dimension) (eq (car
dimension) :relative))
+ (+ base (* sign (cadr dimension)))
+ (spacing-value-to-device-units pane dimension))))
+ (setf user-min-foo (resolve-relative user-min-foo -1 user-foo)
+ user-max-foo (resolve-relative user-max-foo +1 user-
foo)))
+
+ ;; again, user options take precedence
+ (setf min-foo (min min-foo user-min-foo)
+ max-foo (max max-foo user-max-foo))
+
+ ;; Now we have two space requirements which need to be 'merged'.
+ (setf min-foo (clamp user-min-foo min-foo max-foo)
+ max-foo (clamp user-max-foo min-foo max-foo)
+ foo (clamp user-foo min-foo max-foo))
+ (values foo min-foo max-foo))))
(defmethod merge-user-specified-options ((pane space-requirement-
options-mixin)
sr)