package main import ( "citrons.xyz/talk/client/buffer" "citrons.xyz/talk/client/window" "citrons.xyz/talk/tui" "fmt" ) type cmdWindowLocation struct {} type cmdWindow struct { buf buffer.Buffer input tui.TextInput login bool } type logMsg struct { index int text string logType logType } var lastIndex = 0 type logType int const ( logInfo = iota logErr logCmd ) func (m logMsg) Id() string { return fmt.Sprintf("log.%d", m.index) } func (m logMsg) Show(odd bool) { var style *tui.Style switch m.logType { case logErr: style = &tui.Style {Bg: colorErr[odd], Fg: tui.White} case logCmd: style = &tui.Style {Bg: colorCmd[odd], Fg: tui.White} } tui.Push("", tui.Box { Width: tui.Fill, Height: tui.Children, Style: style, Dir: tui.Right, }) tui.Push("", tui.Box {Width: tui.TextSize, Height: tui.TextSize}) tui.Text("* ", nil) tui.Pop() tui.Push("", tui.Box {Width: tui.Fill, Height: tui.TextSize}) tui.Text(m.text, nil) tui.Pop() tui.Pop() } func (l cmdWindowLocation) CreateWindow() window.Window { return &globalApp.cmdWindow } func (w *cmdWindow) Location() window.Location { return cmdWindowLocation {} } func (w *cmdWindow) Kill() {} func (w *cmdWindow) Buffer() *buffer.Buffer { return &w.buf } func (w *cmdWindow) Input() *tui.TextInput { return &w.input } func (w *cmdWindow) Send(text string) { if w.login { w.login = false previousText := w.input.Text() w.input.SetText("") globalApp.auth(text, func(success bool) { if !success { w.loginMode() w.input.SetText(previousText) } }) } if text == ":wq" { globalApp.quit = true } } func (w *cmdWindow) ShowStatusLine() { if !w.login { tui.Text("command window", &tui.Style { Bg: tui.White, Fg: tui.Black, Italic: true, }) } else { tui.Text("[", nil) tui.Text("login", &tui.Style { Bg: tui.White, Fg: tui.Blue, Bold: true, }) tui.Text("]", nil) tui.Text(" username:", nil) } } func (w *cmdWindow) showPreview() { bottom := w.buf.Bottom() if bottom == nil { return } msg := bottom.Msg() tui.Push("command window container", tui.Box { Width: tui.Fill, Height: tui.Children, }) tui.Push(msg.Id(), tui.Box {Width: tui.Fill, Height: tui.Children}) msg.Show(false) tui.Pop() tui.Push("command window border", tui.Box { Width: tui.Fill, Height: 1, Dir: tui.Left, Style: &tui.Style {Bg: tui.White, Fg: tui.Black}, }) tui.Push("", tui.Box {Width: tui.Fill, Height: 1}) tui.Pop() tui.Push("command window status", tui.Box { Width: tui.TextSize, Height: 1, NoWrap: true, }) w.ShowStatusLine() tui.Pop() tui.Pop() tui.Pop() } func (w *cmdWindow) loginMode() { w.login = true w.input.SetText("") } func (w *cmdWindow) info(f string, a ...any) { lastIndex++ w.buf.Add(logMsg {lastIndex, fmt.Sprintf(f, a...), logInfo}) } func (w *cmdWindow) err(f string, a ...any) { lastIndex++ w.buf.Add(logMsg {lastIndex, fmt.Sprintf(f, a...), logErr}) } func (w *cmdWindow) cmd(f string, a ...any) { lastIndex++ w.buf.Add(logMsg {lastIndex, fmt.Sprintf(f, a...), logCmd}) }