feat(builder): a UI overhaul — the launcher page, and one design for every page #1759

Open
isaiahbenj94-star wants to merge 8 commits from isaiahbenj94-star/feat/launcher-hero-page into main
isaiahbenj94-star commented 2026-11-10 15:50:20 +00:00 (Migrated from github.com)

Why

The community drew a mockup of what the game folder's launcher should look like (green hookshot rail, hero with a Play disc,
"Build & Update", the version chain, and a status line that says what just happened). This PR builds that page for both
launcher implementations — the Qt builder (Windows) and the Tk builder in the Linux AppImage — and gives the rest of the Qt
builder the launcher's frame too, so the whole window reads as one design.

(On the Linux side, main already took the Tk builder to its own dark Slate theme — dark cards, Inter, Play's green. This PR
now sits on top of that: it keeps main's theme for the form and progress pages, and adds the mockup launcher page to it. The
branch includes a merge of main.)

What changes

  • The launcher page (--launch <game folder>) in both builders: green rail with the hookshot and the game's version, the
    hero, the Play disc over it, "Build & Update" with the version chain over a scrim, and the "Hookshot: …" strip along the
    foot with the mockup's sentences.
    The hero picture is the player's own file, never ours: <game folder>/hookshot_hero.png when the folder has one, a
    generated dusk-green gradient otherwise. No game art ships in the builder (CONTRIBUTING, "the rule with no exceptions").
  • The same chrome on every page of the Qt builder: the green rail at the left and a dark strip along the foot that carries
    each page's action row — Build/Play, Show log/Cancel, Open/Play, Back/Repair. The chrome stands down for the launch page,
    which draws its own pair inside, and the body takes the whole width back for it.
  • A guard test (tests/test_builder_launch_hero.py, text-based like the other builder tests): the hero is read from the
    game folder only; no hero art ships anywhere under builder/; both builders draw the mockup's words; the Qt pages share the
    chrome; the preview fakes folder names, not game data.

Screenshots

