Skip to content

LED Raster Designer v1.6.0 - #122

Merged
kman1898 merged 431 commits into
mainfrom
dev/draft
Nov 6, 2026
Merged

kman1898 merged 431 commits into
mainfrom
dev/draft

Conversation

@kman1898

@kman1898 kman1898 commented Nov 6, 2026

Copy link
Copy Markdown
Owner

LED Raster Designer v1.6.0. The notes are the top entry of src/VERSION.txt.

CI is green on all 12 jobs at 5f7f047 on dev/draft. The full local suite ran for this major release, and the failures from that run passed when rerun on a quiet machine.

A run whose socket stands in line with its disc went straight at the
socket's x, not at the way out the sheet had weighed against the map's
lettering, so it was drawn through a tag beside the disc. Once data tags
read the length alone, a "50'" tag sat on that line where the wider
"50' etherCON" had blocked the way and sent the run round by the side.
The straight run is now taken only where its line is no dearer than the
way out; otherwise the run keeps that way out and goes by the lane.
With Port numbers on Down, Organized numbered every cut run by its place
along the line (first runs of every row, then second runs, ...). A row cut
at a different width from the rows around it, like a bottom row of
half-height cabinets that fits 17 to a port under rows of 8, had its runs
numbered as if each were the next row of a stack, so the numbers wove
through stacks the runs don't sit under.

Each cut run now carries where its first cabinet sits along the line. The
stacks are the cut most lines share; a line in step with it (same run
spacing wherever both have a run, so a line trimmed at an end by a taken
over port still counts) numbers by place as before; a run of a line cut
another way takes the stack its first cabinet sits under, in line order.
Walls whose lines all cut alike number exactly as they did.

The automatic walk, the custom Apply Pattern fill and the SCR export
(scr_project.split_run_stacks) share the rule. Across is unchanged.
# Conflicts:
#	src/VERSION.txt
The H_4xfiber fix bound a Backup-mode OPT 3-4 box to the OPT 1-2 box off
the mode. The same rule now covers every copy OPT a catalog entry quotes
a source for:

- H_4xfiber (enhanced), Backup: OPT 5-8 bind to OPT 1-4. The rule already
  reached it; tests now prove it for every box shape and order.
- MX40 Pro, 20-port: a box on OPT 3/4 set to Backup (the default) binds to
  the OPT 1/2 box even when it was added alone or before the mode switch.
  Before, it drew as a copy box with free sockets.
- NovaPro UHD and UHD Jr: their own spec sheets name OPT 3/4 the
  copy/hot backup channels of OPT 1/2, and the owner ruled each box there
  picks Mirror or Backup like the MX40 Pro. Their mode gains copyTrunks
  per-box with a copyTrunksNote quoting the sheet, so two CVT4K-S give 16
  ports, each with its backup, drawn as one loop. The count stays 16.

Only boxes on exactly the same OPTs bind; mixed shapes are left unbound.
… under

Power's Circuit numbers switch stacked Organized's cut circuits with its
own copy of the old rule (every row's first circuit, then every row's
second, ...), so a row cut at a different width from the rows around it,
like a bottom row of half-height cabinets that fits twice as many to a
circuit, wove its numbers through stacks it doesn't sit under.

Each cut circuit now carries where its first cabinet sits along its row,
counted from the pattern's start side, and the numbers go through the
data side's _stackSplitRuns, so both follow one rule: a circuit numbers
inside the stack its first cabinet sits under. Walls whose rows all cut
alike number exactly as before, and Across is unchanged.

The splitter packing keeps reading each piece by its place along its
row, so no cabinet changes circuit and no 2fer or 3fer changes; only
the numbers move.

Tests cover power Down on the 85 x 5 half-row shape from every corner,
a differently cut top row, the vertical mirror, sharing with splitters,
and Across and Down from right and bottom start corners on both data
and power, plus SCR export parity for the right-start data cases.
Each unit's own documents now drive its copy OPTs, quoted in its catalog
entry:

- VX400 Pro, VX600 Pro, VX1000 Pro (OPT 2) and VX2000 Pro (OPT 3/4): the
  VX Pro Series User Manual's Table 5-7 sets the OPT working mode to Copy
  or Backup for the unit, so they gain Copy and Backup modes like the
  H_4xfiber. Backup is the default and reads the old "default" mode.
- MCTRL660 Pro: "OPT2 is the backup input or output port of OPT1"
  (Specifications V1.4.1 p.4), so copyTrunks backup.
