2015-02-01 03:39:43 +08:00
|
|
|
// 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.
|
|
|
|
|
2014-01-20 00:23:11 +08:00
|
|
|
/*
|
|
|
|
Package gocui allows to create console user interfaces.
|
|
|
|
|
2016-01-30 09:36:10 +08:00
|
|
|
Create a new GUI:
|
|
|
|
|
2016-11-14 04:42:03 +08:00
|
|
|
g, err := gocui.NewGui(gocui.OutputNormal)
|
2016-10-24 13:26:59 +08:00
|
|
|
if err != nil {
|
2016-01-30 09:36:10 +08:00
|
|
|
// handle error
|
2014-01-20 00:23:11 +08:00
|
|
|
}
|
2016-01-30 09:36:10 +08:00
|
|
|
defer g.Close()
|
|
|
|
|
2016-10-24 14:36:23 +08:00
|
|
|
// Set GUI managers and key bindings
|
2016-01-30 09:36:10 +08:00
|
|
|
// ...
|
|
|
|
|
|
|
|
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
|
|
|
|
// handle error
|
2014-01-20 00:23:11 +08:00
|
|
|
}
|
2016-01-30 09:36:10 +08:00
|
|
|
|
2016-10-24 14:36:23 +08:00
|
|
|
Set GUI managers:
|
2016-01-30 09:36:10 +08:00
|
|
|
|
2016-10-24 14:36:23 +08:00
|
|
|
g.SetManager(mgr1, mgr2)
|
2016-01-30 09:36:10 +08:00
|
|
|
|
2016-10-24 14:36:23 +08:00
|
|
|
Managers are in charge of GUI's layout and can be used to build widgets. On
|
|
|
|
each iteration of the GUI's main loop, the Layout function of each configured
|
|
|
|
manager is executed. Managers are used to set-up and update the application's
|
|
|
|
main views, being possible to freely change them during execution. Also, it is
|
|
|
|
important to mention that a main loop iteration is executed on each reported
|
|
|
|
event (key-press, mouse event, window resize, etc).
|
2016-01-30 09:44:09 +08:00
|
|
|
|
|
|
|
GUIs are composed by Views, you can think of it as buffers. Views implement the
|
|
|
|
io.ReadWriter interface, so you can just write to them if you want to modify
|
|
|
|
their content. The same is valid for reading.
|
2016-01-30 09:36:10 +08:00
|
|
|
|
2016-01-30 09:38:49 +08:00
|
|
|
Create and initialize a view with absolute coordinates:
|
2016-01-30 09:36:10 +08:00
|
|
|
|
|
|
|
if v, err := g.SetView("viewname", 2, 2, 22, 7); err != nil {
|
|
|
|
if err != gocui.ErrUnknownView {
|
|
|
|
// handle error
|
2014-01-20 00:23:11 +08:00
|
|
|
}
|
2016-01-30 09:36:10 +08:00
|
|
|
fmt.Fprintln(v, "This is a new view")
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
2016-01-30 14:50:01 +08:00
|
|
|
Views can also be created using relative coordinates:
|
2016-01-30 09:36:10 +08:00
|
|
|
|
|
|
|
maxX, maxY := g.Size()
|
|
|
|
if v, err := g.SetView("viewname", maxX/2-30, maxY/2, maxX/2+30, maxY/2+2); err != nil {
|
|
|
|
// ...
|
|
|
|
}
|
|
|
|
|
|
|
|
Configure keybindings:
|
|
|
|
|
|
|
|
if err := g.SetKeybinding("viewname", gocui.KeyEnter, gocui.ModNone, fcn); err != nil {
|
|
|
|
// handle error
|
|
|
|
}
|
|
|
|
|
2016-01-30 14:50:01 +08:00
|
|
|
gocui implements full mouse support that can be enabled with:
|
2016-01-30 09:36:10 +08:00
|
|
|
|
|
|
|
g.Mouse = true
|
|
|
|
|
|
|
|
Mouse events are handled like any other keybinding:
|
|
|
|
|
|
|
|
if err := g.SetKeybinding("viewname", gocui.MouseLeft, gocui.ModNone, fcn); err != nil {
|
|
|
|
// handle error
|
|
|
|
}
|
|
|
|
|
2016-02-01 22:08:39 +08:00
|
|
|
IMPORTANT: Views can only be created, destroyed or updated in three ways: from
|
2016-10-25 17:41:17 +08:00
|
|
|
the Layout function within managers, from keybinding callbacks or via
|
|
|
|
*Gui.Execute(). The reason for this is that it allows gocui to be
|
2016-11-14 04:40:01 +08:00
|
|
|
concurrent-safe. So, if you want to update your GUI from a goroutine, you must
|
2016-10-25 17:41:17 +08:00
|
|
|
use *Gui.Execute(). For example:
|
2016-02-01 22:08:39 +08:00
|
|
|
|
|
|
|
g.Execute(func(g *gocui.Gui) error {
|
|
|
|
v, err := g.View("viewname")
|
|
|
|
if err != nil {
|
|
|
|
// handle error
|
|
|
|
}
|
|
|
|
v.Clear()
|
|
|
|
fmt.Fprintln(v, "Writing from different goroutines")
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
|
2016-01-30 09:36:10 +08:00
|
|
|
By default, gocui provides a basic edition mode. This mode can be extended
|
2016-10-27 06:26:59 +08:00
|
|
|
and customized creating a new Editor and assigning it to *View.Editor:
|
2016-01-30 09:36:10 +08:00
|
|
|
|
|
|
|
type Editor interface {
|
|
|
|
Edit(v *View, key Key, ch rune, mod Modifier)
|
|
|
|
}
|
|
|
|
|
|
|
|
DefaultEditor can be taken as example to create your own custom Editor:
|
|
|
|
|
2016-01-30 10:01:54 +08:00
|
|
|
var DefaultEditor Editor = EditorFunc(simpleEditor)
|
2016-01-30 09:36:10 +08:00
|
|
|
|
|
|
|
func simpleEditor(v *View, key Key, ch rune, mod Modifier) {
|
|
|
|
switch {
|
|
|
|
case ch != 0 && mod == 0:
|
|
|
|
v.EditWrite(ch)
|
|
|
|
case key == KeySpace:
|
|
|
|
v.EditWrite(' ')
|
|
|
|
case key == KeyBackspace || key == KeyBackspace2:
|
|
|
|
v.EditDelete(true)
|
|
|
|
// ...
|
2014-01-20 00:23:11 +08:00
|
|
|
}
|
|
|
|
}
|
2016-01-30 09:36:10 +08:00
|
|
|
|
2016-04-28 07:22:15 +08:00
|
|
|
Colored text:
|
|
|
|
|
|
|
|
Views allow to add colored text using ANSI colors. For example:
|
|
|
|
|
|
|
|
fmt.Fprintln(v, "\x1b[0;31mHello world")
|
|
|
|
|
2016-01-30 09:36:10 +08:00
|
|
|
For more information, see the examples in folder "_examples/".
|
2014-01-20 00:23:11 +08:00
|
|
|
*/
|
|
|
|
package gocui
|