The window is laid out in two columns and says what a run comes to - #85
The window is laid out in two columns and says what a run comes to#85donislawdev wants to merge 4 commits into
Conversation
… 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>
|
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. |
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-rc1and 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 smallerand 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
55 052 172 B55 945 491 B893 319 B, 1.62 per cent566 pxto337 px826 pxto594 px776 pxto494 px832,659,820,730 pxon the four screensVerdicts, 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 Bas1. It was right about what it saw.The quieter field name blinded a guard.
samename_test.gofound field namesby 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 spython tools/journey.py- 300 of 300python tools/preflight.py --quick- 12 of 12python tools/mutate/staleness.py- 890 patterns, each onceNot 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