components_ItemGrid_GridItem.bs

import "pkg:/source/roku_modules/log/LogMixin.brs"
import "pkg:/source/utils/config.bs"
import "pkg:/source/utils/misc.bs"

sub init()
  m.log = log.Logger("GridItem")
  m.itemPoster = m.top.findNode("itemPoster")
  m.itemIcon = m.top.findNode("itemIcon")
  m.posterText = m.top.findNode("posterText")
  m.itemText = m.top.findNode("itemText")
  m.backdrop = m.top.findNode("backdrop")

  m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged")

  ' Add some padding space when Item Titles are always showing
  if m.itemText.visible then m.itemText.maxWidth = 224

  ' grab data from ItemGrid node
  m.itemGrid = m.top.GetParent().GetParent() 'Parent is JRMarkupGrid and it's parent is the ItemGrid

  if isValid(m.itemGrid)
    if isValid(m.itemGrid.imageDisplayMode)
      m.itemPoster.loadDisplayMode = m.itemGrid.imageDisplayMode
    end if
    if isValid(m.itemGrid.gridTitles)
      m.gridTitles = m.itemGrid.gridTitles
    end if
  end if

  posterY = m.itemPoster.translation[1]
  m.itemText.translation = [0, posterY + m.itemPoster.height + 18]
  m.itemText.visible = m.gridTitles = "showalways"

end sub

sub itemContentChanged()
  itemData = m.top.itemContent
  if not isValid(itemData) then return

  if isValid(itemData.watched)
    m.itemPoster.isWatched = itemData.watched
  end if

  if isValid(itemData.json) and isValid(itemData.json.UserData)
    if isValid(itemData.json.UserData.UnplayedItemCount)
      m.itemPoster.unplayedCount = itemData.json.UserData.UnplayedItemCount
    end if
  end if

  if itemData.type = "Movie"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "Series"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "Boxset"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "TvChannel"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "Folder"
    m.itemPoster.uri = itemData.PosterUrl
    'm.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
    m.itemPoster.loadDisplayMode = m.itemGrid.imageDisplayMode

    ' MusicGenre folders need square 1:1 sizing
    if isValid(itemData.json) and isValid(itemData.json.type) and itemData.json.type = "MusicGenre"
      m.itemPoster.height = 323
      m.itemPoster.width = 323
      m.itemPoster.loadWidth = 323
      m.itemPoster.loadHeight = 323
      m.itemPoster.loadDisplayMode = "scaleToFit"

      m.itemText.translation = [0, m.itemPoster.translation[1] + m.itemPoster.height + 18]
      m.itemText.maxWidth = 323

      m.backdrop.height = 323
      m.backdrop.width = 323

      m.posterText.height = 313
      m.posterText.width = 313
    end if
  else if itemData.type = "Video"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "Playlist"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "Photo"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    m.itemText.text = itemData.Title
  else if itemData.type = "Episode"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemIcon.uri = itemData.iconUrl
    if isValid(itemData.json) and isValid(itemData.json.SeriesName)
      m.itemText.text = itemData.json.SeriesName + " - " + itemData.Title
    else
      m.itemText.text = itemData.Title
    end if
  else if itemData.type = "MusicArtist"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemText.text = itemData.Title

    m.itemPoster.height = 323
    m.itemPoster.width = 323
    ' Optimize texture memory: load at display size even though URL requests 440x440
    m.itemPoster.loadWidth = 323
    m.itemPoster.loadHeight = 323
    m.itemPoster.loadDisplayMode = "limitSize"

    m.itemText.translation = [0, m.itemPoster.translation[1] + m.itemPoster.height + 18]
    m.itemText.maxWidth = 323

    m.backdrop.height = 323
    m.backdrop.width = 323

    m.posterText.height = 313
    m.posterText.width = 313
  else if isValid(itemData.json.type) and itemData.json.type = "MusicAlbum"
    m.itemPoster.uri = itemData.PosterUrl
    m.itemText.text = itemData.Title

    m.itemPoster.height = 323
    m.itemPoster.width = 323
    ' Optimize texture memory: load at display size even though URL requests 440x440
    m.itemPoster.loadWidth = 323
    m.itemPoster.loadHeight = 323
    m.itemPoster.loadDisplayMode = "limitSize"

    m.itemText.translation = [0, m.itemPoster.translation[1] + m.itemPoster.height + 18]
    m.itemText.maxWidth = 323

    m.backdrop.height = 323
    m.backdrop.width = 323

    m.posterText.height = 313
    m.posterText.width = 313
  else
    m.log.warn("Unhandled Grid Item Type", itemData.type)
  end if

  'If Poster not loaded, ensure "blue box" is shown until loaded
  if m.itemPoster.loadStatus <> "ready"
    m.backdrop.visible = true
    m.posterText.visible = true
  end if

  m.posterText.text = m.itemText.text

end sub

' Enable title scrolling based on item focus
sub focusChanged()
  if m.top.itemHasFocus = true
    m.itemText.repeatCount = -1
  else
    m.itemText.repeatCount = 0
  end if
  if m.gridTitles = "showonhover"
    m.itemText.visible = m.top.itemHasFocus
  end if
end sub

'Hide backdrop and text when poster loaded
sub onPosterLoadStatusChanged()
  if m.itemPoster.loadStatus = "ready"
    m.backdrop.visible = false
    m.posterText.visible = false
  end if
end sub