Keep Framey plugin scrolling while a button is held

This commit is contained in:
SAPHID committed 2026-10-26 23:24:42 +00:00
1 parent 134ceea2b7
commit 617661b7a2
5 files changed
+113 -12

No files matched your search

+28 -2
View File
@@ -71,13 +71,19 @@ def exercise(profile, plugin_id, folder):
if not hit:
raise RuntimeError('Native click hit another element: ' + str(panel.eval('({tag:__vrLastTarget?.tagName,text:__vrLastTarget?.textContent?.slice(0,100)})')))
def click_parent(selector):
def parent_point(selector):
parent.eval(f'document.querySelector({json.dumps(selector)}).scrollIntoView({{block:"center"}})')
time.sleep(.3)
pos = parent.eval(f'''(()=>{{let r=document.querySelector({json.dumps(selector)}).getBoundingClientRect();
return {{x:r.x+r.width/2,y:r.y+r.height/2,w:innerWidth,h:innerHeight}}}})()''')
sx, sy = vr.snapshot()['input']['scale']
x, y = pos['x'] * sx / pos['w'], sy - pos['y'] * sy / pos['h']
if not 0 <= x <= sx or not 0 <= y <= sy:
raise RuntimeError('Parent control is outside the visible viewport')
return x, y
def click_parent(selector):
x, y = parent_point(selector)
count = parent.eval('window.__vrParentClickCount')
vr.post_mouse(300, x, y)
vr.post_mouse(301, x, y, 1)
@@ -86,6 +92,21 @@ def exercise(profile, plugin_id, folder):
if not parent.eval(f'!!window.__vrParentLastTarget?.closest({json.dumps(selector)})'):
raise RuntimeError('Native click missed parent control ' + selector)
def hold_parent(selector, seconds):
x, y = parent_point(selector)
count = parent.eval('window.__vrParentClickCount')
vr.post_mouse(300, x, y)
try:
vr.post_mouse(301, x, y, 1)
time.sleep(seconds)
offset = panel.eval('document.getElementById("vr-scroll-probe").scrollTop')
finally:
vr.post_mouse(302, x, y, 1)
wait(lambda:parent.eval('window.__vrParentClickCount'), lambda n:n > count, seconds=3)
if not parent.eval(f'!!window.__vrParentLastTarget?.closest({json.dumps(selector)})'):
raise RuntimeError('Native hold missed parent control ' + selector)
return offset
try:
parent.eval(f'(async()=>{{await refreshDecky();openFrameyPanel({plugin_id},"Framey VR Check");return true}})()')
wait(lambda:parent.eval('byId("frameyPanelStatus").innerText'), lambda s:s == 'Plugin panel ready')
@@ -172,6 +193,10 @@ def exercise(profile, plugin_id, folder):
result['buttonScrollAfterUp'] = wait(
lambda:panel.eval('document.getElementById("vr-scroll-probe").scrollTop'), lambda n:n == 0)
result['buttonScrollMoved'] = result['buttonScrollAfterDown'] > 0 and result['buttonScrollAfterUp'] == 0
result['holdScrollAfterDown'] = hold_parent('#frameyScrollDown', 1.2)
result['holdScrollAfterUp'] = hold_parent('#frameyScrollUp', 2.0)
result['holdScrollMoved'] = (result['holdScrollAfterDown'] > result['buttonScrollAfterDown']
and result['holdScrollAfterUp'] == 0)
panel.eval('document.getElementById("vr-scroll-probe").remove()')
panel.eval('document.getElementById("vr-controls").remove()')
# Scroll saved status into the visible iframe for compositor evidence.
@@ -179,7 +204,8 @@ def exercise(profile, plugin_id, folder):
result['finalOverlay'] = vr.snapshot()
result['passed'] = (result['trustedOverlayPointer'] and result['diskSetting'] == {'enabled':True}
and result['reopenedChecked'] and result['sliderValue'] != '10'
and result['textValue'] == 'framey-ci' and result['buttonScrollMoved'])
and result['textValue'] == 'framey-ci' and result['buttonScrollMoved']
and result['holdScrollMoved'])
return result
except Exception as exc:
result['error'] = str(exc)