Mockup for the Player comparison tab — the one in the main window, not the modal opened from a
Squad depth position. Ross: "it is all a bit of a mess and it just doesn't work very well… when
selecting a player in the dropdown it disappears and you have to click again to open and then select
another player. It would be better if you can just select the players you want."
All 83 players are the real save, read out of squadvision.db — names, ages, FM position
strings, squads and loans. Everything in the left rail below is live: click rows, type in the search,
toggle the filters. The results panel is schematic and marked as such; the ranked grid already
exists and this proposal does not change it.
What it does today
Six centred rows, each a different width, stacked above the results. Roughly 300px of chrome
before an answer, and it never gets out of the way.
SquadsFirst TeamU21sU18s
▸ Filter by position None selected
Hide players out on loan
ComparingNobody selected
Capture pointDecember 25/26Expand
Judged asPick a role to rank by
Picking 8 players costs 8 open‑scroll‑click cycles — the box closes on every pickThe list behind it holds 28 First Team, 83 across all squadsTwo empty‑state messages show at once, in two alignments
The proposal — a roster rail you pick from
The rail is the filter, the picker and the record of who is in, so the six rows collapse into one
column and one strip. Clicking a name adds him; clicking again takes him out. Nothing closes, nothing
reopens. This is how Squad depth already works — you pick players off a list you are reading — and how
#625 left the Analyse screen: a rail you navigate, panes that fill.
Squad
▸Filter by positionNone
Hide players out on loan
COMPARING
Click a name below to add him.
Judged asAs of
what this fixes
The dropdown is gone
Eight players is eight clicks in one list, not eight open‑scroll‑click cycles. You can also
see the pool you are choosing from, which a popup never showed you — and the filters visibly narrow
the list underneath them, so Hide players out on loan stops being an act of faith. On the real
save it removes 5 of 28 in the First Team and 25 of 83 across all squads.
what this fixes
The chrome gets out of the way
Six centred rows become a rail and one strip, and the rail folds when you want the width back —
the same move the Analyse rail makes while a player is docked. The two competing empty‑state
messages become one, in the panel that is actually empty.
Settled — the rail folds itself once the comparison is realRoss: "when you are comparing we should probably collapse the left hand side once you have
selected the role to compare, like how now it fills everything." Built above — pick two names and
then a role, and the rail folds on its own.
Two details it needed. The trigger is the results appearing — two
players and a role — rather than the role alone, because a role chosen with nobody picked would
fold the rail away from the job you are still doing. And it only ever
folds once: opening the rail back up is how you add a ninth man or swap one out, and a rail that
re-folds every time you touch the role picker is fighting you. Folded, it still carries the count and
the initials, so you have not lost track of who is in — click it to open it again.
Answered — how the two routes differ todayFrom Squad depth there is no cap at all. The tray needs two and
that is the only bar; SetComparedPlayers takes the whole set. Its comment: "TAKES THEM
ALL (#451). It used to trim to MaximumPicked, which made uncapping the tray pointless on its own: you
could add a ninth centre back over there and he was silently dropped on the way in." Eight is the
picker's limit and nothing else's.
Compare from the board still opens the same view — the modal hosts
PlayerComparisonResultsView, which is exactly what this tab hosts inline, and the tab's
own Expand opens that same modal. But the two routes keep separate view models on purpose, so
"comparing from here never overwrites whatever the user has picked on that tab". Nothing in this
proposal touches the board's route: it only replaces the tab's header.
Settled — the picked players stay pinned in the railRoss: "keep them pinned in the rail." So there is no chip row above the results at all — the
rail says who is in, the strip is only the role and the capture point, and the results get the rest.
Folded, the count and the initials come with it.
Found while dropping the cap — the adds have to be coalescedEvery change to the compared set runs a full RecomputeAsync through
CascadeQueue, which serialises but does not coalesce.
Today the dropdown's friction hides that: adding is slow, so the recomputes never pile up.
A rail removes the friction, and dropping the cap removes the ceiling. Clicking down a filtered list of
29 defenders — or pressing "Add all" — queues 29 full recomputes, each
waiting on the last, 28 of them for a grid nobody sees. The bulk path already solved this:
SetComparedPlayers suppresses the handler and recomputes once, because "arriving from a
position is a single act". Picking from a rail is a burst of single acts and wants the same
treatment — debounce the cascade, or route a burst through the same one-recompute door.
This is a real consequence of the change rather than a pre-existing bug: the cap and the dropdown were
together holding it down.
Settled — the cap is goneEight exists because "choosing names from a dropdown one at a time is a different act from
right-clicking your way down a depth chart" — and a set arriving from a Squad depth position has
not been capped since #451. Once the picker is a list you click, that sentence stops being true
and the number stops having a reason. Ross: "drop the cap."
Measured on the real save, this is what the cap was refusing: 17 players
reach centre back across the three squads and 19 reach central
midfield — 8 and 4 of them in the First Team, 3 and 11 in the U21s. "Compare every centre back I
own" is a 17-man question, and eight stopped it less than half way.
Two is still the floor — one player is not a comparison — and the rail now offers
Add all n on whatever the filters have left, which is the
thing dropping the cap is actually for.