jf-roku/components/video/OSD.bs
2023-11-18 19:43:05 -05:00

246 lines
7.3 KiB
Plaintext

import "pkg:/source/utils/misc.bs"
sub init()
m.videoControls = m.top.findNode("videoControls")
m.optionControls = m.top.findNode("optionControls")
m.inactivityTimer = m.top.findNode("inactivityTimer")
m.itemTitle = m.top.findNode("itemTitle")
m.videoPlayPause = m.top.findNode("videoPlayPause")
m.videoPositionTime = m.top.findNode("videoPositionTime")
m.videoRemainingTime = m.top.findNode("videoRemainingTime")
m.progressBar = m.top.findNode("progressBar")
m.progressBarBackground = m.top.findNode("progressBarBackground")
m.top.observeField("visible", "onVisibleChanged")
m.top.observeField("hasFocus", "onFocusChanged")
m.top.observeField("progressPercentage", "onProgressPercentageChanged")
m.top.observeField("playbackState", "onPlaybackStateChanged")
m.top.observeField("itemTitleText", "onItemTitleTextChanged")
m.defaultButtonIndex = 1
m.focusedButtonIndex = 1
m.videoControls.buttonFocused = m.defaultButtonIndex
m.optionControls.buttonFocused = m.optionControls.getChildCount() - 1
m.videoControls.getChild(m.defaultButtonIndex).focus = true
m.deviceInfo = CreateObject("roDeviceInfo")
end sub
' onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param
'
sub onProgressPercentageChanged()
m.videoPositionTime.text = secondsToHuman(m.top.positionTime, true)
m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true)
m.progressBar.width = m.progressBarBackground.width * m.top.progressPercentage
end sub
' onPlaybackStateChanged: Handler for changes to m.top.playbackState param
'
sub onPlaybackStateChanged()
if LCase(m.top.playbackState) = "playing"
m.videoPlayPause.icon = "pkg:/images/icons/pause.png"
return
end if
m.videoPlayPause.icon = "pkg:/images/icons/play.png"
end sub
' onItemTitleTextChanged: Handler for changes to m.top.itemTitleText param.
'
sub onItemTitleTextChanged()
m.itemTitle.text = m.top.itemTitleText
end sub
' resetFocusToDefaultButton: Reset focus back to the default button
'
sub resetFocusToDefaultButton()
' Remove focus from previously selected button
for each child in m.videoControls.getChildren(-1, 0)
if isValid(child.focus)
child.focus = false
end if
end for
for each child in m.optionControls.getChildren(-1, 0)
if isValid(child.focus)
child.focus = false
end if
end for
m.optionControls.setFocus(false)
' Set focus back to the default button
m.videoControls.setFocus(true)
m.focusedButtonIndex = m.defaultButtonIndex
m.videoControls.getChild(m.defaultButtonIndex).focus = true
m.videoControls.buttonFocused = 1
m.optionControls.buttonFocused = m.optionControls.getChildCount() - 1
end sub
' onVisibleChanged: Handler for changes to the visibility of this menu.
'
sub onVisibleChanged()
if m.top.visible
resetFocusToDefaultButton()
m.inactivityTimer.observeField("fire", "inactiveCheck")
m.inactivityTimer.control = "start"
return
end if
m.inactivityTimer.unobserveField("fire")
m.inactivityTimer.control = "stop"
end sub
' onFocusChanged: Handler for changes to the focus of this menu.
'
sub onFocusChanged()
if m.top.hasfocus
focusedButton = m.optionControls.getChild(m.focusedButtonIndex)
if focusedButton.focus
m.optionControls.setFocus(true)
return
end if
m.videoControls.setFocus(true)
end if
end sub
' inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.
'
sub inactiveCheck()
' If user is currently seeing a dialog box, ignore inactive check
if m.global.sceneManager.callFunc("isDialogOpen")
return
end if
if m.deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout
m.top.action = "hide"
end if
end sub
' onButtonSelected: Handler for selection of buttons from the menu.
'
sub onButtonSelected()
if m.optionControls.isInFocusChain()
buttonGroup = m.optionControls
else
buttonGroup = m.videoControls
end if
selectedButton = buttonGroup.getChild(m.focusedButtonIndex)
if LCase(selectedButton.id) = "chapterlist"
m.top.showChapterList = not m.top.showChapterList
end if
m.top.action = selectedButton.id
end sub
function onKeyEvent(key as string, press as boolean) as boolean
if not press then return false
if key = "OK"
onButtonSelected()
return true
end if
if key = "play"
m.top.action = "videoplaypause"
return true
end if
if key = "right"
if m.optionControls.isInFocusChain()
buttonGroup = m.optionControls
else
buttonGroup = m.videoControls
end if
if m.focusedButtonIndex + 1 >= buttonGroup.getChildCount()
return true
end if
focusedButton = buttonGroup.getChild(m.focusedButtonIndex)
focusedButton.focus = false
' Skip spacer elements until next button is found
for i = m.focusedButtonIndex + 1 to buttonGroup.getChildCount()
m.focusedButtonIndex = i
focusedButton = buttonGroup.getChild(m.focusedButtonIndex)
if isValid(focusedButton.focus)
buttonGroup.buttonFocused = m.focusedButtonIndex
focusedButton.focus = true
exit for
end if
end for
return true
end if
if key = "left"
if m.focusedButtonIndex = 0
return true
end if
if m.optionControls.isInFocusChain()
buttonGroup = m.optionControls
else
buttonGroup = m.videoControls
end if
focusedButton = buttonGroup.getChild(m.focusedButtonIndex)
focusedButton.focus = false
' Skip spacer elements until next button is found
for i = m.focusedButtonIndex - 1 to 0 step -1
m.focusedButtonIndex = i
focusedButton = buttonGroup.getChild(m.focusedButtonIndex)
if isValid(focusedButton.focus)
buttonGroup.buttonFocused = m.focusedButtonIndex
focusedButton.focus = true
exit for
end if
end for
return true
end if
if key = "up"
if m.videoControls.isInFocusChain()
focusedButton = m.videoControls.getChild(m.focusedButtonIndex)
focusedButton.focus = false
m.videoControls.setFocus(false)
m.focusedButtonIndex = m.optionControls.buttonFocused
focusedButton = m.optionControls.getChild(m.focusedButtonIndex)
focusedButton.focus = true
m.optionControls.setFocus(true)
end if
return true
end if
if key = "down"
if m.optionControls.isInFocusChain()
focusedButton = m.optionControls.getChild(m.focusedButtonIndex)
focusedButton.focus = false
m.optionControls.setFocus(false)
m.focusedButtonIndex = m.videoControls.buttonFocused
focusedButton = m.videoControls.getChild(m.focusedButtonIndex)
focusedButton.focus = true
m.videoControls.setFocus(true)
end if
return true
end if
' All other keys hide the menu
m.top.action = "hide"
return true
end function