Every board root keys once at its store — the hover path stops walking the filesystem
`DragLocality.isSameBoard` resolved symlinks on both URLs, which stats every path component. It ran five-plus times per `dropUpdated` and again per lane per body evaluation through `renderedCards` → `hiddenMembers` — order of 50–100 stat calls per mouse-move, and worse on iCloud-backed paths. A pickup stall sample had it on ~47 of 943 stacks. `BoardRootKey` mints that canonical spelling once, where the root is, and every locality comparison downstream is an `==` on two strings. The drag carriers hold keys rather than URLs, so re-deriving under the cursor is no longer expressible. `rootURL` keeps the user's spelling — the folder name is the display-name fallback, and canonicalizing there would visibly rename a board opened through a pin. The key follows the folder through `relocate(to:)`: a key frozen at open would collide with a new board opened at the vacated path, and two boards comparing as one is a cross-board drag silently behaving as a move. Claude-Session: https://claude.ai/code/session_01CqjXB7ASoWtbyoGod68k97
This commit is contained in:
@@ -194,7 +194,7 @@ struct TrashLaneView: View {
|
||||
/// Where the delete gesture's shadow run opens in this column — always the topmost row — or `nil`
|
||||
/// when no proposal names the trash, which is every other moment of the app's life.
|
||||
private var proposal: Int? {
|
||||
drops.session.trashProposal(onBoardRooted: store.rootURL)
|
||||
drops.session.trashProposal(onBoardRooted: store.rootKey)
|
||||
}
|
||||
|
||||
/// The slots the column lays out: the rows, with the delete gesture's shadow run opened at the
|
||||
|
||||
Reference in New Issue
Block a user