How I used the TimeGrid: Instead of "channels" this lists by days for 7 days...
Obviously, this is based on the data I had to parse/load, your data will be different...
xml:<interface> I have no idea if these are required, but I just kept from example!
<field id="contentStartTime" type="integer" alias="ID_SchedTimeGrid.contentStartTime" />
<field id="maxDays" type="integer" alias="ID_SchedTimeGrid.maxDays" />
<field id="gridItemSelected" type="array" alwaysNotify="true" />
...
xml:<children>
<TimeGrid id="ID_SchedTimeGrid" translation="[1, 810]" > </TimeGrid>
brs:The "root" is the first column of "channels" - we use for days (only needs to be done once...)
tgSetObserveFieldState(false)
m.SchedTimeGridNode = m.top.findNode("ID_SchedTimeGrid")
'STOP
currentTime = CreateObject("roDateTime")
t = currentTime.AsSeconds()
t = t - (t mod 1800) ' set to a 30m mark...
m.SchedTimeGridNode.contentStartTime = t
'Start at midnight (local date)
currentDate = CreateObject("roDateTime")
currentDate.ToLocalTime()
sDateStr = currentDate.ToISOString()
aDateParts = sDateStr.Tokenize("T")
currentTime.FromISO8601String(aDateParts[0] + " 00:00:00")
'STOP
t = currentTime.AsSeconds()
t += currentTime.GetTimeZoneOffset() * 60
m.SchedTimeGridNode.contentStartTime = t
'STOP
m.SchedTimeGridNode.leftEdgeTargetTime = currentTime.AsSeconds()
m.SchedTimeGridNode.leftEdgeTargetTime = t 'hidden later...
m.SchedTimeGridNode.channelNoDataText = "..."
m.SchedTimeGridNode.loadingDataText = "Loading..."
m.SchedTimeGridNode.channelInfoColumnLabel = "[DOWN] to Nav"
m.SchedTimeGridNode.automaticLoadingDataFeedback = true
' m.SchedTimeGridNode.numRows = 4
' m.SchedTimeGridNode.numColumns = 1 'Root columns default
m.SchedTimeGridNode.itemSpacing = [3,3] 'row spaces
m.SchedTimeGridNode.maxDays = 1
m.SchedTimeGridNode.duration = 4900 'program time box width - larger is smaller?
m.SchedTimeGridNode.fillProgramGaps = true
'm.SchedTimeGridNode.autoDismissTime = 9
'm.SchedTimeGridNode.timeBarTwoLineLayout = false
'm.SchedTimeGridNode.timeBarMessageText = ""
m.SchedTimeGridNode.timeBarMessagingLayout = true 'Hide date!
m.SchedTimeGridNode.timeBarHeight = 64 'Smaller just for times...
TGrootChildren = {
children: []
} ' channels array
TGdaysOfWeek = []
TGdaysOfWeek.Push("Sunday")
TGdaysOfWeek.Push("Monday")
TGdaysOfWeek.Push("Tuesday")
TGdaysOfWeek.Push("Wednesday")
TGdaysOfWeek.Push("Thursday")
TGdaysOfWeek.Push("Friday")
TGdaysOfWeek.Push("Saturday")
currDayOfWeek = currentTime.GetDayOfWeek()
currDayName = currentTime.GetWeekday()
'STOP
nDayNum = currDayOfWeek
rowLocalBaseDateObj = CreateObject("roDateTime")
rowLocalBaseDateObj.ToLocalTime()
WholeDaySecs = 60 * 60 * 24
nDayOffset = 0
while(nDayOffset < 7)
nextWkDay = TGdaysOfWeek[nDayNum]
sMon = rowLocalBaseDateObj.GetMonth()
sDay = rowLocalBaseDateObj.GetDayOfMonth()
sDtDay = sMon.ToStr() + "/" + sDay.ToStr() + " " + nextWkDay
channelNode = makeWeekdayChNode(sDtDay, nDayNum)
TGrootChildren.children.Push(channelNode)
nDayNum++
if(nDayNum > 6) then nDayNum = 0
nDayOffset++
tempDtSecs = rowLocalBaseDateObj.AsSeconds()
tempDtSecs += WholeDaySecs
rowLocalBaseDateObj.FromSeconds(tempDtSecs)
end while
m.SchedTimeGridNode = m.top.findNode("ID_SchedTimeGrid")
tempContentNode = CreateObject("roSGNode", "ContentNode")
tempContentNode.Update(TGrootChildren)
m.SchedTimeGridNode.content = tempContentNode
brs:After you have loaded the data, use this to load from m.gAllShowsAry
'Divide up days...load by Day...
setUTCBaseDateObj = CreateObject("roDateTime")
print "UTC :"; setUTCBaseDateObj.ToISOString(), "TZ:";setUTCBaseDateObj.GetTimeZoneOffset()
setLocalBaseDateObj = CreateObject("roDateTime")
setLocalBaseDateObj.ToLocalTime()
'STOP
xUTCDateStr = setUTCBaseDateObj.ToISOString()
dateParts = xUTCDateStr.Tokenize("T") 'assumes 2019-08-29T11:10:00Z
sGridRowsBaseDate = dateParts[0] 'like 2019-08-29
'STOP
nDayOffset = 0
while(nDayOffset < 7) 'Loop for 7 days
xRowDateMatchStr = setLocalBaseDateObj.ToISOString()
xRowDateMatchStr = xRowDateMatchStr.Mid(0, 10)
m.SchedTimeGridNode = m.top.findNode("ID_SchedTimeGrid")
currRowObj = m.SchedTimeGridNode.content.GetChild(nDayOffset)
?"nDayOffset / xRowDateMatchStr: "; nDayOffset, xRowDateMatchStr
WholeDaySecs = 60 * 60 * 24
nProgCounter = 0
?"m.CurrentShowsType:"m.CurrentShowsType
for each nextShow in m.gAllShowsAry
xProgDate = nextShow.tgProgramLocalStart.ToISOString()
'?"[]xProgDate / xRowDateMatchStr ";xProgDate, xRowDateMatchStr
if(xProgDate.Mid(0, 10) = xRowDateMatchStr) then
'STOP
programInfo = {}
programInfo.title = getCleanStr(nextShow.ProgramName)
programInfo.description = getCleanStr(nextShow.TitleSynopsis)
if(nextShow.TitleSynopsis = invalid) then programInfo.description = getCleanStr(nextShow.ProgramSynopsis)
if("P" = nextShow.TitlePremiereIndicatorCurrentSchedule)
programInfo.description = "NEW: " + programInfo.description
end if
'?m.SchedTimeGridNode
programInfo.TitleName = getCleanStr(nextShow.TitleName)
programInfo.TitleCode = getCleanStr(nextShow.TitleCode)
programInfo.playStart = nextShow.tgProgramUTCStart.AsSeconds()
programInfo.playDuration = nextShow.tgProgramSecsLen
'STOP
'Adjust base time for each row...
fixBaseDtTime = CreateObject("roDateTime")
fixBaseDtTime.FromSeconds(programInfo.playStart)
fixDayOffset = fixBaseDtTime.AsSeconds()
fixDayOffset -= WholeDaySecs * nDayOffset
fixBaseDtTime.FromSeconds(fixDayOffset)
programInfo.playStart = fixBaseDtTime.AsSeconds()
'STOP
'?"nDayOffset:";nDayOffset, "utc:";nextShow.tgProgramUTCStart.toisostring(), "cst:";nextShow.tgProgramLocalStart.toisostring(),
' ?programInfo.playstart, programInfo.playduration, programInfo.title
if(nProgCounter < 123) then
newShowItem = currRowObj.CreateChild("ContentNode")
newShowItem.AddFields({ TitleName: "TitleName" })
newShowItem.AddFields({ TitleCode: "TitleCode" })
newShowItem.SetFields(programInfo)
else
'silly, cuz this should not happen, ever!
chkPS = CreateObject("roDateTime")
chkPS.FromSeconds(programInfo.PlayStart)
?"nProgCounter:"nProgCounter, programInfo, chkPS.ToISOString()
end if
nProgCounter++
end if
end for
nDayOffset++
tempDtSecs = setLocalBaseDateObj.AsSeconds()
tempDtSecs += WholeDaySecs
setLocalBaseDateObj.FromSeconds(tempDtSecs)
end while
' m.ProgramDesc1.text = ""
' m.ProgramDesc2.text = "[DOWN] to Nav"
'Reset so grid jumps to current time...
m.SchedTimeGridNode.leftEdgeTargetTime = 0
m.SchedTimeGridNode.jumpToTime = 0
tgSetObserveFieldState(true)
currentTime = CreateObject("roDateTime")
t = currentTime.AsSeconds()
t = t - (t mod 1800) ' set to a 30m mark...
m.SchedTimeGridNode.leftEdgeTargetTime = t
m.SchedTimeGridNode.jumpToTime = t
brs:Helper to avoid "events" during loading...
Sub tgSetObserveFieldState(bActive)
'STOP
m.SchedTimeGridNode = m.top.findNode("ID_SchedTimeGrid")
if(bActive) then
m.SchedTimeGridNode.observeField("focusedChild", "tgChildFocused")
m.SchedTimeGridNode.observeField("itemFocused", "tgItemFocused")
m.SchedTimeGridNode.observeField("programFocused", "tgProgramFocused")
m.SchedTimeGridNode.observeField("programSelected", "tgProgramSelected")
m.SchedTimeGridNode.observeField("channelInfoSelected", "tgChannelInfoSelected")
m.SchedTimeGridNode.observeField("channelInfoFocused", "tgChannelInfoFocused")
m.SchedTimeGridNode.observeField("itemUnfocused", "tgChannelUnfocused")
m.SchedTimeGridNode.observeField("programUnfocused", "tgProgramUnfocused")
m.SchedTimeGridNode.observeField("channelInfoUnfocused", "tgChannelInfoUnfocused")
else
m.SchedTimeGridNode.unobserveField("focusedChild")
m.SchedTimeGridNode.unobserveField("itemFocused")
m.SchedTimeGridNode.unobserveField("programFocused")
m.SchedTimeGridNode.unobserveField("programSelected")
m.SchedTimeGridNode.unobserveField("channelInfoSelected")
m.SchedTimeGridNode.unobserveField("channelInfoFocused")
m.SchedTimeGridNode.unobserveField("itemUnfocused")
m.SchedTimeGridNode.unobserveField("programUnfocused")
m.SchedTimeGridNode.unobserveField("channelInfoUnfocused")
end if
Enjoy!