win_main.go 3.3 KB

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