Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.2110.mcz
==================== Summary ====================
Name: Morphic-mt.2110 Author: mt Time: 2 June 2023, 6:24:12.90677 pm UUID: 8824e135-e624-624a-93eb-e9f77ed10748 Ancestors: Morphic-ct.2109
In tree widgets, speed up #itemFromPoint:, which is used for clicking and hovering, to not create extra arrays.
=============== Diff against Morphic-ct.2109 ===============
Item was changed: ----- Method: SimpleHierarchicalListMorph>>adjustSubmorphPositions (in category 'private') ----- adjustSubmorphPositions
| p | p := 0@0. scroller submorphsDo: [ :each | | h | + h := each height. + each privateBounds: (p extent: self preferredSubmorphWidth@h). + each visible ifTrue: [p := p + (0@h)]]. - each visible ifTrue: [ - h := each height. - each privateBounds: (p extent: self preferredSubmorphWidth@h). - p := p + (0@h) ]]. scroller layoutChanged. selectedMorphIndex := nil. "to catch all collapse/expand events" self clearColumnsCache; changed; layoutChanged; setScrollDeltas. !
Item was changed: ----- Method: SimpleHierarchicalListMorph>>itemFromPoint: (in category 'event handling') ----- itemFromPoint: aPoint "Return the list element (morph) at the given point or nil if outside" + | items ptY firstVisibleRow lastVisibleRow row itemTop result | + items := scroller submorphs. + items ifEmpty: [^nil]. - | ptY visibleRows | - scroller hasSubmorphs ifFalse:[^nil]. (scroller fullBounds containsPoint: aPoint) ifFalse:[^nil]. + firstVisibleRow := items at: (items findFirst: [:m | m visible]). + lastVisibleRow := items at: (items findLast: [:m | m visible]). - visibleRows := scroller submorphs select: [:m | m visible]. + ptY := (firstVisibleRow point: aPoint from: self) y. - ptY := (visibleRows first point: aPoint from: self) y. "note: following assumes that submorphs are vertical, non-overlapping, and ordered" + firstVisibleRow top > ptY ifTrue:[^nil]. + lastVisibleRow bottom <= ptY ifTrue:[^lastVisibleRow]. - visibleRows first top > ptY ifTrue:[^nil]. - visibleRows last bottom < ptY ifTrue:[^visibleRows last]. "now use binary search" + row := items + findBinaryIndex:[:item| + (item top <= ptY and: [item bottom >= ptY]) - ^visibleRows - findBinary:[:item| - (item top <= ptY and:[item bottom >= ptY]) ifTrue:[0] "found" ifFalse:[ (item top + item bottom // 2) > ptY ifTrue:[-1] ifFalse:[1]]] + ifNone: [^nil]. + "ignore invisible rows, find first visible at #top; see #adjustSubmorphPositions." + itemTop := (items at: row) top. row := row - 1. + [row > 1 and: [(items at: row) top = itemTop]] whileTrue: [row := row-1] . + row := row + 1. + [(result := items at: row) visible] whileFalse: [row := row+1]. + ^ result! - ifNone: [nil]!
packages@lists.squeakfoundation.org