// package win_main -- главное окно приложения package win_main import ( "time" "gitp78su.ipnodns.ru/svi/kern" . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes" tk "modernc.org/tk9.0" . "wartank/app/lev0/types" "wartank/desktop/win_add_bot" "wartank/desktop/win_main/frm_bot_param" "wartank/desktop/win_main/frm_status" ) // Главное окно приложения type WinMain struct { ctx IKernelCtx winMain *tk.Window listBot *tk.ListboxWidget btnBotAdd *tk.ButtonWidget dictBot map[string]bool chBotAdd chan ИБот frmStatus *frm_status.FrmStatus frmBotForce *frm_bot_param.FrmBotParam } var ( win *WinMain ) func GetWinMain() *WinMain { if win != nil { return win } win = &WinMain{ winMain: tk.App, ctx: kern.GetKernelCtx(), dictBot: map[string]bool{}, chBotAdd: make(chan ИБот, 2), } win.new() win.frmStatus = frm_status.NewFrmStatus() return win } func (sf *WinMain) new() { _ = tk.ActivateTheme("azure light") sf.winMain = tk.App sf.winMain.WmTitle("WarBot") tk.StyleThemeUse("alt") tk.WmWithdraw(sf.winMain) tk.WmMinSize(sf.winMain, 640, 480) sf.winMain.Configure(tk.Padx(0), tk.Pady(0)) { // Панель списка ботов frmListBot := sf.winMain.Frame(tk.Border(1), tk.Relief(tk.SUNKEN)) tk.Pack(frmListBot, tk.Fill(tk.FILL_Y), tk.Side(tk.LEFT)) lblText := frmListBot.Label(tk.Txt("Список ботов"), tk.Width(20), tk.Background("#888"), tk.Border(1), tk.Relief(tk.GROOVE), ) tk.Pack(lblText, tk.Side(tk.TOP), tk.Fill(tk.FILL_X)) sf.listBot = frmListBot.Listbox() tk.Pack(sf.listBot, tk.Side(tk.TOP)) sf.btnBotAdd = frmListBot.Button(tk.Txt("Добавить"), tk.Command(sf.botAdd)) tk.Pack(sf.btnBotAdd, tk.Fill(tk.FILL_X)) } frmStateBot := sf.winMain.TFrame(tk.Border(1), tk.Relief(tk.SUNKEN)) { // Панель состояния бота tk.Pack(frmStateBot, tk.Fill(tk.FILL_BOTH), tk.Expand(true)) lblStateBot := frmStateBot.Label(tk.Txt("Состояние бота"), tk.Background("#888"), tk.Border(1), tk.Relief(tk.GROOVE), ) tk.Pack(lblStateBot, tk.Side(tk.TOP), tk.Fill(tk.FILL_X)) } // Панель силы бота sf.frmBotForce = frm_bot_param.NewFrmBotParam(frmStateBot) tk.WmProtocol(sf.winMain, tk.WM_DELETE_WINDOW, tk.Command(sf.quit)) sf.liveUpdate() } func (sf *WinMain) quit() { sf.ctx.Cancel() tk.Destroy(sf.winMain) } func (sf *WinMain) botAdd() { _ = win_add_bot.NewWinAddBot(sf.chBotAdd) } func (sf *WinMain) liveUpdate() { select { case bot := <-sf.chBotAdd: _, isOk := sf.dictBot[bot.Имя()] if !isOk { sf.dictBot[bot.Имя()] = true sf.listBot.Insert("end", bot.Имя()) } default: } // Обновить список ботов // sf.listBot.Delete("0", "end") farmBot := sf.ctx.Get("ботоФерма").Val().(ИБотоФерма) lstBot := farmBot.ListBot() for _, bot := range lstBot { botName := bot.Имя() _, isOk := sf.dictBot[botName] if !isOk { sf.dictBot[botName] = true sf.listBot.Insert("end", bot.Имя()) } } tk.TclAfter(time.Millisecond*250, sf.liveUpdate) } func (sf *WinMain) Run() { tk.WmDeiconify(sf.winMain) sf.winMain.Wait() }