win_main.go 3.2 KB

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