Indeed using a single top level container should be the best approach, because "SpecLayout composed" doesn't have any layout - so adding multiple items into it are just placed one over the other.
Arguably it might be better to add new methods "SpecLayout rows/SpecLayout cols" or something like that so you have the base layout defined.
view := DynamicComposableModel new.
models := #(
leftCol LabelModel
t11 LabelModel t12 LabelModel t13 LabelModel
t21 LabelModel t22 LabelModel t23 LabelModel
).
view instantiateModels: models.
models pairsDo: [ :lbl :m |
(view perform: lbl asSymbol) label: lbl.
].
layout := SpecLayout composed
newRow: [ :r |
r newColumn: [ :col | col add: #leftCol ].
r newColumn: [ :col |
col
newRow: [ :row |
row
add: #t11;
add: #t12;
add: #t13
];
newRow: [ :row |
row
add: #t21;
add: #t22;
add: #t23
]
]
];
yourself.
view openWithSpecLayout: layout.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~