-
Notifications
You must be signed in to change notification settings - Fork 0
/
List.js
97 lines (95 loc) · 2.39 KB
/
List.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
* Copyright 2024 Comcast Cable Communications Management, LLC
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/
import Blits from '@lightningjs/blits'
import Item from '../components/Item'
export default Blits.Component('List', {
components: {
Item,
},
template: `
<Element :x.transition="$x">
<Item
:for="(item, index) in $items"
item="$item"
:x="$index * $totalWidth"
:ref="'list-item-'+$item.id"
:key="$item.id"
width="$itemWidth"
height="$itemHeight"
/>
</Element>
`,
props: [
'autoScroll',
'autoscrollOffset',
'itemOffset',
'itemHeight',
'itemWidth',
'items',
'looping',
],
state() {
return {
focused: 0,
x: 0,
}
},
computed: {
totalWidth() {
return (this.itemWidth || 300) + (this.itemOffset || 0)
},
},
hooks: {
focus() {
this.$trigger('focused')
},
},
watch: {
focused(value) {
const focusItem = this.$select(`list-item-${this.items[value].id}`)
if (focusItem && focusItem.$focus) {
focusItem.$focus()
this.scrollToFocus(value)
}
},
},
methods: {
changeFocus(direction) {
const nextFocus = this.looping
? (this.focused + direction + this.items.length) % this.items.length
: Math.max(0, Math.min(this.focused + direction, this.items.length - 1))
this.focused = nextFocus
},
scrollToFocus(index) {
if (this.autoScroll) {
const maxScrollIndex = Math.max(0, this.items.length - (this.autoscrollOffset || 0))
this.x = -(index <= maxScrollIndex ? index : maxScrollIndex) * this.totalWidth
}
},
},
input: {
left() {
this.changeFocus(-1)
},
right() {
this.changeFocus(1)
},
enter() {
console.log('Selected item:', this.items[this.focused])
},
},
})