Methods
(static) SetUpOptions() → {void}
- Type:
- void
(static) configureBackdrop() → {void}
- Type:
- void
(static) configureGrid() → {void}
- Type:
- void
(static) deliverFilters(filters, errorMsg) → {void}
Hand the filter result back to the presenter, which owns m.apiFilters + the toast. This is needed because Roku promise callbacks run at component scope, not on the presenter class instance.
| Name | Type | Description |
|---|---|---|
filters | object | |
errorMsg | string |
- Type:
- void
(static) getCollectionType() → {string}
- Type:
- string
(static) getDefaultView() → {string}
- Type:
- string
(static) getItemFlatIndex(itemId) → {integer}
Returns the flat index of an item within the grid's content root. Called by GridItem via callFunc for O(1) index lookup (avoids O(N) child scan).
| Name | Type | Description |
|---|---|---|
itemId | string | the Jellyfin item ID to look up |
flat index, or -1 if not found
- Type:
- integer
(static) getItemFocused() → {dynamic}
- Type:
- dynamic
(static) hideTVGuide() → {void}
Hide TV Guide and return to grid
- Type:
- void
(static) init() → {void}
- Type:
- void
(static) loadFilters(params) → {void}
Render-thread filter load, collapsed from GetFiltersTask (Phase-4 pure-fetch Task collapse; see docs/dev/promises.md). Invoked by the presenter via callFunc so the body runs in component-m context, where fetchAsync + auto-abandon work — the presenter is a class, and the auto-abandon plugin only injects into components with onDestroy (which BaseGridView has). The presenter still owns m.apiFilters + the toast; this just fetches and hands the result back via deliverFilters().
| Name | Type | Description |
|---|---|---|
params | object |
- Type:
- void
(static) loadInitialItems() → {void}
- Type:
- void
(static) loadLibraryFromRoute(route) → {void}
Configure the library view from its route. Both in-app navigation and a deep link / cast supply the rich library node as route.context.item (the resolver passes the node it already validated), so there is no fetch here. A missing context node is therefore an unexpected route shape, not a deferred feature — warn rather than silently render nothing.
| Name | Type | Description |
|---|---|---|
route | object |
- Type:
- void
(static) loadMoreData() → {void}
- Type:
- void
(static) onAlphaActiveChanged() → {void}
- Type:
- void
(static) onAlphaSelectedChanged() → {void}
- Type:
- void
(static) onDestroy() → {void}
onDestroy: Full teardown releasing all resources before component removal Called automatically via JRScreen.beforeViewClose when sgRouter permanently closes this view.
- Type:
- void
(static) onGenreItemFocused() → {void}
- Type:
- void
(static) onGenreItemSelected() → {void}
- Type:
- void
(static) onGenreSkeletonsReady(msg) → {void}
Draw the Genres view's rows before their artwork exists.
The task knows every genre's name as soon as the genre LIST query returns, which is one request rather than one-per-genre — so the list can be on screen long before the samples land. Each row gets its title and a single skeleton placeholder cell: a RowList does not lay out a childless row at all, and that one cell is also what gives the row its slot height.
genreSkeletons carries ids and titles, NOT nodes. Building the rows here rather than shipping them from the task keeps the payload of that cross-thread write small — the rendezvous is priced by what it carries. Same split of work as HomeRows.createSkeletonRows().
Nothing here is authoritative: content still arrives later with the real rows and replaces these wholesale. If it never arrives, the skeletons are what the failure looks like, which beats an empty screen.
| Name | Type | Description |
|---|---|---|
msg | dynamic |
- Type:
- void
(static) onItemDataLoaded(msg) → {void}
| Name | Type | Description |
|---|---|---|
msg | dynamic |
- Type:
- void
(static) onItemFocused() → {void}
- Type:
- void
(static) onItemSelected() → {void}
- Type:
- void
(static) onKeyEvent(key, press) → {boolean}
| Name | Type | Description |
|---|---|---|
key | string | |
press | boolean |
- Type:
- boolean
(static) onLibrarySelection(msg) → {void}
A grid / genre / channel item was selected — navigate to its route (rich node as context). Non-navigable selections fall through to playback.
| Name | Type | Description |
|---|---|---|
msg | dynamic |
- Type:
- void
(static) onPresenterLogoLoaded(event) → {void}
Bridge callback for presenter logo loading - forwards to presenter.onLogoLoaded() This is needed because Roku observers look for functions at component scope, not on class instances. Presenters should observe with "onPresenterLogoLoaded".
| Name | Type | Description |
|---|---|---|
event | object |
- Type:
- void
(static) onPresenterTypeChanged() → {void}
Called when presenterType field changes - creates the appropriate presenter
- Type:
- void
(static) onQuickPlayLaunch(msg) → {void}
Forward a non-navigable selection to the playback launcher.
| Name | Type | Description |
|---|---|---|
msg | dynamic |
- Type:
- void
(static) onScreenHidden() → {void}
- Type:
- void
(static) onScreenShown() → {void}
- Type:
- void
(static) onTVGuideFocusedChannel() → {void}
Handle channel focus from TV Guide
- Type:
- void
(static) onTVGuideWatchChannel() → {void}
Handle channel selection from TV Guide
- Type:
- void
(static) onVoiceFilter() → {void}
- Type:
- void
(static) optionsClosed() → {void}
- Type:
- void
(static) prepareDataLoad(disableRemoteopt) → {void}
Prepare for data loading by stopping any active task, showing spinner, and hiding empty text
| Name | Type | Attributes | Default | Description |
|---|---|---|---|---|
disableRemote | boolean | <optional> | false | Whether to disable remote input during loading |
- Type:
- void
(static) reloadGridItems() → {void}
Full reset + reload of the grid. Used by optionsClosed (sort/filter/view change) and by the resume-time content-freshness check in onScreenShown (a delete elsewhere invalidated our cached content).
- Type:
- void
(static) revealGenreList(rowsRoot) → {void}
Swaps the genre RowList to a new set of rows and reveals it, preserving the user's position. ONE owner for both delivery stages — the skeleton rows and the real rows — so the opacity/focus/spinner sequence cannot drift between them.
rowsRoot is a DETACHED ContentNode root: building rows off-tree and assigning content once is a single change notification instead of one per row (the same shape onAlphaSelectedChanged already uses).
Focus/scroll: the view is interactive from the moment skeletons draw, so the user may have scrolled before the real rows land. Skeleton and real rows are 1:1 in server order, so the previous [row, item] position is index-stable — restore it rather than letting the content swap snap the list back to the top. The item index is clamped: a skeleton row holds one cell, the filled row up to 7.
| Name | Type | Description |
|---|---|---|
rowsRoot | object |
- Type:
- void
(static) setupNodes() → {void}
- Type:
- void
(static) showTVGuide() → {void}
Show TV Guide (EPG) for LiveTV
- Type:
- void
(static) updateBackdropForFocusedItem() → {void}
- Type:
- void
(static) updateTitle() → {void}
- Type:
- void