@datamoc/mw_games 0.42.0 → 0.44.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +126 -0
- package/README.md +84 -1
- package/REFERENCE.md +134 -6
- package/api-surface.json +1814 -116
- package/data/microgm-essential.PROVENANCE.md +13 -0
- package/data/microgm-essential.sf2 +0 -0
- package/data/soundfont-catalog.json +8 -0
- package/dist/actors/Resource.d.ts.map +1 -1
- package/dist/actors/Resource.js +2 -3
- package/dist/actors/Resource.js.map +1 -1
- package/dist/audio/AdaptiveMusic.d.ts +85 -0
- package/dist/audio/AdaptiveMusic.d.ts.map +1 -0
- package/dist/audio/AdaptiveMusic.js +230 -0
- package/dist/audio/AdaptiveMusic.js.map +1 -0
- package/dist/audio/AudioLoader.d.ts +33 -0
- package/dist/audio/AudioLoader.d.ts.map +1 -0
- package/dist/audio/AudioLoader.js +58 -0
- package/dist/audio/AudioLoader.js.map +1 -0
- package/dist/audio/AudioViews.d.ts +70 -0
- package/dist/audio/AudioViews.d.ts.map +1 -0
- package/dist/audio/AudioViews.js +119 -0
- package/dist/audio/AudioViews.js.map +1 -0
- package/dist/audio/BusBudget.d.ts +89 -0
- package/dist/audio/BusBudget.d.ts.map +1 -0
- package/dist/audio/BusBudget.js +120 -0
- package/dist/audio/BusBudget.js.map +1 -0
- package/dist/audio/Channels.d.ts +66 -1
- package/dist/audio/Channels.d.ts.map +1 -1
- package/dist/audio/Channels.js +119 -31
- package/dist/audio/Channels.js.map +1 -1
- package/dist/audio/CoreHost.d.ts +114 -0
- package/dist/audio/CoreHost.d.ts.map +1 -0
- package/dist/audio/CoreHost.js +335 -0
- package/dist/audio/CoreHost.js.map +1 -0
- package/dist/audio/DecoderGuard.d.ts +139 -0
- package/dist/audio/DecoderGuard.d.ts.map +1 -0
- package/dist/audio/DecoderGuard.js +208 -0
- package/dist/audio/DecoderGuard.js.map +1 -0
- package/dist/audio/Fft.d.ts +3 -0
- package/dist/audio/Fft.d.ts.map +1 -0
- package/dist/audio/Fft.js +45 -0
- package/dist/audio/Fft.js.map +1 -0
- package/dist/audio/LoopTags.d.ts +18 -0
- package/dist/audio/LoopTags.d.ts.map +1 -1
- package/dist/audio/LoopTags.js +20 -0
- package/dist/audio/LoopTags.js.map +1 -1
- package/dist/audio/Midi.d.ts +35 -0
- package/dist/audio/Midi.d.ts.map +1 -1
- package/dist/audio/Midi.js +71 -1
- package/dist/audio/Midi.js.map +1 -1
- package/dist/audio/MidiRender.d.ts +47 -0
- package/dist/audio/MidiRender.d.ts.map +1 -1
- package/dist/audio/MidiRender.js +100 -2
- package/dist/audio/MidiRender.js.map +1 -1
- package/dist/audio/MidiSynth.d.ts +147 -0
- package/dist/audio/MidiSynth.d.ts.map +1 -0
- package/dist/audio/MidiSynth.js +205 -0
- package/dist/audio/MidiSynth.js.map +1 -0
- package/dist/audio/MusicPlayer.d.ts +80 -0
- package/dist/audio/MusicPlayer.d.ts.map +1 -0
- package/dist/audio/MusicPlayer.js +147 -0
- package/dist/audio/MusicPlayer.js.map +1 -0
- package/dist/audio/Playable.d.ts +7 -0
- package/dist/audio/Playable.d.ts.map +1 -1
- package/dist/audio/Playable.js.map +1 -1
- package/dist/audio/Positional.d.ts +12 -4
- package/dist/audio/Positional.d.ts.map +1 -1
- package/dist/audio/Positional.js +5 -2
- package/dist/audio/Positional.js.map +1 -1
- package/dist/audio/Resample.d.ts +61 -0
- package/dist/audio/Resample.d.ts.map +1 -0
- package/dist/audio/Resample.js +97 -0
- package/dist/audio/Resample.js.map +1 -0
- package/dist/audio/SampleDecoder.d.ts +16 -2
- package/dist/audio/SampleDecoder.d.ts.map +1 -1
- package/dist/audio/SampleDecoder.js +10 -6
- package/dist/audio/SampleDecoder.js.map +1 -1
- package/dist/audio/Settings.d.ts +99 -0
- package/dist/audio/Settings.d.ts.map +1 -0
- package/dist/audio/Settings.js +134 -0
- package/dist/audio/Settings.js.map +1 -0
- package/dist/audio/Sfx.d.ts +148 -0
- package/dist/audio/Sfx.d.ts.map +1 -0
- package/dist/audio/Sfx.js +213 -0
- package/dist/audio/Sfx.js.map +1 -0
- package/dist/audio/Sound.d.ts +2 -0
- package/dist/audio/Sound.d.ts.map +1 -1
- package/dist/audio/Sound.js +3 -0
- package/dist/audio/Sound.js.map +1 -1
- package/dist/audio/SoundFont.d.ts +5 -3
- package/dist/audio/SoundFont.d.ts.map +1 -1
- package/dist/audio/SoundFont.js +10 -8
- package/dist/audio/SoundFont.js.map +1 -1
- package/dist/audio/SpectralDistance.d.ts +34 -0
- package/dist/audio/SpectralDistance.d.ts.map +1 -0
- package/dist/audio/SpectralDistance.js +64 -0
- package/dist/audio/SpectralDistance.js.map +1 -0
- package/dist/audio/StreamChannel.d.ts +150 -0
- package/dist/audio/StreamChannel.d.ts.map +1 -0
- package/dist/audio/StreamChannel.js +390 -0
- package/dist/audio/StreamChannel.js.map +1 -0
- package/dist/audio/StreamPlayable.d.ts +73 -0
- package/dist/audio/StreamPlayable.d.ts.map +1 -0
- package/dist/audio/StreamPlayable.js +130 -0
- package/dist/audio/StreamPlayable.js.map +1 -0
- package/dist/audio/Synth.d.ts +1 -1
- package/dist/audio/Synth.d.ts.map +1 -1
- package/dist/audio/Synth.js +4 -0
- package/dist/audio/Synth.js.map +1 -1
- package/dist/audio/SyxBank.d.ts +73 -0
- package/dist/audio/SyxBank.d.ts.map +1 -0
- package/dist/audio/SyxBank.js +130 -0
- package/dist/audio/SyxBank.js.map +1 -0
- package/dist/audio/Underrun.d.ts +25 -0
- package/dist/audio/Underrun.d.ts.map +1 -0
- package/dist/audio/Underrun.js +18 -0
- package/dist/audio/Underrun.js.map +1 -0
- package/dist/audio/Wav.d.ts +56 -0
- package/dist/audio/Wav.d.ts.map +1 -0
- package/dist/audio/Wav.js +164 -0
- package/dist/audio/Wav.js.map +1 -0
- package/dist/audio/WebMidi.d.ts +58 -0
- package/dist/audio/WebMidi.d.ts.map +1 -0
- package/dist/audio/WebMidi.js +79 -0
- package/dist/audio/WebMidi.js.map +1 -0
- package/dist/audio/humanize/Onsets.d.ts.map +1 -1
- package/dist/audio/humanize/Onsets.js +1 -44
- package/dist/audio/humanize/Onsets.js.map +1 -1
- package/dist/audio/index.d.ts +43 -7
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +21 -3
- package/dist/audio/index.js.map +1 -1
- package/dist/battle/AttackPreview.d.ts.map +1 -1
- package/dist/battle/AttackPreview.js +8 -8
- package/dist/battle/AttackPreview.js.map +1 -1
- package/dist/battle/StatStages.d.ts.map +1 -1
- package/dist/battle/StatStages.js +2 -1
- package/dist/battle/StatStages.js.map +1 -1
- package/dist/board/Engine.d.ts +2 -0
- package/dist/board/Engine.d.ts.map +1 -1
- package/dist/board/Engine.js +1 -1
- package/dist/board/Engine.js.map +1 -1
- package/dist/board/HexSkirmish.d.ts.map +1 -1
- package/dist/board/HexSkirmish.js +11 -72
- package/dist/board/HexSkirmish.js.map +1 -1
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +3 -5
- package/dist/board/Tactics.js.map +1 -1
- package/dist/board/tourney.d.ts.map +1 -1
- package/dist/board/tourney.js +2 -19
- package/dist/board/tourney.js.map +1 -1
- package/dist/core/Handles.js +7 -7
- package/dist/core/Handles.js.map +1 -1
- package/dist/mw_games.global.js +25 -22
- package/dist/mwl/conditions.d.ts +12 -0
- package/dist/mwl/conditions.d.ts.map +1 -1
- package/dist/mwl/conditions.js +49 -8
- package/dist/mwl/conditions.js.map +1 -1
- package/dist/mwl/index.d.ts +13 -0
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +7 -0
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/objects.d.ts +31 -0
- package/dist/mwl/objects.d.ts.map +1 -0
- package/dist/mwl/objects.js +83 -0
- package/dist/mwl/objects.js.map +1 -0
- package/dist/mwl/package-container.d.ts +185 -0
- package/dist/mwl/package-container.d.ts.map +1 -0
- package/dist/mwl/package-container.js +446 -0
- package/dist/mwl/package-container.js.map +1 -0
- package/dist/mwl/package-document.d.ts +217 -0
- package/dist/mwl/package-document.d.ts.map +1 -0
- package/dist/mwl/package-document.js +639 -0
- package/dist/mwl/package-document.js.map +1 -0
- package/dist/mwl/package-rom.d.ts +37 -0
- package/dist/mwl/package-rom.d.ts.map +1 -0
- package/dist/mwl/package-rom.js +96 -0
- package/dist/mwl/package-rom.js.map +1 -0
- package/dist/mwl/package-verify.d.ts +34 -0
- package/dist/mwl/package-verify.d.ts.map +1 -0
- package/dist/mwl/package-verify.js +111 -0
- package/dist/mwl/package-verify.js.map +1 -0
- package/dist/mwl/package.d.ts +184 -0
- package/dist/mwl/package.d.ts.map +1 -0
- package/dist/mwl/package.js +382 -0
- package/dist/mwl/package.js.map +1 -0
- package/dist/mwl/schema.d.ts +1 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/tables.d.ts +2 -0
- package/dist/mwl/tables.d.ts.map +1 -1
- package/dist/mwl/tables.js +13 -0
- package/dist/mwl/tables.js.map +1 -1
- package/dist/physics/PhysicsWorld.d.ts.map +1 -1
- package/dist/physics/PhysicsWorld.js +4 -3
- package/dist/physics/PhysicsWorld.js.map +1 -1
- package/dist/physics/XpbdWorld.d.ts +23 -5
- package/dist/physics/XpbdWorld.d.ts.map +1 -1
- package/dist/physics/XpbdWorld.js +91 -6
- package/dist/physics/XpbdWorld.js.map +1 -1
- package/dist/testing/FakeAudio.d.ts +149 -0
- package/dist/testing/FakeAudio.d.ts.map +1 -0
- package/dist/testing/FakeAudio.js +219 -0
- package/dist/testing/FakeAudio.js.map +1 -0
- package/dist/testing/index.d.ts +18 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +22 -0
- package/dist/testing/index.js.map +1 -1
- package/dist/threads/index.d.ts +2 -2
- package/dist/threads/index.d.ts.map +1 -1
- package/dist/threads/index.js +1 -1
- package/dist/threads/index.js.map +1 -1
- package/dist/threads/spawn.d.ts +32 -0
- package/dist/threads/spawn.d.ts.map +1 -1
- package/dist/threads/spawn.js +35 -11
- package/dist/threads/spawn.js.map +1 -1
- package/dist/three-d/Collision3D.d.ts +46 -2
- package/dist/three-d/Collision3D.d.ts.map +1 -1
- package/dist/three-d/Collision3D.js +46 -2
- package/dist/three-d/Collision3D.js.map +1 -1
- package/dist/three-d/Grid.d.ts +12 -1
- package/dist/three-d/Grid.d.ts.map +1 -1
- package/dist/three-d/Grid.js +12 -1
- package/dist/three-d/Grid.js.map +1 -1
- package/dist/three-d/Vox.d.ts +13 -1
- package/dist/three-d/Vox.d.ts.map +1 -1
- package/dist/three-d/Vox.js +13 -1
- package/dist/three-d/Vox.js.map +1 -1
- package/dist/two-d/Game.d.ts +32 -1
- package/dist/two-d/Game.d.ts.map +1 -1
- package/dist/two-d/Game.js +105 -14
- package/dist/two-d/Game.js.map +1 -1
- package/dist/two-d/Scene2D.d.ts +24 -0
- package/dist/two-d/Scene2D.d.ts.map +1 -1
- package/dist/two-d/Scene2D.js +30 -0
- package/dist/two-d/Scene2D.js.map +1 -1
- package/dist/two-d/render/HazeLayer.d.ts.map +1 -1
- package/dist/two-d/render/HazeLayer.js +2 -1
- package/dist/two-d/render/HazeLayer.js.map +1 -1
- package/dist/two-d/render/ImageModifiers.d.ts +4 -2
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
- package/dist/two-d/render/ImageModifiers.js +13 -8
- package/dist/two-d/render/ImageModifiers.js.map +1 -1
- package/dist/two-d/render/NeonGlow.d.ts.map +1 -1
- package/dist/two-d/render/NeonGlow.js +2 -1
- package/dist/two-d/render/NeonGlow.js.map +1 -1
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +2 -1
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/SceneTransition.d.ts +301 -0
- package/dist/two-d/render/SceneTransition.d.ts.map +1 -0
- package/dist/two-d/render/SceneTransition.js +458 -0
- package/dist/two-d/render/SceneTransition.js.map +1 -0
- package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
- package/dist/two-d/render/ScreenEffects.js +2 -1
- package/dist/two-d/render/ScreenEffects.js.map +1 -1
- package/dist/two-d/render/SkeletalSprite.d.ts.map +1 -1
- package/dist/two-d/render/SkeletalSprite.js +2 -1
- package/dist/two-d/render/SkeletalSprite.js.map +1 -1
- package/dist/two-d/render/Types2D.d.ts +2 -2
- package/dist/two-d/render/Types2D.d.ts.map +1 -1
- package/dist/two-d/render/Types2D.js +2 -2
- package/dist/two-d/render/Types2D.js.map +1 -1
- package/dist/two-d/render/index.d.ts +2 -0
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +1 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +3 -5
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/Button.d.ts +23 -0
- package/dist/two-d/ui/Button.d.ts.map +1 -1
- package/dist/two-d/ui/Button.js +37 -0
- package/dist/two-d/ui/Button.js.map +1 -1
- package/dist/two-d/ui/Dropdown.d.ts +5 -1
- package/dist/two-d/ui/Dropdown.d.ts.map +1 -1
- package/dist/two-d/ui/Dropdown.js +8 -1
- package/dist/two-d/ui/Dropdown.js.map +1 -1
- package/dist/two-d/ui/DropdownView.d.ts +63 -3
- package/dist/two-d/ui/DropdownView.d.ts.map +1 -1
- package/dist/two-d/ui/DropdownView.js +168 -9
- package/dist/two-d/ui/DropdownView.js.map +1 -1
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +2 -1
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/IconGrid.d.ts.map +1 -1
- package/dist/two-d/ui/IconGrid.js +2 -1
- package/dist/two-d/ui/IconGrid.js.map +1 -1
- package/dist/two-d/ui/ListView.d.ts.map +1 -1
- package/dist/two-d/ui/ListView.js +2 -1
- package/dist/two-d/ui/ListView.js.map +1 -1
- package/dist/two-d/ui/ScrollBox.d.ts +96 -0
- package/dist/two-d/ui/ScrollBox.d.ts.map +1 -1
- package/dist/two-d/ui/ScrollBox.js +218 -5
- package/dist/two-d/ui/ScrollBox.js.map +1 -1
- package/dist/two-d/ui/ScrollText.d.ts +131 -0
- package/dist/two-d/ui/ScrollText.d.ts.map +1 -0
- package/dist/two-d/ui/ScrollText.js +218 -0
- package/dist/two-d/ui/ScrollText.js.map +1 -0
- package/dist/two-d/ui/Slider.d.ts.map +1 -1
- package/dist/two-d/ui/Slider.js +4 -4
- package/dist/two-d/ui/Slider.js.map +1 -1
- package/dist/two-d/ui/Tooltip.d.ts +70 -1
- package/dist/two-d/ui/Tooltip.d.ts.map +1 -1
- package/dist/two-d/ui/Tooltip.js +115 -3
- package/dist/two-d/ui/Tooltip.js.map +1 -1
- package/dist/two-d/ui/Window.d.ts +35 -2
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +58 -3
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +7 -5
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +3 -2
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +14 -3
- package/sbom.cdx.json +19 -260
- package/tools/audio.d.mts +75 -0
- package/tools/audio.mjs +437 -0
- package/tools/browser-driver.mjs +3 -3
- package/tools/browser-smoke.mjs +19 -2
- package/tools/build-tablebases.mjs +7 -3
- package/tools/compile-openings.mjs +7 -3
- package/tools/compile-resources.d.mts +2 -0
- package/tools/compile-resources.mjs +13 -1
- package/tools/emit-page.d.mts +6 -0
- package/tools/emit-page.mjs +43 -3
- package/tools/find-chrome.mjs +4 -2
- package/tools/init.mjs +11 -3
- package/tools/mwl.mjs +144 -2
- package/tools/play-uci.mjs +9 -5
- package/tools/vite.mjs +9 -1
- package/tools.md +2 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Container, Graphics } from 'pixi.js';
|
|
1
|
+
import { Container, Graphics, Rectangle } from 'pixi.js';
|
|
2
2
|
import { Signal } from '../../core/Signal.js';
|
|
3
3
|
import { theme, themeChanged } from './theme.js';
|
|
4
4
|
/**
|
|
@@ -16,10 +16,90 @@ import { theme, themeChanged } from './theme.js';
|
|
|
16
16
|
export function scrollOffset(offset, contentSize, viewportSize) {
|
|
17
17
|
return Math.max(0, Math.min(Math.max(0, contentSize - viewportSize), offset));
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Touch scrolling as plain numbers: feed it pointer positions and it says how far the content moves
|
|
21
|
+
* while the finger is down, then keeps coasting after release with a friction that decays the speed.
|
|
22
|
+
* No pointer events or clock of its own, so it is the same under a test as under a finger.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import { ScrollDrag } from '@datamoc/mw_games/two-d/ui';
|
|
27
|
+
*
|
|
28
|
+
* const drag = new ScrollDrag();
|
|
29
|
+
* drag.start(200, 0);
|
|
30
|
+
* console.log(drag.move(170, 0.1)); // 30: the content follows the finger up
|
|
31
|
+
* drag.end();
|
|
32
|
+
* console.log(drag.step(1 / 60) > 0); // true: it keeps coasting
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class ScrollDrag {
|
|
36
|
+
/**
|
|
37
|
+
* @param friction fraction of the speed lost per second of coasting; 0.92 when omitted
|
|
38
|
+
* @param minSpeed the speed, in pixels per second, below which it counts as at rest; 8 when omitted
|
|
39
|
+
*/
|
|
40
|
+
constructor(friction = 0.92, minSpeed = 8) {
|
|
41
|
+
/** content pixels per second the content keeps moving at after release; 0 when at rest */
|
|
42
|
+
this.velocity = 0;
|
|
43
|
+
this.dragging = false;
|
|
44
|
+
/** how far the pointer has travelled since `start`, to tell a drag from a tap */
|
|
45
|
+
this.travelled = 0;
|
|
46
|
+
this.lastY = 0;
|
|
47
|
+
this.lastTime = 0;
|
|
48
|
+
this.friction = friction;
|
|
49
|
+
this.minSpeed = minSpeed;
|
|
50
|
+
}
|
|
51
|
+
start(y, time) {
|
|
52
|
+
this.dragging = true;
|
|
53
|
+
this.velocity = 0;
|
|
54
|
+
this.travelled = 0;
|
|
55
|
+
this.lastY = y;
|
|
56
|
+
this.lastTime = time;
|
|
57
|
+
}
|
|
58
|
+
/** @returns how far the content should move for this pointer position */
|
|
59
|
+
move(y, time) {
|
|
60
|
+
if (!this.dragging)
|
|
61
|
+
return 0;
|
|
62
|
+
const delta = this.lastY - y;
|
|
63
|
+
const dt = time - this.lastTime;
|
|
64
|
+
if (dt > 0)
|
|
65
|
+
this.velocity = this.velocity * 0.4 + (delta / dt) * 0.6;
|
|
66
|
+
this.travelled += Math.abs(delta);
|
|
67
|
+
this.lastY = y;
|
|
68
|
+
this.lastTime = time;
|
|
69
|
+
return delta;
|
|
70
|
+
}
|
|
71
|
+
end() {
|
|
72
|
+
this.dragging = false;
|
|
73
|
+
if (Math.abs(this.velocity) < this.minSpeed)
|
|
74
|
+
this.velocity = 0;
|
|
75
|
+
}
|
|
76
|
+
/** @returns how far the content coasts in `dt` seconds, 0 once it has stopped */
|
|
77
|
+
step(dt) {
|
|
78
|
+
if (this.dragging || this.velocity === 0)
|
|
79
|
+
return 0;
|
|
80
|
+
const delta = this.velocity * dt;
|
|
81
|
+
this.velocity *= (1 - this.friction) ** dt;
|
|
82
|
+
if (Math.abs(this.velocity) < this.minSpeed)
|
|
83
|
+
this.velocity = 0;
|
|
84
|
+
return delta;
|
|
85
|
+
}
|
|
86
|
+
/** stops coasting, for when the content hit an end */
|
|
87
|
+
stop() {
|
|
88
|
+
this.velocity = 0;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
19
91
|
/**
|
|
20
92
|
* A clipped viewport with a scrollbar: put rows in `content` and they scroll inside the box,
|
|
21
93
|
* everything outside it hidden by a mask. The scrollbar is drawn from the theme; the wheel,
|
|
22
94
|
* `scrollBy` and `scrollIntoView` all run through `scrollOffset`, so they clamp the same way.
|
|
95
|
+
* The box owns its `hitArea` (its viewport, kept current by `resize` and `setContentHeight`),
|
|
96
|
+
* so a wheel over the empty part of the viewport reaches it instead of needing a row under
|
|
97
|
+
* the pointer to bubble from.
|
|
98
|
+
*
|
|
99
|
+
* `touch: true` lets a finger drag the content (a drag ends the tap on the rows under it) and coast
|
|
100
|
+
* on release, `keyboard: true` makes `handleKey` scroll by line, page and to the ends, the scrollbar's
|
|
101
|
+
* thumb can be dragged and its track clicked, and `autoHeight` sizes the viewport to the content up
|
|
102
|
+
* to `height`. Call `update(dt)` each frame for the coasting.
|
|
23
103
|
*
|
|
24
104
|
* @example
|
|
25
105
|
* ```ts
|
|
@@ -36,16 +116,23 @@ export class ScrollBox extends Container {
|
|
|
36
116
|
this.onChange = new Signal();
|
|
37
117
|
/** add the rows to scroll here */
|
|
38
118
|
this.content = new Container();
|
|
119
|
+
this.hit = new Rectangle(0, 0, 0, 0);
|
|
39
120
|
this.maskShape = new Graphics();
|
|
40
121
|
this.track = new Graphics();
|
|
41
122
|
this.thumb = new Graphics();
|
|
123
|
+
this.dragMoved = false;
|
|
124
|
+
this.thumbGrab = null;
|
|
42
125
|
this.themeListener = () => this.draw();
|
|
43
126
|
this.handleWheel = (event) => {
|
|
44
127
|
this.scrollBy(event.deltaY);
|
|
45
128
|
};
|
|
46
129
|
this.width_ = options.width;
|
|
47
|
-
this.
|
|
130
|
+
this.maxHeight_ = options.height;
|
|
131
|
+
this.auto = options.autoHeight ?? false;
|
|
132
|
+
this.lineHeight = options.lineHeight ?? 24;
|
|
133
|
+
this.drag = options.touch ? new ScrollDrag() : null;
|
|
48
134
|
this.contentHeight_ = Math.max(0, options.contentHeight ?? 0);
|
|
135
|
+
this.height_ = this.fit();
|
|
49
136
|
this.offset_ = scrollOffset(options.offset ?? 0, this.contentHeight_, this.height_);
|
|
50
137
|
this.addChild(this.content);
|
|
51
138
|
this.addChild(this.maskShape);
|
|
@@ -54,6 +141,30 @@ export class ScrollBox extends Container {
|
|
|
54
141
|
this.content.mask = this.maskShape;
|
|
55
142
|
this.eventMode = 'static';
|
|
56
143
|
this.on('wheel', this.handleWheel);
|
|
144
|
+
if (this.drag) {
|
|
145
|
+
this.on('pointerdown', (event) => this.dragStart(event.global.y, performance.now() / 1000));
|
|
146
|
+
this.on('globalpointermove', (event) => this.dragMove(event.global.y, performance.now() / 1000));
|
|
147
|
+
this.on('pointerup', () => this.dragEnd());
|
|
148
|
+
this.on('pointerupoutside', () => this.dragEnd());
|
|
149
|
+
//a drag that ended over a row is not a click on that row
|
|
150
|
+
this.on('pointerupcapture', (event) => {
|
|
151
|
+
if (this.dragMoved)
|
|
152
|
+
event.stopPropagation();
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
this.track.eventMode = 'static';
|
|
156
|
+
this.thumb.eventMode = 'static';
|
|
157
|
+
this.thumb.on('pointerdown', (event) => {
|
|
158
|
+
event.stopPropagation();
|
|
159
|
+
this.thumbDragStart(event.global.y);
|
|
160
|
+
});
|
|
161
|
+
this.thumb.on('globalpointermove', (event) => this.thumbDragMove(event.global.y));
|
|
162
|
+
this.thumb.on('pointerup', () => (this.thumbGrab = null));
|
|
163
|
+
this.thumb.on('pointerupoutside', () => (this.thumbGrab = null));
|
|
164
|
+
this.track.on('pointerdown', (event) => {
|
|
165
|
+
event.stopPropagation();
|
|
166
|
+
this.scrollToThumbCentre(this.toLocal(event.global).y);
|
|
167
|
+
});
|
|
57
168
|
this.draw();
|
|
58
169
|
themeChanged.add(this.themeListener);
|
|
59
170
|
}
|
|
@@ -63,9 +174,17 @@ export class ScrollBox extends Container {
|
|
|
63
174
|
get contentHeight() {
|
|
64
175
|
return this.contentHeight_;
|
|
65
176
|
}
|
|
177
|
+
/** the viewport's width, the other half of the box's `hitArea` */
|
|
178
|
+
get viewportWidth() {
|
|
179
|
+
return this.width_;
|
|
180
|
+
}
|
|
66
181
|
get viewportHeight() {
|
|
67
182
|
return this.height_;
|
|
68
183
|
}
|
|
184
|
+
/** the viewport's height: the content's, capped at the maximum, when `autoHeight` is on */
|
|
185
|
+
fit() {
|
|
186
|
+
return this.auto ? Math.min(this.maxHeight_, this.contentHeight_) : this.maxHeight_;
|
|
187
|
+
}
|
|
69
188
|
/** how far the content can scroll; 0 when it all fits */
|
|
70
189
|
get maxOffset() {
|
|
71
190
|
return Math.max(0, this.contentHeight_ - this.height_);
|
|
@@ -75,11 +194,13 @@ export class ScrollBox extends Container {
|
|
|
75
194
|
}
|
|
76
195
|
setContentHeight(height) {
|
|
77
196
|
this.contentHeight_ = Math.max(0, height);
|
|
197
|
+
this.height_ = this.fit();
|
|
78
198
|
this.setOffset(scrollOffset(this.offset_, this.contentHeight_, this.height_));
|
|
79
199
|
}
|
|
80
200
|
resize(width, height) {
|
|
81
201
|
this.width_ = width;
|
|
82
|
-
this.
|
|
202
|
+
this.maxHeight_ = height;
|
|
203
|
+
this.height_ = this.fit();
|
|
83
204
|
this.setOffset(scrollOffset(this.offset_, this.contentHeight_, this.height_));
|
|
84
205
|
}
|
|
85
206
|
scrollBy(delta) {
|
|
@@ -95,6 +216,96 @@ export class ScrollBox extends Container {
|
|
|
95
216
|
else if (top + height > this.offset_ + this.height_)
|
|
96
217
|
this.scrollTo(top + height - this.height_);
|
|
97
218
|
}
|
|
219
|
+
/**
|
|
220
|
+
* Scrolls for a key a keyboard-driven list was handed (`KeyboardEvent.key`).
|
|
221
|
+
*
|
|
222
|
+
* @returns true when the key is one this box scrolls by, so a caller can stop it going further
|
|
223
|
+
*/
|
|
224
|
+
handleKey(key) {
|
|
225
|
+
const page = Math.max(this.lineHeight, this.height_ - this.lineHeight);
|
|
226
|
+
switch (key) {
|
|
227
|
+
case 'ArrowUp':
|
|
228
|
+
this.scrollBy(-this.lineHeight);
|
|
229
|
+
return true;
|
|
230
|
+
case 'ArrowDown':
|
|
231
|
+
this.scrollBy(this.lineHeight);
|
|
232
|
+
return true;
|
|
233
|
+
case 'PageUp':
|
|
234
|
+
this.scrollBy(-page);
|
|
235
|
+
return true;
|
|
236
|
+
case 'PageDown':
|
|
237
|
+
this.scrollBy(page);
|
|
238
|
+
return true;
|
|
239
|
+
case 'Home':
|
|
240
|
+
this.scrollTo(0);
|
|
241
|
+
return true;
|
|
242
|
+
case 'End':
|
|
243
|
+
this.scrollTo(this.maxOffset);
|
|
244
|
+
return true;
|
|
245
|
+
default:
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/** a finger or button went down at `y` (any one coordinate space, `time` in seconds) */
|
|
250
|
+
dragStart(y, time) {
|
|
251
|
+
this.drag?.start(y, time);
|
|
252
|
+
this.dragMoved = false;
|
|
253
|
+
}
|
|
254
|
+
/** the pointer moved while down; the content follows once it has travelled a few pixels */
|
|
255
|
+
dragMove(y, time) {
|
|
256
|
+
const drag = this.drag;
|
|
257
|
+
if (!drag?.dragging)
|
|
258
|
+
return;
|
|
259
|
+
const delta = drag.move(y, time);
|
|
260
|
+
if (!this.dragMoved && drag.travelled < 6)
|
|
261
|
+
return;
|
|
262
|
+
this.dragMoved = true;
|
|
263
|
+
this.scrollBy(delta);
|
|
264
|
+
}
|
|
265
|
+
dragEnd() {
|
|
266
|
+
this.drag?.end();
|
|
267
|
+
}
|
|
268
|
+
/** true once the pointer travelled far enough to count as a drag rather than a tap */
|
|
269
|
+
get dragged() {
|
|
270
|
+
return this.dragMoved;
|
|
271
|
+
}
|
|
272
|
+
/** advances touch coasting; call once a frame from the owning scene's `update` */
|
|
273
|
+
update(dt) {
|
|
274
|
+
const drag = this.drag;
|
|
275
|
+
if (!drag)
|
|
276
|
+
return;
|
|
277
|
+
const before = this.offset_;
|
|
278
|
+
this.scrollBy(drag.step(dt));
|
|
279
|
+
if (this.offset_ === before && drag.velocity !== 0)
|
|
280
|
+
drag.stop();
|
|
281
|
+
}
|
|
282
|
+
/** where the scrollbar's thumb sits and how tall it is, in the box's own space */
|
|
283
|
+
get thumbMetrics() {
|
|
284
|
+
const barWidth = 6;
|
|
285
|
+
const height = Math.max(barWidth, (this.height_ / Math.max(1, this.contentHeight_)) * this.height_);
|
|
286
|
+
const y = this.maxOffset === 0 ? 0 : (this.offset_ / this.maxOffset) * (this.height_ - height);
|
|
287
|
+
return { y, height };
|
|
288
|
+
}
|
|
289
|
+
/** the thumb was grabbed at `y` */
|
|
290
|
+
thumbDragStart(y) {
|
|
291
|
+
this.thumbGrab = { y, offset: this.offset_ };
|
|
292
|
+
}
|
|
293
|
+
/** the thumb moved to `y`: the offset follows in proportion to the thumb's travel */
|
|
294
|
+
thumbDragMove(y) {
|
|
295
|
+
if (!this.thumbGrab)
|
|
296
|
+
return;
|
|
297
|
+
const travel = this.height_ - this.thumbMetrics.height;
|
|
298
|
+
if (travel <= 0)
|
|
299
|
+
return;
|
|
300
|
+
this.scrollTo(this.thumbGrab.offset + ((y - this.thumbGrab.y) / travel) * this.maxOffset);
|
|
301
|
+
}
|
|
302
|
+
/** a click on the track at local `y` puts the thumb's centre there */
|
|
303
|
+
scrollToThumbCentre(y) {
|
|
304
|
+
const travel = this.height_ - this.thumbMetrics.height;
|
|
305
|
+
if (travel <= 0)
|
|
306
|
+
return;
|
|
307
|
+
this.scrollTo(((y - this.thumbMetrics.height / 2) / travel) * this.maxOffset);
|
|
308
|
+
}
|
|
98
309
|
setOffset(offset) {
|
|
99
310
|
if (offset === this.offset_) {
|
|
100
311
|
this.draw();
|
|
@@ -105,6 +316,9 @@ export class ScrollBox extends Container {
|
|
|
105
316
|
this.onChange.dispatch(offset);
|
|
106
317
|
}
|
|
107
318
|
draw() {
|
|
319
|
+
this.hit.width = this.width_;
|
|
320
|
+
this.hit.height = this.height_;
|
|
321
|
+
this.hitArea = this.hit;
|
|
108
322
|
const t = theme();
|
|
109
323
|
this.content.y = -this.offset_;
|
|
110
324
|
this.maskShape.clear().rect(0, 0, this.width_, this.height_).fill({ color: 0xffffff });
|
|
@@ -115,8 +329,7 @@ export class ScrollBox extends Container {
|
|
|
115
329
|
const barWidth = 6;
|
|
116
330
|
const x = this.width_ - barWidth;
|
|
117
331
|
this.track.roundRect(x, 0, barWidth, this.height_, barWidth / 2).fill({ color: t.color.panelFill });
|
|
118
|
-
const
|
|
119
|
-
const thumbY = (this.offset_ / this.maxOffset) * (this.height_ - thumbHeight);
|
|
332
|
+
const { y: thumbY, height: thumbHeight } = this.thumbMetrics;
|
|
120
333
|
this.thumb.roundRect(x, thumbY, barWidth, thumbHeight, barWidth / 2).fill({ color: t.color.textHighlight });
|
|
121
334
|
}
|
|
122
335
|
destroy(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollBox.js","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollBox.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScrollBox.js","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollBox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { type LabelOptions } from './Label.ts';
|
|
3
|
+
import { ScrollBox } from './ScrollBox.ts';
|
|
4
|
+
/**
|
|
5
|
+
* `text` cut to fit `maxWidth`, ending in `ellipsis`, as measured by `measure` (the width of a string
|
|
6
|
+
* in whatever font the caller draws it with). A text that already fits comes back unchanged.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { ellipsize } from '@datamoc/mw_games/two-d/ui';
|
|
11
|
+
*
|
|
12
|
+
* const width = (text: string) => text.length * 10;
|
|
13
|
+
* console.log(ellipsize('3. Le Fleuve profond (verrouillé)', 150, width)); // 3. Le Fleuve…
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function ellipsize(text: string, maxWidth: number, measure: (text: string) => number, ellipsis?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* `text` wrapped at `maxWidth` and cut to `maxLines`, the last kept line ending in an ellipsis when
|
|
19
|
+
* something was dropped. Words are not split unless one alone is wider than a line.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { truncateLines } from '@datamoc/mw_games/two-d/ui';
|
|
24
|
+
*
|
|
25
|
+
* const width = (text: string) => text.length * 10;
|
|
26
|
+
* console.log(truncateLines('build a bridge across the river gorge', 120, 2, width));
|
|
27
|
+
* // ['build a', 'bridge acr…']
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function truncateLines(text: string, maxWidth: number, maxLines: number, measure: (text: string) => number, ellipsis?: string): string[];
|
|
31
|
+
/**
|
|
32
|
+
* How far a line of `textWidth` is shifted to scroll inside `boxWidth`, `time` seconds in: it waits
|
|
33
|
+
* `pause` seconds, slides to its end at `speed` px/s, waits again, then slides back, over and over.
|
|
34
|
+
* A text that fits never moves.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* import { marqueeOffset } from '@datamoc/mw_games/two-d/ui';
|
|
39
|
+
*
|
|
40
|
+
* console.log(marqueeOffset(300, 200, 0)); // 0, waiting at the start
|
|
41
|
+
* console.log(marqueeOffset(300, 200, 3)); // 100, at the far end
|
|
42
|
+
* console.log(marqueeOffset(150, 200, 3)); // 0, it fits
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function marqueeOffset(textWidth: number, boxWidth: number, time: number, speed?: number, pause?: number): number;
|
|
46
|
+
export interface ScrollTextOptions {
|
|
47
|
+
width: number;
|
|
48
|
+
/** the tallest the box grows before the text scrolls instead */
|
|
49
|
+
maxHeight: number;
|
|
50
|
+
text?: string;
|
|
51
|
+
label?: Omit<LabelOptions, 'text' | 'wrapWidth'>;
|
|
52
|
+
/** a finger drag scrolls the text; true when omitted */
|
|
53
|
+
touch?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A wrapped `Label` in a `ScrollBox` that sizes itself: the box is as tall as the text up to
|
|
57
|
+
* `maxHeight`, and scrolls (wheel, touch, keys, scrollbar) beyond it, so a long hint, credit list or
|
|
58
|
+
* result message never spills over what is around it. `setText` re-measures and `resize(width)`
|
|
59
|
+
* re-wraps in place; the caller no longer measures the label and feeds `setContentHeight` by hand.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* import { ScrollText } from '@datamoc/mw_games/two-d/ui';
|
|
64
|
+
*
|
|
65
|
+
* const hint = new ScrollText({ width: 220, maxHeight: 60 });
|
|
66
|
+
* hint.setText('Span the gorge with at most 400 of budget. Cables only pull; beams push as well.');
|
|
67
|
+
* console.log(hint.box.viewportHeight <= 60); // true
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare class ScrollText extends Container {
|
|
71
|
+
readonly box: ScrollBox;
|
|
72
|
+
private readonly body;
|
|
73
|
+
private readonly maxHeight;
|
|
74
|
+
private width_;
|
|
75
|
+
constructor(options: ScrollTextOptions);
|
|
76
|
+
/** the text's own height, which sizes the box; its own method so a test can supply it */
|
|
77
|
+
protected measureHeight(): number;
|
|
78
|
+
private measure;
|
|
79
|
+
/** the current width, what `resize` last set it to */
|
|
80
|
+
get viewWidth(): number;
|
|
81
|
+
/**
|
|
82
|
+
* Sets the width in place: the text re-wraps at the new width and the box resizes and
|
|
83
|
+
* re-measures, so a layout change does not rebuild the widget.
|
|
84
|
+
*/
|
|
85
|
+
resize(width: number): void;
|
|
86
|
+
setText(text: string): void;
|
|
87
|
+
/** call each frame for touch coasting */
|
|
88
|
+
update(dt: number): void;
|
|
89
|
+
}
|
|
90
|
+
export interface MarqueeLabelOptions {
|
|
91
|
+
width: number;
|
|
92
|
+
text?: string;
|
|
93
|
+
label?: Omit<LabelOptions, 'text'>;
|
|
94
|
+
/** pixels per second; 40 when omitted */
|
|
95
|
+
speed?: number;
|
|
96
|
+
/** seconds it waits at each end; 1 when omitted */
|
|
97
|
+
pause?: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* One line of text that stays on one line: when it is wider than `width` it slides back and forth
|
|
101
|
+
* inside a clipped window (`marqueeOffset`), driven by `update(dt)`. Under reduced motion it holds
|
|
102
|
+
* still, cut short with an ellipsis, instead of moving.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* import { MarqueeLabel } from '@datamoc/mw_games/two-d/ui';
|
|
107
|
+
*
|
|
108
|
+
* const title = new MarqueeLabel({ width: 160, text: 'A very long track title that cannot fit' });
|
|
109
|
+
* title.update(1 / 60); // once a frame from the scene
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export declare class MarqueeLabel extends Container {
|
|
113
|
+
private readonly body;
|
|
114
|
+
private readonly clip;
|
|
115
|
+
private readonly speed;
|
|
116
|
+
private readonly pause;
|
|
117
|
+
private readonly width_;
|
|
118
|
+
private readonly labelOptions;
|
|
119
|
+
private source;
|
|
120
|
+
private fullWidth;
|
|
121
|
+
private time;
|
|
122
|
+
constructor(options: MarqueeLabelOptions);
|
|
123
|
+
/** the text's width in pixels; its own method so a test can supply it */
|
|
124
|
+
protected measureWidth(text: string): number;
|
|
125
|
+
setText(text: string): void;
|
|
126
|
+
private apply;
|
|
127
|
+
/** where the text is shifted to now (0 until it has waited out its first pause) */
|
|
128
|
+
get shift(): number;
|
|
129
|
+
update(dt: number): void;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=ScrollText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollText.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/ScrollText.ts"],"names":[],"mappings":"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"}
|