// package win_default -- окно по умолчанию package win_default import ( "fmt" tea "github.com/charmbracelet/bubbletea" "wartank/desktop/win_base" "wartank/pkg/cons" "wartank/pkg/types" ) // WinDefault -- окно по умолчанию type WinDefault struct { *win_base.WinBase cursor int // позиция курсора в списке choices []string // выбранный пункт в списке selected map[int]struct{} // что выбрано из списка model tea.Model // Модель для обработки } // NewWinDefault -- возвращает новое окно по умолчанию func NewWinDefault(desk types.IDesktop) (*WinDefault, error) { winBase, err := win_base.NewWinBase(desk, cons.WinDefault) if err != nil { return nil, fmt.Errorf("NewWinDefault(): in create IWinBase, err=\n\t%w", err) } sf := &WinDefault{ WinBase: winBase, // Список дел choices: []string{"Купить картошку", "Оплатить мобилку", "Заплатить за кредит"}, selected: make(map[int]struct{}), } return sf, nil } // Update -- обрабатывает команду цикла func (sf *WinDefault) Update(msg tea.Msg) (tea.Model, tea.Cmd) { isMsg := false switch msg := msg.(type) { // Может клавиша нажата case tea.KeyMsg: switch msg.String() { // Да, нажато, а что именно? case "up", "k": // Если "up" или "k" перемещение курсора вверх if sf.cursor > 0 { sf.cursor-- isMsg = true } case "down", "j": // Если "down" или "j" перемещение курсора вниз if sf.cursor < len(sf.choices)-1 { sf.cursor++ isMsg = true } case "enter", " ": // Нажатие "enter" или "пробел" переключает выбранный элемент списка _, ok := sf.selected[sf.cursor] if ok { delete(sf.selected, sf.cursor) } else { sf.selected[sf.cursor] = struct{}{} } isMsg = true case "w": // Настройки графического клиента sf.Desk().SetWin(cons.WinConfig) } } if isMsg { sf.Desk().SetWin(sf.Name()) return sf.model, nil } return nil, nil } // View -- перерисовывание окна по требованию func (sf *WinDefault) View() string { // Заголовок s := "Что нам нужно сделать?\n\n" // Перебор по списку выбора for i, choice := range sf.choices { // Курсор указывает на этот выбор? cursor := " " // нет курсора if sf.cursor == i { cursor = ">" // есть курсор } // Этот элемент выбран? checked := " " // не выбран if _, ok := sf.selected[i]; ok { checked = "+" // выбран! } // отрендерить заново s += fmt.Sprintf("%s [%s] %s\n", cursor, checked, choice) } // Подвал s += "\n\n[ctrl+q]-выход [w]-настройки\n" // Вернуть строку экрана для отрисовки return s }