mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-27 08:01:40 +01:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c0d8cb9dc4 | ||
|
|
2888a45a30 |
No files matched your search
@@ -64,7 +64,8 @@ none of these frontend controls has passed a worn-headset check yet.
|
||||
| `PanelSection`, rows, buttons, toggles, dropdowns | Local touch-sized controls; disabled controls stay inert during a backend call | Local browser and host unit test |
|
||||
| `TextField`, `SliderField`, grouped `Dropdown` options | Native text, range and select controls in the panel; disabled state, numeric slider callback and basic input types | Host unit test; worn VR use unverified |
|
||||
| Scrollable panel content | Visible Scroll plugin up/down buttons move the last region reached by a trusted pointer, or the document if that region disappears. Hold either button to repeat; keyboard activation still moves one step. Plugins may use ordinary CSS overflow containers. | Parent/iframe message tests and a real Frame synthetic OpenVR pointer hold; physical controller scroll and hold remain unverified |
|
||||
| `Tabs`, `SidebarNavigation`, spinners, dialog/menu wrappers, progress bars | Local tab navigation and ordinary HTML controls; no Steam navigation or controller focus tree | Host tests and catalog frontend smoke checks in local Chromium |
|
||||
| `Tabs`, `SidebarNavigation`, spinners, dialog/menu wrappers | Local tab navigation and ordinary HTML controls; no Steam navigation or controller focus tree | Host tests and catalog frontend smoke checks in local Chromium |
|
||||
| `ProgressBar`, `ProgressBarItem`, `ProgressBarWithInfo` | Native progress control; `indeterminate` omits its value so it animates as unfinished, and `sOperationText` appears with the bar. Estimated completion time is not shown. | Host contract tests; official plugin progress behavior in worn VR remains unverified. |
|
||||
| `SteamUIStore` / `DFL.Router.RunningApps`, `MainRunningApp` | Bounded detached Steam CEF reads while the panel is open; refresh about every two seconds; no MobX observation. Failed reads clear stale context. | Locked real Frame empty-list reads; nonempty local Chromium fixtures. Real running-game selection unverified. |
|
||||
| `GameSessions.RegisterForAppLifetimeNotifications` | Actual Steam callbacks, bounded queue and disposable `.unregister()` handle; no events inferred from snapshot changes; lease cleanup after lost panels | Real Frame registration/poll/close; launch/exit, retry, expiry and duplicate tests use explicit fixtures. Real game transitions unverified. |
|
||||
| Other `SteamClient` subscriptions | Explicit inert registration methods return disposable handles; no fabricated power/input/game-action events. Mutating Steam/power methods are unavailable. | Host contract tests; safe fallbacks only |
|
||||
|
||||
@@ -253,6 +253,14 @@ nodes(tabs,'button')[2].props.onClick();
|
||||
assert.deepEqual(tabChanges,['one']);
|
||||
assert.equal(window.DFL.Spinner({}).props.role,'status');
|
||||
assert.equal(window.DFL.ProgressBar({nProgress:120}).props.value,100);
|
||||
assert.equal(window.DFL.ProgressBar({nProgress:40,indeterminate:true}).props.value,undefined,
|
||||
'an indeterminate progress element must omit its value');
|
||||
assert.equal(window.DFL.ProgressBarItem({nProgress:35}).props.value,35);
|
||||
const progressInfo=window.DFL.ProgressBarWithInfo({indeterminate:true,
|
||||
sOperationText:'Downloading plugin'});
|
||||
assert.equal(nodes(progressInfo,'progress')[0].props.value,undefined);
|
||||
assert.equal(nodes(progressInfo,'small')[0].props.role,'status');
|
||||
assert.equal(nodes(progressInfo,'small')[0].children[0],'Downloading plugin');
|
||||
assert.equal(window.DFL.joinClassNames('one',null,'two'),'one two');
|
||||
let eventCount=0;
|
||||
const unsubscribe=window.SteamClient.GameSessions.RegisterForAppLifetimeNotifications(()=>eventCount++);
|
||||
|
||||
+5
-3
@@ -278,8 +278,10 @@
|
||||
title && R.createElement('h2', null, title), R.createElement(Tabs, {
|
||||
tabs:pages.filter(page=>page.visible!==false).map((page,index)=>({
|
||||
id:page.route || String(index), title:page.title, content:page.content}))}));
|
||||
const ProgressBar = ({nProgress=0, value, max=100}) => R.createElement('progress', {
|
||||
value:Math.max(0,Math.min(max,Number(value ?? nProgress)||0)), max});
|
||||
const ProgressBar = ({nProgress=0, value, max=100, indeterminate=false}) => R.createElement('progress', {
|
||||
value:indeterminate ? undefined : Math.max(0,Math.min(max,Number(value ?? nProgress)||0)), max});
|
||||
const ProgressBarWithInfo = ({sOperationText, ...props}) => R.createElement('div', null,
|
||||
ProgressBar(props), sOperationText == null ? null : R.createElement('small', {role:'status'}, sOperationText));
|
||||
const MenuItem = ({children, disabled, bDisabled, onClick, onSelected}) =>
|
||||
R.createElement('button', {type:'button',disabled:!!(disabled || bDisabled),
|
||||
onClick:event=>{if(!disabled && !bDisabled)(onClick || onSelected)?.(event);}}, children);
|
||||
@@ -484,7 +486,7 @@
|
||||
DialogControlsSectionHeader:passthrough('h3'), ModalRoot:passthrough('section'),
|
||||
ModalPosition:passthrough('div'),
|
||||
Menu:passthrough('div'), MenuGroup:passthrough('section'), MenuItem,
|
||||
ProgressBar, ProgressBarWithInfo:ProgressBar,
|
||||
ProgressBar, ProgressBarItem:ProgressBar, ProgressBarWithInfo,
|
||||
gamepadDialogClasses:{}, quickAccessMenuClasses:{}, gamepadTabbedPageClasses:{},
|
||||
gamepadSliderClasses:{}, gamepadContextMenuClasses:{}, scrollPanelClasses:{},
|
||||
quickAccessControlsClasses:{}, mainMenuAppRunningClasses:{}, libraryAssetImageClasses:{},
|
||||
|
||||
Reference in new issue
Block a user