Maybe something like this. Occasional occlusion is okay if the close button is on the left, I think. Not sure...

Best,
Marcel

Am 04.09.2023 13:39:46 schrieb Marcel Taeumel <marcel.taeumel@hpi.de>:

> [...] is your suggestion to introduce (massive) whitespace for the sake of a clearer column layout?

Of course not :-) Should not yield massive whitespace. Should look nice. Maybe cut-off excessive window titles. Max. column width maybe ... 15-20% of the screen width? Hmm...

Best,
Marcel

Am 04.09.2023 13:25:35 schrieb christoph.thiede@student.hpi.uni-potsdam.de <christoph.thiede@student.hpi.uni-potsdam.de>:

Hi Marcel,

is your suggestion to introduce (massive) whitespace for the sake of a clearer column layout? I'm not sure about that ... based on the screenshot I shared, this would reduce the number of collapsed windows that fit onto the screen by >50%. Given that our current docking bar menus are still not scrollable, I would definitely rate maximizing the number of visible windows more important than the clearness of arrangement.

Best,
Christoph

---
Sent from Squeak Inbox Talk

On 2023-09-04T11:21:34+02:00, marcel.taeumel@hpi.de wrote:

> Hi Christoph --
>
> Could you align it column by column then?
>
> Best,
> Marcel
> Am 01.09.2023 11:39:20 schrieb christoph.thiede(a)student.hpi.uni-potsdam.de :
> Hi Marcel,
>
> it is still column-by-column. Note that the RealEstateAgent logic makes very few assumptions on the collapsed extent of windows but has its own fixed grid size. So, the algorithm will always minimize the total width of all used columns in total.
>
> Merge? :-)
>
> Best,
> Christoph
>
> ---
> Sent from Squeak Inbox Talk
>
> On 2023-08-30T11:32:24+02:00, marcel.taeumel(a)hpi.de wrote:
>
> > Hi Christoph --
> >
> > If you grow columns and enter the next one, align them vertically so reading those labels becomes easier. ... does it still grow from top to bottom, column-by-column ... or is it row-by-row? Reading those window titles from top to bottom is kind of useful and easier than from left to right....
> >
> > Best,
> > Marcel
> > Am 29.08.2023 19:41:47 schrieb commits(a)source.squeak.org :
> > Christoph Thiede uploaded a new version of System to project The Inbox:
> > http://source.squeak.org/inbox/System-ct.1424.mcz
> >
> > ==================== Summary ====================
> >
> > Name: System-ct.1424
> > Author: ct
> > Time: 29 August 2023, 7:41:28.345934 pm
> > UUID: 9af4e7bf-a99d-8a43-9de5-87c8ed70ce94
> > Ancestors: System-mt.1423
> >
> > Revises RealEstateAgent logic for placing collapsed windows to deal with more windows than fit in one column by arranging them next to each other. Speeds up the logic for high-DPI displays by honoring the current scaleFactor.
> >
> > =============== Diff against System-mt.1423 ===============
> >
> > Item was changed:
> > ----- Method: RealEstateAgent class>>assignCollapseFrameFor: (in category 'utilities') -----
> > assignCollapseFrameFor: aSSView
> > "Offer up a location along the left edge of the screen for a collapsed SSView. Make sure it doesn't overlap any other collapsed frames."
> >
> > + | grid verticalBorderDistance horizontalBorderDistance otherFrames viewBox collapsedFrame extent top column countInColumn topLeft newFrame row rowLeft rowFrame |
> > + grid := 8 px.
> > + verticalBorderDistance := 8 px.
> > + horizontalBorderDistance := 8 px.
> > +
> > - | grid otherFrames topLeft viewBox collapsedFrame extent newFrame verticalBorderDistance top |
> > - grid := 8.
> > - verticalBorderDistance := 8.
> > aSSView isMorph
> > ifTrue: [otherFrames := (SystemWindow windowsIn: aSSView world satisfying: [:w | w ~= aSSView])
> > collect: [:w | w collapsedFrame]
> > thenSelect: [:rect | rect notNil].
> > viewBox := self maximumUsableAreaInWorld: aSSView world]
> > ifFalse: [otherFrames := ScheduledControllers scheduledWindowControllers
> > collect: [:aController | aController view ~= aSSView ifTrue: [aController view collapsedFrame]]
> > thenSelect: [:rect | rect notNil].
> > viewBox := Display boundingBox].
> > + otherFrames sort: [:w | w right] ascending.
> > collapsedFrame := aSSView collapsedFrame.
> > extent := collapsedFrame notNil
> > ifTrue: [collapsedFrame extent]
> > ifFalse: [aSSView isMorph
> > + ifTrue: [aSSView getRawLabel width + aSSView labelWidgetAllowance @ (aSSView labelHeight + 2 px)]
> > + ifFalse: [(aSSView labelText extent x + 70 px) @ aSSView labelHeight
> > - ifTrue: [aSSView getRawLabel width + aSSView labelWidgetAllowance @ (aSSView labelHeight + 2)]
> > - ifFalse: [(aSSView labelText extent x + 70) @ aSSView labelHeight
> > min: aSSView labelDisplayBox extent]].
> > collapsedFrame notNil
> > ifTrue: [(otherFrames anySatisfy: [:f | collapsedFrame intersects: f])
> > ifFalse: ["non overlapping"
> > ^ collapsedFrame]].
> > +
> > + column := 0.
> > + countInColumn := nil.
> > + [countInColumn = 0]
> > + whileFalse:
> > + [top := viewBox top + verticalBorderDistance.
> > + countInColumn := 0.
> > + [topLeft := viewBox left @ top.
> > + newFrame := topLeft extent: extent.
> > + newFrame bottom
> > + whileTrue:
> > + [row := otherFrames select: [:w | newFrame intersects: w].
> > + column > 0 ifFalse: [rowFrame := newFrame] ifTrue: [
> > + rowLeft := ((otherFrames collect: [:w | w right]) take: column) last + horizontalBorderDistance.
> > + rowFrame := newFrame translateBy: (rowLeft @ 0).
> > + row := otherFrames select: [:w | rowFrame intersects: w]].
> > + (viewBox containsRect: rowFrame) ifTrue: [
> > + row ifEmpty: ["no overlap"
> > + ^ rowFrame].
> > + countInColumn := countInColumn + 1].
> > + top := top + grid].
> > + column := column + 1].
> > +
> > + "If all else fails... (really too many wins here)"
> > - top := viewBox top + verticalBorderDistance.
> > - [topLeft := viewBox left @ top.
> > - newFrame := topLeft extent: extent.
> > - newFrame bottom
> > - whileTrue:
> > - [(otherFrames anySatisfy: [:w | newFrame intersects: w])
> > - ifFalse: ["no overlap"
> > - ^ newFrame].
> > - top := top + grid].
> > - "If all else fails... (really to many wins here)"
> > aSSView isMorph
> > ifTrue:[ Project current showWorldMainDockingBar ifTrue:[^ (0 @ Project current world mainDockingBars first height) extent: extent]].
> > ^ 0 @ 0 extent: extent!
> >
> > Item was changed:
> > ----- Method: RealEstateAgent class>>assignCollapsePointFor: (in category 'utilities') -----
> > assignCollapsePointFor: aSSView
> > "Offer up a location along the left edge of the screen for a collapsed SSView.
> > Make sure it doesn't overlap any other collapsed frames."
> >
> > + | grid otherFrames viewBox column countInColumn y row topLeft currentRowLeft rowLeft |
> > + grid := 24 px. "should be mult of 8, since manual move is gridded by 8 px"
> > - | grid otherFrames y free topLeft viewBox |
> > - grid := 24. "should be mult of 8, since manual move is gridded by 8"
> > aSSView isMorph
> > ifTrue: [otherFrames := (SystemWindow windowsIn: aSSView world satisfying: [:w | true])
> > collect: [:w | w collapsedFrame]
> > thenSelect: [:rect | rect notNil].
> > viewBox := self maximumUsableAreaInWorld: aSSView world]
> > ifFalse: [otherFrames := ScheduledControllers scheduledWindowControllers
> > collect: [:aController | aController view collapsedFrame]
> > thenSelect: [:rect | rect notNil].
> > viewBox := Display boundingBox].
> > + otherFrames sort: [:w | w right] ascending.
> > +
> > + column := 0.
> > + countInColumn := nil.
> > + [countInColumn = 0]
> > + whileFalse:
> > + [y := viewBox top.
> > + countInColumn := 0.
> > + [(y := y + grid)
> > + whileTrue:
> > + [topLeft := viewBox left(a)y.
> > + row := otherFrames select: [:w | topLeft = w topLeft].
> > + column > 0 ifFalse: [currentRowLeft := topLeft] ifTrue: [
> > + rowLeft := ((otherFrames collect: [:w | w right]) take: column) last + grid.
> > + currentRowLeft := topLeft translateBy: (rowLeft @ 0).
> > + row := otherFrames select: [:w | currentRowLeft = w topLeft]].
> > + (viewBox containsPoint: topLeft) ifTrue: [
> > + row ifEmpty: ["no overlap"
> > + ^ topLeft].
> > + countInColumn := countInColumn + 1]].
> > + column := column + 1].
> > +
> > - y := viewBox top.
> > - [(y := y + grid)
> > - whileTrue:
> > - [topLeft := viewBox left(a)y.
> > - free := true.
> > - otherFrames do: [:w | free := free & (topLeft ~= w topLeft)].
> > - free ifTrue: [^ topLeft]].
> > "If all else fails..."
> > ^ 0 @ 0!