]> Sergey Matveev's repositories - vors.git/blobdiff - cmd/client/gui.go
Chatting ability
[vors.git] / cmd / client / gui.go
index 4b06cacd58e6d44afd319636c5bcc54f8d3bc14cb63ac22b39938d08518cb9e2..4f4051cc5076f99e79b2ef4735148b898fe3e4cf53d572e6a303c3d6a4382b6e 100644 (file)
@@ -17,16 +17,19 @@ package main
 
 import (
        "fmt"
+       "log"
        "sort"
 
        "github.com/jroimartin/gocui"
+       vors "go.stargrave.org/vors/v3/internal"
 )
 
 var (
-       GUI       *gocui.Gui
-       GUIReady  bool
-       GUIReadyC = make(chan struct{})
-       GUIMaxY   int
+       GUI         *gocui.Gui
+       GUIReady    bool
+       GUIReadyC   = make(chan struct{})
+       GUIMaxY     int
+       CurrentView = 0
 )
 
 func guiQuit(gui *gocui.Gui, v *gocui.View) error {
@@ -39,19 +42,65 @@ func mute(gui *gocui.Gui, v *gocui.View) error {
        return nil
 }
 
+func tabHandle(gui *gocui.Gui, v *gocui.View) error {
+       sids := make([]int, 0, len(Streams)+1)
+       sids = append(sids, -1)
+       for sid := range Streams {
+               sids = append(sids, int(sid))
+       }
+       sort.Ints(sids)
+       if CurrentView+1 >= len(sids) {
+               CurrentView = 0
+       } else {
+               CurrentView++
+       }
+       if CurrentView == 0 {
+               gui.SetCurrentView("chat")
+       } else {
+               gui.SetCurrentView(Streams[byte(sids[CurrentView])].name)
+       }
+       return nil
+}
+
+func chatEnter(gui *gocui.Gui, v *gocui.View) error {
+       msg := v.Buffer()
+       if len(msg) > 1 {
+               Ctrl <- vors.ArgsEncode([]byte(vors.CmdChat), []byte(msg[:len(msg)-1]))
+               log.Println("me:", msg[:len(msg)-1])
+       }
+       v.Clear()
+       v.SetCursor(0, 0)
+       return nil
+}
+
 func guiLayout(gui *gocui.Gui) error {
        var maxX int
        maxX, GUIMaxY = gui.Size()
        prevY := 0
-       v, err := gui.SetView("logs", 0, prevY, maxX-1, prevY+10+2)
-       prevY += 10 + 2
+       v, err := gui.SetView("logs", 0, prevY, maxX-1, prevY+7+2)
+       prevY += 7 + 2
        if err != nil {
                if err != gocui.ErrUnknownView {
                        return err
                }
                v.Title = fmt.Sprintf("Logs room=%s", *Room)
                v.Autoscroll = true
+               v.Wrap = true
+       }
+       v, err = gui.SetView("chat", 0, prevY, maxX-1, prevY+2)
+       if err != nil {
+               if err != gocui.ErrUnknownView {
+                       return err
+               }
+               v.Title = "chat"
+               v.Editable = true
+               if err := GUI.SetKeybinding(
+                       "chat", gocui.KeyEnter, gocui.ModNone, chatEnter,
+               ); err != nil {
+                       return err
+               }
        }
+       prevY += 3
        sids := make([]int, 0, len(Streams))
        for sid := range Streams {
                sids = append(sids, int(sid))
@@ -65,7 +114,11 @@ func guiLayout(gui *gocui.Gui) error {
                        if err != gocui.ErrUnknownView {
                                return err
                        }
-                       v.Title = stream.name
+                       if stream.name == *Name {
+                               v.Title = ">" + stream.name + "<"
+                       } else {
+                               v.Title = stream.name
+                       }
                }
                _, err = gui.SetView(stream.name+"-vol", maxX/2, prevY, maxX-1, prevY+2)
                prevY += 3
@@ -78,7 +131,7 @@ func guiLayout(gui *gocui.Gui) error {
        if !GUIReady {
                close(GUIReadyC)
                GUIReady = true
-               gui.SetCurrentView(*Name)
+               gui.SetCurrentView("chat")
        }
        return nil
 }