Add an image tile view to Sliding Puzzle - #575
Merged
mpiorowski merged 5 commits intoSep 8, 2026
Merged
Conversation
Signed-off-by: John Moorman <45500240+mojoro@users.noreply.github.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.
Summary
i, leaving the board, moves, persistence, and reward contract untouchedpre_frame_persistent_raster_wipe_bytes), covering iTerm2 and non-modal placements, and addstream_modal/history_modalto the raster overlay lists so they matchforeground_terminal_overlay_openApp::content_area,arcade::ui::SHOW_GAME_BOTTOM_BAR) shared by the draw path, mouse hit-testing, and the pre-frame wipe, replacing the hand-rolled layout inarcade/input.rsReview
clippy::needless_lifetimeserror that would have failed CI; anImageTiles::releaseleak where a request still in flight when the board closed left its whole encoded set buffered in the channel for the rest of the session; two wipe tests that passed through the modal-close trigger rather than the trigger they named; a duplicatedMAX_DECODED_IMAGE_PIXELS; stale Sixel-only doc comments after the rename;tick.rsre-deciding the bottom-bar literal instead of readingSHOW_GAME_BOTTOM_BAR; and two defensive guards (zero tile geometry,saturating_subin the label centering)non_modal_image_changed/protocol_changedterms now fails all three wipe tests, where two previously stayed greenKnown gaps, flagged rather than fixed
preserveAspectRatio=1, so on a terminal whose cell metrics differ, a tile's raster can bleed into a neighbour that the fast path never repaints. Previously any change re-emitted every placement, which masked it; this is also the first multi-placement non-modal scene in the app. Happy to gate the fast path to Kitty, or re-emit the full set for iTerm2/Sixel, if you'd prefer.opaque_replacement_has_same_coverageguards the old-vs-new pair at each index but does not check for collisions between two placements in the same frame.2 * 5²= 50 images, each with a PNG and, on Sixel, a payload bounded only by the per-imageSIXEL_MAX_BYTES. Realistic photos land far below the structural ceiling, but nothing checks the total.PLACEHOLDER_IMAGE_URLShardcodes three signedfastly.picsum.photosURLs. Lorem Picsum has no SLA, no published terms, and no rate-limit policy, and thehmacparams come from their signing key — a rotation on their side 403s all three at once and everyone drops to numbered tiles. Every other Arcade asset is embedded at build time withinclude_bytes!; doing the same here would delete the runtime dependency, the per-session download, and thefile://path together, but it needs an artwork/licensing call from you first. Recorded inlate-ssh/src/app/arcade/CONTEXT.mdunder known gaps.artwork/sliding-puzzle/ships only aREADME.mdand a.gitignore— it is a Compose-bind-mount dev affordance, not a runtime path; no Dockerfile stage copies it.Verification
cargo fmt -p late-cli -p late-core -p late-ssh -p late-web -p late-webview -- --check— cleancargo clippy -p late-ssh -p late-core --all-targets --features otel -- -D warnings— cleancargo nextest run -p late-ssh -p late-core --all-targets— 3395 passed, 8 skippedfile://tests use temporary directories, and everypolltest runs outside a Tokio runtime so nothing spawnsEnvironment note
make checkcould not complete on this host: the workspace clippy build needsatk/gdk-3.0forlate-webview, and only GTK4 is installed here (same gap as #551). The scoped runs above cover every package this branch touches —late-webviewis untouched — and CI installslibwebkit2gtk-4.1-dev, so the workspace build is covered there. No system package was installed for this PR.