package gui import ( "gitea.tyrel.dev/tyrel/itor/models" "github.com/charmbracelet/bubbles/list" "github.com/charmbracelet/bubbles/textinput" "reflect" "sort" ) type model struct { deck []models.Card // items on the to-do list selectCardIndex int // which to-do list item our selectCardIndex is pointing at selected map[int]struct{} // which to-do items are selected selectList list.Model createInputs []textinput.Model // Inputs for front and back, is an array because we change position by an index createdInputIndex int // holds an index for which input is active editing in create mode drawSeen bool drawCardId string mode Mode err error } /// returns an int slice of the selected card indexes, sorted func (m *model) selectedCardIndexes() []int { var keys []int for _, key := range reflect.ValueOf(m.selected).MapKeys() { keys = append(keys, int(key.Int())) } sort.Ints(keys) return keys } /// Returns a card with matching drawCardId func (m *model) selectedCard() models.Card { for _, card := range m.deck { if card.Id == m.drawCardId { return card } } return models.Card{ Front: "ERROR", Back: "ERROR", Id: "-1", } } func initialModel() model { front := textinput.New() front.Placeholder = "Front..." front.Focus() front.CharLimit = 256 front.Width = 80 back := textinput.New() back.Placeholder = "Back..." back.CharLimit = 256 back.Width = 80 deck := []models.Card{ models.NewCard("Oui, je parle français.", "Yes, I speak French."), models.NewCard("Non, je ne parle pas français.", "No, I don’t speak French."), models.NewCard("Merci beaucoup.", "Thank you very much."), models.NewCard("Je mange le pain.", "I eat the bread."), models.NewCard("Tu manges la salade.", "You seat the salad."), models.NewCard("Vous mangez la pizza.", "You eat the pizza."), models.NewCard("Le garçon chante.", "The boy sings."), models.NewCard("La fille nage.", "The girl swims."), models.NewCard("Les enfants chantent.", "The children sing."), models.NewCard("Un garçon écrit.", "A boy writes."), models.NewCard("Une fille dort.", "A girl sleeps."), models.NewCard("Des enfant étudient.", "Some kids study."), models.NewCard("Je le/la mange.", "I eat it."), models.NewCard("Je les mange.", "I eat them."), models.NewCard("Marc et Sylvie.", "Marc and Sylvie."), models.NewCard("Il aime Sylvie mais il est trop timide.", "He likes Sylvie but he’s ),too shy."), } var items []list.Item for _, card := range deck { items = append(items, card) } selectedList := list.New(items, itemDelegate{}, 80, 8) selectedList.Title = "Card selection" selectedList.SetShowStatusBar(false) selectedList.SetFilteringEnabled(false) selectedList.SetShowHelp(false) selectedList.SetFilteringEnabled(false) selectedList.Styles.Title = titleStyle selectedList.Styles.PaginationStyle = paginationStyle selectedList.Styles.HelpStyle = helpStyle return model{ deck: deck, selectList: selectedList, createInputs: []textinput.Model{front, back}, selected: make(map[int]struct{}), mode: Select, } }