Skip to content

The window is laid out in two columns and says what a run comes to - #85

Closed
donislawdev wants to merge 4 commits into
mainfrom
gui/new-look
Closed

The window is laid out in two columns and says what a run comes to#85
donislawdev wants to merge 4 commits into
mainfrom
gui/new-look

Conversation

@donislawdev

Copy link
Copy Markdown
Owner

The owner asked for a window that is good looking and easy to use, said the
current one is not, and accepted a design before any of this was written. Nine
decisions, all taken by the owner: the scope, the window shape, how far to go
from the toolkit's own look, whether to embed a typeface, and five more from
the first draft of the design.

What changed

The form is on the left and where the files go is on the right, in a column
that does not scroll away. That column carries what the run has to say, so the
answer to a press stays beside the numbers it is about rather than being pinned
to the foot of the window. On the batch screen it also holds the manifest name
and the seed, which used to sit below every batch.

Measured before this, on the four screens: the last field ended 392 px above
the action bar on the single batch screen - 37 per cent of the window in
nothing - while the sentence somebody was waiting for was as far from the form
as it could get.

Preview and Generate move from the middle of the bar to its right hand end, and
each shows the key that presses it. Those keys have worked since 0.3.0-rc1
and the window never said so.

The lettering is Inter, static Regular and SemiBold, unmodified, under the SIL
Open Font License 1.1 read from the file at tag v4.1. Field names are smaller
and quieter than the values in them, and every measured number is set in the
monospace face - Fyne exposes no OpenType features, so tabular figures cannot
be turned on in a proportional one. The star marking a required setting is no
longer drawn in the colour a refusal uses, so red on a resting screen now means
something was actually refused.

Byte counts are grouped in threes with a space, in the window and on the
command line, from one function in core. Machine output is untouched.

The window can no longer be dragged narrower than its two columns need.

Measured

window binary before 55 052 172 B
window binary after 55 945 491 B
difference 893 319 B, 1.62 per cent
form height, single batch 566 px to 337 px
form height, presets 826 px to 594 px
form height, batches 776 px to 494 px
smallest window, before 832, 659, 820, 730 px on the four screens

Verdicts, rejected variants and the full list of what was not checked:
docs/GUI-REDESIGN-2026-09-08.md.

Three things this cost, all found by running rather than reading

Grouping the digits broke three parsers that read the human output. One was
a guard reporting that the tool refuses the minimum it advertises - it was
reading minimum 1 220 B as 1. It was right about what it saw.

The quieter field name blinded a guard. samename_test.go found field names
by their boldness, and field names stopped being bold, so its set was empty and
it passed while asking nothing. Only the mutation runner noticed, with a
NOT CAUGHT.

Embedding somebody else's font broke the premise of the asset guard, which
skipped this module because what it embeds is our own work. That stopped being
true, and the licence obliging a notice to travel with the font applied to
bytes no guard was looking at. The skip is a named list now.

Gates

  • go test ./... green, 346 s
  • python tools/journey.py - 300 of 300
  • python tools/preflight.py --quick - 12 of 12
  • python tools/mutate/staleness.py - 890 patterns, each once
  • four new mutations, all caught, plus one repaired guard proved again
  • 25 stored screens regenerated and looked at

Not done, and accepted as owed

Two approved decisions did not get built: the menu still shares its fill with a
text box, and the three radio buttons for how to say how big did not become a
segmented switch. Both are drawn in the design.

🤖 Generated with Claude Code

