2023-11-11 00:42:33 +00:00
|
|
|
import "pkg:/source/utils/misc.bs"
|
2023-11-06 19:05:21 +00:00
|
|
|
|
|
|
|
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")
|
2023-11-11 22:30:06 +00:00
|
|
|
m.videoPositionTime = m.top.findNode("videoPositionTime")
|
|
|
|
m.videoRemainingTime = m.top.findNode("videoRemainingTime")
|
|
|
|
m.progressBar = m.top.findNode("progressBar")
|
|
|
|
m.progressBarBackground = m.top.findNode("progressBarBackground")
|
2023-11-06 19:05:21 +00:00
|
|
|
|
|
|
|
m.top.observeField("visible", "onVisibleChanged")
|
2023-11-07 01:46:18 +00:00
|
|
|
m.top.observeField("hasFocus", "onFocusChanged")
|
2023-11-11 22:30:06 +00:00
|
|
|
m.top.observeField("progressPercentage", "onProgressPercentageChanged")
|
2023-11-06 19:05:21 +00:00
|
|
|
m.top.observeField("playbackState", "onPlaybackStateChanged")
|
|
|
|
m.top.observeField("itemTitleText", "onItemTitleTextChanged")
|
|
|
|
|
|
|
|
m.defaultButtonIndex = 1
|
|
|
|
m.focusedButtonIndex = 1
|
2023-11-10 21:52:10 +00:00
|
|
|
|
|
|
|
m.videoControls.buttonFocused = m.defaultButtonIndex
|
|
|
|
m.optionControls.buttonFocused = m.optionControls.getChildCount() - 1
|
|
|
|
|
2023-11-06 19:05:21 +00:00
|
|
|
m.videoControls.getChild(m.defaultButtonIndex).focus = true
|
|
|
|
m.deviceInfo = CreateObject("roDeviceInfo")
|
|
|
|
end sub
|
|
|
|
|
2023-11-11 22:30:06 +00:00
|
|
|
' onProgressPercentageChanged: Handler for changes to m.top.progressPercentage param
|
|
|
|
'
|
|
|
|
sub onProgressPercentageChanged()
|
2023-11-12 17:30:53 +00:00
|
|
|
m.videoPositionTime.text = secondsToHuman(m.top.positionTime, true)
|
|
|
|
m.videoRemainingTime.text = secondsToHuman(m.top.remainingPositionTime, true)
|
2023-11-11 22:30:06 +00:00
|
|
|
m.progressBar.width = m.progressBarBackground.width * m.top.progressPercentage
|
|
|
|
end sub
|
|
|
|
|
2023-11-06 19:05:21 +00:00
|
|
|
' 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
|
2023-11-10 21:52:10 +00:00
|
|
|
m.videoControls.buttonFocused = 1
|
|
|
|
m.optionControls.buttonFocused = m.optionControls.getChildCount() - 1
|
2023-11-06 19:05:21 +00:00
|
|
|
end sub
|
|
|
|
|
2023-11-16 14:26:20 +00:00
|
|
|
' onVisibleChanged: Handler for changes to the visibility of this menu.
|
2023-11-06 19:05:21 +00:00
|
|
|
'
|
|
|
|
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
|
|
|
|
|
2023-11-16 14:26:20 +00:00
|
|
|
' onFocusChanged: Handler for changes to the focus of this menu.
|
2023-11-07 01:46:18 +00:00
|
|
|
'
|
|
|
|
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
|
|
|
|
|
2023-11-16 14:26:20 +00:00
|
|
|
' inactiveCheck: Checks if the time since last keypress is greater than or equal to the allowed inactive time of the menu.
|
2023-11-06 19:05:21 +00:00
|
|
|
'
|
|
|
|
sub inactiveCheck()
|
|
|
|
if m.deviceInfo.timeSinceLastKeypress() >= m.top.inactiveTimeout
|
|
|
|
m.top.action = "hide"
|
|
|
|
end if
|
|
|
|
end sub
|
|
|
|
|
2023-11-16 14:26:20 +00:00
|
|
|
' onButtonSelected: Handler for selection of buttons from the menu.
|
2023-11-06 19:05:21 +00:00
|
|
|
'
|
|
|
|
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)
|
2023-11-10 21:52:10 +00:00
|
|
|
buttonGroup.buttonFocused = m.focusedButtonIndex
|
2023-11-06 19:05:21 +00:00
|
|
|
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)
|
2023-11-10 21:52:10 +00:00
|
|
|
buttonGroup.buttonFocused = m.focusedButtonIndex
|
2023-11-06 19:05:21 +00:00
|
|
|
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)
|
|
|
|
|
2023-11-10 21:52:10 +00:00
|
|
|
m.focusedButtonIndex = m.optionControls.buttonFocused
|
2023-11-06 19:05:21 +00:00
|
|
|
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)
|
|
|
|
|
2023-11-10 21:52:10 +00:00
|
|
|
m.focusedButtonIndex = m.videoControls.buttonFocused
|
|
|
|
focusedButton = m.videoControls.getChild(m.focusedButtonIndex)
|
2023-11-06 19:05:21 +00:00
|
|
|
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
|