package tui import ( "github.com/jroimartin/gocui" ) const ( sidebarWidth = 20 inputHeight = 4 chatXOffset = 21 ) func layout(g *gocui.Gui) error { maxX, maxY := g.Size() if maxX != prevWidth || maxY != prevHeight { prevWidth, prevHeight = maxX, maxY if chatView, err := g.View("chat"); err == nil { updateChatView(chatView) } if _, err := g.View("users"); err == nil { updateContactsView(g) } } if err := layoutSidebar(g, maxY); err != nil { return err } if err := layoutChat(g, maxX, maxY); err != nil { return err } if err := layoutInput(g, maxX, maxY); err != nil { return err } return nil } func layoutChat(g *gocui.Gui, maxX, maxY int) error { if v, err := g.SetView("chat", chatXOffset, 0, maxX-1, maxY-inputHeight-1); err != nil { if err != gocui.ErrUnknownView { return err } v.Title = " Chat " v.Wrap = true v.Autoscroll = true updateChatView(v) } return nil } func layoutInput(g *gocui.Gui, maxX, maxY int) error { if v, err := g.SetView("input", chatXOffset, maxY-inputHeight, maxX-1, maxY-1); err != nil { if err != gocui.ErrUnknownView { return err } v.Title = " Type your message: " v.Editable = true v.Wrap = true if _, err := g.SetCurrentView("input"); err != nil { return err } } return nil } func layoutSidebar(g *gocui.Gui, maxY int) error { if v, err := g.SetView("users", 0, 0, sidebarWidth, maxY-1); err != nil { if err != gocui.ErrUnknownView { return err } v.Title = " Users " v.Clear() updateContactsView(g) } return nil } func layoutProfile(g *gocui.Gui, maxX, maxY int) error { viewWidth := maxX - maxX/3 if viewWidth < chatXOffset { viewWidth = 50 } if v, err := g.SetView("profile", viewWidth, 0, maxX-1, maxY-inputHeight-1); err != nil { if err != gocui.ErrUnknownView { return err } v.Title = " Profile " v.Wrap = true } return nil }