Design: the Catch Up page in the nav bar
pauljd/davidson-ci: Davidson CI / quality (push) Failing after 2m13s
pauljd/davidson-ci: Davidson CI / ai-review (push) Failing after 1m44s

Paul, 5 November 2026: Catch Up from the main menu too. A tab between TV
Guide and Drive-In opens a page of the last two days: Just missed (newest
first), Earlier today and Yesterday, each row scrolling on; a two-part story
shows its part 1.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-11-05 19:46:09 +00:00
co-authored by Claude Opus 5.5
parent 883f9595cf
commit e98628438b
3 changed files with 41 additions and 1 deletions
+40
View File
@@ -133,3 +133,43 @@ d.text((340, 205), 'Orbit switches off in 1 minute', font=semi(40), fill=WHITE)
d.text((340, 262), 'Press any button to keep watching', font=reg(30), fill=MUTED)
im.save(HERE / 'sleep-timer.png')
print('done')
# 5. The Catch Up page, from the main menu's nav bar.
im, d = screen()
d.text((70, 30), 'ORBIT', font=semi(54), fill=WHITE)
x = 300
for label in ('Home', "What's On", 'TV Guide', 'Catch Up', 'Drive-In', 'Arcade'):
on = label == 'Catch Up'
w = d.textlength(label, font=semi(32)) + 40
d.text((x + 20, 42), label, font=semi(32), fill=WHITE if on else MUTED)
if on: d.rectangle((x + w / 2 - 28, 88, x + w / 2 + 28, 92), fill=YELLOW)
x += w + 10
d.text((1640, 30), '20:14', font=cond(44), fill=WHITE); d.text((1600, 80), 'Thursday 5 November', font=reg(22), fill=MUTED)
d.text((70, 130), 'CATCH UP', font=anton(56), fill=GREEN); d.text((360, 150), 'Anything shown on Orbit in the last two days, from the start', font=reg(30), fill=MUTED)
def card(x, y, w, h, channel, title, sub, when, focus=False):
box(d, x, y, w, h, fill=(28, 58, 112) if focus else PANEL, r=10, outline=YELLOW if focus else None, width=4)
d.text((x + 20, y + 16), channel.upper(), font=semi(22), fill=GREEN if not focus else YELLOW)
t = title
while d.textlength(t, font=semi(32)) > w - 40 and len(t) > 3: t = t[:-2].rstrip() + '…'
d.text((x + 20, y + 46), t, font=semi(32), fill=WHITE)
s2 = sub
while d.textlength(s2, font=reg(24)) > w - 40 and len(s2) > 3: s2 = s2[:-2].rstrip() + '…'
d.text((x + 20, y + 90), s2, font=reg(24), fill=MUTED); d.text((x + 20, y + 124), when, font=reg(24), fill=MUTED)
catch_mark(d, x + w - 52, y + 18, YELLOW if focus else GREEN)
d.text((70, 215), 'JUST MISSED', font=semi(30), fill=WHITE)
# Newest first.
just = [('Orbit 1', 'Family Matters', 'S2 E3 · Rock Video', 'Ended 20:00', True), ('Heroes', 'Batman: TAS', 'Two-Face (1)', 'Ended 19:50', False),
('Evidence', 'NCIS', 'S4 E12 · Driven', 'Ended 19:45', False), ('Terra', 'Blue Planet', 'Ep 4 · Coral Seas', 'Ended 19:30', False), ('Paradox', 'Doctor Who', 'S3 E8 · Human Nature (1)', 'Ended 18:45', False)]
for k, (ch, t, sub, when, focus) in enumerate(just): card(70 + k * 362, 260, 346, 166, ch, t, sub, when, focus)
d.text((70, 460), 'EARLIER TODAY', font=semi(30), fill=WHITE)
today = [('Vortex', 'Dragon Ball Z', 'S2 E14 · Goku vs. Vegeta', '16:30 to 17:00'), ('Dark Files', 'Unsolved Mysteries', 'S1 E8', '15:00 to 16:00'),
('Orbit Wild', 'Man vs. Wild', 'S3 E2 · Alps', '14:00 to 15:00'), ('Odyssey', 'Cosmos', 'Ep 3 · When Knowledge…', '13:00 to 14:00'), ('Riot', 'The Simpsons', 'S6 E25 · Who Shot Mr. Burns (1)', '12:30 to 13:00')]
for k, (ch, t, sub, when) in enumerate(today): card(70 + k * 362, 505, 346, 166, ch, t, sub, when)
d.text((70, 705), 'YESTERDAY', font=semi(30), fill=WHITE)
yday = [('After Dark', 'The Thing', '1982 · John Carpenter', 'Wed 23:00'), ('Premiere', 'Dune: Part Two', '2024', 'Wed 20:00'),
('BritX', 'Hot Fuzz', '2007', 'Wed 21:00'), ('Orbit 2', 'Top Gear', 'S14 E3', 'Wed 19:00'), ('Wonder', 'Paddington 2', '2017', 'Wed 17:00')]
for k, (ch, t, sub, when) in enumerate(yday): card(70 + k * 362, 750, 346, 166, ch, t, sub, when)
d.text((70, 940), 'Newest first; each row scrolls on. A programme stays two days after it airs, and a two-part story shows its part 1.', font=reg(26), fill=MUTED)
keys(d, [('◄►', 'Move'), ('▲▼', 'Rows'), ('OK', 'Catch Up'), ('Back', 'Home')], y=1000)
im.save(HERE / 'catch-up-5-page.png')
print('page done')
Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

+1 -1
View File
@@ -392,7 +392,7 @@ The project is now in git, so each release can also be rolled back from its comm
Paul will watch Orbit for a few weeks first, so the channels, the Director's Chair and its learning mature on real use before anyone else gets it. In rough order:
1. **Catch-up:** watch a programme that aired in the last couple of days from the start; the channel itself carries on. Designed 5 November 2026 (design/catch-up): the guide scrolls back two days, past programmes carry a Catch Up mark, OK on one opens the Catch Up pop-up (Hold OK stays the number box), a two-part story offers both parts. Awaiting approval, then build.
1. **Catch-up:** watch a programme that aired in the last couple of days from the start; the channel itself carries on. Designed 5 November 2026 (design/catch-up): the guide scrolls back two days, past programmes carry a Catch Up mark, OK on one opens the Catch Up pop-up (Hold OK stays the number box), a two-part story offers both parts; plus a Catch Up tab in the nav bar (Home, What's On, TV Guide, Catch Up, Drive-In, Arcade) with Just missed, Earlier today and Yesterday rows. Paul liked the design (5 Nov); build next, sleep timer first.
2. **Sleep timer:** fade out and stop after 30, 60 or 90 minutes.
3. **First run (pre-launch setup):** a guided first launch that connects a library, checks it against Orbit's channel presets and switches on the channels it can fill; sets the After Dark lock (a PIN on After Dark and The Late Show) and the sleep timer there too.
4. **More media servers:** beyond Emby, Plex, Jellyfin and Silo (a new open-source media server, https://siloserver.org/), behind one library interface so the scheduler, the Chair and the Drive-In don't care which server it is.