win_main.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // package win_main -- главное окно приложения
  2. package win_main
  3. import (
  4. "time"
  5. "gitp78su.ipnodns.ru/svi/kern"
  6. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  7. tk "modernc.org/tk9.0"
  8. . "wartank/app/lev0/types"
  9. "wartank/desktop/win_add_bot"
  10. "wartank/desktop/win_main/frm_bank"
  11. "wartank/desktop/win_main/frm_bot_param"
  12. "wartank/desktop/win_main/frm_mine"
  13. "wartank/desktop/win_main/frm_status"
  14. )
  15. // Главное окно приложения
  16. type WinMain struct {
  17. ctx IKernelCtx
  18. winMain *tk.Window
  19. listBot *tk.ListboxWidget
  20. btnBotAdd *tk.ButtonWidget
  21. dictBot map[string]bool
  22. chBotAdd chan ИБот
  23. frmStatus *frm_status.FrmStatus
  24. frmBotForce *frm_bot_param.FrmBotParam
  25. frmBank *frm_bank.FrmBank
  26. frmMine *frm_mine.FrmMine
  27. }
  28. var (
  29. win *WinMain
  30. )
  31. func GetWinMain() *WinMain {
  32. if win != nil {
  33. return win
  34. }
  35. win = &WinMain{
  36. winMain: tk.App,
  37. ctx: kern.GetKernelCtx(),
  38. dictBot: map[string]bool{},
  39. chBotAdd: make(chan ИБот, 2),
  40. }
  41. win.new()
  42. win.frmStatus = frm_status.NewFrmStatus()
  43. return win
  44. }
  45. func (sf *WinMain) new() {
  46. _ = tk.ActivateTheme("azure light")
  47. sf.winMain = tk.App
  48. sf.winMain.WmTitle("WarBot")
  49. tk.StyleThemeUse("alt")
  50. tk.WmWithdraw(sf.winMain)
  51. tk.WmMinSize(sf.winMain, 640, 480)
  52. sf.winMain.Configure(tk.Padx(0), tk.Pady(0))
  53. { // Панель списка ботов
  54. frmListBot := sf.winMain.Frame(tk.Border(1), tk.Relief(tk.SUNKEN))
  55. tk.Pack(frmListBot, tk.Fill(tk.FILL_Y), tk.Side(tk.LEFT))
  56. lblText := frmListBot.Label(tk.Txt("Список ботов"),
  57. tk.Width(20),
  58. tk.Background("#888"),
  59. tk.Border(1),
  60. tk.Relief(tk.GROOVE),
  61. )
  62. tk.Pack(lblText, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
  63. sf.listBot = frmListBot.Listbox()
  64. tk.Pack(sf.listBot, tk.Side(tk.TOP))
  65. sf.btnBotAdd = frmListBot.Button(tk.Txt("Добавить"), tk.Command(sf.botAdd))
  66. tk.Pack(sf.btnBotAdd, tk.Fill(tk.FILL_X))
  67. }
  68. frmStateBot := sf.winMain.TFrame(tk.Border(1), tk.Relief(tk.SUNKEN))
  69. { // Панель состояния бота
  70. tk.Pack(frmStateBot, tk.Fill(tk.FILL_BOTH), tk.Expand(true))
  71. lblStateBot := frmStateBot.Label(tk.Txt("Состояние бота"),
  72. tk.Background("#888"),
  73. tk.Border(1),
  74. tk.Relief(tk.GROOVE),
  75. )
  76. tk.Pack(lblStateBot, tk.Side(tk.TOP), tk.Fill(tk.FILL_X))
  77. }
  78. // Панель силы бота
  79. sf.frmBotForce = frm_bot_param.NewFrmBotParam(frmStateBot)
  80. sf.frmBank = frm_bank.NewFrmBank(frmStateBot)
  81. sf.frmMine = frm_mine.NewFrmMine(frmStateBot)
  82. tk.WmProtocol(sf.winMain, tk.WM_DELETE_WINDOW, tk.Command(sf.quit))
  83. sf.liveUpdate()
  84. }
  85. func (sf *WinMain) quit() {
  86. sf.ctx.Cancel()
  87. tk.Destroy(sf.winMain)
  88. }
  89. func (sf *WinMain) botAdd() {
  90. _ = win_add_bot.NewWinAddBot(sf.chBotAdd)
  91. }
  92. func (sf *WinMain) liveUpdate() {
  93. select {
  94. case bot := <-sf.chBotAdd:
  95. _, isOk := sf.dictBot[bot.Имя()]
  96. if !isOk {
  97. sf.dictBot[bot.Имя()] = true
  98. sf.listBot.Insert("end", bot.Имя())
  99. }
  100. default:
  101. }
  102. // Обновить список ботов
  103. // sf.listBot.Delete("0", "end")
  104. farmBot := sf.ctx.Get("ботоФерма").Val().(ИБотоФерма)
  105. lstBot := farmBot.ListBot()
  106. for _, bot := range lstBot {
  107. botName := bot.Имя()
  108. _, isOk := sf.dictBot[botName]
  109. if !isOk {
  110. sf.dictBot[botName] = true
  111. sf.listBot.Insert("end", bot.Имя())
  112. }
  113. }
  114. tk.TclAfter(time.Millisecond*250, sf.liveUpdate)
  115. }
  116. func (sf *WinMain) Run() {
  117. tk.WmDeiconify(sf.winMain)
  118. sf.winMain.Wait()
  119. }