// Copyright 2014 The gocui Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "errors" "fmt" "github.com/awesome-gocui/gocui" ) func MouseMain() { g, err := gocui.NewGui(gocui.OutputNormal, true) if err != nil { panic(err) } defer g.Close() me.baseGui = g g.Cursor = true g.Mouse = true g.SetManagerFunc(layout) if err := defaultKeybindings(g); err != nil { panic(err) } if err := g.MainLoop(); err != nil && !errors.Is(err, gocui.ErrQuit) { panic(err) } } func layout(g *gocui.Gui) error { maxX, maxY := g.Size() if _, err := g.View("msg"); msgMouseDown && err == nil { moveMsg(g) } if v, err := g.SetView("global", -1, -1, maxX, maxY, 0); err != nil { if !errors.Is(err, gocui.ErrUnknownView) { return err } v.Frame = false } /* if v, err := g.SetView("but1", 2, 2, 22, 7, 0); err != nil { if !errors.Is(err, gocui.ErrUnknownView) { return err } v.SelBgColor = gocui.ColorGreen v.SelFgColor = gocui.ColorBlack fmt.Fprintln(v, "Button 1 - line 1") fmt.Fprintln(v, "Button 1 - line 2") fmt.Fprintln(v, "Button 1 - line 3") fmt.Fprintln(v, "Button 1 - line 4") if _, err := g.SetCurrentView("but1"); err != nil { return err } } if v, err := g.SetView("but2", 24, 2, 44, 4, 0); err != nil { if !errors.Is(err, gocui.ErrUnknownView) { return err } v.SelBgColor = gocui.ColorGreen v.SelFgColor = gocui.ColorBlack fmt.Fprintln(v, "Button 2 - line 1") } */ helplayout(g) updateHighlightedView(g) return nil } func quit(g *gocui.Gui, v *gocui.View) error { return gocui.ErrQuit } func showMsg(g *gocui.Gui, v *gocui.View) error { var l string var err error if _, err := g.SetCurrentView(v.Name()); err != nil { return err } _, cy := v.Cursor() if l, err = v.Line(cy); err != nil { l = "" } maxX, maxY := g.Size() if v, err := g.SetView("msg", maxX/2-10, maxY/2, maxX/2+10, maxY/2+2, 0); err == nil || errors.Is(err, gocui.ErrUnknownView) { v.Clear() v.SelBgColor = gocui.ColorCyan v.SelFgColor = gocui.ColorBlack fmt.Fprintln(v, l) } return nil } func updateHighlightedView(g *gocui.Gui) { mx, my := g.MousePosition() for _, view := range g.Views() { view.Highlight = false } if v, err := g.ViewByPosition(mx, my); err == nil { v.Highlight = true } } func moveMsg(g *gocui.Gui) { mx, my := g.MousePosition() if !movingMsg && (mx != initialMouseX || my != initialMouseY) { movingMsg = true } g.SetView("msg", mx-xOffset, my-yOffset, mx-xOffset+20, my-yOffset+2, 0) } func msgDown(g *gocui.Gui, v *gocui.View) error { initialMouseX, initialMouseY = g.MousePosition() if vx, vy, _, _, err := g.ViewPosition("msg"); err == nil { xOffset = initialMouseX - vx yOffset = initialMouseY - vy msgMouseDown = true } return nil } func globalDown(g *gocui.Gui, v *gocui.View) error { mx, my := g.MousePosition() if vx0, vy0, vx1, vy1, err := g.ViewPosition("msg"); err == nil { if mx >= vx0 && mx <= vx1 && my >= vy0 && my <= vy1 { return msgDown(g, v) } } globalMouseDown = true maxX, _ := g.Size() msg := fmt.Sprintf("Mouse down at: %d,%d", mx, my) x := mx - len(msg)/2 if x < 0 { x = 0 } else if x+len(msg)+1 > maxX-1 { x = maxX - 1 - len(msg) - 1 } if v, err := g.SetView("globalDown", x, my-1, x+len(msg)+1, my+1, 0); err != nil { if !errors.Is(err, gocui.ErrUnknownView) { return err } v.WriteString(msg) } return nil } func mouseUp(g *gocui.Gui, v *gocui.View) error { if msgMouseDown { msgMouseDown = false if movingMsg { movingMsg = false return nil } else { g.DeleteView("msg") } } else if globalMouseDown { globalMouseDown = false g.DeleteView("globalDown") } return nil }