fix(gui): give paired checkboxes the gap every other pair already had - #144
Merged
Merged
Conversation
Reported from the running build the day after the two LAN switches landed side by side: "Internet only" started exactly where the "LAN mode" label ended, so the pair read as one control rather than two. The BOOL branch of the form packs its Checkbutton straight into the row with no padding at all, while every other kind goes through a cell carrying padx=(0, scaled(22)). That difference was invisible for as long as no two checkboxes ever shared a row, which is a state that existed for one day. Both paths ask _gap_after(field) now, so the two cannot drift apart again: a field that owns its row only has to clear the card edge, two that share one get a real gap. Measured on real Tk at 1366x768: 22 px between them in both languages, the same as any other pair of fields, with neither label clipped and 59-63 px still spare to the right of the second one. Guard: the gap assertion added to the test that already checks the two share a row, plus a MUTATIONS entry that reddens it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
donislawdev
added a commit
that referenced
this pull request
Aug 20, 2026
Four pull requests landed after v0.5.0-rc.2 was cut (#141 to #144), one of them a new user-visible switch, and every note they carried had collected under [Unreleased]. Closing the version means moving them into the dated section, so the tag ships what the release actually contains rather than what the rc did. The tag check cannot catch this on its own: an rc and its release share a version by design, so v0.5.0-rc.2 and v0.5.0 both match 0.5.0. CHANGELOG.md: the moved entries join the Added, Changed and Fixed blocks that [0.5.0] already has, rather than opening a second set of headings the duplicate-heading guard would reject. The Added ones lead their block, because the new switch is the largest user-visible change in the section, and the summary gains a third paragraph naming it - including the one thing worth knowing before ticking it, that the router lives on the local network too. The section carries the release day, not the day the rc closed it. The internal changelog is closed the same way, except its block goes in whole with its own headings: those headings carry content and repeat by design. It is not tracked here, so this commit cannot show that half. [Unreleased] stays as a bare heading, which is the shape the release workflow checks for at tag time. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reported from the running build the day after the two LAN switches landed side by side:
"Internet only" started exactly where the "LAN mode" label ended, with nothing between them, so the
pair read as one control rather than two.
Why it happened
The BOOL branch of
form._place_onepacks its Checkbutton straight into the row:Every other kind goes through a cell that carries
padx=(0, scaled(22)). That difference had novisible consequence for as long as no two checkboxes ever shared a row - a state that lasted exactly
one day, since the registry only learned to pair them yesterday.
The fix
Both paths ask
_gap_after(field)now, so the two cannot drift apart again: a field that owns itsrow only has to clear the card's edge, two that share one get a real gap. One rule, one constant, in
the place that already decides whether a field takes a row to itself.
Measured
On real Tk at 1366x768, in both languages:
lan_modeinternet_only22 px is the same gap any other pair of fields in a row gets. Nothing is clipped, and the row still
has room to spare at the minimum supported resolution.
Guard
The test that already asserts the two share a row now also asserts they do not touch, and a
MUTATIONSentry reddens it by putting the padding-freepackcall back. The render check(buttons and checkboxes since yesterday) passes in both languages, and the fix was looked at on the
live window as well, since "they touch" is a question about pixels.