mirror of
https://github.com/jellyfin/jellyfin-roku.git
synced 2024-11-27 16:31:11 +00:00
Merge pull request #855 from jimdogx/feature/jf-photo-slideshow
Feature/jf photo slideshow
This commit is contained in:
commit
8116babee6
@ -320,13 +320,14 @@ end sub
|
||||
|
||||
' Set Photo Album view, sort, and filter options
|
||||
sub setPhotoAlbumOptions(options)
|
||||
' TODO/FIXME: Show shuffle options once implemented
|
||||
' options.views = [
|
||||
' { "Title": tr("Don't Shuffle"), "Name": "singlephoto"}
|
||||
' { "Title": tr("Shuffle"), "Name": "shufflephoto"}
|
||||
' ]
|
||||
options.views = []
|
||||
options.views = [
|
||||
{ "Title": tr("Slideshow Off"), "Name": "singlephoto" }
|
||||
{ "Title": tr("Slideshow On"), "Name": "slideshowphoto" }
|
||||
{ "Title": tr("Random Off"), "Name": "singlephoto" }
|
||||
{ "Title": tr("Random On"), "Name": "randomphoto" }
|
||||
]
|
||||
options.sort = []
|
||||
options.filter = []
|
||||
end sub
|
||||
|
||||
' Set Default view, sort, and filter options
|
||||
@ -574,14 +575,17 @@ sub optionsClosed()
|
||||
end if
|
||||
end if
|
||||
|
||||
if m.top.parentItem.Type = "CollectionFolder" or m.top.parentItem.CollectionType = "CollectionFolder"
|
||||
' Did the user just request "Shuffle" on a PhotoAlbum?
|
||||
if m.top.parentItem.Type = "CollectionFolder" or m.top.parentItem.Type = "Folder" or m.top.parentItem.CollectionType = "CollectionFolder"
|
||||
' Did the user just request "Random" on a PhotoAlbum?
|
||||
if m.options.view = "singlephoto"
|
||||
' TODO/FIXME: Stop shuffling here
|
||||
print "TODO/FIXME: Stop any shuffling here"
|
||||
else if m.options.view = "shufflephoto"
|
||||
' TODO/FIXME: Start shuffling here
|
||||
print "TODO/FIXME: Start shuffle here"
|
||||
set_user_setting("photos.slideshow", "false")
|
||||
set_user_setting("photos.random", "false")
|
||||
else if m.options.view = "slideshowphoto"
|
||||
set_user_setting("photos.slideshow", "true")
|
||||
set_user_setting("photos.random", "false")
|
||||
else if m.options.view = "randomphoto"
|
||||
set_user_setting("photos.random", "true")
|
||||
set_user_setting("photos.slideshow", "false")
|
||||
end if
|
||||
end if
|
||||
|
||||
@ -724,9 +728,10 @@ function onKeyEvent(key as string, press as boolean) as boolean
|
||||
return true
|
||||
else if itemToPlay <> invalid and itemToPlay.type = "Photo"
|
||||
' Spawn photo player task
|
||||
photoPlayer = CreateObject("roSgNode", "PhotoPlayerTask")
|
||||
photoPlayer.itemContent = itemToPlay
|
||||
photoPlayer.control = "RUN"
|
||||
photoPlayer = CreateObject("roSgNode", "PhotoDetails")
|
||||
photoPlayer.items = markupGrid
|
||||
photoPlayer.itemIndex = markupGrid.itemFocused
|
||||
m.global.sceneManager.callfunc("pushScene", photoPlayer)
|
||||
return true
|
||||
end if
|
||||
else if key = "left" and topGrp.isinFocusChain()
|
||||
|
@ -1,21 +1,123 @@
|
||||
sub init()
|
||||
m.top.optionsAvailable = false ' Change once Shuffle option is added
|
||||
m.top.optionsAvailable = true
|
||||
m.top.overhangVisible = false
|
||||
m.slideshowTimer = m.top.findNode("slideshowTimer")
|
||||
m.slideshowTimer.observeField("fire", "nextSlide")
|
||||
m.status = m.top.findNode("status")
|
||||
m.textBackground = m.top.findNode("background")
|
||||
m.statusTimer = m.top.findNode("statusTimer")
|
||||
m.statusTimer.observeField("fire", "statusUpdate")
|
||||
m.slideshow = get_user_setting("photos.slideshow")
|
||||
m.random = get_user_setting("photos.random")
|
||||
|
||||
m.showStatusAnimation = m.top.findNode("showStatusAnimation")
|
||||
m.hideStatusAnimation = m.top.findNode("hideStatusAnimation")
|
||||
|
||||
itemContentChanged()
|
||||
end sub
|
||||
|
||||
sub itemContentChanged()
|
||||
m.LoadLibrariesTask = createObject("roSGNode", "LoadPhotoTask")
|
||||
m.LoadLibrariesTask.itemContent = m.top.itemContent
|
||||
m.LoadLibrariesTask.observeField("results", "onPhotoLoaded")
|
||||
m.LoadLibrariesTask.control = "RUN"
|
||||
if isValidToContinue(m.top.itemIndex)
|
||||
m.LoadLibrariesTask = createObject("roSGNode", "LoadPhotoTask")
|
||||
itemContent = m.top.items.content.getChild(m.top.itemIndex)
|
||||
m.LoadLibrariesTask.itemContent = itemContent
|
||||
m.LoadLibrariesTask.observeField("results", "onPhotoLoaded")
|
||||
m.LoadLibrariesTask.control = "RUN"
|
||||
end if
|
||||
end sub
|
||||
|
||||
sub onPhotoLoaded()
|
||||
if m.LoadLibrariesTask.results <> invalid
|
||||
photo = m.top.findNode("photo")
|
||||
photo.uri = m.LoadLibrariesTask.results
|
||||
|
||||
if m.slideshow = "true" or m.random = "true"
|
||||
' user has requested either a slideshow or random...
|
||||
m.slideshowTimer.control = "start"
|
||||
end if
|
||||
else
|
||||
'Show user error here (for example if it's not a supported image type)
|
||||
message_dialog("This image type is not supported.")
|
||||
end if
|
||||
end sub
|
||||
|
||||
sub nextSlide()
|
||||
m.slideshowTimer.control = "stop"
|
||||
|
||||
if m.slideshow = "true"
|
||||
if isValidToContinue(m.top.itemIndex + 1)
|
||||
m.top.itemIndex++
|
||||
m.slideshowTimer.control = "start"
|
||||
end if
|
||||
else if m.random = "true"
|
||||
index = rnd(m.top.items.content.getChildCount() - 1)
|
||||
if isValidToContinue(index)
|
||||
m.top.itemIndex = index
|
||||
m.slideshowTimer.control = "start"
|
||||
end if
|
||||
end if
|
||||
end sub
|
||||
|
||||
sub statusUpdate()
|
||||
m.statusTimer.control = "stop"
|
||||
m.hideStatusAnimation.control = "start"
|
||||
end sub
|
||||
|
||||
function onKeyEvent(key as string, press as boolean) as boolean
|
||||
if not press then return false
|
||||
|
||||
if key = "right"
|
||||
if isValidToContinue(m.top.itemIndex + 1)
|
||||
m.slideshowTimer.control = "stop"
|
||||
m.top.itemIndex++
|
||||
end if
|
||||
return true
|
||||
end if
|
||||
|
||||
if key = "left"
|
||||
if isValidToContinue(m.top.itemIndex - 1)
|
||||
m.slideshowTimer.control = "stop"
|
||||
m.top.itemIndex--
|
||||
end if
|
||||
return true
|
||||
end if
|
||||
|
||||
if key = "play"
|
||||
if m.slideshowTimer.control = "start"
|
||||
' stop the slideshow if the user hits "pause"
|
||||
m.slideshowTimer.control = "stop"
|
||||
m.status.text = tr("Slideshow Paused")
|
||||
if m.textBackground.opacity = 0
|
||||
m.showStatusAnimation.control = "start"
|
||||
end if
|
||||
m.statusTimer.control = "start"
|
||||
else
|
||||
' start the slideshow if the user hits "play"
|
||||
m.status.text = tr("Slideshow Resumed")
|
||||
if m.textBackground.opacity = 0
|
||||
m.showStatusAnimation.control = "start"
|
||||
end if
|
||||
m.slideshow = "true"
|
||||
m.statusTimer.control = "start"
|
||||
m.slideshowTimer.control = "start"
|
||||
end if
|
||||
return true
|
||||
end if
|
||||
|
||||
if key = "options"
|
||||
' Options (random etc) is done on itemGrid
|
||||
return true
|
||||
end if
|
||||
|
||||
return false
|
||||
end function
|
||||
|
||||
function isValidToContinue(index as integer)
|
||||
if isValid(m.top.items) and isValid(m.top.items.content)
|
||||
if index >= 0 and index < m.top.items.content.getChildCount()
|
||||
return true
|
||||
end if
|
||||
end if
|
||||
|
||||
return false
|
||||
end function
|
||||
|
@ -1,13 +1,28 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<component name="PhotoDetails" extends="JFGroup">
|
||||
<children>
|
||||
<LayoutGroup id="toplevel">
|
||||
<Poster id="photo" width="1920" height="1080" loadDisplayMode="scaleToFit"/>
|
||||
</LayoutGroup>
|
||||
<Poster id="photo" width="1920" height="1080" loadDisplayMode="scaleToFit"/>
|
||||
<Rectangle id="background" color="0x101010EE" height="120" width="500" Translation="[700, -150]" opacity="0">
|
||||
<Label id="status" font="font:MediumSystemFont" height="100" width="500" horizAlign="center" vertAlign="bottom"/>
|
||||
</Rectangle>
|
||||
<Timer id="slideshowTimer" duration="5" repeat="false" />
|
||||
<Timer id="statusTimer" duration="2" repeat="false" />
|
||||
|
||||
<Animation id="showStatusAnimation" duration="1" repeat="false">
|
||||
<FloatFieldInterpolator key="[0.0, 0.1]" keyValue="[0, 1]" fieldToInterp="background.opacity" />
|
||||
<Vector2DFieldInterpolator key="[0.1, 1]" keyValue="[[700, -150], [700, -5]]" fieldToInterp="background.translation" />
|
||||
</Animation>
|
||||
<Animation id="hideStatusAnimation" duration="1" repeat="false">
|
||||
<Vector2DFieldInterpolator key="[0.0, 0.9]" keyValue="[[700, -5], [700, -150]]" fieldToInterp="background.translation" />
|
||||
<FloatFieldInterpolator key="[0.9, 1]" keyValue="[1, 0]" fieldToInterp="background.opacity" />
|
||||
</Animation>
|
||||
|
||||
</children>
|
||||
<interface>
|
||||
<field id="itemContent" type="node" onChange="itemContentChanged" />
|
||||
<field id="items" type="node" />
|
||||
<field id="itemIndex" type="integer" value="-1" onChange="itemContentChanged" />
|
||||
</interface>
|
||||
<script type="text/brightscript" uri="PhotoDetails.brs" />
|
||||
<script type="text/brightscript" uri="pkg:/source/utils/misc.brs" />
|
||||
<script type="text/brightscript" uri="pkg:/source/utils/config.brs" />
|
||||
</component>
|
||||
|
@ -1,17 +0,0 @@
|
||||
sub init()
|
||||
m.top.functionName = "loadItems"
|
||||
end sub
|
||||
|
||||
sub loadItems()
|
||||
item = m.top.itemContent
|
||||
|
||||
group = CreateObject("roSGNode", "PhotoDetails")
|
||||
group.optionsAvailable = false
|
||||
m.global.sceneManager.callFunc("pushScene", group)
|
||||
|
||||
group.itemContent = item
|
||||
|
||||
' TODO/FIXME:
|
||||
' Wait some time and move to the next photo...
|
||||
|
||||
end sub
|
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
|
||||
<component name="PhotoPlayerTask" extends="Task">
|
||||
<interface>
|
||||
<field id="itemContent" type="node" />
|
||||
</interface>
|
||||
<script type="text/brightscript" uri="PhotoPlayerTask.brs" />
|
||||
</component>
|
@ -851,6 +851,30 @@
|
||||
<extracomment>Popup message when we find no audio data for an artist</extracomment>
|
||||
</message>
|
||||
<message>
|
||||
<source>Slideshow Off</source>
|
||||
<translation>Slideshow Off</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Slideshow On</source>
|
||||
<translation>Slideshow On</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Slideshow Paused</source>
|
||||
<translation>Slideshow Paused</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Slideshow Resumed</source>
|
||||
<translation>Slideshow Resumed</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Random Off</source>
|
||||
<translation>Random Off</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Random On</source>
|
||||
<translation>Random On</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>MPEG-4 Support</source>
|
||||
<translation>MPEG-4 Support</translation>
|
||||
<extracomment>Settings Menu - Title for option</extracomment>
|
||||
|
@ -592,17 +592,6 @@ function CreatePersonView(personData as object) as object
|
||||
return person
|
||||
end function
|
||||
|
||||
function CreatePhotoPage(photo)
|
||||
group = CreateObject("roSGNode", "PhotoDetails")
|
||||
group.optionsAvailable = true
|
||||
m.global.sceneManager.callFunc("pushScene", group)
|
||||
|
||||
group.itemContent = photo
|
||||
|
||||
return group
|
||||
|
||||
end function
|
||||
|
||||
sub UpdateSavedServerList()
|
||||
server = get_setting("server")
|
||||
username = get_setting("username")
|
||||
|
Loading…
Reference in New Issue
Block a user