Skip to content

feat(view): root the forest at one bead - #76

Merged
GraemeF merged 7 commits into
mainfrom
focus1
Sep 12, 2026
Merged

feat(view): root the forest at one bead#76
GraemeF merged 7 commits into
mainfrom
focus1

Conversation

@GraemeF

@GraemeF GraemeF commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Shift+F draws the selected bead where a root is drawn, with everything the forest draws beneath that bead anywhere else, and nothing else. It is for finishing one bead, so what it takes away is everything a reader does not have to do in order to close the one they are on. Pressing it again puts the forest back, with the selection on the bead it was rooted at.

The mode is a change to what the layout walks rather than to what is collected, and the focused bead keeps the place it carries everywhere else. That is what lets a fold set on it survive the key in both directions.

Everything the mode stops drawing goes behind one collapsed line per project, under that project's own line, opening onto it as the line over the trees the filter holds back already does: every other root, every other project's, and the focused bead's own root for the part of it that is left. That last one is drawn without the focused bead, which stays at the root of the forest, so opening the line never redraws the tree the reader is standing in. It is a group like the filter's, so the fold, the selection handle and the tail behaviour come with it.

The part worth a reviewer's attention is what that line says. It stands over open work with seats on it, which the filter's line never does: the filter keeps a tree with an agent on it, so no live agent is true on its own line and cannot be true on this one. This line counts the beads behind it rather than the beads in the roots they came from, because the focused bead and everything beneath it are on the screen, and it says how many seats and how many beads want looking at. It also names the key that brings the roots back, and a row with no room for that hint gives the hint up whole rather than cutting it: F for th… names no key, while the counts are the part of the line a reader can read nowhere else on the screen.

3 roots held back is the line's own count, and it is roots rather than beads. A root whose tracker refused holds no beads, and 0 beads drawn over a root that is really there and really unreadable is the reading degrade, never disappear exists to prevent.

The mode is held to that promise at its edges. A search counts a bead only where it can take the reader to it, and every bead the mode stops drawing is now behind a line the search opens on the way. Putting the forest back opens whatever has been shut over the focused bead in the meantime, a bead the tracker has reparented is followed to where it moved to, and a bead that leaves the collection ends the mode, because nothing is left to root the forest at. A root whose tracker stops reading has left it too, however much of its own row is still drawn. One count is left as it is: a root row behind the line says what is beneath it in the work, the focused bead's branch included, which is what every bead row in bdi says and what a shut fold has always counted.

Closes bdi-2bb.56.1, bdi-2bb.56.2, bdi-eouw and bdi-5mod.

`Shift+F` draws the selected bead where a root is drawn, what the forest
draws beneath that bead anywhere else, and nothing else. It is for
finishing one bead, so what it takes away is everything a reader does not
have to do in order to close the one they are on.

Everything beneath the focused bead is already in the tree it is drawn in,
because a tree's children are the nesting restricted to what its root
reached. So the mode is a change to what the layout walks rather than to
what was collected, and the bead keeps the place it carries everywhere
else — which is what lets a fold set on it survive the key both ways.

The mode stands on the bead named at the keystroke rather than on the
selection, so walking about under it moves nothing. Pressing again puts
the forest back with the selection on the bead it was rooted at. The bead
leaving the collection is the one thing that ends the mode on its own.
Rooting the forest at one bead leaves every other root and every other
project undrawn, and *degrade, never disappear* says they may not simply
go. Each project keeps a collapsed line standing for the roots it is
holding back, under its own line, opening onto them as the line over the
trees the filter holds back already does.

That line stands over open work with seats on it, which the filter's line
never does: the filter keeps a tree with an agent on it, so its own line
can say `no live agent` and be right. This one cannot. It carries what the
roots behind it add up to, and says how many seats and how many beads want
looking at, so a reader is never told by omission that there is nobody
back there.

It also names the key that brings them back, being the line a reader is
looking at when they want them back. A row with no room for that hint
gives it up whole, because `F for th…` names no key while the counts are
the part of the row that is nowhere else on the screen.
Every root but the focused bead's is behind a line while the forest is
rooted at one bead, so that line is what is shut over the beads in those
roots. It joins the chain above them, which is the one answer both the
ancestry a lost selection falls back to and the opening that reaches a
line are read from. A search offers what it can be taken to, so it walks
the focused tree from the focused bead and the other roots from theirs: a
bead above the focused one is drawn nowhere, and counting it would step
the reader onto it and report nothing found.

Putting the forest back opens whatever has been shut over the bead it was
rooted at, asked of the forest the reader is coming back to rather than
the one they are leaving, so a bead already drawn there is left as it is.
The press says the screen changed, which is what asks for the row to be
drawn again.

A collection that no longer holds the focused bead lets the place it stood
on go. Held, it would take the next press of the key and spend it putting
back a forest that was already back, and the bead coming back in a later
collection would turn the mode on again with nobody asking. A bead the
tracker moved is followed to where it moved to, by the bead rather than by
the way down that used to reach it.
Rooting the forest at one bead draws that bead where a root is drawn and
stops there, so the beads above it are in no drawing. They go behind the
line that holds every other root back, under the same project, and that
line counts them: a seat on one of them is a seat nothing else on the
screen says is there, and *no live agent is hidden* leaves no room for it.