donislawdev and others added 4 commits September 8, 2026 07:08
… to (#85)

The form is on the left and where the files go is on the right, in a column
that does not scroll away. That column carries what the run has to say, so the
answer to a press stays beside the numbers it is about instead of being pinned
to the foot of the window. On the batch screen it also holds the manifest name
and the seed, which used to sit below every batch.

Measured before this on the four screens: the last field ended 392 px above the
action bar on the single batch screen, which is 37 per cent of the window in
nothing, while the one sentence somebody was waiting for was as far from the
form as it could get.

Preview and Generate move from the middle of the bar to its right hand end and
each now shows the key that presses it. Those keys have worked since 0.3.0-rc1
and the window never said so.

The lettering is Inter, static Regular and SemiBold, unmodified, under the SIL
Open Font License 1.1. Measured before and after: the window binary goes from
55 052 172 to 55 945 491 bytes, so 893 319 bytes or 1.62 per cent. Field names
are smaller and quieter than the values in them, and every measured number is
set in the monospace face - Fyne exposes no OpenType features, so tabular
figures cannot be turned on in a proportional face.

Byte counts are grouped in threes with a space, in the window and on the
command line, from one function in core so the two cannot spell one number two
ways. Machine output is untouched: nothing under --json or in a manifest goes
through it, and neither does the label written inside a generated file.

The window can no longer be dragged narrower than its two columns need. Fyne
has no SetMinSize on a window and takes that limit from the content's MinSize,
so the floor is something a layout has to produce - and a form inside a scroll
asks for almost nothing.

Three things this cost, all found by running rather than by reading. The
grouping broke three parsers that read the human output. The quieter field name
blinded a guard that looked for labels by their boldness, which only the
mutation runner noticed. And embedding somebody else's font broke the premise
of the asset guard, which skipped this module on the grounds that what it
embeds is our own work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The window opened at 1000x1000. That height was measured, and measured
honestly, against a single column window whose form carried the output
directory, needed 958 px and got 826 - so 1000 took a 232 px shortfall
down to 132.

The two column layout then moved the output directory into the report
column and the form lost 621 px. Nobody measured again. Measured now at
1000x1000: the Single batch form needs 337 px and the scroll it sits in
is handed 900, so the window opened with 563 px of nothing in it every
time, before anybody clicked anything.

Four changes, all of them things the accepted design already drew:

- The window opens at 1120x760, which is the size the layout was drawn
  for and clears a 1366x768 laptop. All three forms fit it, which the
  single column window never managed.

- The report column stops taking the leftover height. It drew that
  leftover as a panel, with a fill and a heading on it, so at 1120x760
  it was a 414 px box around 28 px of words. A panel is a promise that
  something is inside it, and empty background makes no promise at all.
  About keeps the filling behaviour under its own name, because a
  scroll has no height of its own and has to be told one.

- The form lines up on the left edge instead of being centred. Centring
  was right while the form was the only thing on the screen. With a
  report column pinned to the right, half the width is already spoken
  for, and centring in the rest put a 152 px margin on the left with
  nothing to answer it - measured at 1520 px wide, where the screen
  title sat that far in from the tabs above it.

- The action bar runs the full width, so the buttons that start a run
  reach the edge they were moved to on 2026-09-08. A greedy spacer only
  reaches the end of the thing it is in, and the thing it was in was
  the form's 820 px column, which left them 156 px short.

The two remembered size keys carry a suffix now, which is the one time
forgetting the owner asked for: a size remembered for the old form is
not a size for this one, and a remembered size beats every default, so
a new opening size would never have reached anybody who had resized the
window. Renamed rather than deleted - untouchable rule 7 read literally.

Screen references regenerated and read: the only tree change is the
action bar going from pos 128 width 820 to pos 6 width 1064, and About
changed in that one place and nowhere else, which is what says the
renamed column function is a no-op there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The window could not answer "what am I about to do" until somebody
pressed a button. The panel on the right held one sentence naming the
output directory, so with the report column no longer taking the
leftover height it hugged 28 px of words - which is honest and still
almost empty.

It now carries what the settings add up to: how many files, in what
format, and how big each one is, with the readable size and the exact
byte count one under the other. A preview adds the two numbers only a
plan can give, the total and the room left on the disk.

Every number is READ rather than worked out, which is G1. A count is
the length of the list of sizes the engine built, a format is the one
the target carries, and a size is what core.ParseSize already turned
the box into. The total stays behind Preview on the owner's decision,
against the alternative of planning on every keystroke - at 25 000
files that is a plan per keypress.

It says nothing at all about a form that will not settle. Numbers left
standing beside a half typed size would describe a run nobody asked
for, which is the rule ByteCount already follows for a box holding
something that is not a size.

The menu loses its fill and keeps its edge, which is the owner's
decision B of 2026-09-08. A menu and a box to type in shared one
colour to the byte and one corner radius, so only an arrow and a width
told them apart. Measured before it went in: the edge is #55555C on
#2A2A2D, 1.93:1, and the fill it replaces was 1.23:1 against the same
panel - so nothing on that menu was ever above 2, and raising the edge
to 3:1 would make every menu louder than every box beside it.

Two defects this turned up, both in things that walk a screen:

- A field is a name beside a control and a reported fact is a name
  beside a value, so a search for a field by its name found the report
  line instead. Twenty four guards said "the format field is a Label"
  about screens whose format field is a menu. The panel now says which
  it is - parts.IsReport - and the walks that look for form fields go
  past it. Getting that wrong the first time was instructive: the prune
  was dropped by walkUnknown, which every screen goes through, so it
  did nothing at all.

- Wrapping the chooser in a theme left WithRing looking at the wrapper
  rather than at the menu, so the menu was never handed its ring and
  drew no edge at rest. It came out as a word with an arrow and no
  boundary. Nothing went red, because a ring nobody wired has no state
  to draw and so has nothing to be wrong about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The two column layout is out. Everything that stood beside the form
stands under it again: the output settings, and the panel saying what
the run comes to.

The window follows the shape rather than the other way round. One
column makes the form taller and needs none of the width, measured
right after the change with tools/probes/formheight - 864 px for
Single batch, 1008 for Presets, 847 for Several batches. So the window
opens at 900x1000 instead of 1120x760: 900 is ColumnWidth plus a margin
either side, and anything wider is margin and nothing else, because the
column will not grow past 820. Single batch and Several batches fit it.
Presets still scrolls by about 50 px, which it has always done - it
carries a list whose length is the preset's rather than ours.

The column is centred again. It went left for one afternoon, because a
report column pinned to the right edge meant centring in what remained
put a margin on the left with nothing to answer it. That layout is
gone, so the reason went with it.

What the report panel says is kept, and it is the part of the last two
days worth keeping: how many files, in what format, how big each one
is, and after a preview the total and the room left on the disk. It is
a panel among panels now, as tall as what it says.

ReportColumn is About's alone. That screen has real content on both
sides - what the program is, and what it carries - so it stays as it
was, and its last child still takes the leftover height because a
scroll has none of its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@donislawdev

Copy link
Copy Markdown
Owner Author

Closing this. The owner asked to go back to the window as it stands on main, so the two column rebuild is dropped rather than merged.

The one part of it that was not about the window has been lifted onto its own branch and is in #86: byte counts grouped in threes.

Nothing here is lost. The branch tip is 93bbadd and the commits stay reachable by that hash, so if the window is rebuilt later this is where the measurements live.

Why it was dropped is worth recording, because it is a process finding rather than a code one: the design was drawn as an HTML page and the toolkit cannot draw what a browser can. Fyne v2.8.1 offers two font weights, no OpenType features and no letter spacing, and it fills its own widgets - so the mockup set an expectation the window could never meet, twice. A design for this window has to be a render from tools/probes/guirender, which is the real widget tree, and not a page.

@donislawdev donislawdev closed this Sep 8, 2026
@donislawdev
donislawdev deleted the gui/new-look branch September 8, 2026 06:58
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