From 59f1817063960ce56c33ce5bccb12d059a0ade8e Mon Sep 17 00:00:00 2001 From: Ryan Kegel Date: Thu, 22 Oct 2026 16:18:25 -0400 Subject: [PATCH] Add StageBackgroundView and related tests for plain background functionality - Implemented StageBackgroundView class for managing sky and plain backgrounds in the stage. - Added functionality to set background type and color, bind camera, and apply themes. - Created test_phase19_plain_background.gd to validate plain background behavior and migration. - Developed test_phase19_starter_chooser_layout.gd to ensure proper layout and functionality of the starter chooser. - Included visual capture tests for UI elements and interactions. --- content/stages/starters/blank.scene | 6 +- .../stages/starters/plain_background.scene | 11 + .../tech_debt_and_optimizations.md | 3 + docs/ideas/feature_backlog.md | 2 + .../01_new_scene.png | Bin 0 -> 75257 bytes .../01_new_scene.svg | 78 +++ .../02_background_picker.png | Bin 0 -> 73432 bytes .../02_background_picker.svg | 74 +++ .../03_color_choices.png | Bin 0 -> 50682 bytes .../03_color_choices.svg | 45 ++ .../04_custom_color_picker.png | Bin 0 -> 73238 bytes .../04_custom_color_picker.svg | 49 ++ .../05_large_starter_chooser.png | Bin 0 -> 140112 bytes .../05_large_starter_chooser.svg | 92 +++ docs/plans/phase_19_plain_background.md | 130 +++++ docs/specs/phase_19_plain_background.md | 118 ++++ docs/specs/phase_19_plain_background_ui_ux.md | 99 ++++ .../phase_19_scenery_backgrounds_ui_ux.md | 2 + sandbox_theme.json | 30 +- scripts/editors/stage/sandbox_stage.gd | 229 +++++++- scripts/editors/stage/stage_asset_browser.gd | 56 +- scripts/editors/stage/stage_scene_adapter.gd | 4 + .../stage_ui/stage_surface_color_controls.gd | 16 +- .../stage_surface_color_picker_view.gd | 15 + scripts/shared/ui/asset_card.gd | 56 +- scripts/shared/ui/asset_selector.gd | 531 +++++++++++++++--- scripts/shared/ui/color_swatch_selector.gd | 2 +- scripts/stage/sandbox_theme.gd | 52 ++ .../scenery/stage_background_card_preview.gd | 18 +- .../stage/scenery/stage_background_view.gd | 74 +++ .../scenery/stage_background_view.gd.uid | 1 + .../scenery/stage_starter_card_preview.gd | 54 +- .../stage/scenery/stage_surface_preview.gd | 6 +- scripts/stage/stage_gizmos.gd | 35 +- scripts/stage/stage_grid.gd | 36 +- scripts/stage/stage_scene_io.gd | 34 +- tests/test_phase17b_use_spots.gd | 7 +- tests/test_phase19_plain_background.gd | 430 ++++++++++++++ tests/test_phase19_plain_background.gd.uid | 1 + tests/test_phase19_scenery.gd | 17 +- tests/test_phase19_starter_chooser_layout.gd | 144 +++++ ...test_phase19_starter_chooser_layout.gd.uid | 1 + tests/test_phase19_surface_followup.gd | 5 +- 43 files changed, 2403 insertions(+), 160 deletions(-) create mode 100644 content/stages/starters/plain_background.scene create mode 100644 docs/plans/assets/phase_19_plain_background/01_new_scene.png create mode 100644 docs/plans/assets/phase_19_plain_background/01_new_scene.svg create mode 100644 docs/plans/assets/phase_19_plain_background/02_background_picker.png create mode 100644 docs/plans/assets/phase_19_plain_background/02_background_picker.svg create mode 100644 docs/plans/assets/phase_19_plain_background/03_color_choices.png create mode 100644 docs/plans/assets/phase_19_plain_background/03_color_choices.svg create mode 100644 docs/plans/assets/phase_19_plain_background/04_custom_color_picker.png create mode 100644 docs/plans/assets/phase_19_plain_background/04_custom_color_picker.svg create mode 100644 docs/plans/assets/phase_19_plain_background/05_large_starter_chooser.png create mode 100644 docs/plans/assets/phase_19_plain_background/05_large_starter_chooser.svg create mode 100644 docs/plans/phase_19_plain_background.md create mode 100644 docs/specs/phase_19_plain_background.md create mode 100644 docs/specs/phase_19_plain_background_ui_ux.md create mode 100644 scripts/stage/scenery/stage_background_view.gd create mode 100644 scripts/stage/scenery/stage_background_view.gd.uid create mode 100644 tests/test_phase19_plain_background.gd create mode 100644 tests/test_phase19_plain_background.gd.uid create mode 100644 tests/test_phase19_starter_chooser_layout.gd create mode 100644 tests/test_phase19_starter_chooser_layout.gd.uid diff --git a/content/stages/starters/blank.scene b/content/stages/starters/blank.scene index b59e1db..056438a 100644 --- a/content/stages/starters/blank.scene +++ b/content/stages/starters/blank.scene @@ -1,7 +1,9 @@ { - "version": "1.5", - "scene_name": "Blank Scene", + "version": "1.7", + "scene_name": "Open Sky", "sky_id": "sky_neutral", + "background_kind": "sky", + "plain_color": "#F5EFE0", "camera": {"position": {"x": 0.0, "y": -400.0}, "zoom": 0.5}, "objects": [], "event_rules": [], diff --git a/content/stages/starters/plain_background.scene b/content/stages/starters/plain_background.scene new file mode 100644 index 0000000..6b6d8e8 --- /dev/null +++ b/content/stages/starters/plain_background.scene @@ -0,0 +1,11 @@ +{ + "version": "1.7", + "scene_name": "Plain Background", + "sky_id": "sky_neutral", + "background_kind": "plain", + "plain_color": "#F5EFE0", + "camera": {"position": {"x": 0.0, "y": -400.0}, "zoom": 0.5}, + "objects": [], + "event_rules": [], + "metadata": {"created_unix": 1792022400, "modified_unix": 1792022400, "autosave": false, "source_path": ""} +} diff --git a/docs/architecture/tech_debt_and_optimizations.md b/docs/architecture/tech_debt_and_optimizations.md index 380709f..54961bd 100644 --- a/docs/architecture/tech_debt_and_optimizations.md +++ b/docs/architecture/tech_debt_and_optimizations.md @@ -87,6 +87,7 @@ This document tracks known technical debt, optimization opportunities, and minor | 75 | **Old Brick/Wood wall colors were saved but not rendered** — v1.5 walls can carry the old default green while their brick and wood palettes were hard-coded. | Low | Planned migration | Scene v1.6 migration replaces only the old green placeholder on pre-v1.6 Brick/Wood entries with natural finish defaults; Paint and non-placeholder colors remain. The exact placeholder could have been intentionally authored in an older file, which cannot be distinguished retrospectively. New v1.6 colors are authoritative, including green Brick/Wood. See `docs/specs/phase_19_background_ground_and_wall_color.md`. (2026-10-17) | | 76 | **Camera-aware Sky redraws vector motifs while framing changes** — the former static Sky drew motifs only when the preset or viewport changed. | Low | Planned | The Phase 19 Sky addition keeps one screen-space `StageSkyView`, redraws only when a bound camera's effective framing changes, and caches reusable cloud/moon curve samples where practical. Measure sustained pan/zoom cost in a rendered Stage before adding a raster or shader path. The fixed reference frame and bounded response can saturate at distant camera positions; that is an accepted composition trade-off, not scene state to persist. See `docs/specs/phase_19_scenery_backgrounds_surface_finishes.md#phase-19-addition-camera-aware-sky-details`. (2026-10-21) | | 77 | **Starter surfaces guarantee a finite pan envelope, not arbitrary camera framing** — the two bundled sets use a fixed authored width to keep their scene data simple. | Low | Implemented; visual review pending | The authored envelope is a 1,280-logical-pixel viewport at zoom 0.5, ±1,000 world units of travel, and 100 units of margin per side. User review prompted an opaque Town Grass Background ground and separate scale-1 tile rows. Twenty-five 192-unit tiles cover the 4,760-unit minimum; Asphalt has 27 tiles (5,184 units) so the road extends one tile beyond the sidewalk at both ends. Navigation merges contiguous tile tops and routes the 32-unit curb step at the exposed ends without merging Ground objects or colliders. The focused suite passes 515 assertions, including the curb step and PLAY landing. The camera remains unrestricted, so wider viewports, farther pans, and zoomed-out shots can reveal finite ends. Rendered seam review remains pending. See docs/specs/phase_19_starter_scene_composition.md. (2026-10-21) +| 78 | **Plain Background adds a second backdrop kind while Sky remains a separate renderer** — live Stage, starter previews, and chooser cards must agree on kind and remembered color. | Medium | Spec prepared; implementation pending | Phase 19 composes one shared `StageBackgroundView` from the existing Sky view and an opaque fill. Scene v1.7 stores active kind, last Sky ID, and confirmed plain color; all older scenes migrate as Sky. `SandboxStage` owns the transient custom-picker draft, which must never enter Save or autosave. The existing chooser's four-Sky layout and 42 px compact swatches need targeted extension, and grid/gizmo contrast needs theme-backed treatment for light and dark fills. Rendered pan/zoom/resize, legacy migration, and every draft-cancel exit remain verification gates. See `docs/specs/phase_19_plain_background.md`. (2026-10-22) | --- @@ -188,4 +189,6 @@ This document tracks known technical debt, optimization opportunities, and minor | 2026-10-21 | Implemented the approved starter-scene composition spec. Town Street and Living Room now use continuous 4,760-unit support surfaces, aligned bases, and camera-derived starter-card framing; both edited scene files use current v1.6. The focused production-load/save-reopen/PLAY composition test passed 177 assertions, with measured visible-contact geometry within 0.225 logical pixels. The broader scenery suite exits 1 on nine other background-card and wall-erasure/capture-bar assertions, while the new surface assertions pass. GUI capture exited 134 and headless capture produced no image, so rendered-pixel checks, pan-endpoint seam inspection, narrow viewport/zoom-in framing, and user/editor verification remain pending. Updated #77 from planned to implemented with the finite-camera limitation accepted. See `docs/specs/phase_19_starter_scene_composition.md`. | 2026-10-21 | Revised the starters after the user's Town Street screenshot exposed Sky clouds below the skyline and the user rejected oversized scaled Ground blocks. Added an opaque Grass Background ground, replaced the sidewalk and both starter floors with scale-1 tile rows, and extended Asphalt by one tile at each end so the road is accessible. The focused production-path test passed 515 assertions, including navigation across tile seams, sidewalk-to-road routing, and a PLAY actor landing grounded on Asphalt. The broader scenery suite still exits 1 on the same nine Sky-preview/gallery and Scenery-edit UI assertions observed before this revision; its new surface assertions pass. A bounded GUI capture exited 134 without an image, so rendered pixels, pan endpoints, card previews, narrow viewport/zoom-in states, and user/editor review remain pending. See `docs/specs/phase_19_starter_scene_composition.md`. +| 2026-10-22 | Prepared and revised the Phase 19 Plain Background architecture specification (`docs/specs/phase_19_plain_background.md`) for final user sign-off. The accepted composed Stage backdrop view serves live Stage and previews; scene v1.7 persists active kind, last Sky ID, and confirmed plain color while migrating all older scenes as Sky. Color drafts stay out of Save/autosave, and theme-backed grid and two-tone gizmo overlays address light fills without changing art. Per user feedback, the current-color chip is the sole custom-picker entry, the separate More colors button is removed, and the custom picker uses a simple Preview label without a temporary-state helper message. Logged #78 for the chooser extension and rendered verification gates. No runtime code or tests changed. | + _End of Log_ diff --git a/docs/ideas/feature_backlog.md b/docs/ideas/feature_backlog.md index 66a26bc..1eac0b2 100644 --- a/docs/ideas/feature_backlog.md +++ b/docs/ideas/feature_backlog.md @@ -50,6 +50,8 @@ Priorities are recommendations for discussion, not a committed release schedule. 16. **Gentle camera-aware Sky details** — **Status:** Planned · **Suggested priority:** Medium. **Plan:** [Phase 19 — Scenery, Backgrounds, and Surface Finishes, camera-aware Sky addendum](../plans/phase_19_scenery_backgrounds_surface_finishes.md#camera-aware-sky-details-addendum). **Intent:** Let clouds, sun, moon, and stars respond gently and automatically to Stage camera pan and zoom while the Sky gradient always fills the screen. Children choose a Sky and direct the scene without adjusting a motion control. **Rationale:** A small amount of camera response connects the Sky details to a dramatic shot while keeping them visually distant and avoiding a new child-facing setting. Each preset can tune its own response so details stay composed, clear of the main action, and inside the viewport. Background ground remains world-anchored and supplies the horizon. Keep the response bounded across EDIT, DIRECT, PLAY, viewport resize, and saved camera framing; do not add a slider or make Sky details establish a ground line. **Connections:** Scenery backlog item 5, Backdrop horizon and edge treatment (backlog item 13), `scripts/stage/scenery/stage_sky_view.gd`, `scripts/stage/scenery/stage_background_ground.gd`, `scripts/editors/stage/sandbox_stage.gd`. +17. **Plain Background starter and editable solid background** — **Status:** Planned · **Suggested priority:** High. **Plan:** [Phase 19 — Plain Background](../plans/phase_19_plain_background.md). **Intent:** Add **Plain Background** as a fourth card in New Scene, alongside **Open Sky**, Town Street, and Living Room. It opens an empty Stage with no Sky imagery, Ground, or objects, then lets children choose a solid full-screen background color in EDIT. Rename the current empty starter with its neutral Sky to **Open Sky** so the two choices are distinct. **Rationale:** The current Blank Scene has no objects but displays a gray gradient, sun, and clouds, so it does not feel completely empty. A plain color makes the empty canvas intentional while keeping Sky presets available for other scenes. Give the Plain Background card a distinct flat-color preview. Place the color choice beside Sky in the existing Scenery → Backgrounds flow. Treat the background as scene-wide rather than a selectable rectangle, reuse the look of the existing Stage color chooser and its recent/preset swatches, and preserve the selected plain color across save/reopen and when temporarily switching to a Sky. Existing scenes with `sky_neutral` should retain their current appearance. **Connections:** Scenery backlog item 5, `content/stages/starters/blank.scene`, `scripts/editors/stage/stage_asset_browser.gd`, `scripts/shared/ui/asset_selector.gd`, `scripts/shared/stage_ui/stage_surface_color_controls.gd`, `scripts/shared/stage_ui/stage_surface_color_dialog.gd`, `scripts/stage/stage_scene_io.gd`, `scripts/editors/stage/stage_scene_adapter.gd`, `scripts/stage/scenery/stage_sky_view.gd`, `scripts/editors/stage/sandbox_stage.gd`. + ## Entry format For each feature, record: diff --git a/docs/plans/assets/phase_19_plain_background/01_new_scene.png b/docs/plans/assets/phase_19_plain_background/01_new_scene.png new file mode 100644 index 0000000000000000000000000000000000000000..0c17ba5a256756ff31d42be000e6fefee368ea96 GIT binary patch literal 75257 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Ð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 + + + + + + + + + + + + Choose a starter scene + Pick a place to begin. You can change the background later. + + + + + + + Plain Background + An empty stage with one color. + Choose a new color whenever you like. + + + + + + + + + + + + Open Sky + An empty stage with a soft sky. + Sun and clouds, ready for your story. + + + + + + + + + + + + + + + + + + Town Street + Cloudy sky, shops, trees, + sidewalk, and road. + + + + + + + + + + + + + + Living Room + A cozy room with a window, + rug, and furniture. + + + + Close + diff --git a/docs/plans/assets/phase_19_plain_background/02_background_picker.png b/docs/plans/assets/phase_19_plain_background/02_background_picker.png new file mode 100644 index 0000000000000000000000000000000000000000..52b4e54f11d32d05273ce5894924bcb17f74aa7b GIT binary patch literal 73432 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 Z1?4&ABckX1zo8yPip#yoey08Q{{m6Trpo{T literal 0 HcmV?d00001 diff --git a/docs/plans/assets/phase_19_plain_background/02_background_picker.svg b/docs/plans/assets/phase_19_plain_background/02_background_picker.svg new file mode 100644 index 0000000..f1ed372 --- /dev/null +++ b/docs/plans/assets/phase_19_plain_background/02_background_picker.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + Scenery + + Backgrounds + + Artwork + Choose the scene background + + + + + + + Current background + Plain Background + + + + + + + + + Clear Day + + + + + + + + Cloudy Day + + + + + + + + Sunset + + + + + + + + + Starry Night + + + More backgrounds + + + + Wall panel + + + + Background + ground + + + Close + diff --git a/docs/plans/assets/phase_19_plain_background/03_color_choices.png b/docs/plans/assets/phase_19_plain_background/03_color_choices.png new file mode 100644 index 0000000000000000000000000000000000000000..4d723c58be7d62281d55c36f396775ce8ec6680c GIT binary patch literal 50682 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%0AxS11a)xhfe_g*x(76 zWC19^=(KN#fL zz+;Rc#Ydqd;YV+8;EabbHFW^EZ~EQ?61QiP**0Z0ASxB4Vc~U~jyQU3k zWpBzxYv{wOi|<=hLA(YrnLY32<3p@YrFx8YBjYO%Yd@$YT?XG8fE6s(x~2@NuUCPI z7?>fYUJO@<5J3XHY6YM#YVPD9&!bkFYHRBN$e8w&2%W`8YT_Q{;ZY!GEwDd?50Hmb zMMT-2Qnc$2}7*aN@ zM)+Op_j>0Q4X%mDBs_$SA&;bx%&k*m-wB&!+%Pwv@5$4HmyQmGtwISf zpb<#E7#<*pohh=irjU?Fz@mYVxX&by11LN&7IFrA-~P{*y06ie$?h{B6`)fOK9?Ri zynbPT2y)$-EHKRs-E*?A*0YZ!PiVhlnzIk$zCdvw1VDfLm3RR3gD}sA94`Pbn=~7c z7xjZr&Ijql%j^~Q)Vk+ptvdqXAP~4bISI}S)ScU_2r65iu%23Gb@r$ez{SAlaj}hw zZMi-i0SZ+DNGvlAYKCG|ve=;|MOf7X5;|WBwegrW?47^}4{U8QFtl(tm(PNCgLHlp z8{wh;XaE$fEHMX$oNV%-)i2Cg=sXR{47gLm1yd(&&&tm7Cu!c$S4M;nh}@P58$>L z!y+BP03@6SYEQ#-Ovjz0l$@O6&X*Nkr24(qD6%U3{EUZ5(Hw8%m^&CLXz#%-!yEz6 zD1v7;?uR>vtz`ma@aF5gfwmY>TLf@b@G;Z$A&vjG_rS3dfC$++ho2UnZ}W)VzXiS< zAIwd6zIRq+F-;wbxU`8pUPT^zIS#nrG)7G+hd(!@E&UM~&RqTfzCo_Ogdp31VjgF^8MW9Oj zNE6_|-9~T+E?i7SuD0F>Yf}&>%yM;US5{UxNComCr(W=rO;$EQAT`ttcfN0E)K#40 zoc^02LRYDI#yp^G^E0ANF&o-4H7`46=KhySn4cfAnm555_@E1HgM;K$ zyZWYNGH?rp_{?76RLx?*Ry~leLU;stsI4jR76rV`8EieU@D^Ll1DE!kOj+M|MnT7O zCRycX!};Nxs)*$K_Nt92Mo*=ztj=pRUPE|3T(gwnshTJOPsMR4FE(DHsMOISnZ*t+ zDReVs(5H*N7Xf1;F5{S1 zXHy^gkB2Q>3Z+k^@gqXtbbpaz3Oi3&La)AjK3R0`A6- zBf{M@TVj$}$W|%*nlyf`&!#hg2mWZLLO)6GnB9hc>NK+MWv%rEA66C)^It=Q|4??I zCtZS%e(LeR`*#*&RW>{@K5iE*8(V7Y20bD5-?jbo_eP|gf43F>6D0a?Gy4DEejN|3 XNO(uUnlGzC3y!#A@qOiYu0Q<;)$JK5 literal 0 HcmV?d00001 diff --git a/docs/plans/assets/phase_19_plain_background/03_color_choices.svg b/docs/plans/assets/phase_19_plain_background/03_color_choices.svg new file mode 100644 index 0000000..41ae5a6 --- /dev/null +++ b/docs/plans/assets/phase_19_plain_background/03_color_choices.svg @@ -0,0 +1,45 @@ + + + + + + + + ‹ Backgrounds + Plain Background + Tap a color to use it on the Stage. + + Preview + + + + Color + + + + #F5EFE0 + Tap swatch to pick a custom color + + + Recently used + + + + + + + + + + + + + Colors + + + + + + + Back to Backgrounds + diff --git a/docs/plans/assets/phase_19_plain_background/04_custom_color_picker.png b/docs/plans/assets/phase_19_plain_background/04_custom_color_picker.png new file mode 100644 index 0000000000000000000000000000000000000000..0db32e80cb1c63089599944f729305a3879fb468 GIT binary patch literal 73238 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�BKwtm5uQrL~2LO`v?m1SFWj@GX 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%0D+P`YwVLY9+t8{< x{AvF?$9tfv(_ZBNykx-tbzJdZp;9uHd+1rIPGix^TN*jx%Gydrx9>mye*hhZxTXLA literal 0 HcmV?d00001 diff --git a/docs/plans/assets/phase_19_plain_background/04_custom_color_picker.svg b/docs/plans/assets/phase_19_plain_background/04_custom_color_picker.svg new file mode 100644 index 0000000..86a380b --- /dev/null +++ b/docs/plans/assets/phase_19_plain_background/04_custom_color_picker.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + Choose background color + Preview + + + + + + + + + + + + + + + + + RGB + + HSV + Linear + + + + COLOR + + Hex + + F5EFE0 + R 245 + G 239 + B 224 + + + Back + + Use color + diff --git a/docs/plans/assets/phase_19_plain_background/05_large_starter_chooser.png b/docs/plans/assets/phase_19_plain_background/05_large_starter_chooser.png new file mode 100644 index 0000000000000000000000000000000000000000..33fabcb4e4845dae8b5084fb2316ddc7d559c030 GIT binary patch literal 140112 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 fFb)4pcL$d2 + + + + + + + + + + + + + + + + + Choose a starter scene + Pick a place to begin. You can change the background later. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Plain Background + Open Sky + Town Street + Living Room + + + An empty stage with one color. + Choose a new color whenever you like. + An empty stage with a soft sky. + Sun and clouds, ready for your story. + Cloudy sky, shops, trees, + sidewalk, and road. + A cozy room with a window, + rug, and furniture. + + + + Close + diff --git a/docs/plans/phase_19_plain_background.md b/docs/plans/phase_19_plain_background.md new file mode 100644 index 0000000..6edb3bf --- /dev/null +++ b/docs/plans/phase_19_plain_background.md @@ -0,0 +1,130 @@ +# Phase 19 — Plain Background + +> **Status:** Accepted product direction for a focused Phase 19 addition. This is a design handoff to the spec-pipeline, not a UI/UX or architecture specification. +> **Relationship to Phase 19:** This brief updates only the earlier three-card **File → New** choice and the four-Sky-only **Backgrounds** choice. Other accepted Scenery, starter composition, Sky, Ground, and artwork behavior remains as described in the existing Phase 19 plans and specifications. + +## Goal and audience + +Give a child a genuinely empty Stage and an easy way to choose its background color. The audience is a child starting a scene through **File → New** or changing a scene's look in **EDIT**. A plain color can set a mood for an abstract story, title-like shot, or set built entirely from the child's own Ground, characters, Props, and Scenery. + +The background is a scene-wide visual choice. It fills the camera view in **EDIT**, **DIRECT**, and **PLAY**, without adding a selectable Stage object or changing the colors or behavior of placed pieces. + +## PNG mockups + +**Review status:** The starter and Backgrounds PNGs are user-approved. The color-choices and custom-picker PNGs were revised per user feedback: tapping the current-color chip opens the picker without a separate **More colors** button, and the custom picker shows a simple **Preview** label with no temporary-state helper message. These revisions are included for final spec sign-off. The production initial color is warm off-white `#F5EFE0`; Plain Background previews use a uniform solid fill. Editable SVG source files sit beside each PNG. + +- [New Scene starter chooser](assets/phase_19_plain_background/01_new_scene.png) +- [Larger New Scene chooser proposal](assets/phase_19_plain_background/05_large_starter_chooser.png) — expands the same four cards and gives each preview more room; retain the bounded, scrollable layout on smaller screens. +- [Scenery Backgrounds chooser](assets/phase_19_plain_background/02_background_picker.png) +- [Plain Background color choices](assets/phase_19_plain_background/03_color_choices.png) +- [Custom color picker](assets/phase_19_plain_background/04_custom_color_picker.png) + +## Desired child outcome + +- Start **Plain Background** and see one uninterrupted solid color, with no Sky imagery, Ground, characters, Props, or other placed objects. +- Recognize the existing empty starter as **Open Sky**: its current neutral gradient, sun, and clouds remain available. +- Find the background color in **EDIT → Scenery → Backgrounds**, beside the Sky choices, and use a familiar color preview, swatches, and picker. +- Change between a plain color and a Sky without losing the chosen plain color. Save, reopen, and see the same chosen background. + +## Child flow and feedback + +### File → New + +The existing unsaved-work Save/Discard/Cancel gate runs before the starter chooser. Canceling the chooser leaves the open scene intact. The chooser presents four large illustrated cards; a chosen starter opens as a new, unsaved, editable scene. + +```text +┌ Choose a starter scene ───────────────────────────────┐ +│ ┌──────────────────────┐ ┌──────────────────────┐ │ +│ │ [solid color preview]│ │ [soft sky preview] │ │ +│ │ Plain Background │ │ Open Sky │ │ +│ │ An empty stage with │ │ An empty stage with │ │ +│ │ a color you can pick.│ │ a soft sky. │ │ +│ └──────────────────────┘ └──────────────────────┘ │ +│ ┌──────────────────────┐ ┌──────────────────────┐ │ +│ │ [street preview] │ │ [room preview] │ │ +│ │ Town Street │ │ Living Room │ │ +│ └──────────────────────┘ └──────────────────────┘ │ +│ [Close] │ +└───────────────────────────────────────────────────────┘ +``` + +The **Plain Background** card shows its actual initial solid fill. **Open Sky** is the existing sky-backed empty starter, renamed so its preview and label agree. Town Street and Living Room retain their current compositions and editability. On a narrow screen, cards wrap into one column within a bounded, scrollable chooser; the title and visible Close action remain reachable. + +The initial Plain Background color is **warm off-white `#F5EFE0`**, approved as the starting look. It should read like paper and let typical character and artwork outlines remain visible. The Stage grid and selection outlines need contrast treatment so they remain legible over both light and dark child-selected colors. + +### Change the background in EDIT + +The child opens **Scenery → Backgrounds**. A **Plain Background** choice sits with the four existing Sky presets. The chooser shows which background is current with a clear border and words as well as color; keyboard focus remains visually separate from selection. + +```text +┌ Choose Scenery ────────────────────────────────────────┐ +│ [Backgrounds] [Artwork] │ +│ Choose the scene background │ +│ ┌───────────────────┐ ┌────────────┐ ┌────────────┐ │ +│ │ [saved plain color]│ │ Clear Day │ │ Cloudy Day │ │ +│ │ Plain Background │ └────────────┘ └────────────┘ │ +│ │ Current background│ ┌────────────┐ ┌────────────┐ │ +│ └───────────────────┘ │ Sunset │ │ Starry Night│ │ +│ └────────────┘ └────────────┘ │ +│ [Wall panel] [Background ground] │ +│ [Close] │ +└───────────────────────────────────────────────────────┘ +``` + +Choosing the **Plain Background** card immediately switches the Stage to its remembered plain fill and opens its color choices. This background choice is confirmed at the card tap, just as a Sky card is. The child can close or go Back from the color choices while keeping that fill. Preset and recently used swatches are quick, **confirmed** color choices: tapping one immediately updates the entire Stage, the current-color preview, and recent colors. The current-color chip is a button; tapping it opens the fuller picker. There is no separate **More colors** button. + +The full picker starts from the latest confirmed plain color. Moving its controls gives a tentative preview of the Stage background and the large color sample. **Use color** confirms that custom color, records it in recent colors, and returns to the plain color choices. **Back** or Cancel discards the custom draft, restores the confirmed plain fill from before the picker opened, and returns to the color choices. Back from the color choices returns to Backgrounds without undoing the card or swatch choices. This matches the established distinction between direct swatch selection and a custom-color draft. + +```text +┌ Choose background color ──────────────────────────────┐ +│ Preview: [wide uninterrupted solid color] │ +│ Current color [■] #F5EFE0 (tap swatch to pick custom)│ +│ Recently used [■] [■] [■] ... (tap to use now) │ +│ Colors [■] [■] [■] ... (tap to use now) │ +│ [‹ Backgrounds] [Close] │ +└───────────────────────────────────────────────────────┘ + +┌ Custom picker · opened from current-color swatch ────┐ +│ Preview: [wide solid color; Stage previews draft] │ +│ [color field / sliders] [RGB] [HSV] [Linear] │ +│ [Back] [Use color] │ +└───────────────────────────────────────────────────────┘ +``` + +Keep the Stage visually undimmed while either Plain Background color view is open, while retaining the transparent, input-blocking modal layer. In the color-choices view, Back and Close stay in the fixed footer; stack them as full-width targets on narrow windows. + +The color views follow the existing rounded Scenery chooser and surface color picker visual language: large preview, readable labels, spacious swatches, visible Back, and a blue **Use color** action for the custom draft. They stay within the safe viewport and scroll their body when needed; changing views preserves the chooser's anchor so the clicked control does not jump. Swatches, cards, and actions have at least 44 × 44 logical-pixel targets and usable keyboard focus. The current choice is identified by text and outline, not color alone. The RGB/HSV/Linear controls are the existing advanced color picker behavior, not a new child-facing color model to teach. + +The four Sky cards retain their current one-tap behavior. Choosing any Sky changes the scene background immediately. The scene remembers its last chosen plain color, so reopening Plain Background starts with that color and allows the child to use it again. Sky and plain color remain visual backdrops: neither appears in Stage object selection, blocks movement, or recolors Ground, walls, scenery artwork, Props, characters, or speech. + +## Story and mechanics considerations + +A child can use a plain color as an open visual canvas or as a deliberate mood. They can place walkable Ground and a cast later, then move the camera without revealing a backdrop edge. Sky remains the choice for a designed outdoor look with clouds, sun, moon, or stars. Switching backgrounds changes appearance alone; it does not alter actions, events, camera controls, physics, or the ordinary editability of starter pieces. + +## Success criteria + +1. **File → New** shows four distinguishable previews and labels: Plain Background, Open Sky, Town Street, and Living Room. Cancel preserves the existing scene; choosing Plain Background opens an unsaved scene with no Ground or placed objects and no Sky imagery. +2. A child in EDIT can choose Plain Background under Scenery → Backgrounds and immediately see the remembered fill. Preset/recent swatches apply immediately. In the custom picker, **Use color** confirms the draft, while **Back** or Cancel restores the last confirmed fill. +3. The committed color fills every camera view without an edge, gradient, sun, cloud, moon, or star. It remains visually consistent through camera pan/zoom, viewport resize, EDIT/DIRECT/PLAY, and PLAY/stop. +4. Switching to any Sky and back restores the scene's chosen plain color. Save/reopen preserves both the active background choice and that remembered color. Previously saved scenes using the neutral Sky keep their established appearance. +5. Background changes do not recolor or change the behavior of placed scenery, Ground, Props, characters, or speech. The background never intercepts Stage selection. +6. At narrow viewport sizes and with keyboard navigation, the starter cards, Backgrounds choices, color controls, and visible Back/Use/Close actions remain readable and reachable. + +## Scope and exclusions + +**Included:** A new Plain Background starter; the **Open Sky** label for the existing empty sky-backed starter; a scene-wide solid color background choice in EDIT; existing preset/recent swatches and full color picker presentation; clear preview and commit/cancel behavior; remembered plain color across Sky switches; save/reopen support; accurate starter and chooser previews; preservation of existing neutral-Sky scenes. + +**Excluded:** New Sky motifs or customization, gradients or patterns for Plain Background, transparency, animation or directed background transitions, background colors tied to time of day, automatic contrast changes to placed objects, wall/Ground recoloring, new story mechanics, and Stage Undo/Redo. The existing Background ground and wall panels remain finite Scenery surfaces with their own separate color behavior. + +## Current behavior and references + +The current [Phase 19 Scenery brief](phase_19_scenery_backgrounds_surface_finishes.md) and [Scenery UI/UX specification](../specs/phase_19_scenery_backgrounds_ui_ux.md) describe three New Scene cards and four Sky choices; this addition updates those two choice sets only. The [Starter Scene Composition brief](phase_19_starter_scene_composition.md) defines the Town Street and Living Room compositions, which this addition does not revise. Follow the [Dialog Design Principles](../specs/dialog_design_principles.md) for the starter chooser and color flow. + +Today, the [blank starter](../../content/stages/starters/blank.scene) contains no objects and selects `sky_neutral`. The [Sky view](../../scripts/stage/scenery/stage_sky_view.gd) draws that neutral choice as a gray gradient with sun and clouds. The [Stage asset browser](../../scripts/editors/stage/stage_asset_browser.gd) supplies the three starter entries and the four Sky cards; the [Scenery chooser](../../scripts/shared/ui/asset_selector.gd) displays them. Existing [surface color controls](../../scripts/shared/stage_ui/stage_surface_color_controls.gd) and [picker view](../../scripts/shared/stage_ui/stage_surface_color_picker_view.gd) provide a familiar color interaction. The [scene file handler](../../scripts/stage/stage_scene_io.gd) currently validates a saved Sky ID, and the [starter preview](../../scripts/stage/scenery/stage_starter_card_preview.gd) renders it. UI/UX and architecture should account for active background choice, remembered plain color, previews, and older files without changing the appearance of existing `sky_neutral` scenes. + +## Dependencies, risks, and open choices + +- **Grid and selection contrast:** On `#F5EFE0`, current white grid and selection lines have low contrast. The UI/UX specification calls for theme-backed contrasting treatments across light, dark, and saturated backgrounds without recoloring placed artwork. +- **Picker navigation:** The current-color chip is the sole entry to the custom picker; its focus/return behavior and the bounded layout are specified in the UI/UX document. The direct swatch, tentative custom preview, **Use color**, and Back/Cancel outcomes above are settled product behavior. +- **Previews and persistence:** The starter and Backgrounds cards must reflect the selected plain color, and save/reopen must retain the active choice plus the plain color remembered behind a Sky. Architecture should resolve the file representation and legacy migration without changing older neutral Sky scenes. +- **Visual contrast:** A light or dark child-selected background may make some artwork or EDIT overlays harder to see. UI/UX should review selection, grid, mode cues, and speech readability without silently changing the child's chosen artwork colors. diff --git a/docs/specs/phase_19_plain_background.md b/docs/specs/phase_19_plain_background.md new file mode 100644 index 0000000..dacfc9a --- /dev/null +++ b/docs/specs/phase_19_plain_background.md @@ -0,0 +1,118 @@ +# Phase 19 — Plain Background: architecture specification + +> **Status:** Approved design; implementation under way. This specification implements the [accepted product brief](../plans/phase_19_plain_background.md) and [UI/UX specification](phase_19_plain_background_ui_ux.md). The color-choices and custom-picker PNGs reflect the current-color chip as the sole custom-picker entry and the simple **Preview** label; the solid fill and exact labels in the UI/UX specification govern implementation. + +## Scope and decisions + +Plain Background is a scene-wide, opaque backdrop. It is not a Stage object, a wall panel, or Background ground. The initial color is `#F5EFE0`. File → New adds a truly empty Plain Background starter and relabels the existing neutral-Sky starter **Open Sky**. EDIT → Scenery → Backgrounds offers Plain Background beside the four existing Sky cards. A scene remembers its confirmed plain color while a Sky is active. + +The approved design uses a small shared view composed of the existing `StageSkyView` and a full-rect solid `ColorRect`. `SandboxStage` owns the confirmed scene values and the short-lived picker draft. No `Resource`, global signal bus, or extra selectable node is needed for three scalar document values. The Stage inspector kit (`StageInspectorPanel`, `StagePanelChoiceGroup`, `StagePanelToggleRow`) remains for selected objects; this is a modal chooser and uses `AssetSelector`, `AssetCard`, the existing color controls, and their theme tokens. + +When Sandbox Stage launches as the active scene without a requested scene, `SandboxStage` opens the starter chooser once after startup recovery handling. A restored autosave remains the active scene without a chooser; discarding recovery opens the chooser. CLI scene requests and load errors keep their existing flows. Closing the startup chooser leaves the empty EDIT Stage open and does not reopen the chooser for that session. + +## Node hierarchy and rendering + +```text +SandboxStage : Node2D +├─ StageBackgroundLayer : CanvasLayer (layer -1) +│ └─ StageBackgroundView : Control (full viewport; ignores mouse) +│ ├─ StageSkyView : Control (camera-bound only on the live Stage) +│ └─ PlainFill : ColorRect (full rect, opaque, ignores mouse) +├─ StageGrid : Node2D (EDIT overlay) +└─ World : Node2D (existing placed objects) + +StageStarterCardPreview : SubViewportContainer +└─ PreviewViewport : SubViewport + ├─ PreviewBackgroundLayer : CanvasLayer (layer -1) + │ └─ StageBackgroundView (unbound still) + └─ PreviewWorld : Node2D + +AssetSelector scene-wide card +└─ StageBackgroundCardPreview : Control + └─ StageBackgroundView (unbound still, clipped to card) +``` + +`StageBackgroundView` toggles its Sky and Plain children exclusively. A Plain view is a single opaque viewport-sized rect, with no gradient, horizon, motif, parallax, or world transform. Its anchors respond to viewport resize. `StageSkyView` continues to own all five existing Sky IDs and camera response; when hidden for Plain it should not spend frames updating Sky motifs. The view and both children ignore mouse input and never enter Stage selection or draw-order lists. The starter preview must use the same background-kind and color interpretation as the live Stage. The gallery card receives the **remembered** plain color even when the active kind is Sky. Card frames and labels are UI overlays outside the fill, not part of its sample. + +## Typed contracts and ownership + +| Target | Contract and change | Owner responsibility | +| --- | --- | --- | +| `scripts/stage/scenery/stage_background_view.gd`, `class_name StageBackgroundView extends Control` | `func set_background(kind: StringName, sky_id: StringName, plain_color: Color) -> void`; `func bind_camera(camera: Camera2D) -> void`; `func apply_theme(stage_theme: SandboxTheme) -> void` | Only renders a validated Sky or opaque Plain fill. Reuses `StageSkyView`; has no document, history, or picker state. `bind_camera(null)` yields still previews. | +| `scripts/editors/stage/sandbox_stage.gd`, `class_name SandboxStage extends Node2D` | Confirmed `_background_kind: StringName`, `_sky_id: StringName`, `_plain_color: Color`; transient `_plain_color_draft_active: bool`, `_plain_color_draft: Color`. Private typed helpers such as `_commit_background_kind(kind: StringName, sky_id: StringName = &"") -> void`, `_commit_plain_color(color: Color) -> void`, `_preview_plain_color(color: Color) -> void`, `_cancel_plain_color_preview() -> void`, `_refresh_background_view() -> void`. | Sole authority for current scene state, dirty state, save snapshot, recent color history, and draft rollback. Switching to Plain changes the kind immediately and opens choices; switching Sky retains `_plain_color`. | +| `scripts/stage/stage_scene_io.gd`, `class_name StageSceneIO extends RefCounted` | `FILE_VERSION := "1.7"`; typed validation/migration of `background_kind`, `sky_id`, and `plain_color`. | Reject malformed new backdrop fields before applying a document; migrate older versions without changing their visible Sky. | +| `scripts/editors/stage/stage_scene_adapter.gd`, `class_name StageSceneAdapter extends RefCounted` | Pass all three fields through `collect(...) -> Dictionary` and `apply(...) -> Dictionary`. | Keep background data at the top level; no object entry is created. | +| `scripts/editors/stage/stage_asset_browser.gd` and `scripts/shared/ui/asset_selector.gd`, `class_name AssetSelector extends PopupPanel` | Supply four starter cards and five scene-wide background cards; pass `{background_kind, sky_id, plain_color}` for active state and previews. Add typed `signal plain_color_preview_requested(color: Color)`, `signal plain_color_commit_requested(color: Color)`, and `signal plain_color_preview_cancel_requested` through the browser facade. | The chooser owns view navigation, focus, current/selected card display, and picker controls; it emits intents. It never marks the scene dirty or writes scene data. Keep existing `surface_color_confirmed` for wall/Ground setup history; do not route Plain through it and double-record a color. | +| `scripts/shared/stage_ui/stage_surface_color_controls.gd`, `class_name StageSurfaceColorControls extends VBoxContainer`; `scripts/shared/ui/color_swatch_selector.gd`, `class_name ColorSwatchSelector extends FlowContainer` | Retain `color_selected(color: Color)` and `custom_color_requested`; activating the current-color chip is the sole entry to the full picker. Ensure compact swatches are at least 44 × 44 and stack sections when a horizontal row will clip. | Show current, recent, and preset colors with separate selected and focus treatment. The Stage's existing eight-color recent list is shared. | +| `scripts/shared/stage_ui/stage_surface_color_picker_view.gd`, `class_name StageSurfaceColorPickerView extends VBoxContainer` | Extend `configure(...)`, or add a typed background-specific configuration method, so `preview_color_changed(color: Color)` uses an opaque flat sample for Plain. | Native `ColorPicker` supplies controls. The view displays a draft but does not commit it. Surface motif previews keep their current path. | +| `scripts/stage/scenery/stage_starter_card_preview.gd` and `scripts/stage/scenery/stage_background_card_preview.gd` | Use `StageBackgroundView` for starter and background card imagery. | Show a true solid fill for Plain and preserve existing Sky rendering in still previews. | +| `scripts/stage/stage_grid.gd`, `class_name StageGrid extends Node2D`; `scripts/stage/stage_gizmos.gd`, `class_name StageGizmos extends Node2D`; `scripts/stage/sandbox_theme.gd`, `class_name SandboxTheme extends RefCounted`; `sandbox_theme.json` | Add theme-backed light/dark grid colors and two-tone editor outline colors. Add typed setters on drawing nodes if needed to pass the current backdrop treatment. | Adapt editor overlays to the background while leaving authored art, speech, and physics unchanged. | + +The signal names above are the desired public interface between chooser, browser, and Stage. Keep the existing `item_selected(entry: Dictionary)` path for Sky and Plain card taps. A Plain card tap commits the active kind before the chooser opens its color-choices view. A Sky card tap commits the new Sky immediately and keeps the chooser open. The current-card indicator uses a stable **Current background** badge and selected border; keyboard focus is separate. The Plain color choices and its custom picker keep the Stage at full brightness while the modal input blocker remains active and transparent. Other chooser views retain the usual visual dimming. + +## Saved scene format and migration + +Save top-level fields in `.scene` v1.7: + +```json +{ + "version": "1.7", + "background_kind": "plain", + "sky_id": "sky_neutral", + "plain_color": "#F5EFE0", + "camera": {"position": {"x": 0.0, "y": -400.0}, "zoom": 0.5}, + "objects": [], + "event_rules": [] +} +``` + +`background_kind` is exactly `"sky"` or `"plain"`. `sky_id` remains one of the existing five IDs even while Plain is active, preserving the last selected Sky for a later switch. `plain_color` is an opaque canonical six-digit `#RRGGBB` string. Runtime color values are clamped to opacity before commit; invalid file values are rejected at the JSON boundary. The plain starter is a separate `.scene` file under `content/stages/starters/` with these values and empty `objects`/`event_rules`; the existing `blank.scene` can remain the Open Sky starter, with its UI label changed. Town Street and Living Room remain authored compositions and acquire migrated Sky-kind fields on their next save if their source version is older. + +`StageSceneIO._migrate_to_current()` must explicitly handle **1.6** as well as 1.0–1.5. Every pre-1.7 file migrates to `background_kind: "sky"` and `plain_color: "#F5EFE0"`; it preserves its migrated `sky_id` (including `sky_neutral`). In particular, adding 1.6 to the old `version != "1.5"` branch would incorrectly overwrite its Sky choice: keep that earlier version-specific rule intact. Current-version normalization still runs for migrated data. Read and validate the complete document before replacing the live scene. Save and autosave both serialize confirmed fields only; a picker draft is never consulted. `ContentPaths.canonicalize()` continues to handle starter paths. + +## Color transaction and navigation + +```mermaid +stateDiagram-v2 + [*] --> Backgrounds + Backgrounds --> ColorChoices: tap Plain / commit kind + Backgrounds --> Backgrounds: tap Sky / commit sky + ColorChoices --> ColorChoices: tap swatch / commit color + ColorChoices --> CustomPicker: activate current-color chip / snapshot confirmed color + CustomPicker --> ColorChoices: Use color / commit once + CustomPicker --> ColorChoices: Back or Esc / discard draft + ColorChoices --> Backgrounds: Back / keep commits + CustomPicker --> [*]: popup hide, mode switch, scene replacement / discard draft +``` + +`_plain_color` is the confirmed remembered value; `_plain_color_draft` exists only while the custom picker is open. Every native picker movement calls `_preview_plain_color()` to update the live `StageBackgroundView` and its flat chooser sample, without assigning `_plain_color`, changing recent history, or marking dirty. **Use color** clamps to opaque, commits the chosen color once, clears draft state, calls the existing `_record_recent_surface_color()` once, and returns to color choices. A preset/recent swatch uses the same commit method directly. An intentional selection can reorder recent history; mark the scene dirty only if the confirmed scene value actually changes. Opening choices at the untouched default does not add the default to recents. + +Back, Cancel, Esc, popup hide, mode switch, and scene replacement must all clear the draft and restore the confirmed render. A replacement cancels the draft **before** resetting or loading scene state; popup-hide cleanup must be idempotent because a normal close can trigger it after a button callback. Back from color choices returns to Backgrounds without reverting confirmed card/swatches; Close retains confirmed choices. If Save/autosave occurs during a draft, the snapshot reads `_plain_color`, never the displayed draft. Focus returns to the Plain card from color choices and to the custom-picker opener from the picker; the popup keeps its screen anchor while switching views. + +## Chooser layout and contrast + +Use the existing `AssetSelector` responsive grid and `AssetCard` controls. File → New presents Plain Background, Open Sky, Town Street, Living Room in that order, two columns on a normal desktop and one scrollable column when narrow. Keep fixed heading and reachable Close. Backgrounds presents the five scene-wide cards under **Choose the scene background**; Wall panel and Background ground stay in a separate **More backgrounds** row. The color-choices view has a fixed **Choose background color** heading, flat confirmed preview, a focusable current-color chip with readable hex, up to eight shared recents, and presets. Place **‹ Backgrounds** at the left of the fixed footer and **Close** at the right; stack them as full-width actions on narrow layouts. Activating the current-color chip opens the custom picker; do not add a separate **More colors** button. The custom view has a flat draft preview and fixed Back/Use footer. Reuse `popups.asset_selector`, `popups.dialog`, `stage_surface_colors`, `stage_panels.action`, and `mode_colors.edit` tokens; add only narrowly needed flat-preview/backdrop-overlay tokens. Increase `popups.asset_selector.compact_swatch_size` from 42 to at least 44 in both theme sources, and clamp the actual `ColorSwatchSelector` target size to at least 44 even if a custom theme supplies a smaller number. Card, swatch, and action targets also meet 44 × 44. Scroll the content within viewport-safe bounds; do not horizontally clip compact color sections. + +`StageGrid` currently uses translucent white lines. For Plain, choose theme-backed dark minor/major lines on a light fill and light minor/major lines on a dark fill using the displayed color's luminance, including a temporary draft. Minor lines stay subdued; major lines remain legible. On Sky, retain the established grid treatment. `StageGizmos` currently draws white selection and yellow hover outlines, which can disappear against light fills; add a dark backing stroke beneath a bright core for selection, hover, box selection, rotate ring, and scale handles. Keep screen-space widths and hit testing unchanged. This overlay treatment may be applied consistently for Sky and Plain. No authored object, speech bubble, placement material, or pixel color is rewritten. EDIT still owns grid/gizmos, DIRECT keeps its framing cues, and PLAY hides edit-only overlays. Review cursor pills and placement ghosts on light, dark, and saturated fills during rendered verification. + +## Observable acceptance and verification route + +| User path / repeatable scenario | Observable outcome | +| --- | --- | +| Fresh Sandbox Stage startup without a scene; close the chooser; compare with a CLI scene load and autosave restore/discard | The chooser opens once over an empty EDIT Stage. Close leaves the blank Stage open without reopening the chooser. A CLI-loaded or restored scene suppresses it; discarding autosave recovery opens it only after the recovery dialog closes. | +| Dirty scene → File → New → cancel unsaved gate or cancel starter chooser; then choose Plain and Open Sky in separate runs | Gates preserve the prior scene on cancel. Plain opens an unsaved empty scene with a uniform `#F5EFE0` fill and zero placed objects; Open Sky keeps the former neutral gradient, sun, and clouds. Both card previews match. | +| EDIT → Scenery → Backgrounds → Plain → swatch → Sky → Plain | Plain taps switch immediately, swatches update Stage and recent ordering, Sky remains selectable, and returning to Plain restores its confirmed color. Selected badge and focus are distinct. Wall/Ground remain separate. | +| Plain custom picker → drag RGB/HSV controls → Back; repeat with Esc, Close, mode change, popup dismissal, and scene replacement | Draft appears in Stage/sample while editing; each cancel path restores the prior confirmed fill. Dirty state, recent list, saved file, and autosave content do not change from the draft. Replacement does not carry draft into the next scene. | +| Plain color choices → activate current-color chip → change custom picker controls → Use color → Save → reopen; compare color and recent list before/after | The current-color chip opens the picker without a separate button. One confirmation stores an opaque color, records it once in shared history, and marks the scene dirty once. Reopen restores active kind and remembered color. A Sky-active save/reopen also retains the hidden remembered plain color. | +| Load representative v1.0–v1.6 files, especially a v1.6 `sky_neutral` scene and a v1.6 non-neutral Sky; save/reopen | They remain visually Sky scenes with the same Sky ID and composition; migration adds default remembered Plain color and writes v1.7 without changing objects, camera, or Sky choice. Invalid v1.7 background data fails before live-scene replacement. | +| Plain Stage with no world objects → pan, zoom, viewport resize, EDIT → DIRECT → PLAY → stop; repeat after save/reopen | Every frame stays an opaque edge-free flat fill. No gradient or motifs appear; backdrop never intercepts clicks. Mode transitions retain color; PLAY has no edit-only grid/gizmos. | +| Light `#F5EFE0`, dark, and saturated Plain colors with Ground, artwork, Props, character, speech, selection, and placement ghost | Grid major/minor lines, selection/hover/gizmos, cursor pills, and ghosts remain usable. Foreground pixel colors and object behavior remain unchanged. | +| Narrow viewport → pointer/touch/keyboard through starters, cards, swatches, picker, Back/Use/Close | Content scrolls without horizontal clipping; actions stay reachable; all targets meet 44 × 44; returning from subviews restores opener focus and popup anchor. | + +Use the real Stage chooser, stage scene load/save path, and render-capable Stage for the scenarios above. Inspect captured frames at the named colors, camera positions, zoom levels, modes, and viewport sizes; a headless parse or a screenshot command alone does not establish visual correctness. Focused automated checks should cover the v1.7 migration/validation boundary and the commit/cancel state transitions where they meaningfully protect behavior. No new graphical or animation asset is required: thumbnails and previews are rendered from existing Sky drawing and the new solid fill. + +## Trade-offs and implementation constraint + +Composing a backdrop view adds one small node and typed facade but keeps Sky drawing focused and lets live Stage and previews share the same kind switch. Three scalar file fields are easier to validate and migrate than a custom `Resource`; the saved `sky_id` is deliberate remembered state while Plain is active. Color history remains a user setting shared with surface colors, while the confirmed plain color belongs to each scene. Theme-backed grid color can account for the flat background, but it cannot account for every placed object beneath a particular grid segment; the two-tone gizmo outline protects selection visibility across mixed art. + +The existing chooser was designed around four Sky cards and a separate surface row. Its grid-row counting, active-card group, footer placement, and compact swatch width need targeted extension for five scene-wide choices and the new color views. Preserve its popup anchor and focus behavior while changing those branches; do not fork a second gallery or color picker. diff --git a/docs/specs/phase_19_plain_background_ui_ux.md b/docs/specs/phase_19_plain_background_ui_ux.md new file mode 100644 index 0000000..0bdefb5 --- /dev/null +++ b/docs/specs/phase_19_plain_background_ui_ux.md @@ -0,0 +1,99 @@ +# Phase 19 — Plain Background: UI/UX specification + +> **Status:** UI/UX direction revised per user feedback from the user-approved PNG mockups. The current-color chip is the sole entry to the custom picker; there is no separate **More colors** button. The default color is approved as warm off-white `#F5EFE0`; the color swatches and sample views must show a flat fill. +> +> **Design references:** [Phase 19 Plain Background brief](../plans/phase_19_plain_background.md), [approved PNG mockups](../plans/assets/phase_19_plain_background/), [Phase 19 Scenery UI/UX specification](phase_19_scenery_backgrounds_ui_ux.md), and [Child-Facing Dialog Design Principles](dialog_design_principles.md). + +## Child promise + +A child can start with an empty stage filled by one color, choose another color in EDIT, and return to that color after trying a Sky. The color fills the whole camera view. It does not create a selectable object or change the colors and behavior of placed pieces. + +## File → New + +- Keep the existing unsaved-work Save/Discard/Cancel gate. Do not replace the current scene until a starter card is chosen. +- Use the existing themed `AssetSelector` shell and `AssetCard` presentation with a fixed **Choose a starter scene** heading, a scrollable responsive card body, and a reachable visible **Close** action. The card order and tab order are **Plain Background**, **Open Sky**, **Town Street**, **Living Room**. +- At desktop widths, show an equal-sized 2 × 2 card grid. At narrow widths, wrap to one column and scroll the body while keeping the title and Close action available. Preserve the popup's screen anchor when its layout changes. +- Make this chooser materially larger than the current roughly 660 × 560 logical-pixel asset selector: target about 1160 logical pixels wide on a roomy desktop, with a natural height that shows both card rows and the Close action. Cap both dimensions to the usable viewport with safe margins; a short display scrolls the card body while the title and Close stay reachable. At the preferred width, each card's preview should be about 500 pixels wide and at least 240 pixels tall, occupying roughly two-thirds of the card height. Scale the preview with its card instead of leaving a small fixed thumbnail inside a large tile. The [larger starter chooser mockup](../plans/assets/phase_19_plain_background/05_large_starter_chooser.png) shows the intended balance; its pixel dimensions are illustrative, not a fixed window size. +- Plain Background's thumbnail is a uniform opaque `#F5EFE0` fill with no horizon, gradient, Sky motif, checkerboard, or object. Its copy is: **“An empty stage with one color. Choose a new color whenever you like.”** Starting it creates a new unsaved scene with no Ground or placed objects and no additional setup step. +- Open Sky previews the existing neutral gradient, sun, and clouds. Its copy is: **“An empty stage with a soft sky. Sun and clouds, ready for your story.”** This is the existing empty neutral-Sky starter under a clearer name. +- Town Street and Living Room retain their authored compositions and existing descriptions. +- Activating a card by pointer, touch, Enter, or Space opens that starter. Close or Escape leaves the current scene intact. + +## Fresh Sandbox startup + +- When the Sandbox Stage launches as the active scene without a requested scene, show **Choose a starter scene** once for that Stage session. This gives children the same clear starting point as File → New. +- If an autosave is available, resolve its recovery prompt first. Restoring it opens the recovered scene without the starter chooser; discarding it opens the chooser afterward. +- A command-line scene load or load error does not open the starter chooser. The chooser must not cover recovery or another modal dialog. +- Close or Escape leaves the empty EDIT Stage available. Do not automatically reopen the chooser during that session; File → New remains available when the child wants another starter. + +## EDIT → Scenery → Backgrounds + +- Extend the current `AssetSelector` Backgrounds tab with a **Plain Background** card alongside **Clear Day**, **Cloudy Day**, **Sunset**, and **Starry Night**. Keep **Wall panel** and **Background ground** visually separated under a **More backgrounds** row. +- Show the heading **Choose the scene background** above the five scene-wide choices. The Plain Background card preview uses the remembered plain color even while a Sky is active. +- Mark the active choice with the existing cyan selected fill/border and a stable **Current background** badge. Keep the keyboard focus outline visually distinct from selection. Do not identify the current choice by color alone. +- Sky cards retain their immediate selection behavior and leave the chooser open. Activating Plain Background immediately restores/applies its remembered color and opens the Plain Background color choices. Back or Close from those choices keeps Plain Background active. +- Neither a Sky nor Plain Background is Stage-selectable or included in Pieces here. Switching background never starts placement or changes the current cursor mode. + +## Plain Background color choices + +- Reuse the bounded chooser shell, `StageSurfaceColorControls` and shared `ColorSwatchSelector` visual language; the full-stage preview and scene-specific copy are the only feature-specific presentation. +- Keep the **Choose background color** heading. Put **‹ Backgrounds** in the fixed footer, left of **Close**, instead of in the title row. Both are large, outlined secondary actions with 12–16 px separation; at narrow widths, stack them vertically as full-width targets. The scrollable body contains: + 1. Helper text: **“Tap a color to use it on the Stage.”** + 2. A large, flat, opaque preview of the confirmed color with no text over the color sample. + 3. The current color swatch and readable hex value. + 4. **Recently used** colors, using the shared recent color list (up to eight). + 5. **Colors** preset swatches. +- If recents are empty, show **“Colors you use will appear here.”** Opening Plain Background at the untouched default does not add that default to recents. +- Tapping a recent or preset swatch immediately confirms it. The full Stage, preview, current swatch, selected outline/check, dirty state, and recent ordering update together. Leaving and reopening the view preserves that confirmed choice. +- Give the selected swatch an outline/check that is distinct from keyboard focus. Make all swatches at least 44 × 44 logical pixels, including compact layouts; the current 42-pixel compact swatch default is too small here. +- The current-color chip is the sole entry point to the full custom picker. It is a focusable button with clear hover, pressed, and focus states and the tooltip **“Choose a custom color.”** Activating the chip opens the picker; there is no separate **More colors** button. +- Keep the Stage at full brightness while Plain Background color choices or its custom picker are open so live color changes can be judged accurately. Keep the modal input-blocking layer active but visually transparent; clicks outside the dialog must not reach the Stage. The dialog keeps its opaque shell, outline, and footer for modal clarity. Other chooser views retain the normal dim backdrop. + +## Full custom picker + +- Reuse/extend `StageSurfaceColorPickerView`, its native `ColorPicker`, large preview, theme, and compact-height behavior. Use a flat, opaque preview matching the Stage with no text overlay. +- Use the heading **Choose background color** and a simple **Preview** label above the large color sample. The tentative behavior is communicated by the Stage updating during picker movement and the visible **Use color** / **Back** actions; no explanatory preview message is needed. +- On open, snapshot the last confirmed plain color. Moving native color controls updates only the temporary Stage preview and large sample. It does not change history, scene dirty state, or serialized data. +- Use a fixed, visible footer with a dark secondary **Back** (or **Cancel**) button and a blue, bold, white **Use color** primary button, separated by 12–16 logical pixels. All actions remain at least 44 × 44 logical pixels. +- **Use color** confirms once, updates the remembered color and recent history once, marks the scene dirty once, and returns to the color choices. +- Back, Cancel, Escape, or closing the picker restores the confirmed snapshot and returns to color choices with Plain Background still active. +- Mode changes, scene replacement, or unexpected popup dismissal also clear a temporary preview and restore the confirmed color. A temporary color must never enter Save or autosave. + +## Focus, layout, and theme + +- Use `SandboxTheme` values from `popups.asset_selector`, `popups.dialog`, `stage_surface_colors`, `stage_panels.action`, and `mode_colors.edit`. Add a small Plain-preview token group only if the existing theme has no suitable values; avoid a parallel swatch or picker system. +- Keep cards, swatches, and actions at least 44 × 44 logical pixels. Preserve the existing dialog style: rounded surfaces, visible outlines, readable type, blue primary action, and labeled Close/Back/Use actions. +- Tab order: starter cards → Close; Scenery tabs → scene-background cards → surface cards → Close; color choices: Back → current-color chip → recent swatches → preset swatches → footer; custom picker → Back → Use color. +- Opening a subview moves focus to its heading or first useful action. Returning from the color choices restores focus to Plain Background; returning from the custom picker restores focus to the current-color chip. +- Keep the title and footer actions reachable while the body scrolls. Cap the popup to the safe viewport; do not force clipping or horizontal scrolling to retain compact horizontal swatch columns. Stack the Back/Close footer actions and current/recent/preset sections at narrow widths. Preserve the popup anchor when switching gallery, color, and custom-picker views. +- Pointer, touch, and keyboard users get the same selected, hover, focus, and confirmation feedback. Clicking outside must not silently confirm a tentative custom color. + +## Canvas contrast and feedback + +- Review white, black, and saturated Plain Background colors. On light fills such as `#F5EFE0`, the current white EDIT grid and white selection outlines have about 1.15:1 contrast and nearly disappear. Provide a theme-backed contrasting grid treatment for light and dark fills, keeping minor lines subdued and major lines legible. +- Give Stage selection, hover, and gizmo outlines a dark backing plus bright core on Plain Backgrounds of any brightness, following the existing two-tone selection-halo practice. Do not recolor authored artwork. +- Keep EDIT chrome and mode pill dark-backed with cyan accents, DIRECT framing amber, and PLAY free of edit-only grid and gizmos. Preserve speech styles and their authored colors. Check cursor pills and placement ghosts at light, dark, and saturated backgrounds. +- A Plain Background color is a scene-wide visual setting only: it never intercepts Stage selection or changes object ordering, placement, action behavior, or camera movement. + +## Acceptance scenarios + +1. Open Sandbox Stage without a scene and verify the starter chooser appears. Close it and verify the empty EDIT Stage remains available without another automatic prompt in that session. Open a scene through the CLI and verify the chooser does not appear. +2. If an autosave is available at startup, restore it and verify the chooser stays closed; discard it and verify the chooser appears afterward without overlapping the recovery prompt. +3. In a dirty scene, use File → New and verify the existing unsaved gate appears first. Cancel the starter chooser and confirm the previous scene remains. Choose Plain Background and verify the new unsaved Stage is a single flat `#F5EFE0` with no Sky, Ground, or placed objects. Verify Open Sky reproduces the existing neutral Sky appearance. +4. In EDIT, open Scenery → Backgrounds. Verify all five scene-wide choices are visible, the current choice is identified with text and a border, and Wall panel/Background ground remain separate. Choose Plain Background and verify it opens with the remembered color. +5. Tap one preset and one recent swatch. For each, verify the Stage and preview update immediately, the color becomes selected, and recent ordering updates. Close and reopen the choices and verify the confirmed value remains. +6. Activate the current-color chip to open the custom picker. Move a color control, then choose Back. Verify the Stage and preview return to the last confirmed color and the scene/recent history remain unchanged. Repeat and choose Use color; verify the choice and history update once and remain after Save/reopen. +7. Repeat custom-picker cancellation through Escape, visible Cancel/Back, close, mode change, and scene replacement. No temporary preview may leak into the next Stage or saved scene. +8. With each of Sky and Plain active, pan, zoom, resize the viewport, enter/stop PLAY, and reopen a saved scene. Verify the solid fill covers the camera view with no edge and that the remembered plain color returns after switching back from Sky. +9. On light, dark, and saturated fills, inspect grid, selection, hover, gizmos, cursor pills, placement ghosts, speech, and mode chrome. Confirm the Stage remains readable and placed artwork colors remain unchanged. +10. At narrow viewport sizes, navigate each card, swatch, and action by pointer, touch, and keyboard. Verify the content scrolls without clipping; focus and selection remain distinct; Back/Use/Close remain visible; returning from subviews restores the opener focus and popup anchor. + +## Reuse boundary + +| Surface | Reuse direction | +| --- | --- | +| Starter and Scenery cards | Extend `AssetSelector` and `AssetCard`; use `StageBackgroundCardPreview` for a real solid-color thumbnail and add the Plain-specific label/selection state. Do not create another card gallery. | +| Color choices and recents | Reuse `StageSurfaceColorControls` and `ColorSwatchSelector`/shared history. Extend layout for 44-pixel minimum targets and narrow layouts instead of introducing a parallel swatch system. | +| Custom picker | Reuse `StageSurfaceColorPickerView` and the native `ColorPicker`; give the scene-wide background its own flat preview and explicit temporary/confirm/cancel lifecycle. | +| Stage contrast | Use `SandboxTheme` tokens and the existing two-tone selection halo pattern; do not mutate user-authored object colors or make a second editor theme. | + diff --git a/docs/specs/phase_19_scenery_backgrounds_ui_ux.md b/docs/specs/phase_19_scenery_backgrounds_ui_ux.md index 55f1d18..e773452 100644 --- a/docs/specs/phase_19_scenery_backgrounds_ui_ux.md +++ b/docs/specs/phase_19_scenery_backgrounds_ui_ux.md @@ -96,6 +96,7 @@ These are relationship examples, not fixed pixel geometry. On a narrow viewport ### Stage palette and Scenery chooser - Add one illustrated **Scenery** card to the existing vertically scrollable left palette. Keep **Props** and **Ground** as separate cards, with a short helper line in their chooser/tool: “Stays put”, “Can be part of the action”, or “Stickmen walk here.” The palette card opens the Scenery chooser rather than directly arming a tool. +- Keep the Scenery card pressed while its chooser and nested views are open. Back navigation keeps it pressed; closing or canceling the full chooser clears it. If a choice starts drawing, show that active state with the existing on-Stage capture bar instead of leaving the chooser card pressed. - The chooser has a fixed title/Close row; **Backgrounds** and **Artwork** tabs; a scrollable body; and a fixed lower **Make artwork…** action when relevant. It is a chooser workflow, not a selected-object inspector. It receives `SandboxTheme.control_theme()` and its own popup tokens, while borrowing the Stage panel system's font, surface, selected, hover, focus, and target-size rules. - **Backgrounds** shows two large category choices, **Sky** and **Wall panel**. **Artwork** shows a single-select filter row with **All artwork**, **Nature**, **Buildings**, **Walls**, **Roads & paths**, **Objects**, and conditional **Unsorted**. One drawing may carry several tags, so it appears under every matching filter. All artwork includes old, untagged drawings. Filters describe appearance, not behavior. Apply the same filters in the Props browser while keeping its title and placement role distinct. - Use a `FlowContainer` for wrapping filter buttons and an adaptive card grid for previews. Each card has a large illustration, a readable name, and a visible keyboard focus ring. No card depends on hover to reveal its action. Changing tabs or tags preserves the chooser and moves focus to the first relevant control; closing returns focus to the Scenery palette card. @@ -285,3 +286,4 @@ Do not expose “entity”, “collision hull”, “z-index”, “physics laye 7. In Living Room, use Select several to choose two wall panels, the window frame, and rug. Preview a shared move, cancel with right-click, and verify all four return exactly to their original locations while Wood Ground and furniture remain still. Preview a uniform corner resize, check the opposite anchor stays fixed and wall motifs do not stretch, then Keep changes; save and reopen. The four pieces retain their new positions/sizes and original depth/finish, while the temporary group selection is gone. Repeat the preview with touch or keyboard controls in a narrow viewport, using Esc to cancel. 8. Save a scene with two copies of one live `.prop` Scenery drawing, then make the file unavailable and reopen the scene. The friendly missing-art summary appears once; both labeled markers remain at their saved positions/depths through EDIT and PLAY. In ordinary EDIT, select a character in front of a marker without selecting Scenery. Use a marker's Find artwork badge or the Edit Scenery **Needs artwork** list to open its card. Cancel a file choice and verify both markers remain. Choose a replacement for one copy, preview then cancel once, then confirm it; only that copy changes. Confirm the second still has a marker after save/reopen until it too is repaired or deliberately erased. Repeat the repair path with keyboard and on a narrow touch viewport. 9. In Prop Editor, open **Size for Stage** on representative tall, wide, and small artwork. Confirm the standard stickman is drawn in front, the floor/contact guide is visible over every fill, the preview frames both together, presets and fine adjustments preserve proportions, **Keep size** applies, and **✕ Cancel** restores the exact prior geometry. Confirm new placement uses the authored size and loading an existing file performs no automatic normalization. Deliberately save revised geometry over a referenced asset and confirm the usual Save flow and live-reference update on reopen, with scene placement transforms retained. In Edit Scenery, resize one placement and confirm it commits on release and saves/reopens; cancel a still-active drag with Escape/right-click and with the touch capture bar; verify other scenery and Props stay unchanged. Compare this with the separate group Keep/Cancel flow. Repeat sizing-guide visibility and Stage handle/button access with keyboard/touch and at a narrow viewport. +10. Open Scenery and navigate between Backgrounds, Plain Background color choices, and its custom picker. Back keeps the Scenery card pressed; Close or Escape from the full chooser clears it. Choose an artwork or surface tool and confirm the chooser card is unpressed while the on-Stage capture bar shows the active tool. diff --git a/sandbox_theme.json b/sandbox_theme.json index 7ea8d29..49d64e7 100644 --- a/sandbox_theme.json +++ b/sandbox_theme.json @@ -77,7 +77,13 @@ "sideways_offset": 4.0 } }, - "grid": { "snap_size": 15.0 }, + "grid": { + "snap_size": 15.0, + "plain_light_minor": "#11182120", + "plain_light_major": "#11182148", + "plain_dark_minor": "#FFFFFF25", + "plain_dark_major": "#FFFFFF58" + }, "chrome": { "style_defaults": { "bg_color": "#171B24F2", "corner_radius": 10 }, "top_bar": { "height": 64 }, @@ -161,8 +167,21 @@ "surface_corner_radius": 14, "look_corner_radius": 8, "corner_radius": 16, - "compact_swatch_size": 42, + "compact_swatch_size": 44, "color_group_gap": 8, + "starter_dialog_width": 1160, + "starter_viewport_height_ratio": 0.96, + "starter_card_min_width": 340, + "starter_preview_aspect": 2.0, + "starter_preview_corner_radius": 12, + "starter_preview_horizontal_inset": 10, + "starter_preview_top_inset": 6, + "starter_card_text_height": 108, + "starter_title_size": 30, + "starter_label_size": 22, + "starter_label_height": 34, + "starter_description_size": 20, + "starter_description_height": 48, "action_color": "#087DBA", "separator_color": "#AAB2C0A0" } @@ -287,6 +306,13 @@ "uncertain_color": "#FFB300", "neutral_color": "#C5CAD4", "completion_duration": 0.6 + }, + "gizmos": { + "backing_color": "#111821E8", + "selection_color": "#F5F7FAE6", + "hover_color": "#FFE66DCC", + "rotate_color": "#4DB9FFE6", + "backing_extra_width": 3.0 } }, "widgets": { diff --git a/scripts/editors/stage/sandbox_stage.gd b/scripts/editors/stage/sandbox_stage.gd index 869a542..62ae616 100644 --- a/scripts/editors/stage/sandbox_stage.gd +++ b/scripts/editors/stage/sandbox_stage.gd @@ -50,7 +50,7 @@ const STAGE_MODAL_VIEWS_SCRIPT := preload("res://scripts/editors/stage/stage_mod const STAGE_THEME_CONTROLLER_SCRIPT := preload("res://scripts/editors/stage/stage_theme_controller.gd") const STAGE_TARGET_CAPTURE_SCRIPT := preload("res://scripts/editors/stage/stage_target_capture_session.gd") const STAGE_SCENERY_CONTROLLER_SCRIPT := preload("res://scripts/editors/stage/stage_scenery_controller.gd") -const STAGE_SKY_VIEW_SCRIPT := preload("res://scripts/stage/scenery/stage_sky_view.gd") +const STAGE_BACKGROUND_VIEW_SCRIPT := preload("res://scripts/stage/scenery/stage_background_view.gd") const STAGE_DRAW_ORDER_SCRIPT := preload("res://scripts/stage/stage_draw_order.gd") const STAGE_WALL_PANEL_SCRIPT := preload("res://scripts/stage/scenery/stage_wall_panel.gd") const STAGE_BACKGROUND_GROUND_SCRIPT := preload("res://scripts/stage/scenery/stage_background_ground.gd") @@ -258,13 +258,21 @@ var _spawner: StageSpawner var _selection: StageSelection var _gizmos: StageGizmos var _stage_input_ready: bool = false +var _startup_scene_applied: bool = false +var _startup_starter_chooser_pending: bool = false +var _startup_starter_chooser_shown: bool = false var _grid: StageGrid var _spatial_index: StageSpatialIndex var _terrain_painter: StageTerrainPainter var _scenery_controller: StageSceneryController var _sky_layer: CanvasLayer var _sky_view: StageSkyView +var _background_view: StageBackgroundView var _sky_id: StringName = &"sky_neutral" +var _background_kind: StringName = &"sky" +var _plain_color: Color = Color("#F5EFE0") +var _plain_color_draft_active: bool = false +var _plain_color_draft: Color = Color("#F5EFE0") var _new_ground_finish: StringName = &"finish_ground_grass" var _hosted_prop_editor: PropEditor var _hosted_artwork_path: String = "" @@ -1850,6 +1858,8 @@ func set_mode(mode: StageMode) -> void: _show_toast("Finish or cancel speech editing first.") _sync_mode_buttons() return + if _plain_color_draft_active: + _close_selector() _cancel_surface_color_preview() if _scenery_controller != null: if _scenery_controller.is_group_preview_pending(): @@ -2513,6 +2523,74 @@ func _mark_scene_dirty() -> void: _paused_edit_autosave_remaining = 1.0 +func _refresh_background_view() -> void: + if _background_view != null: + var displayed_color: Color = _plain_color_draft if _plain_color_draft_active else _plain_color + _background_view.set_background(_background_kind, _sky_id, displayed_color) + _sky_view = _background_view.get_sky_view() + _update_grid_background_style() + + +func _commit_background_kind(kind: StringName, sky_id: StringName = &"") -> void: + var next_kind: StringName = &"plain" if kind == &"plain" else &"sky" + var next_sky: StringName = sky_id if not sky_id.is_empty() else _sky_id + var changed: bool = _background_kind != next_kind or _sky_id != next_sky + _background_kind = next_kind + _sky_id = next_sky + _refresh_background_view() + if _asset_browser != null: + _asset_browser.set_background_state(_background_kind, _sky_id, _plain_color) + if changed: + _mark_scene_dirty() + + +func _preview_plain_color(color: Color) -> void: + _plain_color_draft = _opaque_stage_color(color) + _plain_color_draft_active = true + _refresh_background_view() + + +func _cancel_plain_color_preview() -> void: + if not _plain_color_draft_active: + return + _plain_color_draft_active = false + _plain_color_draft = _plain_color + _refresh_background_view() + + +func _commit_plain_color(color: Color) -> void: + var next_color: Color = _opaque_stage_color(color) + var changed: bool = _canonical_surface_color(_plain_color) != _canonical_surface_color(next_color) + _plain_color = next_color + _plain_color_draft = next_color + _plain_color_draft_active = false + _refresh_background_view() + _record_recent_surface_color(next_color) + if _asset_browser != null: + _asset_browser.set_background_state(_background_kind, _sky_id, _plain_color) + if changed: + _mark_scene_dirty() + + +func _opaque_stage_color(color: Color) -> Color: + return Color(color.r, color.g, color.b, 1.0) + + +func _update_grid_background_style() -> void: + if _grid == null: + return + var displayed_color: Color = _plain_color_draft if _plain_color_draft_active else _plain_color + var plain_active: bool = _background_kind == &"plain" + _grid.set_background_treatment( + plain_active, + displayed_color, + _sandbox_theme.color("grid.plain_light_minor", Color("#11182120")) if _sandbox_theme != null else Color("#11182120"), + _sandbox_theme.color("grid.plain_light_major", Color("#11182148")) if _sandbox_theme != null else Color("#11182148"), + _sandbox_theme.color("grid.plain_dark_minor", Color("#FFFFFF25")) if _sandbox_theme != null else Color("#FFFFFF25"), + _sandbox_theme.color("grid.plain_dark_major", Color("#FFFFFF58")) if _sandbox_theme != null else Color("#FFFFFF58") + ) + + func _set_scene_dirty(value: bool) -> void: if _document != null: _document.set_dirty(value) @@ -2533,6 +2611,8 @@ func _collect_scene_data(is_autosave: bool = false) -> Dictionary: var document_metadata: Dictionary = { "scene_name": _scene_name, "sky_id": String(_sky_id), + "background_kind": String(_background_kind), + "plain_color": _canonical_surface_color(_plain_color), "metadata": _document.metadata_for_snapshot(is_autosave), } return _scene_adapter.collect(_world, _authored, _event_rules, camera_state, document_metadata) @@ -2613,6 +2693,7 @@ func _validate_queues_for_save() -> String: func _reset_scene_content() -> void: set_mode(StageMode.EDIT) + _cancel_plain_color_preview() _cancel_surface_color_preview() if _scenery_erase_piece_dialog != null: _scenery_erase_piece_dialog.hide() @@ -2622,8 +2703,9 @@ func _reset_scene_content() -> void: _cancel_scenery_repair_preview() _scenery_repair_target = null _sky_id = &"sky_neutral" - if _sky_view != null: - _sky_view.set_sky(_sky_id) + _background_kind = &"sky" + _plain_color = Color("#F5EFE0") + _refresh_background_view() if _scenery_controller != null: _scenery_controller.exit_tool() _scenery_controller.cancel_group() @@ -2655,11 +2737,19 @@ func _apply_scene_data(data: Dictionary, source_path: String, is_recovery: bool) source_path = CONTENT_PATHS.canonicalize(source_path) if _scene_adapter == null: return false + if _plain_color_draft_active: + _close_selector() + _cancel_plain_color_preview() var was_suppressed: bool = _suppress_dirty _suppress_dirty = true _reset_scene_content() var adapter_result: Dictionary = _scene_adapter.apply(data, _world, _spawner) _sky_id = StringName(String(adapter_result.get("sky_id", "sky_neutral"))) + _background_kind = StringName(String(adapter_result.get("background_kind", "sky"))) + _plain_color = STAGE_SCENE_IO.color_from_data( + adapter_result.get("plain_color", STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR), + Color("#F5EFE0") + ) var loaded_nodes: Array[Node2D] = adapter_result.get("loaded_nodes", []) for node: Node2D in loaded_nodes: _finalize_placed_node(node) @@ -2683,8 +2773,7 @@ func _apply_scene_data(data: Dictionary, source_path: String, is_recovery: bool) var camera_data: Dictionary = raw_camera as Dictionary if raw_camera is Dictionary else {} _camera.global_position = STAGE_SCENE_IO.data_to_vector(camera_data.get("position"), DEFAULT_CAMERA_POSITION) _camera.zoom = Vector2.ONE * clampf(float(camera_data.get("zoom", DEFAULT_CAMERA_ZOOM)), min_zoom, max_zoom) - if _sky_view != null: - _sky_view.set_sky(_sky_id) + _refresh_background_view() var raw_metadata: Variant = data.get("metadata", {}) var metadata: Dictionary = raw_metadata as Dictionary if raw_metadata is Dictionary else {} if _document != null: @@ -2712,6 +2801,7 @@ func _apply_scene_data(data: Dictionary, source_path: String, is_recovery: bool) _add_recent_scene(source_path) if _document != null: _document.remove_autosave() + _startup_scene_applied = true return true func _show_scene_load_warnings(warnings: Array[String]) -> void: @@ -2782,20 +2872,79 @@ func _update_scene_chrome() -> void: _refresh_status() -func _check_autosave_recovery() -> void: +func _check_autosave_recovery(show_starter_chooser_after_discard: bool = false) -> void: if _document == null: + if show_starter_chooser_after_discard: + _queue_startup_starter_chooser() return var inspection: Dictionary = _document.inspect_autosave() if not bool(inspection.get("available", false)): + if show_starter_chooser_after_discard: + _queue_startup_starter_chooser() return var autosave_data: Dictionary = inspection.get("data", {}) as Dictionary var dialog := ConfirmationDialog.new() dialog.name = "AutosaveRecoveryDialog"; dialog.title = "Recover Sandbox Scene?"; dialog.dialog_text = "A previous Play session was not closed cleanly. Recover it?" dialog.confirmed.connect(func() -> void: _apply_scene_data(autosave_data, AUTOSAVE_PATH, true); dialog.queue_free()) - dialog.canceled.connect(func() -> void: _document.remove_autosave(); dialog.queue_free()) + dialog.canceled.connect(func() -> void: + _document.remove_autosave() + dialog.queue_free() + if show_starter_chooser_after_discard: + _queue_startup_starter_chooser() + ) get_node(NodePath("UI")).add_child(dialog); _apply_dialog_theme(dialog); dialog.popup_centered() +func _queue_startup_starter_chooser() -> void: + if _startup_starter_chooser_pending or _startup_starter_chooser_shown: + return + _startup_starter_chooser_pending = true + call_deferred("_present_startup_starter_chooser") + + +func _present_startup_starter_chooser() -> void: + while _startup_starter_chooser_pending and is_inside_tree(): + if not _stage_input_ready or _startup_modal_is_visible(): + await get_tree().process_frame + continue + if get_tree().current_scene != self or _startup_scene_applied or current_mode != StageMode.EDIT or not _current_scene_path.is_empty() or _hosted_prop_editor != null: + _startup_starter_chooser_pending = false + return + _startup_starter_chooser_pending = false + _startup_starter_chooser_shown = true + _open_selector("starters") + return + _startup_starter_chooser_pending = false + + +func _startup_modal_is_visible() -> bool: + if _selector_open or _speech_composer_is_open(): + return true + var ui_layer: CanvasLayer = _chrome.get_canvas_layer() if _chrome != null else null + if ui_layer != null: + for child: Node in ui_layer.get_children(): + var window := child as Window + if window != null and window.visible: + return true + for dialog: Window in [ + _cli_error_dialog, + _speech_recovery_dialog, + _speech_save_gate_dialog, + _scene_open_dialog, + _scene_save_dialog, + _unsaved_changes_dialog, + _rename_scene_dialog, + _missing_assets_dialog, + _missing_scenery_dialog, + _scenery_repair_confirm_dialog, + _group_preview_save_dialog, + _confirm_dialog, + ]: + if dialog != null and is_instance_valid(dialog) and dialog.visible: + return true + return false + + func _handle_cli_startup(args: Array) -> void: if OS.get_environment("STICKMAN_WALK_DEBUG") == "1": print("[WalkDebug] CLI_STARTUP args=%s" % [args]) @@ -2806,7 +2955,7 @@ func _handle_cli_startup(args: Array) -> void: return var scene_path := String(result.get("scene_path", "")) if scene_path.is_empty(): - _check_autosave_recovery() + _check_autosave_recovery(true) return if _document != null and _document.has_autosave(): _document.remove_autosave() @@ -3085,6 +3234,9 @@ func _build_ui() -> void: _asset_browser.asset_selected_requested.connect(_on_asset_selected) _asset_browser.selector_cancel_requested.connect(_on_selector_cancelled) + _asset_browser.plain_color_preview_requested.connect(_preview_plain_color) + _asset_browser.plain_color_commit_requested.connect(_commit_plain_color) + _asset_browser.plain_color_preview_cancel_requested.connect(_cancel_plain_color_preview) _asset_browser.asset_load_failed.connect(func(kind: String, path: String) -> void: if _scenery_repair_target != null and is_instance_valid(_scenery_repair_target): _show_toast("Could not open that artwork. Try another file.") @@ -3097,6 +3249,7 @@ func _build_ui() -> void: _asset_browser.edit_scenery_requested.connect(_enter_scenery_edit_mode) _asset_browser.surface_color_confirmed.connect(_record_recent_surface_color) _asset_browser.set_surface_color_history(_recent_surface_colors) + _asset_browser.set_background_state(_background_kind, _sky_id, _plain_color) _build_ground_finish_popup(ui) _modal_views.build_file_dialogs(ui) @@ -4510,6 +4663,8 @@ func _build_gizmo_layer() -> void: _gizmos = STAGE_GIZMOS.new() _gizmos.name = "GizmoLayer" _gizmos.camera = _camera + if _sandbox_theme != null: + _gizmos.apply_theme(_sandbox_theme as SandboxTheme) _gizmos.transform_committed.connect(_on_transform_committed) _gizmos.transform_started.connect(_on_gizmo_transform_started) _gizmos.transform_updated.connect(_on_gizmo_transform_updated) @@ -4522,6 +4677,7 @@ func _build_grid_layer() -> void: _grid.camera = _camera add_child(_grid) move_child(_grid, 0) + _update_grid_background_style() func _build_ghost_holder() -> void: @@ -4542,15 +4698,19 @@ func _build_scenery_controller() -> void: func _build_sky_layer() -> void: _sky_layer = CanvasLayer.new() - _sky_layer.name = "StageSkyLayer" + _sky_layer.name = "StageBackgroundLayer" _sky_layer.layer = -1 - _sky_view = STAGE_SKY_VIEW_SCRIPT.new() as StageSkyView - _sky_view.name = "StageSkyView" - _sky_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - _sky_view.set_sky(_sky_id) - _sky_layer.add_child(_sky_view) + _background_view = STAGE_BACKGROUND_VIEW_SCRIPT.new() as StageBackgroundView + _background_view.name = "StageBackgroundView" + _background_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _background_view.set_background(_background_kind, _sky_id, _plain_color) + _sky_layer.add_child(_background_view) add_child(_sky_layer) - _sky_view.bind_camera(_camera) + _background_view.bind_camera(_camera) + _sky_view = _background_view.get_sky_view() + if _sandbox_theme != null: + _background_view.apply_theme(_sandbox_theme as SandboxTheme) + _update_grid_background_style() func _build_placement_overlay() -> void: @@ -4912,7 +5072,13 @@ func _open_selector(kind: String) -> void: (_palette_buttons[pid] as Button).set_pressed_no_signal(pid == kind) if kind == "scenery": _asset_browser.set_surface_color_history(_recent_surface_colors) - var selector_state: Dictionary = _asset_browser.open_selector(kind, _spawner.get_selected_stickman_path(), _sky_id) + var selector_state: Dictionary = _asset_browser.open_selector( + kind, + _spawner.get_selected_stickman_path(), + _sky_id, + _background_kind, + _plain_color + ) if kind == "stickman": var selected_stickman_path: String = String(selector_state.get("selected_stickman_path", _spawner.get_selected_stickman_path())) if selected_stickman_path != _spawner.get_selected_stickman_path(): @@ -4940,12 +5106,14 @@ func _on_asset_selected(entry: Dictionary) -> void: return var background_kind: String = String(entry.get("background_kind", "")) if background_kind == "sky": - _sky_id = StringName(String(entry.get("id", "sky_neutral"))) - _sky_view.set_sky(_sky_id) - var scenery_selector: AssetSelector = _asset_browser.get_selector() - if scenery_selector != null: - scenery_selector.set_current_sky(_sky_id) - _mark_scene_dirty() + _commit_background_kind(&"sky", StringName(String(entry.get("id", "sky_neutral")))) + _refresh_scenery_capture_bar() + return + if background_kind == "plain": + _commit_background_kind(&"plain") + var plain_selector: AssetSelector = _asset_browser.get_selector() + if plain_selector != null: + plain_selector.open_plain_background_choices(_plain_color) _refresh_scenery_capture_bar() return if background_kind == "wall": @@ -5774,8 +5942,15 @@ func _handle_scenery_edit_motion(world_position: Vector2) -> void: func _close_selector() -> void: + var closing_kind: String = _selector_kind + _cancel_plain_color_preview() if _asset_browser != null: _asset_browser.close() + if closing_kind == "scenery": + # Scenery is a chooser entry; the capture bar communicates active drawing tools. + var scenery_button: Button = _palette_buttons.get("scenery") as Button + if scenery_button != null: + scenery_button.set_pressed_no_signal(false) func _on_selector_cancelled() -> void: @@ -5783,7 +5958,7 @@ func _on_selector_cancelled() -> void: return var kind: String = _selector_kind _close_selector() - if kind != "scenery" and kind != "starters": + if kind != "starters": set_placement_mode("") @@ -7900,8 +8075,12 @@ func _load_font(path: String) -> Font: return _theme_controller.load_font(path) func _apply_theme_to_visuals() -> void: - if _sky_view != null and _sandbox_theme != null: - _sky_view.apply_theme(_sandbox_theme as SandboxTheme) + if _background_view != null and _sandbox_theme != null: + _background_view.apply_theme(_sandbox_theme as SandboxTheme) + if _grid != null: + _update_grid_background_style() + if _gizmos != null and _sandbox_theme != null: + _gizmos.apply_theme(_sandbox_theme as SandboxTheme) if _director_visuals != null: _director_visuals.set_style(_theme) _director_visuals.completed_path_alpha = _sandbox_theme.number("overlays.completed_path_alpha", 0.20, 0.0, 1.0) if _sandbox_theme != null else 0.20 diff --git a/scripts/editors/stage/stage_asset_browser.gd b/scripts/editors/stage/stage_asset_browser.gd index f02458c..e9cda97 100644 --- a/scripts/editors/stage/stage_asset_browser.gd +++ b/scripts/editors/stage/stage_asset_browser.gd @@ -9,6 +9,9 @@ signal refresh_requested signal make_artwork_requested signal edit_scenery_requested signal surface_color_confirmed(color: Color) +signal plain_color_preview_requested(color: Color) +signal plain_color_commit_requested(color: Color) +signal plain_color_preview_cancel_requested() const ASSET_SELECTOR_SCENE := preload("res://scenes/stage/asset_selector.tscn") const STICKMAN_LIBRARY_SCRIPT := preload("res://scripts/characters/stickman/stickman_library.gd") @@ -32,6 +35,9 @@ var browse_dialog: FileDialog var thumbnail_queue: Array[Dictionary] = [] var thumbnail_busy: bool = false var thumbnail_generation: int = 0 +var _current_background_kind: StringName = &"sky" +var _current_sky_id: StringName = &"sky_neutral" +var _current_plain_color: Color = Color("#F5EFE0") func _ready() -> void: @@ -62,6 +68,10 @@ func build_ui(ui_layer: CanvasLayer, ui_font: Font, emoji_font: Font, sandbox_th selector.make_artwork_requested.connect(func() -> void: make_artwork_requested.emit()) selector.edit_scenery_requested.connect(func() -> void: edit_scenery_requested.emit()) selector.surface_color_confirmed.connect(func(color: Color) -> void: surface_color_confirmed.emit(color)) + selector.plain_color_preview_requested.connect(func(color: Color) -> void: plain_color_preview_requested.emit(color)) + selector.plain_color_commit_requested.connect(func(color: Color) -> void: plain_color_commit_requested.emit(color)) + selector.plain_color_preview_cancel_requested.connect(func() -> void: plain_color_preview_cancel_requested.emit()) + selector.stage_preview_dimming_changed.connect(_on_selector_stage_preview_dimming_changed) ui_layer.add_child(selector) # apply_font AFTER add_child so the selector's @onready nodes resolve first. selector.apply_font(ui_font, emoji_font) @@ -92,12 +102,28 @@ func set_surface_color_history(colors: Array[Color]) -> void: selector.set_surface_color_history(colors) +func set_background_state(kind: StringName, sky_id: StringName, plain_color: Color) -> void: + _current_background_kind = &"plain" if kind == &"plain" else &"sky" + _current_sky_id = sky_id + _current_plain_color = Color(plain_color.r, plain_color.g, plain_color.b, 1.0) + if selector != null: + selector.set_background_state(_current_background_kind, _current_sky_id, _current_plain_color) + + func _starter_scene_entries() -> Array[Dictionary]: return [ + { + "id": "starter_plain_background", + "name": "Plain Background", + "description": "An empty stage with one color. Choose a new color whenever you like.", + "category": "Make your own", + "path": "res://content/stages/starters/plain_background.scene", + "icon": "🎨", + }, { "id": "starter_blank_scene", - "name": "Blank Scene", - "description": "Start fresh with an open stage and a clear sky.", + "name": "Open Sky", + "description": "An empty stage with a soft sky. Sun and clouds, ready for your story.", "category": "Make your own", "path": "res://content/stages/starters/blank.scene", "icon": "✨", @@ -129,7 +155,16 @@ func make_browse_entry(kind: String, path: String) -> Dictionary: return stickman_library.make_entry(path) -func open_selector(kind: String, current_stickman_path: String, current_sky_id: StringName = &"") -> Dictionary: +func open_selector( + kind: String, + current_stickman_path: String, + current_sky_id: StringName = &"", + background_kind: StringName = &"sky", + plain_color: Color = Color("#F5EFE0") +) -> Dictionary: + _current_background_kind = &"plain" if background_kind == &"plain" else &"sky" + _current_sky_id = current_sky_id if not current_sky_id.is_empty() else &"sky_neutral" + _current_plain_color = Color(plain_color.r, plain_color.g, plain_color.b, 1.0) set_selector_kind(kind) var entries: Array[Dictionary] = scan_entries(kind) if kind == "starters": @@ -142,7 +177,7 @@ func open_selector(kind: String, current_stickman_path: String, current_sky_id: selected_stickman_path = String(entries[0].get("path", "")) var auto_selection: Dictionary = entries[0] if kind == "stickman" and entries.size() == 1 else {} if auto_selection.is_empty(): - open(kind, entries, current_sky_id) + open(kind, entries, _current_sky_id) return { "entries": entries, "selected_stickman_path": selected_stickman_path, @@ -152,6 +187,7 @@ func open_selector(kind: String, current_stickman_path: String, current_sky_id: func _scenery_background_entries() -> Array[Dictionary]: return [ + {"id": "plain_background", "name": "Plain Background", "category": "Scene background", "gallery_tab": "backgrounds", "background_kind": "plain", "plain_color": _current_plain_color, "icon": "🎨"}, {"id": "sky_clear_day", "name": "Clear Day", "category": "Sky", "gallery_tab": "backgrounds", "background_kind": "sky", "icon": "☀️"}, {"id": "sky_cloudy_day", "name": "Cloudy Day", "category": "Sky", "gallery_tab": "backgrounds", "background_kind": "sky", "icon": "☁️"}, {"id": "sky_sunset", "name": "Sunset", "category": "Sky", "gallery_tab": "backgrounds", "background_kind": "sky", "icon": "🌅"}, @@ -170,8 +206,9 @@ func open(kind: String, entries: Array[Dictionary], current_sky_id: StringName = selector_open = true if selector_dim != null: selector_dim.visible = true + selector_dim.color = Color(0.0, 0.0, 0.0, SELECTOR_DIM_ALPHA) if selector != null: - selector.open(kind, entries, String(current_sky_id)) + selector.open(kind, entries, String(current_sky_id), String(_current_background_kind), _current_plain_color) load_or_enqueue_thumbnails(kind, entries) @@ -206,6 +243,8 @@ func set_entries(entries: Array[Dictionary]) -> void: func refresh_selector_entries() -> Array[Dictionary]: var entries: Array[Dictionary] = scan_entries(selector_kind) + if selector_kind == "scenery": + entries.append_array(_scenery_background_entries()) set_entries(entries) return entries @@ -282,6 +321,13 @@ func _on_selector_cancelled() -> void: selector_cancel_requested.emit() +func _on_selector_stage_preview_dimming_changed(should_dim: bool) -> void: + if selector_dim == null: + return + selector_dim.color = Color(0.0, 0.0, 0.0, SELECTOR_DIM_ALPHA if should_dim else 0.0) + selector_dim.visible = selector_open + + func _on_selector_popup_hide() -> void: if not selector_open: return diff --git a/scripts/editors/stage/stage_scene_adapter.gd b/scripts/editors/stage/stage_scene_adapter.gd index 286fff0..f620b4a 100644 --- a/scripts/editors/stage/stage_scene_adapter.gd +++ b/scripts/editors/stage/stage_scene_adapter.gd @@ -130,6 +130,8 @@ func collect( "version": STAGE_SCENE_IO.FILE_VERSION, "scene_name": scene_name, "sky_id": String(document_metadata.get("sky_id", "sky_neutral")), + "background_kind": String(document_metadata.get("background_kind", "sky")), + "plain_color": String(document_metadata.get("plain_color", STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR)), "camera": {"position": STAGE_SCENE_IO.vector_to_data(camera_position), "zoom": camera_zoom}, "objects": objects, "event_rules": rules_result["rules"], @@ -299,6 +301,8 @@ func apply(data: Dictionary, world: Node2D, spawner: StageSpawner) -> Dictionary "missing_paths": missing_paths, "decoded_rules": decoded_rules, "sky_id": String(data.get("sky_id", "sky_neutral")), + "background_kind": String(data.get("background_kind", "sky")), + "plain_color": String(data.get("plain_color", STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR)), } diff --git a/scripts/shared/stage_ui/stage_surface_color_controls.gd b/scripts/shared/stage_ui/stage_surface_color_controls.gd index 6368ca2..864d048 100644 --- a/scripts/shared/stage_ui/stage_surface_color_controls.gd +++ b/scripts/shared/stage_ui/stage_surface_color_controls.gd @@ -39,14 +39,18 @@ func configure(selected: Color, recents: Array[Color], presets: Array[Color], st func set_selected_no_signal(color: Color) -> void: _selected = color _refresh_current_color() - _recent_swatches.set_selected(color) - _preset_swatches.set_selected(color) + if _recent_swatches != null: + _recent_swatches.set_selected(color) + if _preset_swatches != null: + _preset_swatches.set_selected(color) func set_recent_colors(colors: Array[Color]) -> void: if _recents == colors: return _recents = colors.duplicate() + if _recent_empty_label == null or _recent_swatches == null: + return _recent_empty_label.visible = _recents.is_empty() _recent_swatches.visible = not _recents.is_empty() _recent_swatches.configure(_recents, _selected, _stage_theme) @@ -99,6 +103,7 @@ func _build_current_color_section(parent: Control) -> void: current_row.add_theme_constant_override("separation", _compact_gap()) parent.add_child(current_row) _current_chip = Button.new() + _current_chip.name = "CurrentColorChip" var swatch_size: float = float(_integer("stage_surface_colors.swatch_size", 48, 44, 96)) if _compact_mode: swatch_size = maxf(swatch_size, 52.0) @@ -116,7 +121,8 @@ func _build_current_color_section(parent: Control) -> void: func _build_recent_color_section(parent: Control) -> void: parent.add_child(_make_heading("Recently used")) _recent_empty_label = Label.new() - _recent_empty_label.text = "No colors yet" if _compact_mode else "Colors you use will appear here" + _recent_empty_label.name = "RecentColorsEmptyLabel" + _recent_empty_label.text = "No colors yet" if _compact_mode else "Colors you use will appear here." _recent_empty_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART _recent_empty_label.add_theme_color_override("font_color", _color("global.muted_text_color", Color("#AAB2C0"))) if _compact_mode: @@ -125,7 +131,7 @@ func _build_recent_color_section(parent: Control) -> void: _recent_swatches = COLOR_SWATCH_SELECTOR.new() as ColorSwatchSelector _recent_swatches.size_flags_horizontal = Control.SIZE_EXPAND_FILL if _compact_mode: - _recent_swatches.set_swatch_layout_override(_integer("popups.asset_selector.compact_swatch_size", 42, 28, 52), 8) + _recent_swatches.set_swatch_layout_override(_integer("popups.asset_selector.compact_swatch_size", 44, 44, 52), 8) _recent_swatches.color_selected.connect(_on_swatch_selected) parent.add_child(_recent_swatches) @@ -135,7 +141,7 @@ func _build_palette_section(parent: Control) -> void: _preset_swatches = COLOR_SWATCH_SELECTOR.new() as ColorSwatchSelector _preset_swatches.size_flags_horizontal = Control.SIZE_EXPAND_FILL if _compact_mode: - _preset_swatches.set_swatch_layout_override(_integer("popups.asset_selector.compact_swatch_size", 42, 28, 52), 8) + _preset_swatches.set_swatch_layout_override(_integer("popups.asset_selector.compact_swatch_size", 44, 44, 52), 8) _preset_swatches.color_selected.connect(_on_swatch_selected) parent.add_child(_preset_swatches) diff --git a/scripts/shared/stage_ui/stage_surface_color_picker_view.gd b/scripts/shared/stage_ui/stage_surface_color_picker_view.gd index c111ef1..f337371 100644 --- a/scripts/shared/stage_ui/stage_surface_color_picker_view.gd +++ b/scripts/shared/stage_ui/stage_surface_color_picker_view.gd @@ -22,9 +22,11 @@ var _preferred_preview_height: float = 140.0 var _preferred_picker_min_size: Vector2 = Vector2(320.0, 340.0) var _built: bool = false var _suppress_color_signal: bool = false +var _plain_background_mode: bool = false func configure(surface_kind: StringName, finish: StringName, color: Color, stage_theme: SandboxTheme) -> void: + _plain_background_mode = false _surface_kind = surface_kind _finish_id = finish _stage_theme = stage_theme @@ -35,6 +37,19 @@ func configure(surface_kind: StringName, finish: StringName, color: Color, stage _apply_preview_heading_theme() +func configure_plain_background(color: Color, stage_theme: SandboxTheme) -> void: + _plain_background_mode = true + _surface_kind = &"plain_background" + _finish_id = &"" + _stage_theme = stage_theme + if not _built: + _build() + set_color_no_signal(Color(color.r, color.g, color.b, 1.0)) + _color_picker.edit_alpha = false + theme = stage_theme.control_theme() if stage_theme != null else null + _apply_preview_heading_theme() + + func get_color() -> Color: return _color_picker.color if _color_picker != null else Color.WHITE diff --git a/scripts/shared/ui/asset_card.gd b/scripts/shared/ui/asset_card.gd index 750b257..58805c2 100644 --- a/scripts/shared/ui/asset_card.gd +++ b/scripts/shared/ui/asset_card.gd @@ -15,6 +15,26 @@ var _label: Label = null var _description: Label = null var _status_label: Label = null +static var _rounded_preview_shader: Shader + +const ROUNDED_PREVIEW_SHADER_CODE := """ +shader_type canvas_item; + +uniform float corner_radius_px = 12.0; + +void fragment() { + vec4 preview_color = texture(TEXTURE, UV); + vec2 preview_size = vec2(1.0) / TEXTURE_PIXEL_SIZE; + vec2 half_size = preview_size * 0.5; + vec2 local_position = UV * preview_size; + vec2 rounded_box = abs(local_position - half_size) - (half_size - vec2(corner_radius_px)); + float edge_distance = length(max(rounded_box, vec2(0.0))) + min(max(rounded_box.x, rounded_box.y), 0.0) - corner_radius_px; + float antialias_width = max(fwidth(edge_distance), 1.0); + preview_color.a *= 1.0 - smoothstep(0.0, antialias_width, edge_distance); + COLOR = preview_color; +} +""" + func configure(payload: Dictionary, icon_texture: Texture2D = null, theme: Variant = null) -> void: _payload = payload.duplicate(true) _drag_threshold = theme.number("palette.drag_threshold", 8.0, 1.0, 128.0) if theme != null else 8.0 @@ -32,7 +52,9 @@ func configure(payload: Dictionary, icon_texture: Texture2D = null, theme: Varia _box.alignment = BoxContainer.ALIGNMENT_CENTER; _box.add_theme_constant_override("separation", 2); add_child(_box) _icon = TextureRect.new(); _icon.custom_minimum_size = thumbnail_size; _icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE; _icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED; _icon.texture = icon_texture; _icon.visible = icon_texture != null; _icon.mouse_filter = Control.MOUSE_FILTER_IGNORE; _box.add_child(_icon) _glyph = Label.new(); _glyph.text = String(_payload.get("icon", "")); _glyph.visible = icon_texture == null; _glyph.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER; _glyph.mouse_filter = Control.MOUSE_FILTER_IGNORE; _glyph.add_theme_font_size_override("font_size", 30); _box.add_child(_glyph) - _label = Label.new(); _label.text = String(_payload.get("label", "")); _label.custom_minimum_size = Vector2(0, 28); _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER; _label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART; _label.clip_text = true; _label.mouse_filter = Control.MOUSE_FILTER_IGNORE; _box.add_child(_label) + _label = Label.new(); _label.text = String(_payload.get("label", "")); _label.custom_minimum_size = Vector2(0, float(_payload.get("label_min_height", 28.0))); _label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER; _label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART; _label.clip_text = true; _label.mouse_filter = Control.MOUSE_FILTER_IGNORE; _box.add_child(_label) + if _payload.has("label_font_size"): + _label.add_theme_font_size_override("font_size", int(_payload["label_font_size"])) var description: String = String(_payload.get("description", "")) var status: String = String(_payload.get("status", "")) if not status.is_empty(): @@ -56,6 +78,8 @@ func configure(payload: Dictionary, icon_texture: Texture2D = null, theme: Varia _description.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART _description.max_lines_visible = 2 _description.add_theme_font_size_override("font_size", 14) + if _payload.has("description_font_size"): + _description.add_theme_font_size_override("font_size", int(_payload["description_font_size"])) _description.mouse_filter = Control.MOUSE_FILTER_IGNORE _box.add_child(_description) @@ -75,8 +99,34 @@ func set_preview_control(preview: Control) -> void: preview.custom_minimum_size = preview_size preview.size_flags_horizontal = Control.SIZE_EXPAND_FILL preview.mouse_filter = Control.MOUSE_FILTER_IGNORE - _box.add_child(preview) - _box.move_child(preview, 0) + var preview_corner_radius: float = float(_payload.get("preview_corner_radius", 0.0)) + if preview_corner_radius > 0.0: + var rounded_material := ShaderMaterial.new() + rounded_material.shader = _get_rounded_preview_shader() + rounded_material.set_shader_parameter("corner_radius_px", preview_corner_radius) + preview.material = rounded_material + var horizontal_inset: int = int(_payload.get("preview_horizontal_inset", 0)) + var top_inset: int = int(_payload.get("preview_top_inset", 0)) + if horizontal_inset > 0 or top_inset > 0: + var preview_frame := MarginContainer.new() + preview_frame.name = "PreviewInsetFrame" + preview_frame.size_flags_horizontal = Control.SIZE_EXPAND_FILL + preview_frame.add_theme_constant_override("margin_left", horizontal_inset) + preview_frame.add_theme_constant_override("margin_right", horizontal_inset) + preview_frame.add_theme_constant_override("margin_top", top_inset) + preview_frame.add_child(preview) + _box.add_child(preview_frame) + _box.move_child(preview_frame, 0) + else: + _box.add_child(preview) + _box.move_child(preview, 0) + + +func _get_rounded_preview_shader() -> Shader: + if _rounded_preview_shader == null: + _rounded_preview_shader = Shader.new() + _rounded_preview_shader.code = ROUNDED_PREVIEW_SHADER_CODE + return _rounded_preview_shader func set_thumbnail(texture: Texture2D) -> void: if _icon != null: _icon.texture = texture; _icon.visible = texture != null diff --git a/scripts/shared/ui/asset_selector.gd b/scripts/shared/ui/asset_selector.gd index 7eef4b6..7787e39 100644 --- a/scripts/shared/ui/asset_selector.gd +++ b/scripts/shared/ui/asset_selector.gd @@ -8,6 +8,10 @@ signal refresh_requested() signal make_artwork_requested() signal edit_scenery_requested() signal surface_color_confirmed(color: Color) +signal plain_color_preview_requested(color: Color) +signal plain_color_commit_requested(color: Color) +signal plain_color_preview_cancel_requested() +signal stage_preview_dimming_changed(should_dim: bool) const COLUMNS := 4 const ROWS := 3 @@ -49,11 +53,14 @@ var _filter_chip_group: ButtonGroup var _artwork_filter_buttons: Array[Button] = [] var _tag_id: String = "all" var _current_sky_id: String = "" +var _current_background_kind: StringName = &"sky" +var _current_plain_color: Color = Color("#F5EFE0") var _sky_card_group: ButtonGroup var _active_columns: int = COLUMNS var _page_capacity: int = PAGE_SIZE var _effective_cell_size: Vector2 = CELL_MIN_SIZE var _surface_cell_size: Vector2 = CELL_MIN_SIZE +var _surface_row_heading: Label var _surface_color_history: Array[Color] = [] var _setup_view: VBoxContainer var _color_picker_view: StageSurfaceColorPickerView @@ -69,6 +76,18 @@ var _setup_cancel_button: Button var _setup_draw_button: Button var _color_back_button: Button var _color_use_button: Button +var _plain_color_view: VBoxContainer +var _plain_color_preview: StageSurfacePreview +var _plain_color_controls: StageSurfaceColorControls +var _plain_color_helper: Label +var _plain_color_choices_open: bool = false +var _plain_color_original: Color = Color("#F5EFE0") +var _plain_color_draft: Color = Color("#F5EFE0") +var _color_picker_owner: StringName = &"surface" +var _backgrounds_back_button: Button +var _plain_footer_row: HBoxContainer +var _plain_footer_column: VBoxContainer +var _stage_preview_is_dimmed: bool = true @onready var _title_label: Label = %TitleLabel @onready var _grid: GridContainer = %GridContainer @@ -103,6 +122,8 @@ func _ready() -> void: tab.toggle_mode = true tab.button_group = _gallery_tab_group _build_surface_setup_view() + _build_plain_background_view() + _build_surface_row_heading() _rebuild_artwork_filter_chips() _prev_button.pressed.connect(_on_prev) _next_button.pressed.connect(_on_next) @@ -113,6 +134,7 @@ func _ready() -> void: _artwork_tab.pressed.connect(func() -> void: _set_gallery_tab("artwork")) _make_artwork_button.pressed.connect(func() -> void: make_artwork_requested.emit()) _edit_scenery_button.pressed.connect(func() -> void: edit_scenery_requested.emit()) + popup_hide.connect(_on_popup_hide) get_tree().root.size_changed.connect(_on_root_size_changed) _apply_chooser_visual_style() @@ -123,15 +145,27 @@ func _on_root_size_changed() -> void: _rebuild() -func open(p_kind: String, entries: Array[Dictionary], current_sky_id: String = "") -> void: +func open( + p_kind: String, + entries: Array[Dictionary], + current_sky_id: String = "", + current_background_kind: String = "sky", + plain_color: Color = Color("#F5EFE0") +) -> void: + _cancel_plain_picker_preview(false) kind = p_kind _setup_kind = &"" _color_picker_open = false + _plain_color_choices_open = false _setup_view.visible = false + _plain_color_view.visible = false if _color_picker_view != null: _color_picker_view.visible = false _current_sky_id = current_sky_id if kind == "scenery" else "" + _current_background_kind = &"plain" if current_background_kind == "plain" else &"sky" + _current_plain_color = _opaque_color(plain_color) _title_label.text = "Choose Your Stickman" if kind == "stickman" else ("Choose Scenery" if kind == "scenery" else ("Choose a starter scene" if kind == "starters" else "Choose a Prop")) + _backgrounds_back_button.visible = false _apply_chooser_visual_style() _tabs.visible = kind == "scenery" _filter_chips.visible = false @@ -165,6 +199,47 @@ func set_surface_color_history(colors: Array[Color]) -> void: _surface_color_history = colors.duplicate() if _setup_color_controls != null and is_instance_valid(_setup_color_controls): _setup_color_controls.set_recent_colors(_surface_color_history) + if _plain_color_controls != null and is_instance_valid(_plain_color_controls): + _plain_color_controls.set_recent_colors(_surface_color_history) + + +func set_background_state(background_kind: StringName, sky_id: StringName, plain_color: Color) -> void: + _current_background_kind = &"plain" if background_kind == &"plain" else &"sky" + _current_sky_id = String(sky_id) + _current_plain_color = _opaque_color(plain_color) + for entry: Dictionary in _entries: + if String(entry.get("background_kind", "")) == "plain": + entry["plain_color"] = _current_plain_color + if not _plain_color_choices_open and not (_color_picker_open and _color_picker_owner == &"plain"): + _plain_color_draft = _current_plain_color + if _plain_color_preview != null: + _plain_color_preview.configure(&"plain_background", &"", _current_plain_color) + if _plain_color_controls != null: + _plain_color_controls.set_selected_no_signal(_current_plain_color) + if _color_picker_open and _color_picker_owner == &"plain" and _color_picker_view != null: + _color_picker_view.configure_plain_background(_current_plain_color, _sandbox_theme as SandboxTheme) + if kind == "scenery" and _gallery_tab == "backgrounds": + _rebuild() + + +func open_plain_background_choices(color: Color) -> void: + _current_plain_color = _opaque_color(color) + _plain_color_draft = _current_plain_color + _plain_color_choices_open = true + _color_picker_open = false + _color_picker_owner = &"plain" + _title_label.text = "Choose background color" + _backgrounds_back_button.text = "‹ Backgrounds" + _backgrounds_back_button.visible = true + _plain_color_view.visible = true + _setup_view.visible = false + _color_picker_view.visible = false + _plain_color_preview.configure(&"plain_background", &"", _current_plain_color) + _plain_color_controls.configure(_current_plain_color, _surface_color_history, _preset_surface_colors(), _sandbox_theme as SandboxTheme) + _update_popup_layout(true) + _rebuild() + call_deferred("_update_popup_layout_after_layout") + call_deferred("_focus_plain_color_controls") func set_thumbnail(entry: Dictionary, tex: Texture2D) -> void: @@ -198,6 +273,7 @@ func apply_font(ui_font: Font, emoji_font: Font) -> void: _prev_button, _next_button, _browse_button, _refresh_button, _close_button, _edit_scenery_button, _make_artwork_button, _backgrounds_tab, _artwork_tab, + _backgrounds_back_button, _plain_color_helper, _setup_view.get_node_or_null("SetupHeading") if _setup_view != null else null, get_meta("setup_helper", null) as Control, _setup_cancel_button, _setup_draw_button, @@ -226,8 +302,13 @@ func apply_theme(theme: Variant) -> void: ground_choices.apply_theme(theme as SandboxTheme) if _setup_color_controls != null: _setup_color_controls.configure(_setup_color, _surface_color_history, _preset_surface_colors(), theme as SandboxTheme) + if _plain_color_controls != null: + _plain_color_controls.configure(_current_plain_color, _surface_color_history, _preset_surface_colors(), theme as SandboxTheme) if _color_picker_view != null: - _color_picker_view.configure(_setup_kind, _setup_finish, _setup_color, theme as SandboxTheme) + if _color_picker_owner == &"plain": + _color_picker_view.configure_plain_background(_plain_color_draft, theme as SandboxTheme) + else: + _color_picker_view.configure(_setup_kind, _setup_finish, _setup_color, theme as SandboxTheme) _apply_chooser_visual_style() @@ -305,7 +386,7 @@ func _build_surface_setup_view() -> void: _color_picker_view = SURFACE_COLOR_PICKER_VIEW.new() as StageSurfaceColorPickerView _color_picker_view.name = "SurfaceColorPickerView" _color_picker_view.size_flags_horizontal = Control.SIZE_EXPAND_FILL - _color_picker_view.preview_color_changed.connect(_on_setup_color_preview) + _color_picker_view.preview_color_changed.connect(_on_color_picker_preview) _color_picker_view.visible = false _content_stack.add_child(_color_picker_view) _setup_cancel_button = Button.new() @@ -349,6 +430,77 @@ func _build_surface_setup_view() -> void: _apply_font_to(choice) +func _build_plain_background_view() -> void: + _plain_color_view = VBoxContainer.new() + _plain_color_view.name = "PlainBackgroundColorChoices" + _plain_color_view.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _plain_color_view.add_theme_constant_override("separation", _theme_integer("popups.asset_selector.setup_gap", 8, 4, 24)) + _plain_color_view.visible = false + _content_stack.add_child(_plain_color_view) + _plain_color_helper = Label.new() + _plain_color_helper.name = "PlainBackgroundHelper" + _plain_color_helper.text = "Tap a color to use it on the Stage." + _plain_color_helper.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART + _plain_color_helper.add_theme_color_override("font_color", _theme_color("global.muted_text_color", Color("#AAB2C0"))) + _plain_color_view.add_child(_plain_color_helper) + var preview_frame := PanelContainer.new() + preview_frame.name = "PlainBackgroundPreviewFrame" + var preview_size: Vector2 = _theme_vector2("popups.asset_selector.surface_preview_size", Vector2(420.0, 132.0)) + preview_size.y = minf(preview_size.y, 132.0) + preview_frame.custom_minimum_size.y = preview_size.y + 6.0 + preview_frame.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _plain_color_preview = SURFACE_PREVIEW.new() as StageSurfacePreview + _plain_color_preview.name = "PlainBackgroundPreview" + _plain_color_preview.set_rounded_frame( + float(_theme_integer("popups.asset_selector.surface_corner_radius", 14, 4, 32)), + _theme_color("popups.style_defaults.bg_color", Color("#202633FA")) + ) + _plain_color_preview.custom_minimum_size = preview_size + _plain_color_preview.size_flags_horizontal = Control.SIZE_EXPAND_FILL + preview_frame.add_child(_plain_color_preview) + _plain_color_view.add_child(preview_frame) + _plain_color_controls = SURFACE_COLOR_CONTROLS.new() as StageSurfaceColorControls + _plain_color_controls.name = "PlainBackgroundColorControls" + _plain_color_controls.color_selected.connect(_on_plain_color_selected) + _plain_color_controls.custom_color_requested.connect(_open_plain_color_picker) + _plain_color_view.add_child(_plain_color_controls) + _backgrounds_back_button = Button.new() + _backgrounds_back_button.name = "BackgroundsBackButton" + _backgrounds_back_button.text = "‹ Backgrounds" + _backgrounds_back_button.custom_minimum_size = Vector2(148.0, float(_theme_integer("stage_panels.action.min_target_size", 48, 44, 96))) + _backgrounds_back_button.focus_mode = Control.FOCUS_ALL + _backgrounds_back_button.visible = false + _backgrounds_back_button.pressed.connect(_back_to_backgrounds) + _footer.add_child(_backgrounds_back_button) + _plain_footer_row = HBoxContainer.new() + _plain_footer_row.name = "PlainBackgroundFooterRow" + _plain_footer_row.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _plain_footer_row.alignment = BoxContainer.ALIGNMENT_BEGIN + _plain_footer_row.add_theme_constant_override("separation", _theme_integer("popups.asset_selector.footer_gap", 16, 8, 32)) + _plain_footer_row.visible = false + _footer.add_child(_plain_footer_row) + _plain_footer_column = VBoxContainer.new() + _plain_footer_column.name = "PlainBackgroundFooterColumn" + _plain_footer_column.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _plain_footer_column.add_theme_constant_override("separation", _theme_integer("popups.asset_selector.footer_gap", 16, 8, 32)) + _plain_footer_column.visible = false + _footer.add_child(_plain_footer_column) + _apply_font_to(_plain_color_helper) + _apply_font_to(_backgrounds_back_button) + _apply_chooser_visual_style() + + +func _build_surface_row_heading() -> void: + _surface_row_heading = Label.new() + _surface_row_heading.name = "MoreBackgroundsHeading" + _surface_row_heading.text = "More backgrounds" + _surface_row_heading.visible = false + _surface_row_heading.add_theme_font_size_override("font_size", _theme_integer("popups.asset_selector.setup_heading_size", 26, 18, 48)) + _content_stack.add_child(_surface_row_heading) + _content_stack.move_child(_surface_row_heading, _surface_cards_row.get_index()) + _apply_font_to(_surface_row_heading) + + func _make_look_cue(kind: StringName, finish: StringName) -> Control: var preview: StageSurfacePreview = SURFACE_PREVIEW.new() as StageSurfacePreview var cue_size: Vector2 = _theme_vector2("popups.asset_selector.look_cue_size", Vector2(80.0, 42.0)) @@ -418,6 +570,14 @@ func _on_setup_color_selected(color: Color) -> void: surface_color_confirmed.emit(_setup_color) +func _on_plain_color_selected(color: Color) -> void: + _current_plain_color = _opaque_color(color) + _plain_color_draft = _current_plain_color + _plain_color_preview.configure(&"plain_background", &"", _current_plain_color) + _plain_color_controls.set_selected_no_signal(_current_plain_color) + plain_color_commit_requested.emit(_current_plain_color) + + func _update_setup_preview() -> void: if _setup_preview == null: return @@ -437,6 +597,7 @@ func _open_setup_color_view() -> void: _setup_original_color = _setup_color _color_picker_view.configure(_setup_kind, _setup_finish, _setup_original_color, _sandbox_theme as SandboxTheme) _color_picker_open = true + _color_picker_owner = &"surface" _title_label.text = "Choose color" _rebuild() _update_popup_layout() @@ -444,12 +605,45 @@ func _open_setup_color_view() -> void: _color_picker_view.focus_picker() +func _open_plain_color_picker() -> void: + if not _plain_color_choices_open: + return + _plain_color_original = _current_plain_color + _plain_color_draft = _current_plain_color + _color_picker_owner = &"plain" + _color_picker_view.configure_plain_background(_plain_color_draft, _sandbox_theme as SandboxTheme) + _color_back_button.text = "‹ Plain Background" + _plain_color_choices_open = false + _color_picker_open = true + _title_label.text = "Choose background color" + _backgrounds_back_button.visible = false + _update_popup_layout(true) + _rebuild() + call_deferred("_update_popup_layout_after_layout") + _color_picker_view.focus_picker() + + func _on_setup_color_preview(color: Color) -> void: _setup_color = _opaque_color(color) _update_setup_preview() +func _on_color_picker_preview(color: Color) -> void: + if _color_picker_owner == &"plain": + _plain_color_draft = _opaque_color(color) + plain_color_preview_requested.emit(_plain_color_draft) + return + _on_setup_color_preview(color) + + func _use_setup_color() -> void: + if _color_picker_owner == &"plain": + _current_plain_color = _opaque_color(_color_picker_view.get_color()) + _plain_color_draft = _current_plain_color + _plain_color_preview.configure(&"plain_background", &"", _current_plain_color) + plain_color_commit_requested.emit(_current_plain_color) + _close_plain_color_picker() + return _setup_color = _opaque_color(_color_picker_view.get_color()) _setup_color_chosen = true _update_setup_preview() @@ -459,6 +653,9 @@ func _use_setup_color() -> void: func _back_from_setup_color_view() -> void: + if _color_picker_owner == &"plain": + _cancel_plain_picker_preview(true) + return _setup_color = _setup_original_color _setup_color_controls.set_selected_no_signal(_setup_color) _update_setup_preview() @@ -475,6 +672,74 @@ func _close_setup_color_view() -> void: call_deferred("_update_popup_layout_after_layout") +func _close_plain_color_picker() -> void: + _color_picker_open = false + _plain_color_choices_open = true + _title_label.text = "Choose background color" + _backgrounds_back_button.text = "‹ Backgrounds" + _backgrounds_back_button.visible = true + _plain_color_view.visible = true + _plain_color_preview.configure(&"plain_background", &"", _current_plain_color) + _plain_color_controls.set_selected_no_signal(_current_plain_color) + _update_popup_layout(true) + _rebuild() + call_deferred("_update_popup_layout_after_layout") + call_deferred("_focus_plain_color_controls") + + +func _cancel_plain_picker_preview(return_to_choices: bool = true) -> void: + if not _color_picker_open or _color_picker_owner != &"plain": + return + _plain_color_draft = _current_plain_color + _color_picker_open = false + plain_color_preview_cancel_requested.emit() + if _color_picker_view != null: + _color_picker_view.configure_plain_background(_current_plain_color, _sandbox_theme as SandboxTheme) + if return_to_choices and kind == "scenery": + _plain_color_choices_open = true + _title_label.text = "Choose background color" + _backgrounds_back_button.text = "‹ Backgrounds" + _backgrounds_back_button.visible = true + _plain_color_view.visible = true + _plain_color_preview.configure(&"plain_background", &"", _current_plain_color) + _plain_color_controls.set_selected_no_signal(_current_plain_color) + _update_popup_layout(true) + _rebuild() + call_deferred("_update_popup_layout_after_layout") + call_deferred("_focus_plain_color_controls") + + +func _back_to_backgrounds() -> void: + if _color_picker_open and _color_picker_owner == &"plain": + _cancel_plain_picker_preview(true) + return + _plain_color_choices_open = false + _plain_color_view.visible = false + _backgrounds_back_button.visible = false + _title_label.text = "Choose the scene background" + _update_popup_layout(true) + _rebuild() + call_deferred("_focus_plain_background_card") + + +func _focus_plain_color_controls() -> void: + if _plain_color_controls != null and _plain_color_controls.visible: + _plain_color_controls.focus_custom_button() + + +func _focus_plain_background_card() -> void: + for node: Node in _grid.get_children(): + var card: AssetCard = node as AssetCard + if card != null and String(card.get_meta("entry_id", "")) == "plain_background": + card.grab_focus() + return + + +func _on_popup_hide() -> void: + if _color_picker_open and _color_picker_owner == &"plain": + _cancel_plain_picker_preview(true) + + func _opaque_color(color: Color) -> Color: return Color(color.r, color.g, color.b, 1.0) @@ -600,11 +865,17 @@ func _has_unsorted_artwork() -> bool: func _set_gallery_tab(tab: String) -> void: + if _color_picker_open and _color_picker_owner == &"plain": + _cancel_plain_picker_preview(false) _color_picker_open = false + _plain_color_choices_open = false _setup_kind = &"" _setup_view.visible = false + _plain_color_view.visible = false _color_picker_view.visible = false + _backgrounds_back_button.visible = false _gallery_tab = tab + _title_label.text = "Choose the scene background" if tab == "backgrounds" else "Choose Scenery" _backgrounds_tab.set_pressed_no_signal(tab == "backgrounds") _artwork_tab.set_pressed_no_signal(tab == "artwork") _filter_chips.visible = kind == "scenery" and tab == "artwork" @@ -677,49 +948,70 @@ func _usable_screen_size() -> Vector2: func _update_popup_layout(keep_visible_position: bool = false) -> void: var previous_position: Vector2i = position var in_color_picker: bool = _color_picker_open + var in_plain_choices: bool = _plain_color_choices_open and not in_color_picker var in_setup: bool = not _setup_kind.is_empty() and not in_color_picker - var scenery_background_gallery: bool = _is_scenery_background_gallery() and not in_setup and not in_color_picker - var scenery_artwork_gallery: bool = _is_scenery_artwork_gallery() and not in_setup and not in_color_picker + var in_subview: bool = in_setup or in_color_picker or in_plain_choices + var scenery_background_gallery: bool = _is_scenery_background_gallery() and not in_subview + var scenery_artwork_gallery: bool = _is_scenery_artwork_gallery() and not in_subview var filtered: Array[Dictionary] = _filtered_entries() - _tabs.visible = kind == "scenery" and not in_color_picker + _tabs.visible = kind == "scenery" and not in_subview _filter_chips.visible = scenery_artwork_gallery - _position_footer() _close_button.visible = not in_setup and not in_color_picker _setup_cancel_button.visible = in_setup _setup_draw_button.visible = in_setup _setup_view.visible = in_setup + _plain_color_view.visible = in_plain_choices + _backgrounds_back_button.visible = in_plain_choices _color_picker_view.visible = in_color_picker _surface_cards_row.visible = scenery_background_gallery and _has_surface_entries(filtered) + _surface_row_heading.visible = _surface_cards_row.visible _color_back_button.visible = in_color_picker _color_use_button.visible = in_color_picker _edit_scenery_button.visible = kind == "scenery" and not in_setup and not in_color_picker _footer_spacer.visible = scenery_artwork_gallery - _empty_label.visible = filtered.is_empty() and not in_setup and not in_color_picker - _grid.visible = not filtered.is_empty() and not in_setup and not in_color_picker - _grid_scroll.visible = not filtered.is_empty() or in_setup or in_color_picker - _footer.alignment = BoxContainer.ALIGNMENT_BEGIN if scenery_artwork_gallery else (BoxContainer.ALIGNMENT_END if in_setup or in_color_picker else BoxContainer.ALIGNMENT_CENTER) + _empty_label.visible = filtered.is_empty() and not in_subview + _grid.visible = not filtered.is_empty() and not in_subview + _grid_scroll.visible = not filtered.is_empty() or in_subview + _footer.alignment = BoxContainer.ALIGNMENT_BEGIN if scenery_artwork_gallery or in_subview else BoxContainer.ALIGNMENT_CENTER _footer.add_theme_constant_override( "separation", - _theme_integer("popups.asset_selector.footer_gap", 16, 8, 32) if in_setup or in_color_picker or kind == "scenery" else 8 + _theme_integer("popups.asset_selector.footer_gap", 16, 8, 32) if in_subview or kind == "scenery" else 8 ) var available: Vector2 = _usable_screen_size() - var width_ratio: float = 0.98 if in_setup else 0.94 + var width_ratio: float = 0.98 if in_subview else (0.96 if kind == "starters" else 0.94) var max_width: float = maxf(1.0, minf(available.x * width_ratio, available.x - POPUP_SAFE_SCREEN_MARGIN)) - var max_height: float = maxf(1.0, minf(available.y * 0.86, available.y - POPUP_SAFE_SCREEN_MARGIN * 2.0)) - var preferred_width: float = CELL_MIN_SIZE.x * COLUMNS + GRID_H_SEPARATION * (COLUMNS - 1) + POPUP_SIDE_PADDING + var height_ratio: float = _theme_number("popups.asset_selector.starter_viewport_height_ratio", 0.96, 0.7, 0.98) if kind == "starters" else 0.86 + var max_height: float = maxf(1.0, minf(available.y * height_ratio, available.y - POPUP_SAFE_SCREEN_MARGIN * 2.0)) + var preferred_width: float = CELL_MIN_SIZE.x * (2 if kind == "starters" else COLUMNS) + GRID_H_SEPARATION * ((2 if kind == "starters" else COLUMNS) - 1) + POPUP_SIDE_PADDING var preferred_height: float = max_height - if in_color_picker: + if kind == "starters": + preferred_width = _theme_number("popups.asset_selector.starter_dialog_width", 1160.0, 440.0, 2400.0) + if in_color_picker or in_plain_choices: var color_dialog_size: Vector2 = _theme_vector2("popups.dialog.surface_color_size", Vector2(560.0, 640.0)) preferred_width = color_dialog_size.x preferred_height = color_dialog_size.y var popup_width: float = minf(preferred_width, max_width) + _position_footer(popup_width) var grid_width: float = maxf(1.0, popup_width - POPUP_SIDE_PADDING) - _active_columns = clampi(floori((grid_width + GRID_H_SEPARATION) / (CELL_MIN_SIZE.x + GRID_H_SEPARATION)), 1, COLUMNS) - _page_capacity = maxi(1, filtered.size()) if scenery_background_gallery or scenery_artwork_gallery else _active_columns * ROWS + var minimum_card_width: float = CELL_MIN_SIZE.x + if kind == "starters": + minimum_card_width = _theme_number("popups.asset_selector.starter_card_min_width", 340.0, 220.0, 800.0) + _active_columns = clampi(floori((grid_width + GRID_H_SEPARATION) / (minimum_card_width + GRID_H_SEPARATION)), 1, 2 if kind == "starters" else COLUMNS) + _page_capacity = maxi(1, filtered.size()) if scenery_background_gallery or scenery_artwork_gallery or kind == "starters" else _active_columns * ROWS _grid.columns = _active_columns - var card_width: float = minf(CELL_MIN_SIZE.x, (grid_width - GRID_H_SEPARATION * (_active_columns - 1)) / float(_active_columns)) - var card_height_limit: float = 248.0 if kind == "starters" else CELL_MIN_SIZE.y - var card_height: float = minf(card_height_limit, card_width + (58.0 if kind == "starters" else 30.0)) + var available_card_width: float = (grid_width - GRID_H_SEPARATION * (_active_columns - 1)) / float(_active_columns) + var card_width: float = available_card_width if kind == "starters" else minf(CELL_MIN_SIZE.x, available_card_width) + var card_height_limit: float = 248.0 if kind != "starters" else INF + var card_height: float + if kind == "starters": + var preview_horizontal_inset: float = _theme_number("popups.asset_selector.starter_preview_horizontal_inset", 10.0, 0.0, 32.0) + var preview_aspect: float = _theme_number("popups.asset_selector.starter_preview_aspect", 2.0, 1.2, 2.8) + var preview_top_inset: float = _theme_number("popups.asset_selector.starter_preview_top_inset", 6.0, 0.0, 24.0) + var preview_height: float = maxf(1.0, card_width - preview_horizontal_inset * 2.0) / preview_aspect + var text_and_spacing_height: float = _theme_number("popups.asset_selector.starter_card_text_height", 92.0, 72.0, 144.0) + card_height = preview_height + preview_top_inset + text_and_spacing_height + else: + card_height = minf(card_height_limit, card_width + 30.0) _effective_cell_size = Vector2(maxf(96.0, card_width), maxf(180.0, card_height)) var surface_width: float = minf(_effective_cell_size.x, maxf(96.0, (grid_width - GRID_H_SEPARATION) * 0.5)) var surface_height: float = maxf(180.0, minf(card_height_limit, surface_width + 30.0)) @@ -729,18 +1021,20 @@ func _update_popup_layout(keep_visible_position: bool = false) -> void: _page = clampi(_page, 0, page_count - 1) var page_start: int = _page * _page_capacity var page_items: int = clampi(filtered_count - page_start, 0, _page_capacity) - var grid_item_count: int = _count_sky_entries(filtered) if scenery_background_gallery else page_items + var grid_item_count: int = _count_scene_background_entries(filtered) if scenery_background_gallery else page_items var grid_rows: int = int(ceil(float(grid_item_count) / float(_active_columns))) if grid_item_count > 0 else 0 var body_height: float if in_color_picker: _color_picker_view.set_available_size(Vector2(popup_width, minf(preferred_height, max_height))) body_height = maxf(220.0, _color_picker_view.get_combined_minimum_size().y) + elif in_plain_choices: + body_height = maxf(220.0, _visible_content_minimum_height(_plain_color_view)) elif in_setup: body_height = maxf(180.0, _visible_content_minimum_height(_setup_view)) else: body_height = maxf(120.0, float(grid_rows) * _effective_cell_size.y + float(maxi(0, grid_rows - 1)) * GRID_V_SEPARATION) if scenery_background_gallery and _has_surface_entries(filtered): - body_height += _surface_cell_size.y + GRID_V_SEPARATION + body_height += _surface_cell_size.y + _surface_row_heading.get_combined_minimum_size().y + GRID_V_SEPARATION * 2.0 if page_items == 0: body_height = maxf(body_height, _empty_label.get_combined_minimum_size().y) _tabs.custom_minimum_size.x = grid_width @@ -798,6 +1092,8 @@ func _update_popup_layout(keep_visible_position: bool = false) -> void: _color_back_button.custom_minimum_size.x = action_width _color_use_button.custom_minimum_size.x = action_width size = Vector2i(maxi(1, roundi(popup_width)), maxi(1, roundi(popup_height))) + _position_footer(float(size.x)) + _sync_stage_preview_dimming() if visible: if keep_visible_position: var max_x: int = maxi(0, floori(available.x - float(size.x) - POPUP_SAFE_SCREEN_MARGIN)) @@ -815,7 +1111,7 @@ func _update_popup_layout(keep_visible_position: bool = false) -> void: func _update_popup_layout_after_layout() -> void: await get_tree().process_frame if is_inside_tree(): - _update_popup_layout() + _update_popup_layout(visible) func _rebuild() -> void: @@ -827,27 +1123,33 @@ func _rebuild() -> void: _cell_texrects.clear() var filtered: Array[Dictionary] = _filtered_entries() var in_color_picker: bool = _color_picker_open + var in_plain_choices: bool = _plain_color_choices_open and not in_color_picker var in_setup: bool = not _setup_kind.is_empty() and not in_color_picker - var scenery_background_gallery: bool = _is_scenery_background_gallery() and not in_setup and not in_color_picker - var scenery_artwork_gallery: bool = _is_scenery_artwork_gallery() and not in_setup and not in_color_picker - _position_footer() + var in_subview: bool = in_setup or in_color_picker or in_plain_choices + var scenery_background_gallery: bool = _is_scenery_background_gallery() and not in_subview + var scenery_artwork_gallery: bool = _is_scenery_artwork_gallery() and not in_subview + _position_footer(float(size.x)) + _sync_stage_preview_dimming() _close_button.visible = not in_setup and not in_color_picker _setup_view.visible = in_setup + _plain_color_view.visible = in_plain_choices + _backgrounds_back_button.visible = in_plain_choices _color_picker_view.visible = in_color_picker _filter_chips.visible = scenery_artwork_gallery _surface_cards_row.visible = scenery_background_gallery and _has_surface_entries(filtered) + _surface_row_heading.visible = _surface_cards_row.visible _setup_cancel_button.visible = in_setup _setup_draw_button.visible = in_setup _color_back_button.visible = in_color_picker _color_use_button.visible = in_color_picker - _edit_scenery_button.visible = kind == "scenery" and not in_setup and not in_color_picker + _edit_scenery_button.visible = kind == "scenery" and not in_subview _make_artwork_button.visible = scenery_artwork_gallery _browse_button.visible = (kind == "stickman" or kind == "prop") and not in_setup and not in_color_picker _refresh_button.visible = (kind == "stickman" or kind == "prop") and not in_setup and not in_color_picker _footer_spacer.visible = scenery_artwork_gallery - _empty_label.visible = filtered.is_empty() and not in_setup and not in_color_picker - _grid.visible = not filtered.is_empty() and not in_setup and not in_color_picker - _grid_scroll.visible = not filtered.is_empty() or in_setup or in_color_picker + _empty_label.visible = filtered.is_empty() and not in_subview + _grid.visible = not filtered.is_empty() and not in_subview + _grid_scroll.visible = not filtered.is_empty() or in_subview var total := _page_count() var single := total <= 1 _prev_button.visible = not single @@ -856,7 +1158,7 @@ func _rebuild() -> void: _prev_button.disabled = _page <= 0 _next_button.disabled = (_page + 1) * _page_capacity >= filtered.size() _page_label.text = "Page %d/%d" % [_page + 1, total] - if in_setup or in_color_picker: + if in_subview: _prev_button.visible = false _next_button.visible = false _page_label.visible = false @@ -869,7 +1171,7 @@ func _rebuild() -> void: if scenery_background_gallery: for entry: Dictionary in filtered: var background_kind: String = String(entry.get("background_kind", "")) - if background_kind == "sky": + if background_kind == "sky" or background_kind == "plain": _grid.add_child(_build_cell(entry)) elif background_kind == "wall_setup" or background_kind == "background_ground_setup": _surface_cards_row.add_child(_build_cell(entry, _surface_cell_size)) @@ -879,15 +1181,70 @@ func _rebuild() -> void: _grid.add_child(_build_cell(filtered[i])) -func _position_footer() -> void: +func _position_footer(target_width: float = -1.0) -> void: var parent := _footer.get_parent() as VBoxContainer if parent == null: return var target_index: int = parent.get_child_count() - 1 if _footer.get_index() != target_index: parent.move_child(_footer, target_index) - if _close_button.get_parent() == _footer and _close_button.get_index() != 0: - _footer.move_child(_close_button, 0) + var in_plain_choices: bool = _plain_color_choices_open and not _color_picker_open + if in_plain_choices: + var available_width: float = target_width if target_width >= 0.0 else float(size.x) + var stack_actions: bool = available_width < 380.0 + var action_container: Control = _plain_footer_column if stack_actions else _plain_footer_row + _plain_footer_row.visible = not stack_actions + _plain_footer_column.visible = stack_actions + _move_footer_control(_backgrounds_back_button, action_container, 0) + if stack_actions: + _move_footer_control(_close_button, action_container, 1) + _move_footer_control(_footer_spacer, _footer, 1) + _footer_spacer.visible = false + _backgrounds_back_button.custom_minimum_size.x = 0.0 + _close_button.custom_minimum_size.x = 0.0 + _backgrounds_back_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + _close_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL + else: + _move_footer_control(_footer_spacer, action_container, 1) + _move_footer_control(_close_button, action_container, 2) + _footer_spacer.visible = true + _backgrounds_back_button.custom_minimum_size.x = 148.0 + _close_button.custom_minimum_size.x = 136.0 + _backgrounds_back_button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN + _close_button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN + return + _plain_footer_row.visible = false + _plain_footer_column.visible = false + _move_footer_control(_backgrounds_back_button, _footer, 1) + _move_footer_control(_footer_spacer, _footer, 1) + _move_footer_control(_close_button, _footer, 0) + _backgrounds_back_button.custom_minimum_size.x = 148.0 + _close_button.custom_minimum_size.x = 136.0 + _backgrounds_back_button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN + _close_button.size_flags_horizontal = Control.SIZE_SHRINK_BEGIN + + +func _move_footer_control(control: Control, target: Control, index: int) -> void: + if control == null or target == null: + return + if control.get_parent() != target: + var old_parent: Node = control.get_parent() + if old_parent != null: + old_parent.remove_child(control) + target.add_child(control) + var safe_index: int = clampi(index, 0, maxi(0, target.get_child_count() - 1)) + if control.get_index() != safe_index: + target.move_child(control, safe_index) + + +func _sync_stage_preview_dimming() -> void: + var should_dim: bool = not (_plain_color_choices_open and kind == "scenery") + if _color_picker_open and _color_picker_owner == &"plain": + should_dim = false + if should_dim == _stage_preview_is_dimmed: + return + _stage_preview_is_dimmed = should_dim + stage_preview_dimming_changed.emit(should_dim) func _is_scenery_background_gallery() -> bool: @@ -898,10 +1255,10 @@ func _is_scenery_artwork_gallery() -> bool: return kind == "scenery" and _gallery_tab == "artwork" -func _count_sky_entries(entries: Array[Dictionary]) -> int: +func _count_scene_background_entries(entries: Array[Dictionary]) -> int: var count: int = 0 for entry: Dictionary in entries: - if String(entry.get("background_kind", "")) == "sky": + if String(entry.get("background_kind", "")) in ["sky", "plain"]: count += 1 return count @@ -930,8 +1287,8 @@ func _visible_content_minimum_height(container: VBoxContainer) -> float: func _build_cell(entry: Dictionary, requested_size: Vector2 = Vector2.ZERO) -> Control: var key := _entry_key(entry) var cell: Variant = ASSET_CARD.new() - # Give scenery cards rounded resting and interaction states. The selected sky - # state is applied separately below, so opening the gallery stays neutral. + # Scene cards have clear rounded resting and interaction states. Selected + # background state is applied separately below. var categories: Array = entry.get("tags", []) as Array var category: String = ", ".join(PackedStringArray(categories)) if not categories.is_empty() else String(entry.get("category", entry.get("material_label", ""))) var card_size: Vector2 = _effective_cell_size if requested_size == Vector2.ZERO else requested_size @@ -940,56 +1297,88 @@ func _build_cell(entry: Dictionary, requested_size: Vector2 = Vector2.ZERO) -> C var thumb_edge: float = minf(_thumbnail_size.x, minf(card_size.x - 20.0, thumb_height_budget)) var thumb_size := Vector2.ONE * maxf(72.0, thumb_edge) if kind == "starters": - thumb_size = Vector2.ONE * minf(128.0, maxf(72.0, thumb_edge)) + var preview_horizontal_inset: float = _theme_number("popups.asset_selector.starter_preview_horizontal_inset", 10.0, 0.0, 32.0) + var preview_aspect: float = _theme_number("popups.asset_selector.starter_preview_aspect", 2.0, 1.2, 2.8) + var preview_width: float = maxf(72.0, card_size.x - preview_horizontal_inset * 2.0) + thumb_size = Vector2(preview_width, preview_width / preview_aspect) var description: String = "" if is_background_ground_setup else String(entry.get("description", "")) var card_payload: Dictionary = {"placement_id": _entry_key(entry), "label": String(entry.get("name", entry.get("id", ""))), "icon": String(entry.get("icon", "")), "category": category, "description": description, "thumbnail_size": thumb_size} + if kind == "starters": + card_payload["label_font_size"] = _theme_integer("popups.asset_selector.starter_label_size", 22, 18, 32) + card_payload["label_min_height"] = _theme_integer("popups.asset_selector.starter_label_height", 34, 28, 52) + card_payload["description_font_size"] = _theme_integer("popups.asset_selector.starter_description_size", 20, 16, 30) + card_payload["description_min_height"] = _theme_integer("popups.asset_selector.starter_description_height", 48, 36, 80) + card_payload["preview_corner_radius"] = _theme_integer("popups.asset_selector.starter_preview_corner_radius", 12, 6, 24) + card_payload["preview_horizontal_inset"] = roundi(_theme_number("popups.asset_selector.starter_preview_horizontal_inset", 10.0, 0.0, 32.0)) + card_payload["preview_top_inset"] = _theme_integer("popups.asset_selector.starter_preview_top_inset", 6, 0, 24) if entry.has("background_kind"): card_payload["background_kind"] = entry["background_kind"] card_payload["finish_id"] = entry.get("finish_id", "") card_payload["id"] = entry.get("id", "") - var is_sky_choice: bool = String(entry.get("background_kind", "")) == "sky" - var is_current_sky: bool = is_sky_choice and String(entry.get("id", "")) == _current_sky_id - if is_current_sky: - card_payload["status"] = "Current Sky" + var background_kind: String = String(entry.get("background_kind", "")) + var is_scene_background_choice: bool = background_kind == "sky" or background_kind == "plain" + var is_current_background: bool = background_kind == String(_current_background_kind) and ( + background_kind == "plain" or String(entry.get("id", "")) == _current_sky_id + ) + if is_current_background: + card_payload["status"] = "Current background" card_payload["status_color"] = _theme_color("mode_colors.edit", Color("#22C6FF")) cell.configure(card_payload, _thumbnails.get(key, null), null) - if kind == "scenery": + if kind == "scenery" or kind == "starters": var card_button: Button = cell as Button var card_border_width: int = _theme_integer("popups.asset_selector.button_border_width", 2, 1, 5) + var card_corner_radius: int = _theme_integer("popups.asset_selector.corner_radius", 16, 8, 32) + var card_neutral_surface: Color = _theme_color("stage_panels.choice.neutral_surface", Color("#171B24")) + var card_neutral_border: Color = _theme_color("stage_panels.choice.border_color", Color("#FFFFFF33")) + var card_hover_surface: Color = _theme_color("stage_panels.choice.hover_surface", Color("#303A4B")) + var card_selected_surface: Color = _theme_color("stage_panels.choice.selected_surface", Color("#12394A")) + var card_hover_border_width: int = card_border_width + 1 card_button.add_theme_stylebox_override("normal", _make_rounded_style( - _theme_color("stage_panels.choice.neutral_surface", Color("#171B24")), - _theme_color("stage_panels.choice.border_color", Color("#FFFFFF33")), + card_neutral_surface, + card_neutral_border, card_border_width, - _theme_integer("popups.asset_selector.corner_radius", 16, 8, 32) + card_corner_radius )) card_button.add_theme_stylebox_override("hover", _make_rounded_style( - _theme_color("stage_panels.choice.hover_surface", Color("#303A4B")), + card_hover_surface, _theme_color("mode_colors.edit", Color("#22C6FF")), - card_border_width + 1, - _theme_integer("popups.asset_selector.corner_radius", 16, 8, 32) + card_hover_border_width, + card_corner_radius )) card_button.add_theme_stylebox_override("pressed", _make_rounded_style( - _theme_color("stage_panels.choice.selected_surface", Color("#12394A")), + card_selected_surface, _theme_color("mode_colors.edit", Color("#22C6FF")), - card_border_width + 1, - _theme_integer("popups.asset_selector.corner_radius", 16, 8, 32) + card_hover_border_width, + card_corner_radius )) - card_button.add_theme_stylebox_override("focus", _make_rounded_style( + if kind == "starters": + card_button.add_theme_stylebox_override("hover_pressed", _make_rounded_style( + card_selected_surface.lightened(0.05), + _theme_color("mode_colors.edit", Color("#22C6FF")), + card_hover_border_width, + card_corner_radius + )) + var focus_color: Color = _theme_color("stage_panels.type.text_color", Color("#F5F7FA")) if kind == "starters" else _theme_color("mode_colors.edit", Color("#22C6FF")) + var focus_style: StyleBoxFlat = _make_rounded_style( Color(0, 0, 0, 0), - _theme_color("mode_colors.edit", Color("#22C6FF")), - card_border_width + 1, - _theme_integer("popups.asset_selector.corner_radius", 16, 8, 32) - )) + focus_color, + card_hover_border_width, + card_corner_radius + ) + if kind == "starters": + focus_style.set_expand_margin_all(float(card_border_width)) + card_button.add_theme_stylebox_override("focus", focus_style) cell.custom_minimum_size = card_size cell.focus_mode = Control.FOCUS_ALL + cell.set_meta("entry_id", String(entry.get("id", ""))) cell.activated.connect(func(_payload: Dictionary) -> void: _on_cell_pressed(entry)) - if is_sky_choice: + if is_scene_background_choice: cell.button_group = _sky_card_group - cell.set_selected(is_current_sky, _theme_color("stage_panels.choice.selected_surface", Color("#12394A")), _theme_color("mode_colors.edit", Color("#22C6FF"))) + cell.set_selected(is_current_background, _theme_color("stage_panels.choice.selected_surface", Color("#12394A")), _theme_color("mode_colors.edit", Color("#22C6FF"))) var tex: Texture2D = _thumbnails.get(key, null) if kind == "starters": var preview: Control = STARTER_CARD_PREVIEW.new() as Control - preview.call("configure", entry) + preview.call("configure", entry, thumb_size) cell.set_preview_control(preview) elif entry.has("background_kind"): var preview: StageBackgroundCardPreview = BACKGROUND_CARD_PREVIEW.new() as StageBackgroundCardPreview @@ -1012,6 +1401,10 @@ func _theme_integer(path: String, fallback: int, minimum: int, maximum: int) -> return fallback if _sandbox_theme == null else _sandbox_theme.integer(path, fallback, minimum, maximum) +func _theme_number(path: String, fallback: float, minimum: float, maximum: float) -> float: + return fallback if _sandbox_theme == null else _sandbox_theme.number(path, fallback, minimum, maximum) + + func _theme_vector2(path: String, fallback: Vector2) -> Vector2: if _sandbox_theme == null: return fallback @@ -1054,7 +1447,8 @@ func _apply_chooser_visual_style() -> void: frame_style.set_corner_radius_all(_theme_integer("popups.asset_selector.surface_corner_radius", 14, 4, 32)) preview_frame.add_theme_stylebox_override("panel", frame_style) if _title_label != null: - _title_label.add_theme_font_size_override("font_size", _theme_integer("popups.asset_selector.setup_title_size", 30, 22, 48) if kind == "scenery" else 24) + var title_size: int = _theme_integer("popups.asset_selector.setup_title_size", 30, 22, 48) if kind == "scenery" else (_theme_integer("popups.asset_selector.starter_title_size", 30, 22, 48) if kind == "starters" else 24) + _title_label.add_theme_font_size_override("font_size", title_size) _title_label.add_theme_color_override("font_color", text_color) _apply_emphasis_font(_title_label) for tab: Button in [_backgrounds_tab, _artwork_tab]: @@ -1096,6 +1490,15 @@ func _apply_chooser_visual_style() -> void: heading.add_theme_font_size_override("font_size", _theme_integer("popups.asset_selector.setup_heading_size", 26, 18, 48)) heading.add_theme_color_override("font_color", text_color) _apply_emphasis_font(heading) + if _surface_row_heading != null: + _surface_row_heading.add_theme_font_size_override("font_size", _theme_integer("popups.asset_selector.setup_heading_size", 26, 18, 48)) + _surface_row_heading.add_theme_color_override("font_color", text_color) + _apply_emphasis_font(_surface_row_heading) + if _plain_color_helper != null: + _plain_color_helper.add_theme_font_size_override("font_size", _theme_integer("stage_panels.type.body_size", 20, 14, 32)) + _plain_color_helper.add_theme_color_override("font_color", _theme_color("stage_panels.type.muted_text_color", Color("#AAB2C0"))) + _apply_font_to(_plain_color_helper) + _apply_rounded_button(_backgrounds_back_button, false, accent, text_color, neutral, hover, border, radius) _apply_rounded_button(_setup_cancel_button, false, accent, text_color, neutral, hover, border, radius) _apply_rounded_button(_setup_draw_button, true, accent, text_color, neutral, hover, border, radius) _apply_emphasis_font(_setup_draw_button, true) diff --git a/scripts/shared/ui/color_swatch_selector.gd b/scripts/shared/ui/color_swatch_selector.gd index 6ce389c..f1cdd70 100644 --- a/scripts/shared/ui/color_swatch_selector.gd +++ b/scripts/shared/ui/color_swatch_selector.gd @@ -44,7 +44,7 @@ func configure(colors: Array[Color], selected: Color, theme: Variant = null) -> continue seen[color_key] = true var button := Button.new() - var swatch_size: float = _swatch_size_override if _swatch_size_override > 0.0 else float(_integer("stage_surface_colors.swatch_size", 48)) + var swatch_size: float = maxf(44.0, _swatch_size_override if _swatch_size_override > 0.0 else float(_integer("stage_surface_colors.swatch_size", 48))) button.custom_minimum_size = Vector2(swatch_size, swatch_size) button.toggle_mode = true button.button_group = _group diff --git a/scripts/stage/sandbox_theme.gd b/scripts/stage/sandbox_theme.gd index 2b471de..a12cd44 100644 --- a/scripts/stage/sandbox_theme.gd +++ b/scripts/stage/sandbox_theme.gd @@ -61,6 +61,7 @@ var _warned: Dictionary = {} func _init() -> void: _apply_confirmation_defaults() + _apply_phase19_defaults() func load_from(path: String = DEFAULT_PATH) -> bool: invalidate_caches() @@ -80,8 +81,59 @@ func load_from(path: String = DEFAULT_PATH) -> bool: return false _apply_legacy_aliases(parsed as Dictionary) _config = _deep_merge(_config, parsed as Dictionary) + _apply_phase19_defaults() return true + +func _apply_phase19_defaults() -> void: + var grid: Dictionary = _config.get("grid", {}).duplicate(true) + for key: String in ["plain_light_minor", "plain_light_major", "plain_dark_minor", "plain_dark_major"]: + if not grid.has(key): + grid[key] = { + "plain_light_minor": "#11182120", + "plain_light_major": "#11182148", + "plain_dark_minor": "#FFFFFF25", + "plain_dark_major": "#FFFFFF58", + }[key] + _config["grid"] = grid + var popups: Dictionary = _config.get("popups", {}).duplicate(true) + var asset_selector: Dictionary = popups.get("asset_selector", {}).duplicate(true) + asset_selector["compact_swatch_size"] = maxi(44, int(asset_selector.get("compact_swatch_size", 44))) + var starter_defaults: Dictionary = { + "starter_dialog_width": 1160.0, + "starter_viewport_height_ratio": 0.96, + "starter_card_min_width": 340.0, + "starter_preview_aspect": 2.0, + "starter_preview_corner_radius": 12, + "starter_preview_horizontal_inset": 10.0, + "starter_preview_top_inset": 6, + "starter_card_text_height": 108.0, + "starter_title_size": 30, + "starter_label_size": 22, + "starter_label_height": 34, + "starter_description_size": 20, + "starter_description_height": 48, + } + for key: String in starter_defaults: + if not asset_selector.has(key): + asset_selector[key] = starter_defaults[key] + popups["asset_selector"] = asset_selector + _config["popups"] = popups + var overlays: Dictionary = _config.get("overlays", {}).duplicate(true) + var gizmos: Dictionary = overlays.get("gizmos", {}).duplicate(true) + var defaults: Dictionary = { + "backing_color": "#111821E8", + "selection_color": "#F5F7FAE6", + "hover_color": "#FFE66DCC", + "rotate_color": "#4DB9FFE6", + "backing_extra_width": 3.0, + } + for key: String in defaults: + if not gizmos.has(key): + gizmos[key] = defaults[key] + overlays["gizmos"] = gizmos + _config["overlays"] = overlays + func _apply_confirmation_defaults() -> void: var popups: Dictionary = _config.get("popups", {}).duplicate(true) popups["confirmation"] = CONFIRMATION_DEFAULTS.duplicate(true) diff --git a/scripts/stage/scenery/stage_background_card_preview.gd b/scripts/stage/scenery/stage_background_card_preview.gd index 0de3ffb..1bddd18 100644 --- a/scripts/stage/scenery/stage_background_card_preview.gd +++ b/scripts/stage/scenery/stage_background_card_preview.gd @@ -3,23 +3,29 @@ extends Control ## Reuses the Stage's Sky and wall-finish drawing rules in gallery cards. const SKY_VIEW: Script = preload("res://scripts/stage/scenery/stage_sky_view.gd") +const BACKGROUND_VIEW: Script = preload("res://scripts/stage/scenery/stage_background_view.gd") const SURFACE_RENDERER: Script = preload("res://scripts/stage/scenery/stage_surface_renderer.gd") var _background_kind: String = "" var _preview_id: StringName = &"" var _sky_view: StageSkyView +var _background_view: StageBackgroundView +var _plain_color: Color = Color("#F5EFE0") func configure(entry: Dictionary) -> void: _background_kind = String(entry.get("background_kind", "")) _preview_id = StringName(String(entry.get("id", ""))) if _background_kind == "sky" else StringName(String(entry.get("finish_id", ""))) + var raw_plain_color: Variant = entry.get("plain_color", Color("#F5EFE0")) + _plain_color = raw_plain_color if raw_plain_color is Color else Color.from_string(String(raw_plain_color), Color("#F5EFE0")) clip_contents = true mouse_filter = Control.MOUSE_FILTER_IGNORE - if _background_kind == "sky": - _sky_view = SKY_VIEW.new() as StageSkyView - _sky_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - _sky_view.set_sky(_preview_id) - add_child(_sky_view) + if _background_kind in ["sky", "plain"]: + _background_view = BACKGROUND_VIEW.new() as StageBackgroundView + _background_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _background_view.set_background(StringName(_background_kind), _preview_id, _plain_color) + add_child(_background_view) + _sky_view = _background_view.get_sky_view() var frame: Panel = Panel.new() frame.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) frame.mouse_filter = Control.MOUSE_FILTER_IGNORE @@ -35,6 +41,8 @@ func configure(entry: Dictionary) -> void: func _draw() -> void: + if _background_kind == "plain": + return if _background_kind == "wall" and SURFACE_RENDERER.is_wall_finish(_preview_id): var wall_tint: Color = Color("#7FA36C") if _preview_id == &"finish_wall_paint" else Color.WHITE # The preview rect is already small and clipped, so draw its full pattern directly. diff --git a/scripts/stage/scenery/stage_background_view.gd b/scripts/stage/scenery/stage_background_view.gd new file mode 100644 index 0000000..f651979 --- /dev/null +++ b/scripts/stage/scenery/stage_background_view.gd @@ -0,0 +1,74 @@ +class_name StageBackgroundView +extends Control +## Shared full-rect backdrop for the live Stage and still card previews. + +const SKY_VIEW_SCRIPT := preload("res://scripts/stage/scenery/stage_sky_view.gd") + +var _sky_view: StageSkyView +var _plain_fill: ColorRect +var _bound_camera: Camera2D +var _background_kind: StringName = &"sky" +var _sky_id: StringName = &"sky_neutral" +var _plain_color: Color = Color("#F5EFE0") + + +func _ready() -> void: + mouse_filter = Control.MOUSE_FILTER_IGNORE + if _sky_view == null: + _sky_view = SKY_VIEW_SCRIPT.new() as StageSkyView + _sky_view.name = "StageSkyView" + _sky_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _sky_view.mouse_filter = Control.MOUSE_FILTER_IGNORE + add_child(_sky_view) + if _plain_fill == null: + _plain_fill = ColorRect.new() + _plain_fill.name = "PlainFill" + _plain_fill.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _plain_fill.mouse_filter = Control.MOUSE_FILTER_IGNORE + _plain_fill.color = _opaque(_plain_color) + add_child(_plain_fill) + _refresh_children() + + +func set_background(kind: StringName, sky_id: StringName, plain_color: Color) -> void: + _background_kind = &"plain" if kind == &"plain" else &"sky" + _sky_id = sky_id + _plain_color = _opaque(plain_color) + _refresh_children() + + +func bind_camera(camera: Camera2D) -> void: + _bound_camera = camera + if _sky_view != null: + _sky_view.bind_camera(_bound_camera if _background_kind == &"sky" else null) + + +func apply_theme(stage_theme: SandboxTheme) -> void: + if _sky_view != null: + _sky_view.apply_theme(stage_theme) + + +func get_sky_view() -> StageSkyView: + return _sky_view + + +func get_background_kind() -> StringName: + return _background_kind + + +func get_plain_color() -> Color: + return _plain_color + + +func _refresh_children() -> void: + if _sky_view == null or _plain_fill == null: + return + _sky_view.set_sky(_sky_id) + _sky_view.visible = _background_kind == &"sky" + _sky_view.bind_camera(_bound_camera if _background_kind == &"sky" else null) + _plain_fill.color = _plain_color + _plain_fill.visible = _background_kind == &"plain" + + +func _opaque(color: Color) -> Color: + return Color(color.r, color.g, color.b, 1.0) diff --git a/scripts/stage/scenery/stage_background_view.gd.uid b/scripts/stage/scenery/stage_background_view.gd.uid new file mode 100644 index 0000000..25e66b3 --- /dev/null +++ b/scripts/stage/scenery/stage_background_view.gd.uid @@ -0,0 +1 @@ +uid://dc72udajou30y diff --git a/scripts/stage/scenery/stage_starter_card_preview.gd b/scripts/stage/scenery/stage_starter_card_preview.gd index ef73abf..e25b361 100644 --- a/scripts/stage/scenery/stage_starter_card_preview.gd +++ b/scripts/stage/scenery/stage_starter_card_preview.gd @@ -6,6 +6,7 @@ const STAGE_SCENE_IO := preload("res://scripts/stage/stage_scene_io.gd") const STAGE_SCENE_ADAPTER := preload("res://scripts/editors/stage/stage_scene_adapter.gd") const STAGE_SPAWNER := preload("res://scripts/stage/stage_spawner.gd") const STAGE_SKY_VIEW := preload("res://scripts/stage/scenery/stage_sky_view.gd") +const STAGE_BACKGROUND_VIEW := preload("res://scripts/stage/scenery/stage_background_view.gd") const PROP_BLOCK := preload("res://scripts/props/prop_block.gd") const PREVIEW_SIZE := Vector2i(256, 256) @@ -14,14 +15,16 @@ const REFERENCE_VIEWPORT_SIZE := Vector2(1280.0, 720.0) var _viewport: SubViewport var _sky_view: StageSkyView +var _background_view: StageBackgroundView var _world: Node2D var _loaded_nodes: Array[Node2D] = [] var _scene_valid: bool = false -func configure(entry: Dictionary) -> void: +func configure(entry: Dictionary, requested_preview_size: Vector2 = Vector2.ZERO) -> void: name = "StarterScenePreview" - custom_minimum_size = Vector2(128.0, 128.0) + var resolved_preview_size: Vector2 = requested_preview_size if requested_preview_size.x > 0.0 and requested_preview_size.y > 0.0 else Vector2(PREVIEW_SIZE) + custom_minimum_size = resolved_preview_size mouse_filter = Control.MOUSE_FILTER_IGNORE stretch = true texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR @@ -31,36 +34,40 @@ func configure(entry: Dictionary) -> void: return var data: Dictionary = result.get("data", {}) as Dictionary _scene_valid = true - _build_preview_viewport(data) + _build_preview_viewport(data, resolved_preview_size) func has_preview_scene() -> bool: - return _scene_valid and _viewport != null and _sky_view != null and _world != null + return _scene_valid and _viewport != null and _background_view != null and _world != null func get_loaded_object_count() -> int: return _loaded_nodes.size() -func _build_preview_viewport(data: Dictionary) -> void: +func _build_preview_viewport(data: Dictionary, requested_preview_size: Vector2) -> void: _viewport = SubViewport.new() _viewport.name = "PreviewViewport" - _viewport.size = PREVIEW_SIZE + _viewport.size = Vector2i(maxi(1, roundi(requested_preview_size.x)), maxi(1, roundi(requested_preview_size.y))) _viewport.world_2d = World2D.new() _viewport.transparent_bg = false _viewport.render_target_update_mode = SubViewport.UPDATE_DISABLED add_child(_viewport) - var sky_layer := CanvasLayer.new() - sky_layer.name = "PreviewSky" - sky_layer.layer = -1 - _viewport.add_child(sky_layer) - _sky_view = STAGE_SKY_VIEW.new() as StageSkyView - _sky_view.name = "SkyView" - _sky_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) - _sky_view.mouse_filter = Control.MOUSE_FILTER_IGNORE - _sky_view.set_sky(StringName(String(data.get("sky_id", "sky_neutral")))) - sky_layer.add_child(_sky_view) + var background_layer := CanvasLayer.new() + background_layer.name = "PreviewBackgroundLayer" + background_layer.layer = -1 + _viewport.add_child(background_layer) + _background_view = STAGE_BACKGROUND_VIEW.new() as StageBackgroundView + _background_view.name = "StageBackgroundView" + _background_view.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _background_view.set_background( + StringName(String(data.get("background_kind", "sky"))), + StringName(String(data.get("sky_id", "sky_neutral"))), + STAGE_SCENE_IO.color_from_data(data.get("plain_color", STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR), Color("#F5EFE0")) + ) + background_layer.add_child(_background_view) + _sky_view = _background_view.get_sky_view() _world = Node2D.new() _world.name = "PreviewWorld" @@ -85,27 +92,30 @@ func _build_preview_viewport(data: Dictionary) -> void: func _fit_scene_to_preview(camera_state: Dictionary) -> void: if _world == null or not is_instance_valid(_world): return - var preview_frame: Dictionary = _preview_transform_for_camera(camera_state) + var preview_frame: Dictionary = _preview_transform_for_camera(camera_state, Vector2(_viewport.size)) var preview_scale: float = float(preview_frame["scale"]) _world.scale = Vector2.ONE * preview_scale _world.position = preview_frame["position"] as Vector2 _viewport.render_target_update_mode = SubViewport.UPDATE_ONCE -static func _preview_transform_for_camera(camera_state: Dictionary) -> Dictionary: +static func _preview_transform_for_camera(camera_state: Dictionary, preview_size: Vector2 = Vector2(PREVIEW_SIZE)) -> Dictionary: var camera_position: Vector2 = STAGE_SCENE_IO.data_to_vector(camera_state.get("position"), Vector2.ZERO) var camera_zoom: float = float(camera_state.get("zoom", 0.5)) if not is_finite(camera_zoom) or camera_zoom <= 0.0: camera_zoom = 0.5 + var safe_preview_size: Vector2 = preview_size if preview_size.x > 0.0 and preview_size.y > 0.0 else Vector2(PREVIEW_SIZE) + var preview_aspect: float = safe_preview_size.x / safe_preview_size.y var square_world_extent: float = REFERENCE_VIEWPORT_SIZE.y / camera_zoom + var focus_size := Vector2(square_world_extent * preview_aspect, square_world_extent) var focus_rect := Rect2( - camera_position - Vector2.ONE * square_world_extent * 0.5, - Vector2.ONE * square_world_extent + camera_position - focus_size * 0.5, + focus_size ) - var usable_size: Vector2 = Vector2(PREVIEW_SIZE) - Vector2.ONE * PREVIEW_MARGIN * 2.0 + var usable_size: Vector2 = safe_preview_size - Vector2(PREVIEW_MARGIN * 2.0, PREVIEW_MARGIN * 2.0) var preview_scale: float = minf(usable_size.x / focus_rect.size.x, usable_size.y / focus_rect.size.y) return { "focus_rect": focus_rect, "scale": preview_scale, - "position": Vector2(PREVIEW_SIZE) * 0.5 - camera_position * preview_scale, + "position": safe_preview_size * 0.5 - camera_position * preview_scale, } diff --git a/scripts/stage/scenery/stage_surface_preview.gd b/scripts/stage/scenery/stage_surface_preview.gd index 34e2cc1..9f72b82 100644 --- a/scripts/stage/scenery/stage_surface_preview.gd +++ b/scripts/stage/scenery/stage_surface_preview.gd @@ -29,14 +29,16 @@ func _draw() -> void: var rect: Rect2 = Rect2(Vector2(3.0, 3.0), size - Vector2(6.0, 6.0)) if rect.size.x <= 0.0 or rect.size.y <= 0.0: return - if surface_kind == &"background_ground": + if surface_kind == &"plain_background": + draw_rect(rect, Color(tint.r, tint.g, tint.b, 1.0), true) + elif surface_kind == &"background_ground": SURFACE_RENDERER.draw_background(self, rect, finish_id, tint, Vector2.ZERO, Vector2.ONE, false) else: SURFACE_RENDERER.draw_wall(self, rect, finish_id, tint, Vector2.ZERO, Vector2.ONE, false) var radius: float = minf(corner_radius, minf(rect.size.x, rect.size.y) * 0.5) if radius > 0.0: var wall: bool = surface_kind != &"background_ground" - var base_color: Color = SURFACE_RENDERER.surface_base_color(finish_id, tint, wall) + var base_color: Color = Color(tint.r, tint.g, tint.b, 1.0) if surface_kind == &"plain_background" else SURFACE_RENDERER.surface_base_color(finish_id, tint, wall) _draw_rounded_corner(rect, radius, base_color, outside_color, 0) _draw_rounded_corner(rect, radius, base_color, outside_color, 1) _draw_rounded_corner(rect, radius, base_color, outside_color, 2) diff --git a/scripts/stage/stage_gizmos.gd b/scripts/stage/stage_gizmos.gd index 00266e2..c9d1304 100644 --- a/scripts/stage/stage_gizmos.gd +++ b/scripts/stage/stage_gizmos.gd @@ -54,6 +54,13 @@ const MAX_SCALE: float = 20.0 # --------------------------------------------------------------------------- var camera: Camera2D = null +var _selection_backing_color: Color = Color("#111821E8") +var _selection_core_color: Color = Color(1.0, 1.0, 1.0, 0.9) +var _hover_backing_color: Color = Color("#111821E8") +var _hover_core_color: Color = Color(1.0, 0.9, 0.2, 0.5) +var _rotate_backing_color: Color = Color("#111821E8") +var _rotate_core_color: Color = Color(0.3, 0.6, 1.0, 0.9) +var _outline_extra_width: float = 3.0 ## When > 0, translation drags snap to this grid size (0 = off). var snap_size: float = 0.0 @@ -105,6 +112,19 @@ func set_snap_size(size: float) -> void: snap_size = maxf(size, 0.0) +func apply_theme(stage_theme: SandboxTheme) -> void: + if stage_theme == null: + return + _selection_backing_color = stage_theme.color("overlays.gizmos.backing_color", Color("#111821E8")) + _selection_core_color = stage_theme.color("overlays.gizmos.selection_color", SELECTION_COLOR) + _hover_backing_color = stage_theme.color("overlays.gizmos.backing_color", Color("#111821E8")) + _hover_core_color = stage_theme.color("overlays.gizmos.hover_color", HOVER_COLOR) + _rotate_backing_color = stage_theme.color("overlays.gizmos.backing_color", Color("#111821E8")) + _rotate_core_color = stage_theme.color("overlays.gizmos.rotate_color", ROTATE_COLOR) + _outline_extra_width = stage_theme.number("overlays.gizmos.backing_extra_width", 3.0, 1.0, 8.0) + queue_redraw() + + func set_box_rect(rect: Rect2) -> void: _box_rect = rect queue_redraw() @@ -253,16 +273,18 @@ func _draw() -> void: return var zoom := _zoom() if _hovered != null and is_instance_valid(_hovered) and not _hovered.is_queued_for_deletion() and not _targets.has(_hovered): - draw_rect(_target_bounds(_hovered), HOVER_COLOR, false, HOVER_WIDTH / zoom) + _draw_halo_rect(_target_bounds(_hovered), _hover_core_color, HOVER_WIDTH / zoom, _hover_backing_color) # A selection outline for every selected object. for node: Node2D in _targets: if node != null and is_instance_valid(node): - draw_rect(_target_bounds(node), SELECTION_COLOR, false, SELECTION_WIDTH / zoom) + _draw_halo_rect(_target_bounds(node), _selection_core_color, SELECTION_WIDTH / zoom, _selection_backing_color) # Rotate ring only for a single selection. if _transform_handles_visible and _targets.size() == 1 and is_instance_valid(_targets[0]): var rect: Rect2 = _target_bounds(_targets[0]) if not _is_scenery_target(_targets[0]): - draw_arc(rect.get_center(), _rotate_ring_radius(rect), 0.0, TAU, 64, ROTATE_COLOR, ROTATE_WIDTH / zoom, true) + var ring_radius: float = _rotate_ring_radius(rect) + draw_arc(rect.get_center(), ring_radius, 0.0, TAU, 64, _rotate_backing_color, ROTATE_WIDTH / zoom + _outline_extra_width / zoom, true) + draw_arc(rect.get_center(), ring_radius, 0.0, TAU, 64, _rotate_core_color, ROTATE_WIDTH / zoom, true) if _is_scenery_target(_targets[0]): for corner: Vector2 in _corners(rect): draw_circle(corner, 11.0 / zoom, Color("#111821E8")) @@ -275,7 +297,7 @@ func _draw() -> void: draw_line(corner + Vector2(-half, 0.0), corner + Vector2(half, 0.0), SELECTION_COLOR, 1.5 / zoom) draw_line(corner + Vector2(0.0, -half), corner + Vector2(0.0, half), SELECTION_COLOR, 1.5 / zoom) if _box_rect.size != Vector2.ZERO: - draw_rect(_box_rect.abs(), HOVER_COLOR, false, HOVER_WIDTH / zoom) + _draw_halo_rect(_box_rect.abs(), _hover_core_color, HOVER_WIDTH / zoom, _hover_backing_color) # --------------------------------------------------------------------------- # Internal helpers @@ -287,6 +309,11 @@ func _zoom() -> float: return 1.0 +func _draw_halo_rect(rect: Rect2, core_color: Color, core_width: float, backing_color: Color) -> void: + draw_rect(rect, backing_color, false, core_width + _outline_extra_width / _zoom()) + draw_rect(rect, core_color, false, core_width) + + func _rotate_ring_radius(rect: Rect2) -> float: return rect.size.length() * 0.5 + ROTATE_HANDLE_MARGIN_PX / _zoom() diff --git a/scripts/stage/stage_grid.gd b/scripts/stage/stage_grid.gd index 3d347ab..e64ea98 100644 --- a/scripts/stage/stage_grid.gd +++ b/scripts/stage/stage_grid.gd @@ -9,6 +9,12 @@ extends Node2D var camera: Camera2D = null var grid_size: float = 15.0 var enabled: bool = true +var _plain_background_active: bool = false +var _plain_background_color: Color = Color("#F5EFE0") +var _plain_light_minor_color: Color = Color("#11182120") +var _plain_light_major_color: Color = Color("#11182148") +var _plain_dark_minor_color: Color = Color("#FFFFFF25") +var _plain_dark_major_color: Color = Color("#FFFFFF58") const GRID_COLOR := Color(1.0, 1.0, 1.0, 0.08) const MAJOR_COLOR := Color(1.0, 1.0, 1.0, 0.16) @@ -19,6 +25,23 @@ func _process(_delta: float) -> void: queue_redraw() +func set_background_treatment( + plain_active: bool, + plain_color: Color, + light_minor: Color, + light_major: Color, + dark_minor: Color, + dark_major: Color +) -> void: + _plain_background_active = plain_active + _plain_background_color = Color(plain_color.r, plain_color.g, plain_color.b, 1.0) + _plain_light_minor_color = light_minor + _plain_light_major_color = light_major + _plain_dark_minor_color = dark_minor + _plain_dark_major_color = dark_major + queue_redraw() + + func _draw() -> void: if not enabled or grid_size <= 0.0: return @@ -34,13 +57,22 @@ func _draw() -> void: var x := floorf(rect.position.x / grid_size) * grid_size while x <= rect.end.x: var grid_index := int(round(x / grid_size)) - var color := MAJOR_COLOR if grid_index % MAJOR_EVERY == 0 else GRID_COLOR + var color: Color = _grid_color(grid_index % MAJOR_EVERY == 0) draw_line(Vector2(x, rect.position.y), Vector2(x, rect.end.y), color, line_width) x += grid_size var y := floorf(rect.position.y / grid_size) * grid_size while y <= rect.end.y: var grid_index := int(round(y / grid_size)) - var color := MAJOR_COLOR if grid_index % MAJOR_EVERY == 0 else GRID_COLOR + var color: Color = _grid_color(grid_index % MAJOR_EVERY == 0) draw_line(Vector2(rect.position.x, y), Vector2(rect.end.x, y), color, line_width) y += grid_size + + +func _grid_color(is_major: bool) -> Color: + if not _plain_background_active: + return MAJOR_COLOR if is_major else GRID_COLOR + var light_fill: bool = _plain_background_color.get_luminance() >= 0.55 + if light_fill: + return _plain_light_major_color if is_major else _plain_light_minor_color + return _plain_dark_major_color if is_major else _plain_dark_minor_color diff --git a/scripts/stage/stage_scene_io.gd b/scripts/stage/stage_scene_io.gd index 8e08715..8d54460 100644 --- a/scripts/stage/stage_scene_io.gd +++ b/scripts/stage/stage_scene_io.gd @@ -3,7 +3,8 @@ extends RefCounted ## JSON boundary for Sandbox Stage documents. This class deliberately has no ## scene-tree dependencies, which makes rejected documents non-destructive. -const FILE_VERSION: String = "1.6" +const FILE_VERSION: String = "1.7" +const DEFAULT_PLAIN_COLOR: String = "#F5EFE0" const SURFACE_RENDERER := preload("res://scripts/stage/scenery/stage_surface_renderer.gd") const CONTENT_PATHS := preload("res://scripts/shared/content_paths.gd") const ACTION_REGISTRY := preload("res://scripts/stage/action_registry.gd") @@ -185,11 +186,13 @@ static func _migrate_to_current(data: Dictionary) -> Dictionary: prop_entry["wobble_on_impact"] = false _assign_legacy_depths(current.get("objects", [])) return current - if version not in ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5"]: + if version not in ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6"]: return {} var migrated: Dictionary = data.duplicate(true) - if version != "1.5": + if version not in ["1.5", "1.6"]: migrated["sky_id"] = "sky_neutral" + migrated["background_kind"] = "sky" + migrated["plain_color"] = DEFAULT_PLAIN_COLOR for raw: Variant in migrated.get("objects", []): if not raw is Dictionary: continue @@ -203,9 +206,9 @@ static func _migrate_to_current(data: Dictionary) -> Dictionary: object["next_use_spot_number"] = object.get("next_use_spot_number", 1) if not object.has("wobble_on_impact"): object["wobble_on_impact"] = false - if version != "1.5" and String(object.get("type", "")) == "terrain" and String(object.get("asset_id", "")) == "ground": + if version not in ["1.5", "1.6"] and String(object.get("type", "")) == "terrain" and String(object.get("asset_id", "")) == "ground": object["finish_id"] = "finish_ground_legacy" - if String(object.get("type", "")) == "wall_panel": + if version != "1.6" and String(object.get("type", "")) == "wall_panel": _migrate_legacy_wall_tint(object) migrated["version"] = FILE_VERSION _assign_legacy_depths(migrated.get("objects", [])) @@ -254,9 +257,15 @@ static func _assign_legacy_depths(raw_objects: Variant) -> void: roles["depth"] = PROP_STAGE_ROLES.DEPTH_FRONT if characters_before > characters_after else PROP_STAGE_ROLES.DEPTH_BEHIND static func _validate_root(data: Dictionary) -> Dictionary: - var sky_id: Variant = data.get("sky_id", "sky_neutral") + var background_kind: Variant = data.get("background_kind", null) + if not background_kind is String or not ["sky", "plain"].has(String(background_kind)): + return {"ok": false, "error": "Scene background kind is invalid."} + var sky_id: Variant = data.get("sky_id", null) if not sky_id is String or not SKY_IDS.has(String(sky_id)): return {"ok": false, "error": "Scene Sky is invalid."} + var plain_color: Variant = data.get("plain_color", null) + if not _valid_opaque_hex_color(plain_color): + return {"ok": false, "error": "Scene Plain Background color is invalid."} var seen: Dictionary = {} var seen_stage_ids: Dictionary = {} for raw: Variant in data["objects"]: @@ -346,6 +355,19 @@ static func _valid_color(value: Variant) -> bool: return true +static func _valid_opaque_hex_color(value: Variant) -> bool: + if not value is String: + return false + var raw: String = String(value).strip_edges() + if raw.length() != 7 or not raw.begins_with("#"): + return false + const HEX_DIGITS: String = "0123456789abcdefABCDEF" + for index: int in range(1, raw.length()): + if not HEX_DIGITS.contains(raw.substr(index, 1)): + return false + return true + + static func _valid_rect_data(value: Variant) -> bool: if not value is Dictionary: return false diff --git a/tests/test_phase17b_use_spots.gd b/tests/test_phase17b_use_spots.gd index 320e9e6..01bbe1b 100644 --- a/tests/test_phase17b_use_spots.gd +++ b/tests/test_phase17b_use_spots.gd @@ -46,7 +46,7 @@ func _test_migration_and_schema() -> void: var legacy: Dictionary = {"version": version, "objects": [{"file_id": "prop_a", "type": "prop"}]} var migrated: Dictionary = STAGE_SCENE_IO._migrate_to_current(legacy) var entry: Dictionary = migrated["objects"][0] - _expect(String(migrated["version"]) == "1.3" and entry.get("use_spots") == [] and int(entry.get("next_use_spot_number", 0)) == 1, "%s prop receives v1.3 empty Use spot defaults" % version) + _expect(String(migrated["version"]) == STAGE_SCENE_IO.FILE_VERSION and entry.get("use_spots") == [] and int(entry.get("next_use_spot_number", 0)) == 1, "%s prop receives current-format empty Use spot defaults" % version) var valid_root: Dictionary = _valid_root() _expect(bool(STAGE_SCENE_IO._validate_root(valid_root).get("ok", false)), "valid Use spot data passes root validation") var duplicate: Dictionary = _valid_root() @@ -176,7 +176,10 @@ func _on_use_failed(reason_code: String, _prop: PropBlock, _spot_id: String) -> func _valid_root() -> Dictionary: return { - "version": "1.3", + "version": STAGE_SCENE_IO.FILE_VERSION, + "sky_id": "sky_neutral", + "background_kind": "sky", + "plain_color": STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR, "objects": [{ "file_id": "prop_file", "type": "prop", diff --git a/tests/test_phase19_plain_background.gd b/tests/test_phase19_plain_background.gd new file mode 100644 index 0000000..673d861 --- /dev/null +++ b/tests/test_phase19_plain_background.gd @@ -0,0 +1,430 @@ +extends SceneTree + +const SANDBOX_STAGE: PackedScene = preload("res://scenes/stage/sandbox_stage.tscn") +const STAGE_SCENE_IO: Script = preload("res://scripts/stage/stage_scene_io.gd") +const PLAIN_STARTER_PATH: String = "res://content/stages/starters/plain_background.scene" + +var _checks: int = 0 +var _failures: int = 0 +var _stage: SandboxStage + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + root.size = Vector2i(1280, 720) + _test_version_migration_and_validation() + var starter_result: Dictionary = STAGE_SCENE_IO.read_file(PLAIN_STARTER_PATH) + _expect(bool(starter_result.get("ok", false)), "Plain Background starter is valid v1.7 data") + _stage = SANDBOX_STAGE.instantiate() as SandboxStage + root.add_child(_stage) + await process_frame + await process_frame + _test_live_backdrop_default() + await _save_visual_capture("phase19_open_sky_stage.png") + await _test_plain_background_picker_flow() + await _test_draft_cancel_on_mode_switch() + await _test_draft_cancel_on_popup_hide() + await _test_draft_cancel_on_scene_replacement(starter_result.get("data", {}) as Dictionary) + _test_recent_color_history_limit() + print("----------------------------------------") + if _failures == 0: + print("RESULT: ALL PASSED (%d checks)" % _checks) + quit(0) + else: + print("RESULT: %d FAILURE(S) out of %d checks" % [_failures, _checks]) + quit(1) + + +func _expect(condition: bool, message: String) -> void: + _checks += 1 + if condition: + print("PASS: " + message) + else: + _failures += 1 + push_error("Phase 19 Plain Background check failed: " + message) + + +func _test_version_migration_and_validation() -> void: + for version: String in ["1.0", "1.4", "1.5", "1.6"]: + var legacy: Dictionary = { + "version": version, + "scene_name": "Migration fixture", + "sky_id": "sky_sunset", + "camera": {"position": {"x": 0.0, "y": -400.0}, "zoom": 0.5}, + "objects": [], + "event_rules": [], + } + var migrated: Dictionary = STAGE_SCENE_IO._migrate_to_current(legacy) + var expected_sky: String = "sky_sunset" if version in ["1.5", "1.6"] else "sky_neutral" + _expect(String(migrated.get("version", "")) == "1.7", "%s scene migrates to v1.7" % version) + _expect(String(migrated.get("sky_id", "")) == expected_sky, "%s migration preserves the compatible Sky choice" % version) + _expect(String(migrated.get("background_kind", "")) == "sky", "%s migration remains visually Sky-backed" % version) + _expect(String(migrated.get("plain_color", "")) == STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR, "%s migration adds the default remembered color" % version) + _expect(bool(STAGE_SCENE_IO._validate_root(migrated).get("ok", false)), "%s migrated empty scene passes v1.7 root validation" % version) + + var valid: Dictionary = _valid_document() + _expect(bool(STAGE_SCENE_IO._validate_root(valid).get("ok", false)), "valid v1.7 Plain Background fields pass validation") + var missing_kind: Dictionary = valid.duplicate(true) + missing_kind.erase("background_kind") + _expect(not bool(STAGE_SCENE_IO._validate_root(missing_kind).get("ok", false)), "v1.7 rejects a missing background kind") + var missing_sky: Dictionary = valid.duplicate(true) + missing_sky.erase("sky_id") + _expect(not bool(STAGE_SCENE_IO._validate_root(missing_sky).get("ok", false)), "v1.7 rejects a missing remembered Sky") + var missing_color: Dictionary = valid.duplicate(true) + missing_color.erase("plain_color") + _expect(not bool(STAGE_SCENE_IO._validate_root(missing_color).get("ok", false)), "v1.7 rejects a missing remembered Plain Background color") + var alpha_color: Dictionary = valid.duplicate(true) + alpha_color["plain_color"] = "#F5EFE0FF" + _expect(not bool(STAGE_SCENE_IO._validate_root(alpha_color).get("ok", false)), "v1.7 rejects alpha-bearing Plain Background colors") + var bad_color: Dictionary = valid.duplicate(true) + bad_color["plain_color"] = "F5EFE0" + _expect(not bool(STAGE_SCENE_IO._validate_root(bad_color).get("ok", false)), "v1.7 requires canonical hash-prefixed six-digit color") + + +func _test_live_backdrop_default() -> void: + var background: StageBackgroundView = _stage.get("_background_view") as StageBackgroundView + var sky_view: StageSkyView = _stage.get("_sky_view") as StageSkyView + var plain_fill: ColorRect = background.get_node("PlainFill") as ColorRect if background != null else null + _expect(background != null and sky_view != null and plain_fill != null, "live Stage owns the shared Sky and Plain renderer") + if background == null or sky_view == null or plain_fill == null: + return + _expect(background.get_background_kind() == &"sky" and sky_view.visible and not plain_fill.visible, "default live Stage shows Sky with Plain fill hidden") + _expect(background.get_plain_color().to_html(false).to_upper() == "F5EFE0", "default remembered Plain color is warm off-white") + var plain_starter: Dictionary = STAGE_SCENE_IO.read_file(PLAIN_STARTER_PATH).get("data", {}) as Dictionary + _expect(String(plain_starter.get("background_kind", "")) == "plain", "Plain Background starter selects a flat backdrop") + _expect(String(plain_starter.get("plain_color", "")) == "#F5EFE0" and (plain_starter.get("objects", []) as Array).is_empty(), "Plain Background starter is empty and uses the approved color") + + +func _test_plain_background_picker_flow() -> void: + var browser: StageAssetBrowser = _stage.get("_asset_browser") as StageAssetBrowser + _stage.call("_open_selector", "scenery") + var selector: AssetSelector = browser.get_selector() + selector.call("_set_gallery_tab", "backgrounds") + await process_frame + var grid: GridContainer = selector.find_child("GridContainer", true, false) as GridContainer + var plain_card: AssetCard = _find_card(grid, "plain_background") + _expect(selector.visible and plain_card != null, "real Scenery gallery shows the Plain Background card") + if plain_card == null: + return + await _activate_card(plain_card) + var title: Label = selector.find_child("TitleLabel", true, false) as Label + var controls: StageSurfaceColorControls = selector.find_child("PlainBackgroundColorControls", true, false) as StageSurfaceColorControls + _expect(String(_stage.get("_background_kind")) == "plain" and selector.visible, "Plain card immediately switches the Stage and keeps the gallery open") + _expect(title != null and title.text == "Choose background color", "Plain color choices use the approved heading") + _expect(controls != null and controls.get("_current_chip") != null, "color choices expose the current-color chip and swatch sections") + if controls == null: + return + await _save_visual_capture("phase19_plain_color_choices.png") + var recent_before: Array[String] = _stage.call("_surface_color_history_strings") as Array[String] + _expect(not recent_before.has("#F5EFE0"), "opening at the default does not add that color to recents") + var empty_message: Label = controls.find_child("RecentColorsEmptyLabel", true, false) as Label + if recent_before.is_empty(): + _expect(empty_message != null and empty_message.text == "Colors you use will appear here.", "empty recent colors use the approved helper text") + var confirmed_color: Color = _stage.get("_plain_color") as Color + var confirmed_hex: String = _stage.call("_canonical_surface_color", confirmed_color) as String + var dirty_before: bool = bool(_stage.get("_dirty")) + var current_chip: Button = controls.get("_current_chip") as Button + await _activate_button(current_chip) + var picker_view: StageSurfaceColorPickerView = selector.get("_color_picker_view") as StageSurfaceColorPickerView + var picker: ColorPicker = picker_view.find_child("ColorPickerControl", true, false) as ColorPicker if picker_view != null else null + var use_button: Button = selector.get("_color_use_button") as Button + var back_button: Button = selector.get("_color_back_button") as Button + _expect(picker != null and use_button != null and back_button != null, "current-color chip opens the full custom picker with Back and Use color") + if picker == null or use_button == null or back_button == null: + return + var draft_color: Color = Color("#B34FD8") + _set_picker_draft(picker_view, picker, draft_color) + await process_frame + var background: StageBackgroundView = _stage.get("_background_view") as StageBackgroundView + var plain_fill: ColorRect = background.get_node("PlainFill") as ColorRect + var draft_snapshot: Dictionary = _stage.call("_collect_scene_data", false) as Dictionary + _expect(bool(_stage.get("_plain_color_draft_active")) and plain_fill.color.to_html(false).to_upper() == "B34FD8", "custom picker movement previews an opaque flat color on the Stage") + await _save_visual_capture("phase19_plain_picker_draft.png") + _expect(String(draft_snapshot.get("plain_color", "")) == confirmed_hex, "scene snapshots keep the confirmed color during a custom draft") + _expect(bool(_stage.get("_dirty")) == dirty_before and (_stage.call("_surface_color_history_strings") as Array[String]) == recent_before, "custom preview does not change dirty state or recents") + await _activate_button(back_button) + _expect(not bool(_stage.get("_plain_color_draft_active")) and plain_fill.color.to_html(false).to_upper() == confirmed_hex.trim_prefix("#"), "Back discards the draft and restores the confirmed Stage fill") + await _save_visual_capture("phase19_plain_picker_rollback.png") + _expect(bool(_stage.get("_dirty")) == dirty_before and (_stage.call("_surface_color_history_strings") as Array[String]) == recent_before, "Back leaves dirty state and recents unchanged") + _expect(selector.visible and title.text == "Choose background color", "Back returns to color choices with the scene picker still open") + + await _activate_button(controls.get("_current_chip") as Button) + picker_view = selector.get("_color_picker_view") as StageSurfaceColorPickerView + picker = picker_view.find_child("ColorPickerControl", true, false) as ColorPicker if picker_view != null else null + _set_picker_draft(picker_view, picker, Color("#26A8D6")) + await _press_escape() + _expect(not bool(_stage.get("_plain_color_draft_active")) and plain_fill.color.to_html(false).to_upper() == confirmed_hex.trim_prefix("#"), "Escape from the custom picker restores the prior fill") + _expect(selector.visible and title.text == "Choose background color", "Escape returns to color choices instead of closing the Stage chooser") + + await _activate_button(controls.get("_current_chip") as Button) + picker_view = selector.get("_color_picker_view") as StageSurfaceColorPickerView + picker = picker_view.find_child("ColorPickerControl", true, false) as ColorPicker if picker_view != null else null + _set_picker_draft(picker_view, picker, draft_color) + await _activate_button(selector.get("_color_use_button") as Button) + var committed_hex: String = _stage.call("_canonical_surface_color", _stage.get("_plain_color")) as String + var recent_after_commit: Array[String] = _stage.call("_surface_color_history_strings") as Array[String] + _expect(committed_hex == "#B34FD8" and plain_fill.color.to_html(false).to_upper() == "B34FD8", "Use color confirms the custom color on the Stage") + _expect(bool(_stage.get("_dirty")) and recent_after_commit.count(committed_hex) == 1 and recent_after_commit[0] == committed_hex, "one confirmation marks changed scene dirty and records the color once") + _expect(selector.visible and title.text == "Choose background color", "Use color returns to the choices view") + + var path: String = "user://phase19_plain_background_roundtrip.scene" + var saved: bool = _stage.call("_save_scene_to_path", path, false) as bool + var read: Dictionary = STAGE_SCENE_IO.read_file(path) + var saved_data: Dictionary = read.get("data", {}) as Dictionary + _expect(saved and bool(read.get("ok", false)) and String(saved_data.get("background_kind", "")) == "plain" and String(saved_data.get("plain_color", "")) == committed_hex, "production save/reopen boundary stores the confirmed Plain color") + _stage.call("_close_selector") + _stage.call("_open_selector", "scenery") + selector = browser.get_selector() + selector.call("_set_gallery_tab", "backgrounds") + await process_frame + grid = selector.find_child("GridContainer", true, false) as GridContainer + var sky_card: AssetCard = _find_card(grid, "sky_clear_day") + if sky_card != null: + await _activate_card(sky_card) + _expect(String(_stage.get("_background_kind")) == "sky" and _stage.call("_canonical_surface_color", _stage.get("_plain_color")) == committed_hex, "switching to Sky retains the remembered Plain color") + var sky_saved: Dictionary = _stage.call("_collect_scene_data", false) as Dictionary + _expect(String(sky_saved.get("background_kind", "")) == "sky" and String(sky_saved.get("plain_color", "")) == committed_hex, "Sky-active scene snapshot preserves the remembered Plain color") + grid = selector.find_child("GridContainer", true, false) as GridContainer + var return_plain_card: AssetCard = _find_card(grid, "plain_background") + if return_plain_card != null: + await _activate_card(return_plain_card) + _expect(String(_stage.get("_background_kind")) == "plain" and _stage.call("_canonical_surface_color", _stage.get("_plain_color")) == committed_hex, "returning from Sky restores the confirmed Plain color") + controls = selector.find_child("PlainBackgroundColorControls", true, false) as StageSurfaceColorControls + var preset_swatches: ColorSwatchSelector = controls.get("_preset_swatches") as ColorSwatchSelector if controls != null else null + var preset_button: Button = preset_swatches.get_child(0) as Button if preset_swatches != null and preset_swatches.get_child_count() > 0 else null + var preset_color: Color = Color.WHITE + if preset_button != null: + preset_color = preset_button.get_meta("surface_color", Color.WHITE) + if preset_button != null: + await _activate_button(preset_button) + var preset_hex: String = _stage.call("_canonical_surface_color", preset_color) as String + var preset_recents: Array[String] = _stage.call("_surface_color_history_strings") as Array[String] + _expect(preset_button != null and preset_button.button_pressed and preset_button.text == "✓", "preset swatch selection displays its selected check") + _expect(_stage.call("_canonical_surface_color", _stage.get("_plain_color")) == preset_hex and preset_recents[0] == preset_hex, "preset swatch immediately confirms the Stage color and moves it to recent colors") + await _save_visual_capture("phase19_plain_preset_selected.png") + _stage.call("_close_selector") + var loaded: bool = _stage.call("_load_scene_from_path", path, false) as bool + _expect(loaded and String(_stage.get("_background_kind")) == "plain" and _stage.call("_canonical_surface_color", _stage.get("_plain_color")) == committed_hex, "production Stage load restores the confirmed Plain background") + if FileAccess.file_exists(path): + DirAccess.remove_absolute(ProjectSettings.globalize_path(path)) + + +func _test_draft_cancel_on_mode_switch() -> void: + var browser: StageAssetBrowser = _stage.get("_asset_browser") as StageAssetBrowser + _stage.call("_open_selector", "scenery") + var selector: AssetSelector = browser.get_selector() + selector.call("_set_gallery_tab", "backgrounds") + await process_frame + var grid: GridContainer = selector.find_child("GridContainer", true, false) as GridContainer + var plain_card: AssetCard = _find_card(grid, "plain_background") + if plain_card != null: + await _activate_card(plain_card) + var controls: StageSurfaceColorControls = selector.find_child("PlainBackgroundColorControls", true, false) as StageSurfaceColorControls + await _activate_button(controls.get("_current_chip") as Button) + var picker_view: StageSurfaceColorPickerView = selector.get("_color_picker_view") as StageSurfaceColorPickerView + var picker: ColorPicker = picker_view.find_child("ColorPickerControl", true, false) as ColorPicker if picker_view != null else null + _set_picker_draft(picker_view, picker, Color("#E66A21")) + await process_frame + var confirmed_hex: String = _stage.call("_canonical_surface_color", _stage.get("_plain_color")) as String + _stage.call("set_mode", SandboxStage.StageMode.DIRECT) + await process_frame + var background: StageBackgroundView = _stage.get("_background_view") as StageBackgroundView + var fill: ColorRect = background.get_node("PlainFill") as ColorRect + _expect(not bool(_stage.get("_plain_color_draft_active")) and not selector.visible, "mode switch closes an active custom picker and cancels its draft") + _expect(fill.color.to_html(false).to_upper() == confirmed_hex.trim_prefix("#"), "mode-switch cancel restores the confirmed backdrop") + _stage.call("set_mode", SandboxStage.StageMode.EDIT) + await process_frame + + +func _test_draft_cancel_on_popup_hide() -> void: + var browser: StageAssetBrowser = _stage.get("_asset_browser") as StageAssetBrowser + _stage.call("_open_selector", "scenery") + var selector: AssetSelector = browser.get_selector() + selector.call("_set_gallery_tab", "backgrounds") + await process_frame + var grid: GridContainer = selector.find_child("GridContainer", true, false) as GridContainer + var plain_card: AssetCard = _find_card(grid, "plain_background") + if plain_card != null: + await _activate_card(plain_card) + var controls: StageSurfaceColorControls = selector.find_child("PlainBackgroundColorControls", true, false) as StageSurfaceColorControls + await _activate_button(controls.get("_current_chip") as Button) + var picker_view: StageSurfaceColorPickerView = selector.get("_color_picker_view") as StageSurfaceColorPickerView + var picker: ColorPicker = picker_view.find_child("ColorPickerControl", true, false) as ColorPicker if picker_view != null else null + _set_picker_draft(picker_view, picker, Color("#AC5E31")) + var confirmed_hex: String = _stage.call("_canonical_surface_color", _stage.get("_plain_color")) as String + selector.hide() + await process_frame + await process_frame + var background: StageBackgroundView = _stage.get("_background_view") as StageBackgroundView + var fill: ColorRect = background.get_node("PlainFill") as ColorRect + _expect(not bool(_stage.get("_plain_color_draft_active")), "unexpected popup dismissal cancels the custom-color draft") + _expect(fill.color.to_html(false).to_upper() == confirmed_hex.trim_prefix("#") and selector.visible, "popup dismissal restores the confirmed fill and keeps the chooser available") + browser.close() + await process_frame + + +func _test_draft_cancel_on_scene_replacement(starter_data: Dictionary) -> void: + var browser: StageAssetBrowser = _stage.get("_asset_browser") as StageAssetBrowser + _stage.call("_open_selector", "scenery") + var selector: AssetSelector = browser.get_selector() + selector.call("_set_gallery_tab", "backgrounds") + await process_frame + var grid: GridContainer = selector.find_child("GridContainer", true, false) as GridContainer + var plain_card: AssetCard = _find_card(grid, "plain_background") + if plain_card != null: + await _activate_card(plain_card) + var controls: StageSurfaceColorControls = selector.find_child("PlainBackgroundColorControls", true, false) as StageSurfaceColorControls + await _activate_button(controls.get("_current_chip") as Button) + var picker_view: StageSurfaceColorPickerView = selector.get("_color_picker_view") as StageSurfaceColorPickerView + var picker: ColorPicker = picker_view.find_child("ColorPickerControl", true, false) as ColorPicker if picker_view != null else null + _set_picker_draft(picker_view, picker, Color("#46A45F")) + await process_frame + var replaced: bool = _stage.call("_apply_scene_data", starter_data, "", false) as bool + var background: StageBackgroundView = _stage.get("_background_view") as StageBackgroundView + var fill: ColorRect = background.get_node("PlainFill") as ColorRect + _expect(replaced and not bool(_stage.get("_plain_color_draft_active")), "scene replacement applies after canceling the custom-color draft") + _expect(not selector.visible and String(_stage.get("_background_kind")) == "plain", "scene replacement closes the old selector and uses the new Plain starter") + _expect(fill.color.to_html(false).to_upper() == "F5EFE0", "replacement renders the new scene's confirmed starter color") + await _save_visual_capture("phase19_plain_offwhite_stage.png") + _stage.call("_commit_plain_color", Color("#262B36")) + await _save_visual_capture("phase19_plain_dark_stage.png") + _stage.call("set_mode", SandboxStage.StageMode.DIRECT) + await process_frame + await _save_visual_capture("phase19_plain_direct_mode.png") + _stage.call("set_mode", SandboxStage.StageMode.PLAY) + await process_frame + await _save_visual_capture("phase19_plain_play_mode.png") + var camera: Camera2D = _stage.get("_camera") as Camera2D + _stage.call("set_mode", SandboxStage.StageMode.EDIT) + _stage.set("_cli_startup", true) + var hovered_control: Control = root.gui_get_hovered_control() + var saved_mouse_filter: Control.MouseFilter = hovered_control.mouse_filter if hovered_control != null else Control.MOUSE_FILTER_STOP + if hovered_control != null: + hovered_control.mouse_filter = Control.MOUSE_FILTER_IGNORE + await process_frame + camera.global_position = Vector2(0.0, -400.0) + camera.zoom = Vector2.ONE * 0.5 + var wheel: InputEventMouseButton = InputEventMouseButton.new() + wheel.button_index = MOUSE_BUTTON_WHEEL_UP + wheel.pressed = true + wheel.position = Vector2(root.size) * 0.5 + _stage.call("_input", wheel) + var pan_press: InputEventMouseButton = InputEventMouseButton.new() + pan_press.button_index = MOUSE_BUTTON_MIDDLE + pan_press.pressed = true + pan_press.position = wheel.position + _stage.call("_input", pan_press) + var pan_motion: InputEventMouseMotion = InputEventMouseMotion.new() + pan_motion.position = pan_press.position + Vector2(80.0, -30.0) + pan_motion.relative = Vector2(80.0, -30.0) + _stage.call("_input", pan_motion) + var pan_release: InputEventMouseButton = InputEventMouseButton.new() + pan_release.button_index = MOUSE_BUTTON_MIDDLE + pan_release.position = pan_motion.position + _stage.call("_input", pan_release) + await process_frame + _expect(camera.zoom.x > 0.5 and not camera.global_position.is_equal_approx(Vector2(0.0, -400.0)), "plain backdrop remains visible through production zoom and pan input") + _stage.set("_cli_startup", false) + if hovered_control != null and is_instance_valid(hovered_control): + hovered_control.mouse_filter = saved_mouse_filter + await _save_visual_capture("phase19_plain_dark_pan_zoom.png") + root.size = Vector2i(640, 480) + await process_frame + await process_frame + await _save_visual_capture("phase19_plain_dark_narrow_viewport.png") + browser = _stage.get("_asset_browser") as StageAssetBrowser + _stage.call("_open_selector", "scenery") + selector = browser.get_selector() + selector.call("_set_gallery_tab", "backgrounds") + await process_frame + grid = selector.find_child("GridContainer", true, false) as GridContainer + plain_card = _find_card(grid, "plain_background") + if plain_card != null: + await _activate_card(plain_card) + await process_frame + var selector_rect: Rect2 = Rect2(Vector2(selector.position), Vector2(selector.size)) + var narrow_size: Vector2 = Vector2(root.size) + _expect(selector.visible and selector_rect.position.x >= 0.0 and selector_rect.position.y >= 0.0 and selector_rect.end.x <= narrow_size.x and selector_rect.end.y <= narrow_size.y, "Plain color choices stay inside a narrow viewport") + await _save_visual_capture("phase19_plain_narrow_choices.png") + browser.close() + root.size = Vector2i(1280, 720) + await process_frame + + +func _test_recent_color_history_limit() -> void: + for index: int in range(9): + _stage.call("_record_recent_surface_color", Color.from_hsv(float(index) / 9.0, 0.8, 0.9)) + var recent: Array[String] = _stage.call("_surface_color_history_strings") as Array[String] + _expect(recent.size() == 8, "recent surface color history is capped at eight colors") + var newest: String = _stage.call("_canonical_surface_color", Color.from_hsv(8.0 / 9.0, 0.8, 0.9)) as String + _expect(not recent.is_empty() and recent[0] == newest, "recent surface color history is most-recent-first") + + +func _valid_document() -> Dictionary: + return { + "version": "1.7", + "scene_name": "Validation fixture", + "sky_id": "sky_neutral", + "background_kind": "plain", + "plain_color": "#F5EFE0", + "camera": {"position": {"x": 0.0, "y": -400.0}, "zoom": 0.5}, + "objects": [], + "event_rules": [], + } + + +func _find_card(grid: GridContainer, entry_id: String) -> AssetCard: + if grid == null: + return null + for child: Node in grid.get_children(): + var card: AssetCard = child as AssetCard + if card != null and String(card.get_meta("entry_id", "")) == entry_id: + return card + return null + + +func _activate_card(card: AssetCard) -> void: + card.activated.emit(card.payload()) + await process_frame + + +func _activate_button(button: Button) -> void: + if button == null: + _expect(false, "expected production button exists") + return + button.pressed.emit() + await process_frame + + +func _press_escape() -> void: + var viewport: Viewport = root + var press := InputEventKey.new() + press.keycode = KEY_ESCAPE + press.pressed = true + viewport.push_input(press) + await process_frame + var release := InputEventKey.new() + release.keycode = KEY_ESCAPE + release.pressed = false + viewport.push_input(release) + await process_frame + + +func _set_picker_draft(view: StageSurfaceColorPickerView, picker: ColorPicker, color: Color) -> void: + picker.color = color + view.call("_on_picker_color_changed", color) + await process_frame + + +func _save_visual_capture(file_name: String) -> void: + if DisplayServer.get_name() == "headless": + return + await RenderingServer.frame_post_draw + var capture: Image = root.get_texture().get_image() + var capture_dir: String = ProjectSettings.globalize_path("res://.phase19_captures") + DirAccess.make_dir_recursive_absolute(capture_dir) + var error: Error = capture.save_png(capture_dir.path_join(file_name)) + _expect(error == OK, "rendered capture saved: %s" % file_name) diff --git a/tests/test_phase19_plain_background.gd.uid b/tests/test_phase19_plain_background.gd.uid new file mode 100644 index 0000000..2a6c8f4 --- /dev/null +++ b/tests/test_phase19_plain_background.gd.uid @@ -0,0 +1 @@ +uid://iaplw44v1huj diff --git a/tests/test_phase19_scenery.gd b/tests/test_phase19_scenery.gd index 45cc690..f573fce 100644 --- a/tests/test_phase19_scenery.gd +++ b/tests/test_phase19_scenery.gd @@ -12,6 +12,7 @@ const STARTER_CARD_PREVIEW: Script = preload("res://scripts/stage/scenery/stage_ const STAGE_SKY_VIEW_SCRIPT: Script = preload("res://scripts/stage/scenery/stage_sky_view.gd") const STARTER_PATHS: Array[String] = [ "res://content/stages/starters/blank.scene", + "res://content/stages/starters/plain_background.scene", "res://content/stages/starters/town_street.scene", "res://content/stages/starters/living_room.scene", ] @@ -90,7 +91,7 @@ func _run() -> void: ) var browser: StageAssetBrowser = _stage.get("_asset_browser") as StageAssetBrowser var starter_entries: Array[Dictionary] = browser.scan_entries("starters") - _expect(starter_entries.size() == 3, "New Scene gallery lists Blank, Town Street, and Living Room") + _expect(starter_entries.size() == 4, "New Scene gallery lists Plain Background, Open Sky, Town Street, and Living Room") var original_name: String = String(_stage.get("_scene_name")) var original_world_count: int = (_stage.get_node("World") as Node2D).get_child_count() var original_sky: String = String(_stage.get("_sky_id")) @@ -107,7 +108,7 @@ func _run() -> void: selector = browser.get_selector() var starter_grid: GridContainer = selector.find_child("GridContainer", true, false) as GridContainer await _test_starter_card_previews(starter_grid) - var town_card: AssetCard = starter_grid.get_child(1) as AssetCard if starter_grid != null and starter_grid.get_child_count() > 1 else null + var town_card: AssetCard = _find_card_by_id(starter_grid, "starter_town_street") _expect(town_card != null, "Town Street is selectable as a real starter card") if town_card != null: await _activate_card(town_card) @@ -212,16 +213,16 @@ func _run() -> void: for preview_node: Node in card_content.get_children(): if preview_node.get_script() == BACKGROUND_CARD_PREVIEW: background_preview_count += 1 - _expect(background_grid != null and background_grid.get_child_count() == 6 and background_preview_count == 6, "four Sky looks and both surface setup cards render production-style previews") + _expect(background_grid != null and background_grid.get_child_count() == 7 and background_preview_count == 7, "Plain Background, four Sky looks, and both surface setup cards render production-style previews") var cloudy_status: Label = cloudy_card.find_child("StatusLabel", true, false) as Label if cloudy_card != null else null - _expect(cloudy_card != null and cloudy_card.button_pressed and cloudy_status != null and cloudy_status.text == "Current Sky", "gallery marks the loaded Town Street Sky as Current Sky") + _expect(cloudy_card != null and cloudy_card.button_pressed and cloudy_status != null and cloudy_status.text == "Current background", "gallery marks the loaded Town Street Sky as the current background") var clear_sky_card: AssetCard = _find_card_by_id(background_grid, "sky_clear_day") if clear_sky_card != null: await _activate_card(clear_sky_card) var selected_clear_card: AssetCard = _find_card_by_id(selector.find_child("GridContainer", true, false) as GridContainer, "sky_clear_day") var clear_status: Label = selected_clear_card.find_child("StatusLabel", true, false) as Label if selected_clear_card != null else null _expect(selector.visible and String(_stage.get("_sky_id")) == "sky_clear_day", "choosing a Sky updates the Stage and keeps the chooser open") - _expect(selected_clear_card != null and selected_clear_card.button_pressed and clear_status != null and clear_status.text == "Current Sky", "Current Sky marker follows the newly chosen card") + _expect(selected_clear_card != null and selected_clear_card.button_pressed and clear_status != null and clear_status.text == "Current background", "current background marker follows the newly chosen card") selector.call("_set_gallery_tab", "artwork") await process_frame var artwork_entries: Array[Dictionary] = browser.scan_entries("scenery") @@ -614,7 +615,7 @@ func _test_starter_card_previews(starter_grid: GridContainer) -> void: for card_node: Node in starter_grid.get_children(): if not card_node.is_queued_for_deletion(): live_card_count += 1 - _expect(live_card_count == 3, "starter chooser has three scene cards to preview") + _expect(live_card_count == 4, "starter chooser has four scene cards to preview") var preview_count: int = 0 var populated_scene_count: int = 0 for card_node: Node in starter_grid.get_children(): @@ -628,8 +629,8 @@ func _test_starter_card_previews(starter_grid: GridContainer) -> void: if int(preview.call("get_loaded_object_count")) > 0: populated_scene_count += 1 var viewport: SubViewport = preview.get_child(0) as SubViewport if preview.get_child_count() > 0 else null - _expect(viewport != null and preview.find_child("SkyView", true, false) != null, "starter preview has an isolated viewport and sky renderer") - _expect(preview_count == 3, "all three starter cards use scene previews instead of placeholder tiles") + _expect(viewport != null and preview.find_child("StageSkyView", true, false) != null, "starter preview has an isolated viewport and shared backdrop renderer") + _expect(preview_count == 4, "all four starter cards use scene previews instead of placeholder tiles") _expect(populated_scene_count == 2, "Town Street and Living Room previews load their scene objects") diff --git a/tests/test_phase19_starter_chooser_layout.gd b/tests/test_phase19_starter_chooser_layout.gd new file mode 100644 index 0000000..70cf2a0 --- /dev/null +++ b/tests/test_phase19_starter_chooser_layout.gd @@ -0,0 +1,144 @@ +extends SceneTree + +const SELECTOR_SCENE: PackedScene = preload("res://scenes/stage/asset_selector.tscn") +const SANDBOX_THEME_SCRIPT: Script = preload("res://scripts/stage/sandbox_theme.gd") + +var _checks: int = 0 +var _failures: int = 0 +var _selector: AssetSelector + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + root.size = Vector2i(1280, 720) + _selector = SELECTOR_SCENE.instantiate() as AssetSelector + root.add_child(_selector) + await process_frame + var stage_theme: SandboxTheme = SANDBOX_THEME_SCRIPT.new() as SandboxTheme + stage_theme.load_from("res://sandbox_theme.json") + _selector.apply_theme(stage_theme) + _selector.open("starters", _starter_entries()) + await process_frame + await process_frame + _test_roomy_layout() + await _save_capture("phase19_starter_chooser_wide.png") + await _test_hover_style_and_capture() + await _test_narrow_layout() + _selector.hide() + _selector.queue_free() + await process_frame + if _failures == 0: + print("RESULT: ALL PASSED (%d checks)" % _checks) + quit(0) + else: + print("RESULT: %d FAILURE(S) out of %d checks" % [_failures, _checks]) + quit(1) + + +func _starter_entries() -> Array[Dictionary]: + return [ + { + "id": "starter_plain_background", + "name": "Plain Background", + "description": "An empty stage with one color. Choose a new color whenever you like.", + "path": "res://content/stages/starters/plain_background.scene", + }, + { + "id": "starter_blank_scene", + "name": "Open Sky", + "description": "An empty stage with a soft sky. Sun and clouds, ready for your story.", + "path": "res://content/stages/starters/blank.scene", + }, + { + "id": "starter_town_street", + "name": "Town Street", + "description": "Cloudy sky, shops, trees, sidewalk, and road.", + "path": "res://content/stages/starters/town_street.scene", + }, + { + "id": "starter_living_room", + "name": "Living Room", + "description": "A cozy room with a window, rug, and furniture.", + "path": "res://content/stages/starters/living_room.scene", + }, + ] + + +func _test_roomy_layout() -> void: + var grid: GridContainer = _grid() + var close_button: Button = _selector.find_child("CloseButton", true, false) as Button + _expect(_selector.size.x == 1160, "roomy starter chooser uses the preferred 1160-pixel width") + _expect(int(_selector.get("_active_columns")) == 2 and grid != null and grid.columns == 2, "roomy chooser presents two card columns") + _expect(close_button != null and close_button.visible and close_button.custom_minimum_size.y >= 44.0, "roomy chooser keeps its visible Close action reachable") + var first_card: Control = grid.get_child(0) as Control if grid != null and grid.get_child_count() > 0 else null + var preview: Control = first_card.find_child("StarterScenePreview", true, false) as Control if first_card != null else null + var viewport: SubViewport = preview.get_child(0) as SubViewport if preview != null and preview.get_child_count() > 0 else null + var preview_aspect: float = float(viewport.size.x) / float(viewport.size.y) if viewport != null and viewport.size.y > 0 else 0.0 + _expect(first_card != null and first_card.custom_minimum_size.x >= 500.0, "roomy starter cards expand to at least 500 pixels") + _expect(preview != null and preview.custom_minimum_size.x >= 500.0 and preview.custom_minimum_size.y >= 240.0, "roomy previews meet the approved dimensions") + _expect(viewport != null and viewport.size.x >= 500 and viewport.size.y >= 240 and preview_aspect >= 1.9 and preview_aspect <= 2.2, "preview render target preserves the wide scene shape") + var title: Label = _selector.find_child("TitleLabel", true, false) as Label + _expect(title != null and title.visible and title.text == "Choose a starter scene", "roomy chooser keeps its readable title") + + +func _test_narrow_layout() -> void: + root.size = Vector2i(550, 690) + await process_frame + _selector.call("_update_popup_layout") + _selector.call("_rebuild") + await process_frame + await process_frame + var grid: GridContainer = _grid() + var close_button: Button = _selector.find_child("CloseButton", true, false) as Button + _expect(_selector.size.x <= root.size.x - 24, "narrow chooser stays within the safe screen margins") + _expect(int(_selector.get("_active_columns")) == 1 and grid != null and grid.columns == 1, "narrow chooser switches to a single card column") + _expect(int(_selector.get("_page_capacity")) == 4 and grid != null and grid.get_child_count() == 4, "narrow chooser keeps all four cards in the scrollable body") + _expect(close_button != null and close_button.visible, "narrow chooser keeps Close visible outside the scrolling body") + var first_card: Control = grid.get_child(0) as Control if grid != null and grid.get_child_count() > 0 else null + var preview: Control = first_card.find_child("StarterScenePreview", true, false) as Control if first_card != null else null + _expect(preview != null and preview.custom_minimum_size.x >= 400.0 and preview.custom_minimum_size.y >= 200.0, "narrow single-column layout retains large previews") + await _save_capture("phase19_starter_chooser_narrow.png") + + +func _test_hover_style_and_capture() -> void: + var grid: GridContainer = _grid() + var hover_card: Button = grid.get_child(1) as Button if grid != null and grid.get_child_count() > 1 else null + if hover_card == null: + _expect(false, "starter card is available for hover preview") + return + var hover_style: StyleBoxFlat = hover_card.get_theme_stylebox("hover") as StyleBoxFlat + _expect(hover_style != null and hover_style.border_color.is_equal_approx(Color("#22C6FF")), "starter hover style uses the EDIT blue border") + if hover_style == null: + return + var normal_style: StyleBox = hover_card.get_theme_stylebox("normal") + hover_card.add_theme_stylebox_override("normal", hover_style) + await process_frame + await _save_capture("phase19_starter_chooser_hover.png") + hover_card.add_theme_stylebox_override("normal", normal_style) + + +func _grid() -> GridContainer: + return _selector.find_child("GridContainer", true, false) as GridContainer + + +func _expect(condition: bool, message: String) -> void: + _checks += 1 + if condition: + print("PASS: " + message) + else: + _failures += 1 + push_error("Starter chooser layout check failed: " + message) + + +func _save_capture(file_name: String) -> void: + if DisplayServer.get_name() == "headless": + return + await RenderingServer.frame_post_draw + var capture: Image = root.get_texture().get_image() + var capture_dir: String = ProjectSettings.globalize_path("res://.phase19_captures") + DirAccess.make_dir_recursive_absolute(capture_dir) + var error: Error = capture.save_png(capture_dir.path_join(file_name)) + _expect(error == OK, "capture saved for visual inspection: %s" % file_name) diff --git a/tests/test_phase19_starter_chooser_layout.gd.uid b/tests/test_phase19_starter_chooser_layout.gd.uid new file mode 100644 index 0000000..c6c5fc5 --- /dev/null +++ b/tests/test_phase19_starter_chooser_layout.gd.uid @@ -0,0 +1 @@ +uid://dp47aexhannrg diff --git a/tests/test_phase19_surface_followup.gd b/tests/test_phase19_surface_followup.gd index 1e8a1d1..a7686f2 100644 --- a/tests/test_phase19_surface_followup.gd +++ b/tests/test_phase19_surface_followup.gd @@ -58,8 +58,9 @@ func _test_v15_migration() -> void: ] } var migrated: Dictionary = STAGE_SCENE_IO._migrate_to_current(source) - _expect(String(migrated.get("version", "")) == "1.6", "v1.5 scenes migrate to v1.6") + _expect(String(migrated.get("version", "")) == "1.7", "v1.5 scenes migrate to v1.7") _expect(String(migrated.get("sky_id", "")) == "sky_cloudy_day", "v1.5 migration preserves the saved Sky") + _expect(String(migrated.get("background_kind", "")) == "sky" and String(migrated.get("plain_color", "")) == STAGE_SCENE_IO.DEFAULT_PLAIN_COLOR, "v1.5 migration adds the remembered Plain Background defaults") var objects: Array = migrated.get("objects", []) as Array _expect(String((objects[0] as Dictionary).get("finish_id", "")) == "finish_ground_sidewalk", "v1.5 migration preserves walkable terrain finishes") var migrated_brick_color: String = String((objects[1] as Dictionary).get("color", "")).to_upper() @@ -157,7 +158,7 @@ func _test_background_ground_model_and_serialization(world: Node2D, surface: Sta _expect(selection.hit_test(surface.global_position) == surface, "Edit Scenery hit-testing can select background ground") var data: Dictionary = _stage.call("_collect_scene_data", false) var validation: Dictionary = STAGE_SCENE_IO._validate_root(data) - _expect(String(data.get("version", "")) == "1.6" and bool(validation.get("ok", false)), "background ground serializes and validates in the current scene schema") + _expect(String(data.get("version", "")) == STAGE_SCENE_IO.FILE_VERSION and bool(validation.get("ok", false)), "background ground serializes and validates in the current scene schema") var found: Dictionary = {} for entry_value: Variant in data.get("objects", []): if entry_value is Dictionary and String((entry_value as Dictionary).get("type", "")) == "background_ground":