2023-10-06 03:43:55 +00:00
|
|
|
<!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Source: components/data/SceneManager.brs</title><!--[if lt IE 9]>
|
|
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
|
|
<![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M1
|
2023-10-06 03:18:36 +00:00
|
|
|
|
|
|
|
sub init()
|
|
|
|
m.log = log.Logger("SceneManager")
|
|
|
|
m.groups = []
|
|
|
|
m.scene = m.top.getScene()
|
|
|
|
m.content = m.scene.findNode("content")
|
|
|
|
m.overhang = m.scene.findNode("overhang")
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Push a new group onto the stack, replacing the existing group on the screen
|
|
|
|
sub pushScene(newGroup)
|
|
|
|
|
|
|
|
currentGroup = m.groups.peek()
|
|
|
|
if newGroup <> invalid
|
|
|
|
if currentGroup <> invalid
|
|
|
|
'Search through group and store off last focused item
|
|
|
|
if currentGroup.focusedChild <> invalid
|
|
|
|
focused = currentGroup.focusedChild
|
|
|
|
while focused.hasFocus() = false
|
|
|
|
focused = focused.focusedChild
|
|
|
|
end while
|
|
|
|
|
|
|
|
currentGroup.lastFocus = focused
|
|
|
|
currentGroup.setFocus(false)
|
|
|
|
else
|
|
|
|
currentGroup.setFocus(false)
|
|
|
|
end if
|
|
|
|
|
|
|
|
if currentGroup.isSubType("JFGroup")
|
|
|
|
unregisterOverhangData(currentGroup)
|
|
|
|
end if
|
|
|
|
|
|
|
|
currentGroup.visible = false
|
|
|
|
|
|
|
|
if currentGroup.isSubType("JFScreen")
|
|
|
|
currentGroup.callFunc("OnScreenHidden")
|
|
|
|
end if
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
m.groups.push(newGroup)
|
|
|
|
|
|
|
|
if currentGroup <> invalid
|
|
|
|
m.content.replaceChild(newGroup, 0)
|
|
|
|
else
|
|
|
|
m.content.appendChild(newGroup)
|
|
|
|
end if
|
|
|
|
|
|
|
|
if newGroup.isSubType("JFScreen")
|
|
|
|
newGroup.callFunc("OnScreenShown")
|
|
|
|
end if
|
|
|
|
|
|
|
|
'observe info about new group, set overhang title, etc.
|
|
|
|
if newGroup.isSubType("JFGroup")
|
|
|
|
registerOverhangData(newGroup)
|
|
|
|
|
|
|
|
' Some groups set focus to a specific component within init(), so we don't want to
|
|
|
|
' change if that is the case.
|
|
|
|
if newGroup.isInFocusChain() = false
|
|
|
|
newGroup.setFocus(true)
|
|
|
|
end if
|
|
|
|
else if newGroup.isSubType("JFVideo")
|
|
|
|
newGroup.setFocus(true)
|
|
|
|
newGroup.control = "play"
|
|
|
|
m.overhang.visible = false
|
|
|
|
end if
|
|
|
|
else
|
|
|
|
currentGroup.focusedChild.setFocus(true)
|
|
|
|
end if
|
|
|
|
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Remove the current group and load the last group from the stack
|
|
|
|
sub popScene()
|
|
|
|
group = m.groups.pop()
|
|
|
|
if group <> invalid
|
|
|
|
groupType = group.subtype()
|
|
|
|
if groupType = "JFGroup"
|
|
|
|
unregisterOverhangData(group)
|
|
|
|
else if groupType = "JFVideo"
|
|
|
|
' Stop video to make sure app communicates stop playstate to server
|
|
|
|
group.control = "stop"
|
|
|
|
end if
|
|
|
|
|
|
|
|
group.visible = false
|
|
|
|
|
|
|
|
if groupType = "JFScreen"
|
|
|
|
group.callFunc("OnScreenHidden")
|
|
|
|
end if
|
|
|
|
else
|
|
|
|
' Exit app if for some reason we don't have anything on the stack
|
|
|
|
m.scene.exit = true
|
|
|
|
end if
|
|
|
|
|
|
|
|
group = m.groups.peek()
|
|
|
|
if group <> invalid
|
|
|
|
registerOverhangData(group)
|
|
|
|
|
|
|
|
if group.subtype() = "Home"
|
|
|
|
currentTime = CreateObject("roDateTime").AsSeconds()
|
|
|
|
if group.timeLastRefresh = invalid or (currentTime - group.timeLastRefresh) > 20
|
|
|
|
group.timeLastRefresh = currentTime
|
|
|
|
group.callFunc("refresh")
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
group.visible = true
|
|
|
|
|
|
|
|
m.content.replaceChild(group, 0)
|
|
|
|
|
|
|
|
if group.isSubType("JFScreen")
|
|
|
|
group.callFunc("OnScreenShown")
|
|
|
|
else
|
|
|
|
' Restore focus
|
|
|
|
if group.lastFocus <> invalid
|
|
|
|
group.lastFocus.setFocus(true)
|
|
|
|
else
|
|
|
|
if group.focusedChild <> invalid
|
|
|
|
group.focusedChild.setFocus(true)
|
|
|
|
else
|
|
|
|
group.setFocus(true)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
else
|
|
|
|
' Exit app if the stack is empty after removing group
|
|
|
|
m.scene.exit = true
|
|
|
|
end if
|
|
|
|
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Return group at top of stack without removing
|
|
|
|
function getActiveScene() as object
|
|
|
|
return m.groups.peek()
|
|
|
|
end function
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Clear all content from group stack
|
|
|
|
sub clearScenes()
|
|
|
|
if m.content <> invalid then m.content.removeChildrenIndex(m.content.getChildCount(), 0)
|
|
|
|
m.groups = []
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Clear previous scene from group stack
|
|
|
|
sub clearPreviousScene()
|
|
|
|
m.groups.pop()
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Delete scene from group stack at passed index
|
|
|
|
sub deleteSceneAtIndex(index = 1)
|
|
|
|
m.groups.Delete(index)
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Display user/device settings screen
|
|
|
|
sub settings()
|
|
|
|
settingsScreen = createObject("roSGNode", "Settings")
|
|
|
|
pushScene(settingsScreen)
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Register observers for overhang data
|
|
|
|
sub registerOverhangData(group)
|
|
|
|
if group.isSubType("JFGroup")
|
|
|
|
if group.overhangTitle <> invalid then m.overhang.title = group.overhangTitle
|
|
|
|
|
|
|
|
if group.optionsAvailable
|
|
|
|
m.overhang.showOptions = true
|
|
|
|
else
|
|
|
|
m.overhang.showOptions = false
|
|
|
|
end if
|
|
|
|
group.observeField("optionsAvailable", "updateOptions")
|
|
|
|
|
|
|
|
group.observeField("overhangTitle", "updateOverhangTitle")
|
|
|
|
|
|
|
|
if group.overhangVisible
|
|
|
|
m.overhang.visible = true
|
|
|
|
else
|
|
|
|
m.overhang.visible = false
|
|
|
|
end if
|
|
|
|
group.observeField("overhangVisible", "updateOverhangVisible")
|
|
|
|
else if group.isSubType("JFVideo")
|
|
|
|
m.overhang.visible = false
|
|
|
|
else
|
|
|
|
m.log.error("registerOverhangData(): Unexpected group type.", group, group.subtype())
|
|
|
|
end if
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Remove observers for overhang data
|
|
|
|
sub unregisterOverhangData(group)
|
|
|
|
group.unobserveField("overhangTitle")
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Update overhang title
|
|
|
|
sub updateOverhangTitle(msg)
|
|
|
|
m.overhang.title = msg.getData()
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Update options availability
|
|
|
|
sub updateOptions(msg)
|
|
|
|
m.overhang.showOptions = msg.getData()
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Update whether the overhang is visible or not
|
|
|
|
sub updateOverhangVisible(msg)
|
|
|
|
m.overhang.visible = msg.getData()
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Update username in overhang
|
|
|
|
sub updateUser()
|
|
|
|
' Passthrough to overhang
|
|
|
|
if m.overhang <> invalid then m.overhang.currentUser = m.top.currentUser
|
|
|
|
end sub
|
|
|
|
|
|
|
|
|
|
|
|
'
|
|
|
|
' Reset time
|
|
|
|
sub resetTime()
|
|
|
|
' Passthrough to overhang
|
|
|
|
m.overhang.callFunc("resetTime")
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Display dialog to user with an OK button
|
|
|
|
sub userMessage(title as string, message as string)
|
|
|
|
dialog = createObject("roSGNode", "StandardMessageDialog")
|
|
|
|
dialog.title = title
|
|
|
|
dialog.message = message
|
|
|
|
dialog.buttons = [tr("OK")]
|
|
|
|
dialog.observeField("buttonSelected", "dismissDialog")
|
|
|
|
m.scene.dialog = dialog
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Display dialog to user with an OK button
|
|
|
|
sub standardDialog(title, message)
|
|
|
|
dialog = createObject("roSGNode", "StandardDialog")
|
|
|
|
dlgPalette = createObject("roSGNode", "RSGPalette")
|
|
|
|
dlgPalette.colors = {
|
|
|
|
DialogBackgroundColor: "0x262828FF",
|
|
|
|
DialogFocusColor: "0xcececeFF",
|
|
|
|
DialogFocusItemColor: "0x202020FF",
|
|
|
|
DialogSecondaryTextColor: "0xf8f8f8ff",
|
|
|
|
DialogSecondaryItemColor: "#00a4dcFF",
|
|
|
|
DialogTextColor: "0xeeeeeeFF"
|
|
|
|
}
|
|
|
|
dialog.palette = dlgPalette
|
|
|
|
dialog.observeField("buttonSelected", "dismissDialog")
|
|
|
|
dialog.title = title
|
|
|
|
dialog.contentData = message
|
|
|
|
dialog.buttons = [tr("OK")]
|
|
|
|
|
|
|
|
m.scene.dialog = dialog
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Display dialog to user with an OK button
|
|
|
|
sub radioDialog(title, message)
|
|
|
|
dialog = createObject("roSGNode", "RadioDialog")
|
|
|
|
dlgPalette = createObject("roSGNode", "RSGPalette")
|
|
|
|
dlgPalette.colors = {
|
|
|
|
DialogBackgroundColor: "0x262828FF",
|
|
|
|
DialogFocusColor: "0xcececeFF",
|
|
|
|
DialogFocusItemColor: "0x202020FF",
|
|
|
|
DialogSecondaryTextColor: "0xf8f8f8ff",
|
|
|
|
DialogSecondaryItemColor: "#00a4dcFF",
|
|
|
|
DialogTextColor: "0xeeeeeeFF"
|
|
|
|
}
|
|
|
|
dialog.palette = dlgPalette
|
|
|
|
dialog.observeField("buttonSelected", "dismissDialog")
|
|
|
|
dialog.title = title
|
|
|
|
dialog.contentData = message
|
|
|
|
dialog.buttons = [tr("OK")]
|
|
|
|
|
|
|
|
m.scene.dialog = dialog
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Display dialog to user with an OK button
|
|
|
|
sub optionDialog(title, message, buttons)
|
|
|
|
m.top.dataReturned = false
|
|
|
|
m.top.returnData = invalid
|
|
|
|
m.userselection = false
|
|
|
|
|
|
|
|
dialog = createObject("roSGNode", "StandardMessageDialog")
|
|
|
|
dlgPalette = createObject("roSGNode", "RSGPalette")
|
|
|
|
dlgPalette.colors = {
|
|
|
|
DialogBackgroundColor: "0x262828FF",
|
|
|
|
DialogFocusColor: "0xcececeFF",
|
|
|
|
DialogFocusItemColor: "0x202020FF",
|
|
|
|
DialogSecondaryTextColor: "0xf8f8f8ff",
|
|
|
|
DialogSecondaryItemColor: "#00a4dcFF",
|
|
|
|
DialogTextColor: "0xeeeeeeFF"
|
|
|
|
}
|
|
|
|
dialog.palette = dlgPalette
|
|
|
|
dialog.observeField("buttonSelected", "optionSelected")
|
|
|
|
dialog.observeField("wasClosed", "optionClosed")
|
|
|
|
dialog.title = title
|
|
|
|
dialog.message = message
|
|
|
|
dialog.buttons = buttons
|
|
|
|
|
|
|
|
m.scene.dialog = dialog
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Return button the user selected
|
|
|
|
sub optionClosed()
|
|
|
|
if m.userselection then return
|
|
|
|
|
|
|
|
m.top.returnData = {
|
|
|
|
indexSelected: -1,
|
|
|
|
buttonSelected: ""
|
|
|
|
}
|
|
|
|
m.top.dataReturned = true
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Return button the user selected
|
|
|
|
sub optionSelected()
|
|
|
|
m.userselection = true
|
|
|
|
m.top.returnData = {
|
|
|
|
indexSelected: m.scene.dialog.buttonSelected,
|
|
|
|
buttonSelected: m.scene.dialog.buttons[m.scene.dialog.buttonSelected]
|
|
|
|
}
|
|
|
|
m.top.dataReturned = true
|
|
|
|
|
|
|
|
dismissDialog()
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Close currently displayed dialog
|
|
|
|
sub dismissDialog()
|
|
|
|
m.scene.dialog.close = true
|
|
|
|
end sub
|
|
|
|
|
|
|
|
'
|
|
|
|
' Returns bool indicating if dialog is currently displayed
|
|
|
|
function isDialogOpen() as boolean
|
|
|
|
return m.scene.dialog <> invalid
|
|
|
|
end function
|
2023-10-06 03:43:55 +00:00
|
|
|
</code></pre></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">Home</a><div class="mobile-nav-links"></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="OoBGiK4t8S-uQXcd1ck70"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-AlbumData.html">AlbumData</a></div><div class="sidebar-section-children"><a href="module-AlbumGrid.html">AlbumGrid</a></div><div class="sidebar-section-children"><a href="module-AlbumTrackList.html">AlbumTrackList</a></div><div class="sidebar-section-children"><a href="module-AlbumView.html">AlbumView</a></div><div class="sidebar-section-children"><a href="module-Alpha.html">Alpha</a></div><div class="sidebar-section-children"><a href="module-ArtistView.html">ArtistView</a></div><div class="sidebar-section-children"><a href="module-AudioPlayer.html">AudioPlayer</a></div><div class="sidebar-section-children"><a href="module-AudioPlayerView.html">AudioPlayerView</a></div><div class="sidebar-section-children"><a href="module-AudioTrackListItem.html">AudioTrackListItem</a></div><div class="sidebar-section-children"><a href="module-ButtonGroupHoriz.html">ButtonGroupHoriz</a></div><div class="sidebar-section-children"><a href="module-ChannelData.html">ChannelData</a></div><div class="sidebar-section-children"><a href="module-CollectionData.html">CollectionData</a></div><div class="sidebar-section-children"><a href="module-ConfigData.html">ConfigData</a></div><div class="sidebar-section-children"><a href="module-ConfigItem.html">ConfigItem</a></div><div class="sidebar-section-children"><a href="module-ConfigList.html">ConfigList</a></div><div class="sidebar-section-children"><a href="module-ExtrasItem.html">ExtrasItem</a></div><div class="sidebar-section-children"><a href="module-ExtrasRowList.html">ExtrasRowList</a></div><div class="sidebar-section-children"><a href="module-FavoriteItemsTask.html">FavoriteItemsTask</a></div><div class="sidebar-section-children"><a href="module-FolderData.html">FolderData</a></div><div class="sidebar-section-children"><a href="module-GetFiltersTask.html">GetFiltersTask</a></div><div class="sidebar-section-children"><a href="module-GetNextEpisodeTask.html">GetNextEpisodeTask</a></div><div class="sidebar-section-children"><a href="module-GetPlaybackInfoTask.html">GetPlaybackInfoTask</a></div><div class="sidebar-section-children"><a href="module-GetShuffleEpisodesTask.html">GetShuffleEpisodesTask</a></div><div class="sidebar-section-children"><a href="module-GridItem.html">GridItem</a></div><div class="sidebar-section-children"><a href="module-GridItemSmall.html">GridItemSmall</a></div><div class="sidebar-section-children"><a href="module-Home.html">Home</a></div><div class="sidebar-section-children"><a href="module-HomeData.html">HomeData</a></div><div class="sidebar-section-children"><a href="module-HomeItem.html">HomeItem</a></div><div class="sidebar-section-children"><a href="module-HomeRows.html">HomeRows</a></div><div class="sidebar-section-children"><a href="module-IconButton.html">IconButton</a></div><div class="sidebar-sec
|