Last updated at 4:20 pm UTC on 5 April 2020
How does layout work in Morphic?
Laying out usually occurs when the size or position of a Morph is changed, althought there are other possible reasons. As this happens in the event processing stage of a UI cycle, the Morphs are only marked to be relaid in the layout stage. This is done via Morph method layoutChanged. This should not be confused with changed method of MVC UI.
Then, in the drawing stage, WorldState@displayWorld:submorphs: calls fullBounds to each submorph.
- fullBounds is set to nil to mark Morph for layouting
- is sent to mark the owner, too.
fullBounds "CODE STRIPPED!!!"
"Return the bounding box of the receiver and all its children. Recompute the layout if necessary."
self doLayoutIn: self layoutBounds
As you can see, if the layout wasn't changed, fullBounds is not nil, so nothing happens. If it was nil,
doLayoutIn: is sent to self.
doLayoutIn: layoutBounds "CODE STRIPPED!!!"
"Compute a new layout based on the given layout bounds."
| layout box priorBounds |
submorphs do: [:m | m ownerChanged].
layout := self layoutPolicy.
layout layout: self in: layoutBound].
fullBounds := self privateFullBounds.
The actual laying out can be done several ways;
- simple absolute positions
- a proportional rule-based positioning, see ProportionalLayout
- or a table/column based rule system, see TableLayout