The launcher page as the mockup draws it (Qt offscreen previews; the chain shows the preview's made-up tags):

shot_launcher_up_to_date shot_launcher_update_available

With the player's own hero picture (a generated placeholder — no game data):

shot_launcher_hero_image

The rest of the Qt builder, same frame (offscreen previews):

shot_qt_files_page shot_qt_build_page shot_qt_ready_page shot_qt_problem_page

The Linux (Tk) launcher, live under Xwayland with the AppImage's own Python, both states:

shot_linux_tk_up_to_date shot_linux_tk_update_available

Tests

  • python -I -B tests/test_builder_launch_hero.py — new, passes.
  • python -I -B tests/run_all.py builder — the existing builder checks (jobs, scaling, status lines...) still pass; their
    greps still match.
  • The Tk launcher was run for real with the AppImage's own Python against a made-up game folder (names only, no game data);
    Play, Update, the version chain and a hookshot_hero.png from the folder all behave.
## Why The community drew a mockup of what the game folder's launcher should look like (green hookshot rail, hero with a Play disc, "Build & Update", the version chain, and a status line that says what just happened). This PR builds that page for both launcher implementations — the Qt builder (Windows) and the Tk builder in the Linux AppImage — and gives the rest of the Qt builder the launcher's frame too, so the whole window reads as one design. (On the Linux side, main already took the Tk builder to its own dark Slate theme — dark cards, Inter, Play's green. This PR now sits on top of that: it keeps main's theme for the form and progress pages, and adds the mockup launcher page to it. The branch includes a merge of main.) ## What changes - **The launcher page** (`--launch <game folder>`) in both builders: green rail with the hookshot and the game's version, the hero, the Play disc over it, "Build & Update" with the version chain over a scrim, and the "Hookshot: …" strip along the foot with the mockup's sentences. **The hero picture is the player's own file, never ours:** `<game folder>/hookshot_hero.png` when the folder has one, a generated dusk-green gradient otherwise. No game art ships in the builder (CONTRIBUTING, "the rule with no exceptions"). - **The same chrome on every page of the Qt builder**: the green rail at the left and a dark strip along the foot that carries each page's action row — Build/Play, Show log/Cancel, Open/Play, Back/Repair. The chrome stands down for the launch page, which draws its own pair inside, and the body takes the whole width back for it. - **A guard test** (`tests/test_builder_launch_hero.py`, text-based like the other builder tests): the hero is read from the game folder only; no hero art ships anywhere under `builder/`; both builders draw the mockup's words; the Qt pages share the chrome; the preview fakes folder names, not game data. ## Screenshots The launcher page as the mockup draws it (Qt offscreen previews; the chain shows the preview's made-up tags): <img width="960" height="600" alt="shot_launcher_up_to_date" src="https://github.com/user-attachments/assets/a809c93a-dae0-4cec-9299-81e6bdb7493e" /> <img width="960" height="600" alt="shot_launcher_update_available" src="https://github.com/user-attachments/assets/e2156ca0-ae05-406f-ba8a-3165500f288d" /> With the player's own hero picture (a generated placeholder — no game data): <img width="960" height="600" alt="shot_launcher_hero_image" src="https://github.com/user-attachments/assets/b2bc5f70-1797-415c-9d32-bec8ca2925fc" /> The rest of the Qt builder, same frame (offscreen previews): <img width="960" height="600" alt="shot_qt_files_page" src="https://github.com/user-attachments/assets/3f475f6c-e42e-4640-a713-42dc3ab33b5a" /> <img width="960" height="600" alt="shot_qt_build_page" src="https://github.com/user-attachments/assets/579ed943-ae46-4969-b3cb-79f4afa4338f" /> <img width="960" height="600" alt="shot_qt_ready_page" src="https://github.com/user-attachments/assets/9f61d056-3c8d-4502-934c-d7a5771b244e" /> <img width="960" height="600" alt="shot_qt_problem_page" src="https://github.com/user-attachments/assets/03e236fc-bf77-4a42-a5f0-6e5f955bf943" /> The Linux (Tk) launcher, live under Xwayland with the AppImage's own Python, both states: <img width="900" height="560" alt="shot_linux_tk_up_to_date" src="https://github.com/user-attachments/assets/2c379e93-b388-4d38-a5d4-beaec2feec38" /> <img width="900" height="560" alt="shot_linux_tk_update_available" src="https://github.com/user-attachments/assets/47ca934a-4618-4c7b-8e6b-2338b6a710fb" /> ## Tests - `python -I -B tests/test_builder_launch_hero.py` — new, passes. - `python -I -B tests/run_all.py builder` — the existing builder checks (jobs, scaling, status lines...) still pass; their greps still match. - The Tk launcher was run for real with the AppImage's own Python against a made-up game folder (names only, no game data); Play, Update, the version chain and a `hookshot_hero.png` from the folder all behave.
hckrman101 (Migrated from github.com) reviewed 2026-11-10 16:41:43 +00:00
hckrman101 (Migrated from github.com) left a comment
No description provided.
Looks good. I read through launch_page.py, the window.py wiring and the Tk page; the hero is only ever read from `<folder>/hookshot_hero.png`, the preview folder is made-up file names only, `paths.write_small` / `self.hook` / `game_ready` all exist, and the new test is picked up by run_all's `test_*.py` discovery. The screenshots use a generated placeholder, so nothing from the game ships. Nits, none blocking: - Tk page: `tk.PhotoImage(file=picture)` raises TclError if `hookshot_hero.png` is corrupt or not a PNG/GIF, and that would break the launcher page. A try/except falling back to the gradient would be safer (the Qt side already handles a null pixmap). - Tk page: the hero is only zoomed up, never scaled down, so a normal screenshot (1080p/4K) is just centre-cropped to the 650x560 canvas instead of cover-fit as the description says. Fine for a first cut. - Qt: `set_color(self.launch_version, "White")` on the update chain is never reset to InkSoft if the launcher is shown again for another folder in the same session. Only matters in preview/dev. - The tests are source-string checks, so they guard the rule but not behaviour. That's fine for the no-game-art rule. CI hasn't run on this branch (no checks reported), so a Windows run of `--launch <folder>` as you suggested is still worth one look before merging.
hckrman101 commented 2026-11-10 17:13:40 +00:00 (Migrated from github.com)

Can you fix the screenshot links

Can you fix the screenshot links
hckrman101 commented 2026-11-10 17:15:29 +00:00 (Migrated from github.com)

I've withdrawn my approval for now, sorry for the back and forth. The page itself still looks good to me. The issue is the screenshots:

  • They're committed as docs/launcher/*.png, so merging this would put five PNGs in the repo permanently just to illustrate the PR. They aren't referenced by any docs page.
  • The description links them with relative paths (docs/launcher/up_to_date.png), which GitHub doesn't resolve in a PR description, so they show up broken.

Could you drag the images into the PR description instead (GitHub hosts them then) and drop the docs/launcher/ files from the commit? I'll re-approve once that's done.

I've withdrawn my approval for now, sorry for the back and forth. The page itself still looks good to me. The issue is the screenshots: - They're committed as `docs/launcher/*.png`, so merging this would put five PNGs in the repo permanently just to illustrate the PR. They aren't referenced by any docs page. - The description links them with relative paths (`docs/launcher/up_to_date.png`), which GitHub doesn't resolve in a PR description, so they show up broken. Could you drag the images into the PR description instead (GitHub hosts them then) and drop the `docs/launcher/` files from the commit? I'll re-approve once that's done.
hckrman101 commented 2026-11-10 17:50:29 +00:00 (Migrated from github.com)

Heads-up: this conflicts with main now (a lot landed today). Could you merge main into the branch (or rebase) and resolve the conflicts? Thanks!

Heads-up: this conflicts with main now (a lot landed today). Could you merge main into the branch (or rebase) and resolve the conflicts? Thanks!
isaiahbenj94-star commented 2026-11-10 19:34:04 +00:00 (Migrated from github.com)

Screenshots posted, and code cleaned!

Screenshots posted, and code cleaned!
hckrman101 (Migrated from github.com) reviewed 2026-11-10 20:51:22 +00:00
hckrman101 (Migrated from github.com) left a comment

Thanks for adding the screenshots to the description, they render now. The PNGs are still in the PR though, so I can't re-approve yet.

The PR's files still list nine PNGs:

  • docs/launcher/: hero_image.png, linux_tk_up_to_date.png, linux_tk_update_available.png, up_to_date.png, update_available.png
  • docs/overhaul/: qt_build_page.png, qt_files_page.png, qt_problem_page.png, qt_ready_page.png

The latest commit only modified the docs/launcher/ ones and removed two from docs/overhaul/; the files are still there, and they live in the earlier commits' history too. Nothing links to them now that the description uses GitHub-hosted images, so they only add weight to the repo. Please delete all nine (docs/launcher/*.png and docs/overhaul/*.png). Because history would still hold them if merged as separate commits, either squash the branch, or rebuild it without the screenshot commits (5ad96253, e701e369 and the overhaul commit 70db3016 add them) so no commit adds a PNG. If this gets squash-merged, deleting the files in a final commit is enough.

The code changes since my approval look fine: the Tk rail now lays the logo over the gradient with subsample and falls back to the flattened copy on an older Tk, and the Qt launch page takes the full body width back while the chrome is hidden. No new issues there. The nits from my first review (corrupt hero PNG in Tk, hero only zoomed up) are unchanged and still non-blocking.

No CI checks have been reported on this branch; the PR is mergeable. Once the PNGs are out I'll approve.

Thanks for adding the screenshots to the description, they render now. The PNGs are still in the PR though, so I can't re-approve yet. The PR's files still list nine PNGs: - `docs/launcher/`: `hero_image.png`, `linux_tk_up_to_date.png`, `linux_tk_update_available.png`, `up_to_date.png`, `update_available.png` - `docs/overhaul/`: `qt_build_page.png`, `qt_files_page.png`, `qt_problem_page.png`, `qt_ready_page.png` The latest commit only modified the `docs/launcher/` ones and removed two from `docs/overhaul/`; the files are still there, and they live in the earlier commits' history too. Nothing links to them now that the description uses GitHub-hosted images, so they only add weight to the repo. Please delete all nine (`docs/launcher/*.png` and `docs/overhaul/*.png`). Because history would still hold them if merged as separate commits, either squash the branch, or rebuild it without the screenshot commits (`5ad96253`, `e701e369` and the overhaul commit `70db3016` add them) so no commit adds a PNG. If this gets squash-merged, deleting the files in a final commit is enough. The code changes since my approval look fine: the Tk rail now lays the logo over the gradient with `subsample` and falls back to the flattened copy on an older Tk, and the Qt launch page takes the full body width back while the chrome is hidden. No new issues there. The nits from my first review (corrupt hero PNG in Tk, hero only zoomed up) are unchanged and still non-blocking. No CI checks have been reported on this branch; the PR is mergeable. Once the PNGs are out I'll approve.
Joey-Magnus (Migrated from github.com) requested changes 2026-11-11 21:46:06 +00:00
Joey-Magnus (Migrated from github.com) left a comment

The nine screenshots are still in the PR: five in docs/launcher/*.png and four in docs/overhaul/*.png, added by 5ad96253, e701e369 and 70db3016. Screenshots belong in the description, which you've already done, not in the repo. Please rebuild the branch without those commits, or squash it, so no commit adds a PNG.

Other points:

  • builder/linux/hookshot_builder.py conflicts with main. Several Linux builder fixes landed in that file since (#2485, #2406, #2279, #2150), and the Tk launcher page is the Linux Play path, so this needs a careful merge.
  • hookshot_builder.py:930: tk.PhotoImage(file=picture) still has no try/except. A corrupt or renamed hookshot_hero.png raises TclError and takes the launcher page down. Falling back to the gradient would fix it.
  • The Windows release ships the .NET WPF builder (dotnet publish in windows-builder.yml), and no workflow builds the Qt builder. So "one design for every page" doesn't reach Windows players; it only reaches Linux and the Qt port. Whether the WPF builder should follow is a maintainer call.
The nine screenshots are still in the PR: five in `docs/launcher/*.png` and four in `docs/overhaul/*.png`, added by 5ad96253, e701e369 and 70db3016. Screenshots belong in the description, which you've already done, not in the repo. Please rebuild the branch without those commits, or squash it, so no commit adds a PNG. Other points: - builder/linux/hookshot_builder.py conflicts with main. Several Linux builder fixes landed in that file since (#2485, #2406, #2279, #2150), and the Tk launcher page is the Linux Play path, so this needs a careful merge. - hookshot_builder.py:930: `tk.PhotoImage(file=picture)` still has no try/except. A corrupt or renamed `hookshot_hero.png` raises TclError and takes the launcher page down. Falling back to the gradient would fix it. - The Windows release ships the .NET WPF builder (`dotnet publish` in windows-builder.yml), and no workflow builds the Qt builder. So "one design for every page" doesn't reach Windows players; it only reaches Linux and the Qt port. Whether the WPF builder should follow is a maintainer call.
hckrman101 commented 2026-11-11 22:55:35 +00:00 (Migrated from github.com)

This now conflicts with main in builder/linux/hookshot_builder.py. Could you merge main into the branch (or rebase) when you get a chance? I'll take another look once it's up to date.

This now conflicts with main in `builder/linux/hookshot_builder.py`. Could you merge main into the branch (or rebase) when you get a chance? I'll take another look once it's up to date.
Commenting is not possible because the repository is archived.
No description provided.