win_main.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // package win_main -- главное коно бото-фермы
  2. package win_main
  3. import (
  4. "fmt"
  5. "image/color"
  6. "log"
  7. "fyne.io/fyne/v2"
  8. "fyne.io/fyne/v2/canvas"
  9. "fyne.io/fyne/v2/container"
  10. "fyne.io/fyne/v2/layout"
  11. "fyne.io/fyne/v2/widget"
  12. "wartank/pkg/types"
  13. )
  14. // WinMain -- главное окно приложения
  15. type WinMain struct {
  16. fyne.Window
  17. serv types.IServer
  18. app fyne.App
  19. botLogin string
  20. botPass string
  21. boxLeft *fyne.Container
  22. tabBot *container.AppTabs // Просмотр параметров бота
  23. entLogin *widget.Label // Логин текущего бота
  24. entPass *widget.Entry // Пароль текущего бота
  25. checkAutoGame *widget.Check // Автоматически играть при старте
  26. lblFuel *widget.Label // Топливо бота
  27. }
  28. // NewWinMain -- возвращает новое главное окно
  29. func NewWinMain(serv types.IServer) (*WinMain, error) {
  30. if serv == nil {
  31. return nil, fmt.Errorf("NewWinMain(): IServer==nil")
  32. }
  33. sf := &WinMain{
  34. Window: serv.Gui().FyneApp().NewWindow("Бото-ферма [wartank.ru]"),
  35. app: serv.Gui().FyneApp(),
  36. serv: serv,
  37. }
  38. green := color.NRGBA{R: 0, G: 180, B: 0, A: 255}
  39. text1 := canvas.NewText("Список ботов", green)
  40. btnAddBot := widget.NewButton("Добавить бота", sf.btnAddClick)
  41. btnExit := widget.NewButton("Выход", sf.btnExitClick)
  42. boxDown := container.NewHBox(btnAddBot, layout.NewSpacer(), btnExit)
  43. sf.entLogin = widget.NewLabel("")
  44. sf.entPass = widget.NewEntry()
  45. sf.checkAutoGame = widget.NewCheck("", sf.clickAutoGame)
  46. formLogin := &widget.Form{
  47. Items: []*widget.FormItem{ // we can specify items in the constructor
  48. {Text: "Логин", Widget: sf.entLogin},
  49. {Text: "Пароль", Widget: sf.entPass},
  50. {Text: "Авто игра", Widget: sf.checkAutoGame},
  51. },
  52. }
  53. tabLogin := container.NewTabItem("Логин", formLogin)
  54. sf.lblFuel = widget.NewLabel("0")
  55. itemFuel := widget.NewFormItem("Топливо", sf.lblFuel)
  56. frmStat := widget.NewForm(itemFuel)
  57. tabStat := container.NewTabItem("Статистика", frmStat)
  58. sf.tabBot = container.NewAppTabs(tabLogin, tabStat)
  59. sf.boxLeft = container.NewVBox(text1)
  60. boxBorder := container.NewBorder(nil, nil, sf.boxLeft, nil, sf.boxLeft, sf.tabBot)
  61. boxMain := container.NewBorder(nil, boxDown, nil, nil, boxBorder)
  62. sf.Resize(fyne.NewSize(640, 480))
  63. { // Получить список всех ботов
  64. lstBots := sf.serv.ServBots().ListBot()
  65. for _, bot := range lstBots {
  66. sf.botLogin = bot.Name()
  67. sf.addBot()
  68. }
  69. }
  70. sf.SetContent(boxMain)
  71. return sf, nil
  72. }
  73. // Выставляет признак автоматического начала игры при запуске бото-фермы
  74. func (sf *WinMain) clickAutoGame(isAutoGame bool) {
  75. log.Printf("WinMain.clickAutoGame(): login:%q\t isAutoGame=%v\n", sf.entLogin.Text, isAutoGame)
  76. sf.botLogin = sf.entLogin.Text
  77. if sf.botLogin == "" {
  78. sf.checkAutoGame.Checked = false
  79. return
  80. }
  81. // Сохранить автозапуск бота
  82. bot := sf.serv.ServBots().Get(sf.botLogin)
  83. switch isAutoGame {
  84. case true: // Автозапуск бота
  85. bot.SetAutoGame()
  86. default:
  87. bot.ResetAutoGame()
  88. }
  89. }
  90. func (sf *WinMain) btnAddClick() {
  91. log.Println("WinMain.btnAddclick()")
  92. winAddBot := sf.app.NewWindow("Новый бот")
  93. entLogin := widget.NewEntry()
  94. entPass := widget.NewEntry()
  95. form := &widget.Form{
  96. Items: []*widget.FormItem{ // we can specify items in the constructor
  97. {Text: "Логин", Widget: entLogin},
  98. {Text: "Пароль", Widget: entPass},
  99. },
  100. OnSubmit: func() { // optional, handle form submission
  101. sf.botLogin = entLogin.Text
  102. sf.botPass = entPass.Text
  103. winAddBot.Close()
  104. go sf.addBot()
  105. },
  106. }
  107. winAddBot.Resize(fyne.NewSize(640, 480))
  108. winAddBot.SetContent(form)
  109. winAddBot.Show()
  110. }
  111. // Добавляет бота на жкран
  112. func (sf *WinMain) addBot() {
  113. log.Printf("WinMain.addBot(): %q\n", sf.botLogin)
  114. err := sf.serv.ServBots().AddBot(sf.botLogin, sf.botPass)
  115. if err != nil {
  116. log.Printf("WinMain.addBot().OnSubmit(): in add bot to ferma, err=\n\t%v\n", err)
  117. return
  118. }
  119. btnBot := widget.NewButton(sf.botLogin, sf.btnBotClick())
  120. sf.boxLeft.Add(btnBot)
  121. }
  122. func (sf *WinMain) btnBotClick() func() {
  123. log.Println("WinMain.btnBotClick()")
  124. _botLogin := sf.botLogin
  125. bot := sf.serv.ServBots().Get(_botLogin)
  126. _botPass := bot.Pass()
  127. return func() {
  128. log.Printf("btnBotClick().fn(): botName=%q\tbotPass=%q\tisAuto=%v\n", _botLogin, _botPass, bot.IsAutoGame())
  129. // Заполнить данными вкладки своего бота
  130. sf.entLogin.Text = _botLogin
  131. sf.entLogin.Refresh()
  132. sf.entPass.Text = _botPass
  133. sf.entPass.Refresh()
  134. sf.checkAutoGame.Checked = bot.IsAutoGame()
  135. sf.checkAutoGame.Refresh()
  136. fuel := bot.Angar().Fuel()
  137. sf.lblFuel.Text = fmt.Sprint(fuel.Get())
  138. sf.lblFuel.Refresh()
  139. }
  140. }
  141. func (sf *WinMain) btnExitClick() {
  142. log.Println("WinMain.btnExitClick()")
  143. sf.Close()
  144. sf.app.Quit()
  145. sf.serv.CancelApp()
  146. }