- MCTRL R5 and MCTRL4K: their sheets say copy channel / duplicate
  channel and their product pages say backup, so each box on a copy OPT
  picks Mirror or Backup, Backup by default, like the NovaPro UHD.
- MX30 and MX20: "OPT 2 is the copy channel of OPT 1" and nothing says
  backup, so the box there feeds a mirror screen.

The port counts are unchanged, a box on a primary OPT still comes alone,
and boxes on different OPT shapes stay unbound. The VX400, VX600 and
VX1000 keep no box on the OPT that copies.
When a wall shrinks (columns or rows, typed, by Size by Wall Dimensions or
through its group), every drawn data port drops the cabinets that fell off
the wall. A port left with none is removed and the later ports close up the
way Redraw ports as one closes them: one shared close-up (_closeUpPorts)
moves the overrides, the active port and the typed port names, and the
card pins follow through /api/port-assignments/merge. The trim runs inside
updateLayers, so it rides the shrink's own PUT and undo step; pins the
server moves afterwards are carried into the undo steps taken since.

A show saved in that state is repaired when it is opened (File > Open and
Recent Files), where an override held with nothing drawn goes too.

Redraw ports as one counts only cabinets on the wall, and refuses up front,
with the "is full" toast's figures, picks that hold more than one port takes.

In the Data view an Alt+press now arms the same two gestures as in Power:
dragged past the threshold it picks every port it crosses into the Shift
picks; released inside it, it is the Alt+click that redraws one port.
Shortcuts sheet, an Advanced Guide step and the tour snapshots follow.
Custom power screens hid the Circuit numbers switch once a circuit was
drawn, and the custom Apply Pattern numbered the circuits it cuts from
long rows along the rows whatever the switch said. Data's custom fill
already followed Port numbers.

The switch now shows on a custom power screen wherever Apply Pattern
would cut a line (asked in a horizontal and a vertical pattern, the way
the data side asks), and not with Maximize Power Use. With Down picked
(Across on a vertical pattern), the fill numbers its cut circuits down
the stacks through _stackSplitRuns, the rule the data fill and the
automatic walk share, so a half-height bottom row's circuit takes the
number right after the stack its first panel sits under. One helper,
powerNumbersStack, now answers this for the automatic walk and the
custom fill alike.

The sharing fill numbers the same way. Its cut pieces never share, so
only their numbers move among themselves; every 2fer and 3fer keeps its
runs and numbers. As on the data side, circuits already drawn keep
their numbers when the switch changes.

Tests: the owner's 85 x 5 half-row shape from every horizontal corner,
Across and never-switched screens unchanged, the vertical mirror, a
sharing fill with a 2fer, the switch on custom screens, and drawn
circuits kept.
# Conflicts:
#	src/VERSION.txt
# Conflicts:
#	src/VERSION.txt
A box set to Backup on a copy OPT whose OPTs differ from its primary's
(a CVT4K-S on OPT 5-6 behind two CVT10s, CVT10s on OPT 5 and 6 behind a
CVT4K-S) now maps each socket to the primary port it backs up. The tray
draws the sockets as loop rows in each primary's strip, numbered with the
ports they back up; the box cable sheet, its settings, the fiber section
and the binder's Breakout boxes table say the same. A backup box no
longer adds ports to its card (36 read 32 on an enhanced H_4xfiber).
The VX1000's own sheet (Specifications V1.6.0 p.7, Optical Fiber Ports)
reads "OPT | 2 | 10G optical fiber ports" and "OPT 2: For output only,
with copy and backup modes", and the owner turned OPT 2 on (2026-11-02).

- Catalog: trunks 2, with Copy and Backup modes for the whole unit in the
  VX Pros' shape, Backup the default and reading the old "default" mode.
  The port count stays 10. The modesNote quotes the sheet.
- Tests: the VX1000 joins the copy/backup shapes (either order, the Data
  tray loop, Copy's mirror, the mode switch, the pull sheet, the count)
  and COPY_SOURCES. The 10G roster pins it at 2 trunks; the single-trunk
  test moves to the VX600, whose OPT 2 still has no stated rate; a second
  one-OPT CVT4K-S now lands on OPT 2 as the first box's backup.
When a wall shrinks, every drawn power circuit (custom paths, a circuit
taken over by hand, a drawing left from a custom spell) drops the cabinets
that fell off the wall. A circuit left with none is removed and the other
circuits keep their numbers. On a custom screen it comes off its multi the
way Unplug circuit takes it off, with its cable, label and share entries,
and every other circuit keeps its distro, multi number and tail: the multis
are rebuilt from what each held, so the box grid cannot slide a later
circuit into an earlier multi. A 2fer or 3fer keeps the legs left on the
wall and dissolves only with one leg or none; a circuit whose first leg
went is read by its next one, its label and cable following. On an
automatic screen an emptied take-over is let go like Return to auto.

The pass rides the data trim's hooks (trimPortsOffWall: updateLayers, the
load repair, the opening hold, the locked-screen skip, one toast). Data
behavior is unchanged.

