win_bot_list.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // package win_bots_list -- окно списка ботов на бото-ферме
  2. package win_bots_list
  3. import (
  4. "fmt"
  5. "github.com/charmbracelet/bubbles/textinput"
  6. tea "github.com/charmbracelet/bubbletea"
  7. "wartank/desktop/win_base"
  8. "wartank/pkg/alias"
  9. "wartank/pkg/cons"
  10. "wartank/pkg/types"
  11. )
  12. // WinBotsList -- показывает список ботов на бото-ферме вар-танк
  13. type WinBotsList struct {
  14. *win_base.WinBase
  15. botSelect int // Выбранный бот
  16. dictBot map[int]string // Список ботов
  17. }
  18. // NewWinBotsList -- возвращает новое окно для ввода списка ботов а бото-ферме вар-танк
  19. func NewWinBotsList(desk types.IDesktop) (*WinBotsList, error) {
  20. winBase, err := win_base.NewWinBase(desk, cons.WinBotsAddPass)
  21. if err != nil {
  22. return nil, fmt.Errorf("NewWinBotsList(): in create WinBase, err=\n\t%w", err)
  23. }
  24. sf := &WinBotsList{
  25. WinBase: winBase,
  26. dictBot: make(map[int]string),
  27. }
  28. _ = tea.Model(sf)
  29. return sf, nil
  30. }
  31. // Init -- настраивает окно для бабл-теа
  32. func (sf *WinBotsList) Init() tea.Cmd {
  33. lstBot := sf.Desk().LstBot()
  34. for ind, bot := range lstBot {
  35. sf.dictBot[ind] = bot
  36. }
  37. return textinput.Blink
  38. }
  39. // Update -- обрабатывает команду цикла
  40. func (sf *WinBotsList) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  41. winName := alias.AWinName("")
  42. switch msg := msg.(type) {
  43. // Может клавиша нажата
  44. case tea.KeyMsg:
  45. switch msg.String() { // Да, нажато, а что именно?
  46. case "esc": // Вернуться на шаг назад
  47. winName = cons.WinBotsMenu
  48. case "down", "s": // Нажато вниз
  49. for key := range sf.dictBot {
  50. if key == sf.botSelect {
  51. sf.botSelect++
  52. if sf.botSelect >= len(sf.dictBot) {
  53. sf.botSelect = len(sf.dictBot) - 1
  54. }
  55. break
  56. }
  57. }
  58. case "up", "w": // Нажато вверх
  59. for key := range sf.dictBot {
  60. if key == sf.botSelect {
  61. sf.botSelect++
  62. if sf.botSelect < 0 {
  63. sf.botSelect = 0
  64. }
  65. break
  66. }
  67. }
  68. }
  69. }
  70. if winName != "" {
  71. sf.Desk().SetWin(winName)
  72. }
  73. return nil, nil
  74. }
  75. // View -- перерисовывание окна по требованию
  76. func (sf *WinBotsList) View() string {
  77. s := "=Выбор бота на бото-ферме вар-танк=\n\n"
  78. for key, bot := range sf.dictBot {
  79. if key != sf.botSelect {
  80. s += fmt.Sprintf("\t\t%v\n", bot)
  81. continue
  82. }
  83. s += fmt.Sprintf("=>\t%v\n", bot)
  84. }
  85. s += "\n\n[ctrl+q]-выход [esc]-назад\n"
  86. return s
  87. }