The Trunk: Morphic-mt.1643.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Morphic-mt.1643.mcz

commits-2
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1643.mcz

==================== Summary ====================

Name: Morphic-mt.1643
Author: mt
Time: 4 April 2020, 11:06:42.760864 am
UUID: 81efe0e9-ec69-1b45-ba8e-b81bbb649355
Ancestors: Morphic-mt.1642

Fixes the recently discovered layout bug. Thanks to Christoph (ct)!

=============== Diff against Morphic-mt.1642 ===============

Item was changed:
  ----- Method: TableLayout>>computeExtraSpacing:in:horizontal:target: (in category 'layout') -----
  computeExtraSpacing: arrangement in: newBounds horizontal: aBool target: aMorph
  "Compute the required extra spacing for laying out the cells"
 
  "match newBounds extent with arrangement's orientation"
 
  | extent extra centering n extraPerCell cell last hFill vFill max amount allow |
  extent := newBounds extent.
  aBool ifFalse: [extent := extent transposed].
 
  "figure out if we have any horizontal or vertical space fillers"
  hFill := vFill := false.
  max := 0 @ 0.
  arrangement do:
  [:c |
  max := (max x max: c cellSize x) @ (max y + c cellSize y).
  max := max max: c cellSize.
  hFill := hFill or: [c hSpaceFill].
  vFill := vFill or: [c vSpaceFill]].
 
  "Take client's shrink wrap constraints into account.
  Note: these are only honored when there are no #spaceFill children,
  or when #rubberBandCells is set."
  allow := properties rubberBandCells not.
  aMorph hResizing == #shrinkWrap
  ifTrue:
  [aBool
  ifTrue: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
  ifFalse: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
  aMorph vResizing == #shrinkWrap
  ifTrue:
  [aBool
  ifFalse: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
  ifTrue: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
 
  "Now compute the extra v space"
  extra := extent y
  - (arrangement inject: 0 into: [:sum :c | sum + c cellSize y]).
  extra > 0
  ifTrue:
  ["Check if we have any #spaceFillers"
 
  vFill
  ifTrue:
  ["use only #spaceFillers"
 
  n := arrangement inject: 0
  into: [:sum :c | c vSpaceFill ifTrue: [sum + 1] ifFalse: [sum]].
  n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
  extra := last := 0.
  arrangement do:
  [:c |
  c vSpaceFill
  ifTrue:
  [extra := (last := extra) + extraPerCell.
  amount := 0 @ (extra truncated - last truncated).
  c do: [:cc | cc cellSize: cc cellSize + amount]]]]
  ifFalse:
  ["no #spaceFillers; distribute regularly"
 
  centering := properties wrapCentering.
  "centering == #topLeft ifTrue:[]." "add all extra space to the last cell; e.g., do nothing"
  centering == #bottomRight
  ifTrue:
  ["add all extra space to the first cell"
 
+ arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]].
- arrangement first addExtraSpace: 0 @ extra].
  centering == #center
  ifTrue:
  ["add 1/2 extra space to the first and last cell"
 
+ arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ (extra // 2)]].
- arrangement first addExtraSpace: 0 @ (extra // 2)].
  centering == #justified
  ifTrue:
  ["add extra space equally distributed to each cell"
 
  n := arrangement size - 1 max: 1.
  extraPerCell := extra asFloat / n asFloat.
  extra := last := 0.
  arrangement do:
  [:c |
  c addExtraSpace: 0 @ (extra truncated - last truncated).
  extra := (last := extra) + extraPerCell]]]].
 
  "Now compute the extra space for the primary direction"
  centering := properties listCentering.
  1 to: arrangement size
  do:
  [:i |
  cell := arrangement at: i.
  extra := extent x - cell cellSize x.
  extra > 0
  ifTrue:
  ["Check if we have any #spaceFillers"
  cell := cell nextCell.
  cell hSpaceFill
  ifTrue:
  ["use only #spaceFillers"
 
 
  n := cell inject: 0
  into: [:sum :c | c hSpaceFill ifTrue: [sum + c target spaceFillWeight] ifFalse: [sum]].
  n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
  extra := last := 0.
  cell do:
  [:c |
  c hSpaceFill
  ifTrue:
  [extra := (last := extra) + (extraPerCell * c target spaceFillWeight).
  amount := extra truncated - last truncated.
  c cellSize: c cellSize + (amount @ 0)]]]
  ifFalse:
  ["no #spaceFiller; distribute regularly"
 
 
  "centering == #topLeft ifTrue:[]" "add all extra space to the last cell; e.g., do nothing"
  centering == #bottomRight
  ifTrue:
  ["add all extra space to the first cell"
 
  cell addExtraSpace: extra @ 0].
  centering == #center
  ifTrue:
  ["add 1/2 extra space to the first and last cell"
 
  cell addExtraSpace: (extra // 2) @ 0].
  centering == #justified
  ifTrue:
  ["add extra space equally distributed to each cell"
 
  n := cell size - 1 max: 1.
  extraPerCell := extra asFloat / n asFloat.
  extra := last := 0.
  cell do:
  [:c |
  c addExtraSpace: (extra truncated - last truncated) @ 0.
  extra := (last := extra) + extraPerCell]]]]]!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.1643.mcz

Jakob Reschke
Whoa that method is long...

Am Sa., 4. Apr. 2020 um 11:06 Uhr schrieb <[hidden email]>:

>
> Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
> http://source.squeak.org/trunk/Morphic-mt.1643.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-mt.1643
> Author: mt
> Time: 4 April 2020, 11:06:42.760864 am
> UUID: 81efe0e9-ec69-1b45-ba8e-b81bbb649355
> Ancestors: Morphic-mt.1642
>
> Fixes the recently discovered layout bug. Thanks to Christoph (ct)!
>
> =============== Diff against Morphic-mt.1642 ===============
>
> Item was changed:
>   ----- Method: TableLayout>>computeExtraSpacing:in:horizontal:target: (in category 'layout') -----
>   computeExtraSpacing: arrangement in: newBounds horizontal: aBool target: aMorph
>         "Compute the required extra spacing for laying out the cells"
>
>         "match newBounds extent with arrangement's orientation"
>
>         | extent extra centering n extraPerCell cell last hFill vFill max amount allow |
>         extent := newBounds extent.
>         aBool ifFalse: [extent := extent transposed].
>
>         "figure out if we have any horizontal or vertical space fillers"
>         hFill := vFill := false.
>         max := 0 @ 0.
>         arrangement do:
>                         [:c |
>                         max := (max x max: c cellSize x) @ (max y + c cellSize y).
>                         max := max max: c cellSize.
>                         hFill := hFill or: [c hSpaceFill].
>                         vFill := vFill or: [c vSpaceFill]].
>
>         "Take client's shrink wrap constraints into account.
>         Note: these are only honored when there are no #spaceFill children,
>         or when #rubberBandCells is set."
>         allow := properties rubberBandCells not.
>         aMorph hResizing == #shrinkWrap
>                 ifTrue:
>                         [aBool
>                                 ifTrue: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
>                                 ifFalse: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
>         aMorph vResizing == #shrinkWrap
>                 ifTrue:
>                         [aBool
>                                 ifFalse: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
>                                 ifTrue: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
>
>         "Now compute the extra v space"
>         extra := extent y
>                                 - (arrangement inject: 0 into: [:sum :c | sum + c cellSize y]).
>         extra > 0
>                 ifTrue:
>                         ["Check if we have any #spaceFillers"
>
>                         vFill
>                                 ifTrue:
>                                         ["use only #spaceFillers"
>
>                                         n := arrangement inject: 0
>                                                                 into: [:sum :c | c vSpaceFill ifTrue: [sum + 1] ifFalse: [sum]].
>                                         n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
>                                         extra := last := 0.
>                                         arrangement do:
>                                                         [:c |
>                                                         c vSpaceFill
>                                                                 ifTrue:
>                                                                         [extra := (last := extra) + extraPerCell.
>                                                                         amount := 0 @ (extra truncated - last truncated).
>                                                                         c do: [:cc | cc cellSize: cc cellSize + amount]]]]
>                                 ifFalse:
>                                         ["no #spaceFillers; distribute regularly"
>
>                                         centering := properties wrapCentering.
>                                         "centering == #topLeft ifTrue:[]."      "add all extra space to the last cell; e.g., do nothing"
>                                         centering == #bottomRight
>                                                 ifTrue:
>                                                         ["add all extra space to the first cell"
>
> +                                                       arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]].
> -                                                       arrangement first addExtraSpace: 0 @ extra].
>                                         centering == #center
>                                                 ifTrue:
>                                                         ["add 1/2 extra space to the first and last cell"
>
> +                                                       arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ (extra // 2)]].
> -                                                       arrangement first addExtraSpace: 0 @ (extra // 2)].
>                                         centering == #justified
>                                                 ifTrue:
>                                                         ["add extra space equally distributed to each cell"
>
>                                                         n := arrangement size - 1 max: 1.
>                                                         extraPerCell := extra asFloat / n asFloat.
>                                                         extra := last := 0.
>                                                         arrangement do:
>                                                                         [:c |
>                                                                         c addExtraSpace: 0 @ (extra truncated - last truncated).
>                                                                         extra := (last := extra) + extraPerCell]]]].
>
>         "Now compute the extra space for the primary direction"
>         centering := properties listCentering.
>         1 to: arrangement size
>                 do:
>                         [:i |
>                         cell := arrangement at: i.
>                         extra := extent x - cell cellSize x.
>                         extra > 0
>                                 ifTrue:
>                                         ["Check if we have any #spaceFillers"
>                                         cell := cell nextCell.
>                                         cell hSpaceFill
>                                                 ifTrue:
>                                                         ["use only #spaceFillers"
>
>
>                                                         n := cell inject: 0
>                                                                                 into: [:sum :c | c hSpaceFill ifTrue: [sum + c target spaceFillWeight] ifFalse: [sum]].
>                                                         n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
>                                                         extra := last := 0.
>                                                         cell do:
>                                                                         [:c |
>                                                                         c hSpaceFill
>                                                                                 ifTrue:
>                                                                                         [extra := (last := extra) + (extraPerCell * c target spaceFillWeight).
>                                                                                         amount := extra truncated - last truncated.
>                                                                                         c cellSize: c cellSize + (amount @ 0)]]]
>                                                 ifFalse:
>                                                         ["no #spaceFiller; distribute regularly"
>
>
>                                                         "centering == #topLeft ifTrue:[]"       "add all extra space to the last cell; e.g., do nothing"
>                                                         centering == #bottomRight
>                                                                 ifTrue:
>                                                                         ["add all extra space to the first cell"
>
>                                                                         cell addExtraSpace: extra @ 0].
>                                                         centering == #center
>                                                                 ifTrue:
>                                                                         ["add 1/2 extra space to the first and last cell"
>
>                                                                         cell addExtraSpace: (extra // 2) @ 0].
>                                                         centering == #justified
>                                                                 ifTrue:
>                                                                         ["add extra space equally distributed to each cell"
>
>                                                                         n := cell size - 1 max: 1.
>                                                                         extraPerCell := extra asFloat / n asFloat.
>                                                                         extra := last := 0.
>                                                                         cell do:
>                                                                                         [:c |
>                                                                                         c addExtraSpace: (extra truncated - last truncated) @ 0.
>                                                                                         extra := (last := extra) + extraPerCell]]]]]!
>
>


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.1643.mcz

marcel.taeumel
Whoa that method is long...

That layout code reads quite nicely. I got in touch with it last fall. It's heavy on the "math side", so it is a pleasure to have all intermediate results named as temps. This is one of the gifts Andreas has left us. And a perfect example of how temps can make life easier. I wouldn't change it just for sake of its length. :-)

Best,
Marcel

Am 04.04.2020 16:38:05 schrieb Jakob Reschke <[hidden email]>:

Whoa that method is long...

Am Sa., 4. Apr. 2020 um 11:06 Uhr schrieb :
>
> Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
> http://source.squeak.org/trunk/Morphic-mt.1643.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-mt.1643
> Author: mt
> Time: 4 April 2020, 11:06:42.760864 am
> UUID: 81efe0e9-ec69-1b45-ba8e-b81bbb649355
> Ancestors: Morphic-mt.1642
>
> Fixes the recently discovered layout bug. Thanks to Christoph (ct)!
>
> =============== Diff against Morphic-mt.1642 ===============
>
> Item was changed:
> ----- Method: TableLayout>>computeExtraSpacing:in:horizontal:target: (in category 'layout') -----
> computeExtraSpacing: arrangement in: newBounds horizontal: aBool target: aMorph
> "Compute the required extra spacing for laying out the cells"
>
> "match newBounds extent with arrangement's orientation"
>
> | extent extra centering n extraPerCell cell last hFill vFill max amount allow |
> extent := newBounds extent.
> aBool ifFalse: [extent := extent transposed].
>
> "figure out if we have any horizontal or vertical space fillers"
> hFill := vFill := false.
> max := 0 @ 0.
> arrangement do:
> [:c |
> max := (max x max: c cellSize x) @ (max y + c cellSize y).
> max := max max: c cellSize.
> hFill := hFill or: [c hSpaceFill].
> vFill := vFill or: [c vSpaceFill]].
>
> "Take client's shrink wrap constraints into account.
> Note: these are only honored when there are no #spaceFill children,
> or when #rubberBandCells is set."
> allow := properties rubberBandCells not.
> aMorph hResizing == #shrinkWrap
> ifTrue:
> [aBool
> ifTrue: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
> ifFalse: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
> aMorph vResizing == #shrinkWrap
> ifTrue:
> [aBool
> ifFalse: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
> ifTrue: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
>
> "Now compute the extra v space"
> extra := extent y
> - (arrangement inject: 0 into: [:sum :c | sum + c cellSize y]).
> extra > 0
> ifTrue:
> ["Check if we have any #spaceFillers"
>
> vFill
> ifTrue:
> ["use only #spaceFillers"
>
> n := arrangement inject: 0
> into: [:sum :c | c vSpaceFill ifTrue: [sum + 1] ifFalse: [sum]].
> n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
> extra := last := 0.
> arrangement do:
> [:c |
> c vSpaceFill
> ifTrue:
> [extra := (last := extra) + extraPerCell.
> amount := 0 @ (extra truncated - last truncated).
> c do: [:cc | cc cellSize: cc cellSize + amount]]]]
> ifFalse:
> ["no #spaceFillers; distribute regularly"
>
> centering := properties wrapCentering.
> "centering == #topLeft ifTrue:[]." "add all extra space to the last cell; e.g., do nothing"
> centering == #bottomRight
> ifTrue:
> ["add all extra space to the first cell"
>
> + arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]].
> - arrangement first addExtraSpace: 0 @ extra].
> centering == #center
> ifTrue:
> ["add 1/2 extra space to the first and last cell"
>
> + arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ (extra // 2)]].
> - arrangement first addExtraSpace: 0 @ (extra // 2)].
> centering == #justified
> ifTrue:
> ["add extra space equally distributed to each cell"
>
> n := arrangement size - 1 max: 1.
> extraPerCell := extra asFloat / n asFloat.
> extra := last := 0.
> arrangement do:
> [:c |
> c addExtraSpace: 0 @ (extra truncated - last truncated).
> extra := (last := extra) + extraPerCell]]]].
>
> "Now compute the extra space for the primary direction"
> centering := properties listCentering.
> 1 to: arrangement size
> do:
> [:i |
> cell := arrangement at: i.
> extra := extent x - cell cellSize x.
> extra > 0
> ifTrue:
> ["Check if we have any #spaceFillers"
> cell := cell nextCell.
> cell hSpaceFill
> ifTrue:
> ["use only #spaceFillers"
>
>
> n := cell inject: 0
> into: [:sum :c | c hSpaceFill ifTrue: [sum + c target spaceFillWeight] ifFalse: [sum]].
> n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
> extra := last := 0.
> cell do:
> [:c |
> c hSpaceFill
> ifTrue:
> [extra := (last := extra) + (extraPerCell * c target spaceFillWeight).
> amount := extra truncated - last truncated.
> c cellSize: c cellSize + (amount @ 0)]]]
> ifFalse:
> ["no #spaceFiller; distribute regularly"
>
>
> "centering == #topLeft ifTrue:[]" "add all extra space to the last cell; e.g., do nothing"
> centering == #bottomRight
> ifTrue:
> ["add all extra space to the first cell"
>
> cell addExtraSpace: extra @ 0].
> centering == #center
> ifTrue:
> ["add 1/2 extra space to the first and last cell"
>
> cell addExtraSpace: (extra // 2) @ 0].
> centering == #justified
> ifTrue:
> ["add extra space equally distributed to each cell"
>
> n := cell size - 1 max: 1.
> extraPerCell := extra asFloat / n asFloat.
> extra := last := 0.
> cell do:
> [:c |
> c addExtraSpace: (extra truncated - last truncated) @ 0.
> extra := (last := extra) + extraPerCell]]]]]!
>
>




Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.1643.mcz

Levente Uzonyi
In reply to this post by commits-2
Hi Marcel,

Wouldn't it be better to skip the extra variable?

  arrangement ifNotEmpty: [arrangement first addExtraSpace: 0 @ extra]

vs

  arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]


Levente

On Sat, 4 Apr 2020, [hidden email] wrote:

> Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
> http://source.squeak.org/trunk/Morphic-mt.1643.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-mt.1643
> Author: mt
> Time: 4 April 2020, 11:06:42.760864 am
> UUID: 81efe0e9-ec69-1b45-ba8e-b81bbb649355
> Ancestors: Morphic-mt.1642
>
> Fixes the recently discovered layout bug. Thanks to Christoph (ct)!
>
> =============== Diff against Morphic-mt.1642 ===============
>
> Item was changed:
>  ----- Method: TableLayout>>computeExtraSpacing:in:horizontal:target: (in category 'layout') -----
>  computeExtraSpacing: arrangement in: newBounds horizontal: aBool target: aMorph
>   "Compute the required extra spacing for laying out the cells"
>
>   "match newBounds extent with arrangement's orientation"
>
>   | extent extra centering n extraPerCell cell last hFill vFill max amount allow |
>   extent := newBounds extent.
>   aBool ifFalse: [extent := extent transposed].
>
>   "figure out if we have any horizontal or vertical space fillers"
>   hFill := vFill := false.
>   max := 0 @ 0.
>   arrangement do:
>   [:c |
>   max := (max x max: c cellSize x) @ (max y + c cellSize y).
>   max := max max: c cellSize.
>   hFill := hFill or: [c hSpaceFill].
>   vFill := vFill or: [c vSpaceFill]].
>
>   "Take client's shrink wrap constraints into account.
>   Note: these are only honored when there are no #spaceFill children,
>   or when #rubberBandCells is set."
>   allow := properties rubberBandCells not.
>   aMorph hResizing == #shrinkWrap
>   ifTrue:
>   [aBool
>   ifTrue: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
>   ifFalse: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
>   aMorph vResizing == #shrinkWrap
>   ifTrue:
>   [aBool
>   ifFalse: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
>   ifTrue: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
>
>   "Now compute the extra v space"
>   extra := extent y
>   - (arrangement inject: 0 into: [:sum :c | sum + c cellSize y]).
>   extra > 0
>   ifTrue:
>   ["Check if we have any #spaceFillers"
>
>   vFill
>   ifTrue:
>   ["use only #spaceFillers"
>
>   n := arrangement inject: 0
>   into: [:sum :c | c vSpaceFill ifTrue: [sum + 1] ifFalse: [sum]].
>   n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
>   extra := last := 0.
>   arrangement do:
>   [:c |
>   c vSpaceFill
>   ifTrue:
>   [extra := (last := extra) + extraPerCell.
>   amount := 0 @ (extra truncated - last truncated).
>   c do: [:cc | cc cellSize: cc cellSize + amount]]]]
>   ifFalse:
>   ["no #spaceFillers; distribute regularly"
>
>   centering := properties wrapCentering.
>   "centering == #topLeft ifTrue:[]." "add all extra space to the last cell; e.g., do nothing"
>   centering == #bottomRight
>   ifTrue:
>   ["add all extra space to the first cell"
>
> + arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]].
> - arrangement first addExtraSpace: 0 @ extra].
>   centering == #center
>   ifTrue:
>   ["add 1/2 extra space to the first and last cell"
>
> + arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ (extra // 2)]].
> - arrangement first addExtraSpace: 0 @ (extra // 2)].
>   centering == #justified
>   ifTrue:
>   ["add extra space equally distributed to each cell"
>
>   n := arrangement size - 1 max: 1.
>   extraPerCell := extra asFloat / n asFloat.
>   extra := last := 0.
>   arrangement do:
>   [:c |
>   c addExtraSpace: 0 @ (extra truncated - last truncated).
>   extra := (last := extra) + extraPerCell]]]].
>
>   "Now compute the extra space for the primary direction"
>   centering := properties listCentering.
>   1 to: arrangement size
>   do:
>   [:i |
>   cell := arrangement at: i.
>   extra := extent x - cell cellSize x.
>   extra > 0
>   ifTrue:
>   ["Check if we have any #spaceFillers"
>   cell := cell nextCell.
>   cell hSpaceFill
>   ifTrue:
>   ["use only #spaceFillers"
>
>
>   n := cell inject: 0
>   into: [:sum :c | c hSpaceFill ifTrue: [sum + c target spaceFillWeight] ifFalse: [sum]].
>   n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
>   extra := last := 0.
>   cell do:
>   [:c |
>   c hSpaceFill
>   ifTrue:
>   [extra := (last := extra) + (extraPerCell * c target spaceFillWeight).
>   amount := extra truncated - last truncated.
>   c cellSize: c cellSize + (amount @ 0)]]]
>   ifFalse:
>   ["no #spaceFiller; distribute regularly"
>
>
>   "centering == #topLeft ifTrue:[]" "add all extra space to the last cell; e.g., do nothing"
>   centering == #bottomRight
>   ifTrue:
>   ["add all extra space to the first cell"
>
>   cell addExtraSpace: extra @ 0].
>   centering == #center
>   ifTrue:
>   ["add 1/2 extra space to the first and last cell"
>
>   cell addExtraSpace: (extra // 2) @ 0].
>   centering == #justified
>   ifTrue:
>   ["add extra space equally distributed to each cell"
>
>   n := cell size - 1 max: 1.
>   extraPerCell := extra asFloat / n asFloat.
>   extra := last := 0.
>   cell do:
>   [:c |
>   c addExtraSpace: (extra truncated - last truncated) @ 0.
>   extra := (last := extra) + extraPerCell]]]]]!

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: Morphic-mt.1643.mcz

marcel.taeumel
Hi Levente.

> Wouldn't it be better to skip the extra variable?

Yes, that's right. :-) Thanks.

Best,
Marcel

Am 05.04.2020 07:18:32 schrieb Levente Uzonyi <[hidden email]>:

Hi Marcel,

Wouldn't it be better to skip the extra variable?

arrangement ifNotEmpty: [arrangement first addExtraSpace: 0 @ extra]

vs

arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]


Levente

On Sat, 4 Apr 2020, [hidden email] wrote:

> Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
> http://source.squeak.org/trunk/Morphic-mt.1643.mcz
>
> ==================== Summary ====================
>
> Name: Morphic-mt.1643
> Author: mt
> Time: 4 April 2020, 11:06:42.760864 am
> UUID: 81efe0e9-ec69-1b45-ba8e-b81bbb649355
> Ancestors: Morphic-mt.1642
>
> Fixes the recently discovered layout bug. Thanks to Christoph (ct)!
>
> =============== Diff against Morphic-mt.1642 ===============
>
> Item was changed:
> ----- Method: TableLayout>>computeExtraSpacing:in:horizontal:target: (in category 'layout') -----
> computeExtraSpacing: arrangement in: newBounds horizontal: aBool target: aMorph
> "Compute the required extra spacing for laying out the cells"
>
> "match newBounds extent with arrangement's orientation"
>
> | extent extra centering n extraPerCell cell last hFill vFill max amount allow |
> extent := newBounds extent.
> aBool ifFalse: [extent := extent transposed].
>
> "figure out if we have any horizontal or vertical space fillers"
> hFill := vFill := false.
> max := 0 @ 0.
> arrangement do:
> [:c |
> max := (max x max: c cellSize x) @ (max y + c cellSize y).
> max := max max: c cellSize.
> hFill := hFill or: [c hSpaceFill].
> vFill := vFill or: [c vSpaceFill]].
>
> "Take client's shrink wrap constraints into account.
> Note: these are only honored when there are no #spaceFill children,
> or when #rubberBandCells is set."
> allow := properties rubberBandCells not.
> aMorph hResizing == #shrinkWrap
> ifTrue:
> [aBool
> ifTrue: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
> ifFalse: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
> aMorph vResizing == #shrinkWrap
> ifTrue:
> [aBool
> ifFalse: [allow & hFill ifFalse: [extent := max x @ (max y max: extent y)]]
> ifTrue: [allow & vFill ifFalse: [extent := (max x max: extent x) @ max y]]].
>
> "Now compute the extra v space"
> extra := extent y
> - (arrangement inject: 0 into: [:sum :c | sum + c cellSize y]).
> extra > 0
> ifTrue:
> ["Check if we have any #spaceFillers"
>
> vFill
> ifTrue:
> ["use only #spaceFillers"
>
> n := arrangement inject: 0
> into: [:sum :c | c vSpaceFill ifTrue: [sum + 1] ifFalse: [sum]].
> n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
> extra := last := 0.
> arrangement do:
> [:c |
> c vSpaceFill
> ifTrue:
> [extra := (last := extra) + extraPerCell.
> amount := 0 @ (extra truncated - last truncated).
> c do: [:cc | cc cellSize: cc cellSize + amount]]]]
> ifFalse:
> ["no #spaceFillers; distribute regularly"
>
> centering := properties wrapCentering.
> "centering == #topLeft ifTrue:[]." "add all extra space to the last cell; e.g., do nothing"
> centering == #bottomRight
> ifTrue:
> ["add all extra space to the first cell"
>
> + arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ extra]].
> - arrangement first addExtraSpace: 0 @ extra].
> centering == #center
> ifTrue:
> ["add 1/2 extra space to the first and last cell"
>
> + arrangement ifNotEmpty: [:cells | cells first addExtraSpace: 0 @ (extra // 2)]].
> - arrangement first addExtraSpace: 0 @ (extra // 2)].
> centering == #justified
> ifTrue:
> ["add extra space equally distributed to each cell"
>
> n := arrangement size - 1 max: 1.
> extraPerCell := extra asFloat / n asFloat.
> extra := last := 0.
> arrangement do:
> [:c |
> c addExtraSpace: 0 @ (extra truncated - last truncated).
> extra := (last := extra) + extraPerCell]]]].
>
> "Now compute the extra space for the primary direction"
> centering := properties listCentering.
> 1 to: arrangement size
> do:
> [:i |
> cell := arrangement at: i.
> extra := extent x - cell cellSize x.
> extra > 0
> ifTrue:
> ["Check if we have any #spaceFillers"
> cell := cell nextCell.
> cell hSpaceFill
> ifTrue:
> ["use only #spaceFillers"
>
>
> n := cell inject: 0
> into: [:sum :c | c hSpaceFill ifTrue: [sum + c target spaceFillWeight] ifFalse: [sum]].
> n isZero ifFalse: [extraPerCell := extra asFloat / n asFloat].
> extra := last := 0.
> cell do:
> [:c |
> c hSpaceFill
> ifTrue:
> [extra := (last := extra) + (extraPerCell * c target spaceFillWeight).
> amount := extra truncated - last truncated.
> c cellSize: c cellSize + (amount @ 0)]]]
> ifFalse:
> ["no #spaceFiller; distribute regularly"
>
>
> "centering == #topLeft ifTrue:[]" "add all extra space to the last cell; e.g., do nothing"
> centering == #bottomRight
> ifTrue:
> ["add all extra space to the first cell"
>
> cell addExtraSpace: extra @ 0].
> centering == #center
> ifTrue:
> ["add 1/2 extra space to the first and last cell"
>
> cell addExtraSpace: (extra // 2) @ 0].
> centering == #justified
> ifTrue:
> ["add extra space equally distributed to each cell"
>
> n := cell size - 1 max: 1.
> extraPerCell := extra asFloat / n asFloat.
> extra := last := 0.
> cell do:
> [:c |
> c addExtraSpace: (extra truncated - last truncated) @ 0.
> extra := (last := extra) + extraPerCell]]]]]!