/
model.go
266 lines (223 loc) · 5.04 KB
/
model.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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
package cmd
import (
"time"
"github.com/bloznelis/typioca/cmd/words"
"github.com/charmbracelet/bubbles/stopwatch"
"github.com/charmbracelet/bubbles/timer"
tea "github.com/charmbracelet/bubbletea"
"github.com/muesli/termenv"
)
type myTimer struct {
timer timer.Model
duration time.Duration
isRunning bool // Inner is running is being handled weirdly.
timedout bool
}
type myStopWatch struct {
stopwatch stopwatch.Model
isRunning bool
}
type mistakes struct {
mistakesAt map[int]bool
rawMistakesCnt int // Should never be reduced
}
type StringStyle func(string) termenv.Style
type Styles struct {
correct StringStyle
toEnter StringStyle
mistakes StringStyle
cursor StringStyle
runningTimer StringStyle
stoppedTimer StringStyle
greener StringStyle
faintGreen StringStyle
}
type model struct {
state State
styles Styles
width int
height int
}
type Results struct {
identifier ResultsIdentifier
wpm int
accuracy float64
deltaWpm float64
rawWpm int
cpm int
time time.Duration
wordList string
wpmEachSecond []float64
}
type PersistentResults struct {
Results AllPersistedResults
Version int
}
type ResultsIdentifier struct {
testType TestType
numeric NumericSetting
words WordListName
}
type PersistentResultsNode struct {
Wpm int
Accuracy float64
DeltaWpm float64
RawWpm int
Cpm int
WpmEachSecond []float64
}
type WordListSelection struct {
key string
show string
}
type State interface{}
type MainMenuSelection interface {
Enabled() bool
show(s Styles) string
handleInput(msg tea.Msg, menu MainMenu) State
}
type TimerBasedTestSettings struct {
timeSelections []time.Duration
timeCursor int
wordListSelections []WordsSelection
wordListCursor int
cursor int
enabled bool
}
func (s TimerBasedTestSettings) Enabled() bool {
return s.enabled
}
type WordCountBasedTestSettings struct {
wordCountSelections []int
wordCountCursor int
wordListSelections []WordsSelection
wordListCursor int
cursor int
enabled bool
}
func (s WordCountBasedTestSettings) Enabled() bool {
return s.enabled
}
type SentenceCountBasedTestSettings struct {
sentenceCountSelections []int
sentenceCountCursor int
sentenceListSelections []WordsSelection
sentenceListCursor int
cursor int
enabled bool
}
func (s SentenceCountBasedTestSettings) Enabled() bool {
return s.enabled
}
type ConfigViewSelection struct{}
func (s ConfigViewSelection) Enabled() bool {
return true
}
type MainMenu struct {
config Config
selections []MainMenuSelection
cursor int
timeBasedGenerator words.WordsGenerator
wordCountGenerator words.WordsGenerator
sentenceCountGenerator words.WordsGenerator
}
type TestBase struct {
wordsToEnter []rune
inputBuffer []rune
wpmEachSecond []float64
rawInputCnt int // Should not be reduced
mistakes mistakes
cursor int
}
type TimerBasedTest struct {
settings TimerBasedTestSettings
timer myTimer
base TestBase
completed bool
mainMenu MainMenu
}
type TimerBasedTestResults struct {
settings TimerBasedTestSettings
wpmEachSecond []float64
results Results
mainMenu MainMenu
}
type WordCountBasedTest struct {
settings WordCountBasedTestSettings
stopwatch myStopWatch
base TestBase
completed bool
mainMenu MainMenu
}
type WordCountTestResults struct {
settings WordCountBasedTestSettings
wpmEachSecond []float64
wordCnt int
results Results
mainMenu MainMenu
}
type SentenceCountBasedTest struct {
settings SentenceCountBasedTestSettings
stopwatch myStopWatch
base TestBase
completed bool
mainMenu MainMenu
}
type SentenceCountTestResults struct {
settings SentenceCountBasedTestSettings
wpmEachSecond []float64
sentenceCnt int
results Results
mainMenu MainMenu
}
type ConfigView struct {
mainMenu MainMenu
config Config
cursor int
}
type TestSettingCursors struct {
TimerTimeCursor int
TimerWordlistCursor int
WordCountCursor int
WordCountWordlistCursor int
SentenceCountCursor int
SentenceCountWordlistCursor int
}
type WordList struct {
Sentences bool
Name string
Path string
RemoteURI string
isLocal bool
Enabled bool
synced bool
syncOK bool
}
func (wordList *WordList) toggleEnabled() {
if !wordList.isLocal {
wordList.Enabled = !wordList.Enabled
}
}
type EmbededWordList struct {
Name string
IsSentences bool
Enabled bool
}
func (embeded *EmbededWordList) toggleEnabled() {
embeded.Enabled = !embeded.Enabled
}
type Config struct {
TestSettingCursors TestSettingCursors
EmbededWordLists []EmbededWordList
WordLists []WordList
Version int
}
type LocalConfig struct {
Words []WordList
}
func (cfg Config) wordListsCount() int {
return len(cfg.WordLists) + len(cfg.EmbededWordLists)
}
type Toggleable interface {
toggle()
}