Circuits Required on a custom screen counts the circuits drawn instead of
the highest number, so a hole is no circuit.
On a unit with ports of its own (NovaPro UHD and UHD Jr, MX40 Pro in
20-port mode: every product whose catalog mode carries copyTrunks), a
port no box on a primary OPT carries is the unit's own port, and a box
on the copy OPT set to Backup backs it up, port by port beside any box
on a primary OPT. The tray draws those sockets as loop rows under the
unit's own ports; set to Mirror the box feeds a mirror of them. The
count stays the unit's own. + Box offers each box on a free copy OPT
(the add's new trunk field), and the box holds that OPT.
# Conflicts:
#	src/VERSION.txt
A locked owner keeps its circuits as they are, and the locked error now
names the circuit it kept instead of only logging it. A removal on an
unlocked screen runs under the locks the unplug gestures run: the repack
lock (_repackTrial, a locked member of the owner's group whose packing %
the wall shares), then a check of every locked screen's power stores and
of its multis' distro, number, circuits and tails. Rebuilding a shared box
no longer writes a locked screen's tails to hold them; if the removal would
deal them again, everything it wrote is put back and the circuit stays
until that screen is unlocked, the next layer save trying again. The error
says which locked screen kept which circuit and why, once while the hold
lasts. _showLockedError takes a lead sentence and a 'shared' reason, and
_repackTrial an optional say callback.
… OPT input

Every unit whose catalog mode sources copyTrunks and has Ethernet ports of
its own (VX Pros, VX1000, MCTRL660 Pro, MCTRL R5, MCTRL4K, MX30, MX20) is
tested: a box on the copy OPT with nothing on the primary backs up or
mirrors the unit's own ports by mode or role, the count stays the unit's,
the tray draws the loop rows and + Box offers the copy OPT.

Backup sockets read the box's own silkscreen; the row header names the
ports they carry and the hover, the box sheet and the binder name the port
each backs up.

A box takes from each OPT only as many ports as it has outputs for one
input: a CVT4K-S on two 10-port OPTs carries 1-8 and 11-18, and a CVT10 on
an 8-port OPT 8. A box can no longer take a primary OPT and a copy OPT
together (a CVT4K-S on OPT 1-2 of a VX1000); + Box offers it on one OPT,
and a file carrying one counts only the primary OPT's ports. A box drop
fills only that box's own sockets.
Owner, 2026-11-02: a CVT4K-S on OPT 1-2 of a VX1000, whose OPT 2 copies
OPT 1, carries that OPT's ports on outputs 1-8 and their backup on 9-16,
or a mirror where the OPT mode or the box says Mirror. The add no longer
refuses it and + Box offers it whole again. The tray draws outputs 9-16
as the box's own loop row; across a UHD Jr's OPT 2-3 the copy input backs
up the box on OPT 1. The count stays the main OPT's ports. A per-box
straddle picks Mirror or Backup on its gear and keeps its own sockets'
cables.
The owner's rule: a locked screen stays unchanged until unlocked, and any
attempt says why. Unplug circuit and the other gestures that rebuild a
shared box still wrote a locked member's shown tails into its
powerSocaPhasePos (_materializeSocaBox), and a locked member that stored
none was dealt again whenever the box changed under it.

The trim's snapshot-compare-hold is now one shared lock,
_lockedPowerTrial: opened before a gesture's first write, checked before
its commit. When a locked screen's power stores, multi distro, number,
circuits or tails would change, everything the gesture wrote is put back
(_holdPowerRecords) and the locked error names the screen ('shared').
Otherwise the gesture stands and the locked screen is never written:
_materializeSocaBox passes locked screens by. A refusal inside a gesture
made of guarded setters refuses the whole gesture, once. _repackTrial
runs the lock with the repack lock, so the trim, shares, Nfers and the
batch verbs take it; the edit funnel checks locked screens on the
reached screens' distros.

Under the lock: Unplug circuit, Unplug multi, multi distro and number,
the dock's plug, slot, pip and whole-distro drops, Split and Un-split,
Move Circuits and breaker offset, Balance and Reset, splitter shares and
packing, breakout, custom Clear Circuit, Clear All, drawn panels, Apply
Pattern, Return to Auto, distro edits and removal, and panel edits.
Unlocked screens behave exactly as before.
A mirror was checked only when it was made. A later resize of the source
or the mirror that kept the port count (columns, cabinet pixels, a blank
or half cabinet) was taken silently: the copy kept its runs, the tray said
all attached, and putting the size back could leave an old warning up.

The screens of a mirror now send their shape (columns x rows, pixels per
cabinet, half-tile edges, the blank, hidden and half cabinets, runs that
cross onto another screen) with every resolve. It is in the panel's key,
so a change to it re-runs the match, and the server checks the shape the
person sees rather than a layer save still on its way. No other edit asks
the server anything new.

When an edit breaks a mirror an error says which screens no longer match
and why; the tray keeps the warning until they match again, then the
mirror resumes. The mismatch messages read as two sentences, no dash.
The app fits the view 100 ms after its first load reports done, so a view
set in that gap was fitted over. In CI a browser module set its zoom right
after the load and the fit landed after it: six drags aimed at the far
side of the walls missed the canvas. The fit now stands down if the view
has moved since the load.
The first strand's own echo could restate the tray while the hand was on
its way to the second strand's pick, after the pick was found. The reach
found nothing and the step stopped, and in What's New's apply every step
after it was left with no show: Put the distro on the service then had no
distro. A lost chip or pick is now one more try, up to the step's three.
The drop only compared size and shape, and the first snapshot then wrote
the source's data settings over the target, so Screen2's 30 fps quietly
became Screen1's 60. A drop that passes every other rule but differs in a
setting that makes the port map now says Not allowed on the pill, and its
release lists every difference and offers to match the target to the
source. One undo takes back the mirror and the matched settings. The rule
is in mirror_set_refusal too, in the same words, and holds only where a
mirror is set: a mirror already made keeps following its source.

Blanks read as the walk reads them, and paths an automatic screen does not
walk do not count. The Port numbers order counts only where the switch
moves something. The refusal check waits for saves on their way, and the
mirror is written on the project's copy of the screen, which a socket echo
may have replaced.
…e their mode

Remove processor, Remove card and a card swapped in a slot let a mirror go
with its source's feed, in the same undo step. Remove box lets it go when
the box held the copy's last socket. A setting that leaves the copy nothing
to ride keeps the mirror; its tray line now offers Stop mirroring, and the
refusal no longer says to unplug a card that isn't there. A source unplugged
from a card that left Copy takes its mirror too.

A fiber extension names its mode on the pull list, xlsx, binder and box
sheet, so single mode and multimode never merge. Edits on the old row follow
it. A folded loop of both modes reads both.

A Backup box on a screen on the unit's own ports says its backup already
rides on it, read from the card's resolution.
…es a tray redraw

The ring was measured when an act began and when it ended, so a step whose
act adds or scrolls hardware ringed the wrong thing while it played. Mirror
a screen sat on another box for its whole drag. The ring now follows the
step's target through the act, a target that becomes another element is
brought into view, and one the tray scrolls away leaves the ring in place.

The box was also past the tray's bottom edge: a rebuild stacked the columns
before the snake bracket made its unit taller, so a reveal measured a column
30 px short and the anchor walked the scroll back on every rebuild. The stack
now runs again once the brackets are placed. A gesture checks where its
element is on arrival and hops to it if the tray moved.

Pick the strands failed under a steady redraw because the pick was only a
chip swapped for a select, so any rebuild put the chip back, and a rebuild
during the press sent the click to a detached chip. An open pick now rides
the rebuild, and the release lands on the chip that is there.
The guide puts the show back a beat after Skip, and that restore closed every
menu twice, shutting the one a person had just opened. The guide's own menus
now go at Skip, and one opened after that is left up.
… test

- A page load puts the startup screen only in the pristine project. One
  left empty and worked on (renamed, a canvas or beach added, a screen
  added and undone) stays empty through a reload.
- The opening fit compares with the view the renderer was built with, so
  a wheel or pan at any time before it stays put. A launch left alone
  still fits.
- Undo and redo leave the active canvas on the selected screen, on the
  page and in the restore's PUT, so Raster reads the right canvas.
- The press in a list name being edited lets go of the selection first,
  so the first drag after the double-click selects text in all four
  kinds of name.
- The Screens list takes a canvas dropped under the last block or in a
  gap between blocks.
- Ctrl or Cmd adds a group's header to the selection and Shift ranges to
  it, as on the screen rows. An emptied selection hides the Names switch.
- Delete on the last screen says why nothing happened.
- Three Export dialog tooltips read without a spaced hyphen.
… save or reload ends it like Esc

An open redraw's hold decides the plan, and only its end moves the cables.
The project alone cannot say that, so anything that brought the project
back without the session put cables on the wrong circuits.

- The undo entry records the redraw it was taken with, so undo and redo
  open or close it with the project.
- Ending a redraw and handing its circuit back are one undo step, here
  and when another circuit picks up, so no entry holds an empty number
  with nothing open.
- A save writes the open redraw into the file and the show ends it as it
  opens. A reload does the same from the browser's copy. Opening a show
  drops any redraw in hand.
- A circuit taken over and left as seeded goes back to automatic even
  when another redraw's end renumbered the walk around it.
A fill from the browser's contacts wrote a name and a phone into fields the person was not in, a multi name in a folded panel among them. One capture listener on the window now refuses a value that neither page script nor the person's typing put there, puts the field back and logs autofill_refused with the field and no value. Every field also gets the no-fill hints as it appears.
The act never checked that IMAG L reached the box. A place request that got no
answer resolved all the same, and the drag was then refused as if the gesture
were wrong. The step now stops and says what went wrong.
Preferences > Cable stock keeps one Fiber list, feet and meters, and every
fiber run of either mode is pulled from it. The mode stays on every cable,
row, label and refusal, so single mode and multimode rows never merge. A show
or preset saved with a list per mode keeps every length of both, and the old
keys are folded away on open, on save and when the presets file is written.

A screen with no saved panel name has no panel row on the pull sheet, in the
workbook or on the binder's pull pages: no model guessed from its figures and
no size in its place, older shows included. The guess and the wait for the
library behind it are gone. The Panel field's placeholder is blank with no
name saved. Saved names print as before, halves included.
…cs, wiring boxes name their fiber

A member's sheet cut the other member off its bitmap, and a wiring sheet's
bitmap stopped at the wall, so a disc, 2fer pill or cable tag on the seam
printed in half. Each label that reaches the wall now comes back whole from
a Power or Data stage pass, the wall framed to keep it on the sheet, with
brackets, rulers, outline and rails clear of it.

Wiring sheets read a disc's place from the coordinates it was drawn at. A
run across members is drawn in the wall's frame, so where a member's Show
Look offset is not nil the rings and runs landed that far off. A disc's
place is now read through the transform it was painted under.

A box on a Data Wiring sheet names each input's cable before its strands,
as the data sheet's band does.
The beach name's first drag selected nothing on Linux CI. Chromium loses a
drag's start when the press lands close to the middle of a letter and off a
whole CSS pixel, in a bare text field too, and Linux's font put the test's
press on one. The caret then follows the mouse. The press's place is now
kept, and a caret that leaves it while the button is held becomes a
selection from there. Any selection the press finds is let go, whole name or
one word, so nothing assumes what a double-click left.

A drag let go past the end of the name no longer clicks the row under it,
which ended a group's rename.

The tests sweep the press across the name from each shape of selection, on
all four kinds of name and on a scaled screen. An edit a failed assert left
open no longer fails the next test: the [0, 7] on CI was that.
…ags keep their rim

The cable name made a Data Wiring box's inputs too long for the caption's
row: X2 was padded to X1's name and the groups fell to a line each, a taller
box. Each cable now takes its own width, and a box holds its groups on the
one line under the caption while two such boxes still fit a row.

A cable tag or 2fer pill astride a group's seam lost part of its rim past the
wall: the rim stands outside the box the label registry notes. The tag now
notes its rim and the restore keeps it.

The check that nothing but labels comes back read the printed page, so it
counted the row ruler's digit, and more of it on Linux. It reads the map's
bitmap on the seam's side now.

The autofill line in the 1.6.0 notes no longer says paste.
… alike

Some boxes put their inputs on the name's row and ran wide with empty paper
past the sockets, others put them under the name. Every box now takes the
line under the name, side by side, and is only as wide as its sockets, name
and that line need. Names too long for one line still take a line per input.

This replaces the name's-row layout, so the widening of the far row and the
socket slide that went with it are gone.
The entry drops the fixes to code that never shipped in 1.5.3, trims each
section to what it does for you and keeps every count change under
Opening an older show. The release tests follow the shorter wording, and
the Graphite line no longer says panel rows print by size.
@kman1898
kman1898 merged commit 0542d8f into main Nov 6, 2026
24 checks passed
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