Repository navigation
gamepad-plugin 1.0.2 - #1811
Merged
Merged
gamepad-plugin 1.0.2#1811
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
- UICheckbox: a checkbox with its label, drawn or skinned, a radio button with a `group`; `onChange` only on user input - UISlider: horizontal or vertical, drag, track click, wheel, step, caption and value text, drawn or skinned; `onChange` and `onChangeEnd` - UITextButton: `onClick` setting on a completed click, atlas `skin` with lowered pressed art, `enabled`, `pressedColor`, CSS fonts - UIPanel: nine-slice `skin`, `title`, `draggable`, `layout` (column/row/grid, padding, gap, align, autoSize) and `scroll` (wheel, drag with momentum, scrollbar, scrollTo/scrollToChild) - UIBaseElement: cancelPress/onCancel, so a drag on a button in a scrolling panel scrolls instead of clicking - Input: children cropped by a clipping container, or scrolled out of a panel, no longer get pointer events there - The UI example uses the widgets, with volume sliders wired to audio and a scrolling level list; skill sections and changelog entries Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
- UIBaseElement: a draggable element pressed with no hover first, as a touch tap is, no longer throws, and drags by touch - UIPanel: a draggable panel is moved by its title or frame, not through a widget on it, so dragging it by a button no longer clicks the button - UIPanel: no fling while the pointer is still down; autoSize counts the title and frame from a zero height; a scrolling panel inside another scrolls alone; emptying or destroying a panel does not lay it out per child or call onScroll - UISlider: the wheel to the right raises it; a drag also ends on a mouse or touch release, or a release over the slider - UICheckbox: as wide as its longer label, whichever it is - UITextButton: a font given as fontData, an image, or with only its image loaded is a bitmap font as before; pressedColor defaults to hoverOnColor; bitmapText can be assigned - 10 regression tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
API, from a consistency review against the existing UI widgets: - UITextButton: width/height, fontSize (pixels, bitmap fonts too), labelFillStyle and borderColor, the names the other widgets use; the old names still work. Settings are no longer written back. Colours take any Paint. pressedColor left undefined follows hoverOnColor. onClickCallback (was clickCallback). bitmapText keeps its BitmapText type, deprecated - UICheckbox: boxSize, boxHoverColor; labelOn/labelOff settable and refitting; group changes apply at once; skin hoverOn/hoverOff and disabledOn/disabledOff - UISlider: valueFormat(value, ratio) (was format), ratio, settable min/max/step, thumbHoverColor, thumbBorderColor, thumbBorderWidth - UIBaseElement: enabled shared by every UI element; keepsDrag public - ProgressBar: onChange also gets the bar - Paint exported; @category UI on the UI settings types Fixes: - align "stretch" only resizes buttons and panels, not a BitmapText (whose resize is a scale) or a checkbox or slider - a drag ends only on its own pointer's release, in the event family the engine listens to, not on another finger or button - a non-blocking scrolling panel inside another scrolls alone - a draggable panel is not moved through a widget at any depth, and the check no longer mixes coordinate spaces in the world - a draggable element in the world no longer jumps by the camera position - a stale scroll press is dropped; skin insets of 0 match the art - slider steps in exponent notation, and a range that is not a whole number of steps, snap correctly Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
shadowColor, shadowOffsetX, shadowOffsetY and shadowBlur. The soft edge is a few stacked translucent rounded rectangles, so it looks the same on Canvas, WebGL and WebGPU; it follows the corner radius, goes under a skin too, and is drawn outside the bounds so it never takes the pointer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
…game (#1805) A touch fires pointerover and pointerenter before its pointerdown, and pointerout and pointerleave after its pointerup. The plugin only kept the down, move, up and cancel from the engine, so the widget under a button got onOver as the button was pressed (the Alex 4 menu arrow jumped to the line under B). The plugin now also captures the four hover events and stops them for a touch that lands on, or lifted from, a control. A mouse hovering over the controls is left alone, as its moves are. Fixes #1805 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
UIFocus (off until UIFocus.enable()): one widget has the focus; the arrows, the D-pad or the left stick move it to the nearest widget that way, edge to edge; Enter, Space or A press it as a click does; left/right step a slider; Escape or B cancel. The pad is read directly (input.readGamepads, real or virtual), so the game's pad bindings are untouched. The ring shows after keyboard or pad input and hides when the mouse moves; the first key after the mouse only shows it. A UIPanel with trapFocus keeps the focus in and restores it after, with onBack on cancel. Focused widgets in a scrolling panel scroll into view, with room for the ring. Any UIBaseElement can take part: focusable, focusNeighbors, onNavigate, onFocus/onBlur, focusPress/focusRelease. Buttons, checkboxes and sliders do. hoverScale and pressScale on UIBaseElement, and as settings on every widget: an eased bounce applied to the drawing only, so hit areas and layouts stay put. The UI example turns on both, with a hint line for the controls. Skill sections and changelog entries; 13 new tests (87 in ui-widgets). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Arrows or the D-pad move to the nearest widget, Enter, Space or A press it, sliders step, a ring shows the focus, and a focused widget in a scrolling panel scrolls into view. Removed: trapFocus/onBack, cancel, focusNeighbors, onFocus/onBlur, hover moving the focus, the first-key rule, the stick with repeat, configurable keys and ring sizes. Most games use the mouse or touch; this covers a menu driven by keys or a pad. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
- a press held by Enter or A is called off when the focus moves, the widget is removed or navigation is disabled, instead of staying down - a focused widget only bounces while the focus ring shows - the bounce eases over about 0.2 s; it snapped in a frame - Enter goes to the focused button: another bound to Enter waits while the ring shows elsewhere - a pad's A held as navigation is enabled is not a press - a widget made focusable after it was added takes part - navigation skips widgets inside a hidden or transparent container - an arrow from a focused widget disabled since moves on from where it is - docs: the bounce is on UIBaseElement; Enter and bindKey; accept calls onClick() with no event Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
UIFocus is gone. A widget takes the keyboard and gamepad focus with focus(); from then on the arrows or the D-pad move it, Enter, Space or A press it, sliders step. Nothing listens until a widget has the focus, and the listeners go when none does (blur(), or the focused widget leaving the scene), so the keys and the pad are the game's until then. On UIBaseElement: focus(), blur(), focused, focusable, onNavigate, the static focusOwner and focusRingColor. The example focuses its first widget. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Three bugs the new tests caught: - a slider's default value text kept the old decimals after `step` changed - Enter on a focused button the pointer already held clicked it on release - a virtual gamepad sharing a slot with a real one was not read The stub-subclass tests now use the real button. New tests cover the shadow under a faded parent, scrollbar geometry, vertical and skinned sliders, cancelled and two-finger drags, skin regions and bitmap font sizes, radio drawing and groups, sideways and line-mode wheel scrolling, wheel pass-through at the end of a panel, fling limits, grid stretch, row autoSize, clearChildren, the focus ring, and focus teardown. The clipping test now clips through a real container. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
Dates the 1.0.2 changelog section: a touch on the controls no longer reaches the game as a hover (#1805). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JnzwA4xBNBw7cEZzG1bUru
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Releases
@melonjs/gamepad-plugin1.0.2: the package version goes from 1.0.1 to 1.0.2 and the changelog's[1.0.2]section is dated.The release carries the #1805 fix merged in #1808: a touch on the on-screen controls no longer reaches the game as a hover (
pointerover/pointerenter/pointerout/pointerleave), so a widget under a button no longer getsonOveras the button is pressed.Once merged, the "Publish to npm" workflow is run with
package=gamepad-plugin.How it was checked
Type of change
Checklist
pnpm lintpasses)pnpm build)Generated by Claude Code