-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcursor.go
87 lines (77 loc) · 1.56 KB
/
cursor.go
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
package main
// position intentionally does not have a constructor to avoid potential inversion of column and row.
// It should always be instantiated explicitly: pos := &position{c: 0, r: 0}
type position struct {
c int
r int
}
func newPositionFromIndex(idx int, rows int) *position {
return &position{
c: int(float64(idx) / float64(rows)),
r: idx % rows,
}
}
func (p *position) index(rows int) int {
return index(p.c, p.r, rows)
}
func (m *model) resetCursor() {
m.c = 0
m.r = 0
}
func (m *model) setCursor(pos *position) {
m.c = pos.c
m.r = pos.r
}
func (m *model) saveCursor() {
pos := &position{c: m.c, r: m.r}
if cache, ok := m.pathCache[m.path]; ok {
cache.setPosition(pos)
return
}
m.pathCache[m.path] = newCacheItemWithPosition(pos)
}
func (m *model) moveUp() {
m.r--
if m.r < 0 {
m.r = m.rows - 1
m.c--
}
if m.c < 0 {
m.r = m.rows - 1 - (m.columns*m.rows - m.displayed)
m.c = m.columns - 1
}
}
func (m *model) moveDown() {
m.r++
if m.r >= m.rows {
m.r = 0
m.c++
}
if m.c >= m.columns {
m.c = 0
}
if m.c == m.columns-1 && (m.columns-1)*m.rows+m.r >= m.displayed {
m.r = 0
m.c = 0
}
}
func (m *model) moveLeft() {
m.c--
if m.c < 0 {
m.c = m.columns - 1
}
if m.c == m.columns-1 && (m.columns-1)*m.rows+m.r >= m.displayed {
m.r = m.rows - 1 - (m.columns*m.rows - m.displayed)
m.c = m.columns - 1
}
}
func (m *model) moveRight() {
m.c++
if m.c >= m.columns {
m.c = 0
}
if m.c == m.columns-1 && (m.columns-1)*m.rows+m.r >= m.displayed {
m.r = m.rows - 1 - (m.columns*m.rows - m.displayed)
m.c = m.columns - 1
}
}