| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // 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
- }
|