Round number fields to the precision they display
`decimals` only reached `formatNumber`, so it changed the label and nothing else: typing 640.5 into a field with `decimals: 0` stored 640.5 and displayed 641. The two existing users got away with it because rounding happened outside the widget (`normalizeFrameRect`, the slice dialog), which their comments had to point out. `NumberField.clampValue` now rounds before it clamps, and every path that sets a value goes through it (typing, scrubbing, arrow keys, the constructor), so the stored number matches the shown one and `min`/`max` stay exact. The rounding is `roundTo` in math.ts, which `snapToStep` already did inline. With that safe, camera `View width`/`View height` and text `Font size` become integers – they were showing 640.000 and 32.000. Everything else that looked integral is not: positions, sprite and collider sizes and zoom are all scrubbed, and `z` is a summed coordinate (walk.ts), not a layer. Verified remotely against the RTX 4070 host: 270 checks, all passed (step 10 gained a check that the field text has no decimal point and survives a reopen). `npm run check` green, 407 tests.
This commit is contained in:
1 parent
6cf47fd2ae
commit
1b16a55ffc
8 files changed
+80
-19
No files matched your search
@@ -1,6 +1,21 @@
|
||||
/** Text assets rendered in the scene, and the enabled switch in the editor and in the running game. */
|
||||
export async function textAndEnabled(t) {
|
||||
const { check, sleep, evaluate, json, shot, click, clickText, mutate, object, play, stop } = t;
|
||||
const {
|
||||
check,
|
||||
sleep,
|
||||
evaluate,
|
||||
json,
|
||||
shot,
|
||||
click,
|
||||
clickText,
|
||||
locate,
|
||||
mutate,
|
||||
object,
|
||||
play,
|
||||
press,
|
||||
stop,
|
||||
typeText,
|
||||
} = t;
|
||||
const has = (text) => evaluate(`Boolean(__gm.locate(${JSON.stringify(text)}))`);
|
||||
|
||||
// 17. Text assets: created through the + menu, placed, and rendered as real text in the scene.
|
||||
@@ -62,4 +77,16 @@ export async function textAndEnabled(t) {
|
||||
);
|
||||
await stop();
|
||||
check('stop leaves the play-mode switch behind', (await object('otext')).overrides.enabled === false);
|
||||
|
||||
// 17c. A field that shows no decimals must not store any either. Font size is such a field, so
|
||||
// typing a fraction has to round: showing "33" while the project holds 32.6 would be a lie.
|
||||
const fontLabel = await locate('Font size');
|
||||
check('Font size reads as a whole number', Boolean(await has('32')) && !(await has('32.000')));
|
||||
await click(fontLabel.x + 160, fontLabel.y);
|
||||
await typeText('32.6');
|
||||
await press('Enter');
|
||||
await sleep(200);
|
||||
const fontSize = (await object('otext')).overrides.fontSize;
|
||||
check('typing a fraction into it rounds the stored value', fontSize === 33, String(fontSize));
|
||||
check('and the field shows exactly what was stored', Boolean(await has('33')));
|
||||
}
|
||||
Reference in new issue
Block a user