The focused bead stays at the root of the forest rather than being drawn a
second time behind the line, so opening the line never redraws the tree the
reader is standing in. What is behind it is the root they are working under
and every branch off it, resting shut as a held-back root does. The line
joins the chain above those beads, so a search counts them and going to one
opens the line on the way.

Every copy of that bead is left out of the root behind the line, so the mode
draws it once, at the copy the key was pressed on. Where the forest is rooted
is therefore asked before the trees are: for a bead its own tree reaches
twice, the first way down to it, and to everything only that copy reaches, is
a way down to a row nothing draws. A search that answered with one of those
would count a bead it could not then land on.

A search steps through the beads in the order the rows come out, and the
drawing is asked for that order rather than told it a second time: the focused
bead's tree from that bead, then the roots behind the line in the order the
line opens onto them. A reader standing on the line and stepping to the next
match steps into what is behind it, because a shut line is asked what it holds
rather than read past, and this one holds roots. With every fold open, the
beads that order yields are the beads the rows draw, in the order they draw
them, which is what holds the two together as the mode moves the rows about.

A root the tracker files under another root is followed the same way as a
bead moved further down. Its place carries no steps, so the name to look it
up by is the tree's own, and the mode goes on standing on the bead instead of
ending on a collection that still holds it.

The line counts the beads behind it rather than the beads in the roots they
came from, because the focused bead and everything beneath it are on the
screen already. A run behind the line stands for the members left in it and
what is beneath them, counted by putting the bead drawn elsewhere among the
beads the way down came through: that is the set the walk already stops at, so
a way back into it is cut here exactly as the drawing cuts it as a loop.

It says `3 roots held back`. The root the reader is standing in is behind it
as well now, so *other* is not true of what is back there, and every root it
counts has a row of its own nowhere else.

A row inside the line is a bead row and says what is beneath it in the work,
the focused branch included where it is beneath that bead. That is what a
shut fold has counted everywhere since two copies of a bead were made not to
add up, and `shut_over` now carries this instance of it.
The bead the forest is rooted at was drawn where a root is drawn and kept the
id it has as a child, so the one bead the reader pressed the key for read as a
suffix while every other root, its own parent among them, read whole. A column
of shortened ids is read by putting the drawn root in front of each one, and
the root this branch came out of is behind the line. So the drawing rooted at
one bead shortens against that bead: it reads whole where a root would, and
the beads under it read as its children.

What is behind the line is a drawing of its own and shortens against its own
root, so the root the focused branch came out of and the beads still in it
read exactly as they do with the mode off. A bead with a way down on either
side of the line has a row on either side, and each row reads against the root
of the drawing it sits in: `abbreviate` cuts nothing off an id the drawn root
is not a prefix of, so the two spellings differ and both put a reader on the
one bead.

The line's anchor looks past a root that holds no bead. A root whose tracker
refused leads its project whatever the filter says and holds none, so a reader
standing on the shut line and stepping to the next match walked past
everything the line holds and came round to the top of the screen.
A root whose tracker refuses on a later read keeps a row saying it would not
read, and the mode was following the row rather than the bead. So it stayed on
with nothing to root the forest at: every root came back on the screen while
the mode was still set, and the next press was spent putting back a forest
that was already back rather than rooting it at the bead the reader was on.

A bead the collection no longer holds ends the mode, and a root that will not
read is such a bead however much of its header is still drawn.
@GraemeF
GraemeF merged commit 318ccd2 into main Sep 12, 2026
2 checks passed
@GraemeF
GraemeF deleted the focus1 branch September 12, 2026 11:45
@GraemeF GraemeF mentioned this pull request Sep 12, 2026
GraemeF added a commit that referenced this pull request Sep 12, 2026
`main` has carried four squashes since `v0.7.0`, and nobody running
`bdi` can reach any of them until a version is cut. One of the four is
breaking, which this repository has called a minor bump at every version
below 1.0, `v0.4.0` and `v0.7.0` included.

The notes say what a reader has to act on and leave out what they
cannot. The badge chain is the only item that changes what an existing
config draws, so it has the Upgrading section to itself. The row that
has gone is quoted rather than described, because a reader who has that
string on their screen searches a frozen page for the string. The
collapsed line's wording and the gap between that row's cells are not
mentioned at all: the line did not exist at `v0.7.0`, so nobody arriving
from there ever saw what was corrected. There is no Maintenance section,
because the range holds no dependency, CI, test or docs commit.

The README gains a row for `F`, which shipped in #76 without one. Until
now the table's only case pair was `/` `n` `N`, one row for one meaning,
so a reader who had met `f` as *focus the selected bead's pane* would
read `F` as a variant of it. The two rows name the noun that separates
them, a pane and the forest, and `the whole forest` is the program's own
key hint for that row.

`docs/bdi-frame.svg` was read against the new id rule rather than
assumed current, and it is unchanged by it. `atlas-1` is the front of
`atlas-10` as a string, but the rule measures a bead only against the
row above it and those two are drawn at the same depth. What would
restyle that picture is a child whose id is its parent's with a dot and
more on the end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant