diff --git a/cmd/ui.go b/cmd/ui.go new file mode 100644 index 0000000..41260db --- /dev/null +++ b/cmd/ui.go @@ -0,0 +1,108 @@ +package cmd + +import ( + "fmt" + "github.com/jroimartin/gocui" + "log" +) + +func ui() { + g, err := gocui.NewGui(gocui.OutputNormal) + if err != nil { + log.Panicln(err) + } + defer g.Close() + g.SetManagerFunc(layout) + g.Mouse = true + g.Cursor = true + initKeybindings(g) + + if err := g.MainLoop(); err != nil && err != gocui.ErrQuit { + log.Panicln(err) + } +} + +func quit(*gocui.Gui, *gocui.View) error { + return gocui.ErrQuit +} + +func sendmsg(g *gocui.Gui, v *gocui.View) error { + chatbox, err := g.View("chatbox") + textarea, err := g.View("textarea") + if err != nil { + log.Panicln(err) + } + message := textarea.Buffer() + msg := string(message) + if msg == "" { + return nil + } + + fmt.Fprint(chatbox, msg) + textarea.Clear() + textarea.SetCursor(0, 0) + return nil +} + +func initKeybindings(g *gocui.Gui) error { + if err := g.SetKeybinding("", gocui.KeyCtrlC, gocui.ModNone, quit); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("button", gocui.MouseLeft, gocui.ModNone, sendmsg); err != nil { + log.Panicln(err) + } + + if err := g.SetKeybinding("textarea", gocui.KeyEnter, gocui.ModNone, sendmsg); err != nil { + log.Panicln(err) + } + return nil +} + +func layout(g *gocui.Gui) error { + maxX, maxY := g.Size() + + if chatbox, err := g.SetView("chatbox", 2, 1, maxX/2+40, maxY-6); err != nil { + if err != gocui.ErrUnknownView { + return err + } + chatbox.Title = "Chat Box" + fmt.Fprintln(chatbox, "Hello world!") + } + + if button, err := g.SetView("button", maxX/2+32, maxY-4, maxX/2+40, maxY-2); err != nil { + if err != gocui.ErrUnknownView { + return err + } + //button.BgColor = gocui.ColorRed + button.Wrap = true + button.Frame = true + fmt.Fprintln(button, "Send it") + } + + if textarea, err := g.SetView("textarea", 2, maxY-4, maxX/2+28, maxY-2); err != nil { + if err != gocui.ErrUnknownView { + return err + } + if _, err := g.SetCurrentView("textarea"); err != nil { + log.Panicln(err) + } + textarea.Title = "Send message" + textarea.Wrap = true + textarea.Editable = true + } + + if currentUsers, err := g.SetView("currentUsers", maxX/2+42, 1, maxX-6, maxY-6); err != nil { + if err != gocui.ErrUnknownView { + return err + } + currentUsers.Title = "Connected users" + } + + // TODO: Add "Users currently online" view + // if currentUsers, err := g.SetView("currentUsers", maxX/2+34, 1, maxX/2+40, maxY/2+11); err != nil { + // + // } + + return nil +}