new-gui/README.md

216 lines
4.8 KiB
Markdown

# gui
Package gui implements a abstraction layer for Go visual elements.
Definitions:
* Toolkit: the underlying GUI library (MacOS gui, Windows gui, gtk, qt, etc)
* Node: A binary tree of all the underlying widgets
Principles:
* Make code using this package simple to use
* Hide complexity internally here
* Isolate the GUI toolkit
* Widget names should try to match [Wikipedia Graphical widget]
* When in doubt, search upward in the binary tree
* It's ok to guess. Try to do something sensible.
Quick Start
```go
// This creates a simple hello world window
package main
import (
"log"
"git.wit.org/wit/gui"
)
var window *gui.Node // This is the beginning of the binary tree of widgets
// go will sit here until the window exits
func main() {
gui.Init()
gui.Main(helloworld)
}
// This initializes the first window and 2 tabs
func helloworld() {
gui.Config.Title = "Hello World golang wit/gui Window"
gui.Config.Width = 640
gui.Config.Height = 480
window := gui.NewWindow()
addTab(window, "A Simple Tab Demo")
addTab(window, "A Second Tab")
}
func addTab(w *gui.Node, title string) {
tab := w.NewTab(title)
group := tab.NewGroup("foo bar")
group.NewButton("hello", func() {
log.Println("world")
})
}
```
## Debian Build
This worked on debian sid on 2022/10/20
I didn't record the dependances needed
```go
GO111MODULE="off" go get -v -t -u git.wit.org/wit/gui
cd ~/go/src/git.wit.org/wit/gui/cmds/helloworld/
GO111MODULE="off" go build -v -x
[./helloworld](./helloworld)
```
Toolkits
* andlabs - [https://github.com/andlabs/ui](https://github.com/andlabs/ui)
* gocui - [https://github.com/awesome-gocui/gocui](https://github.com/awesome-gocui/gocui)
The next step is to allow this to work against go-gtk and go-qt.
TODO: Add Fyne, WASM, native macos & windows, android and
hopefully also things like libSDL, faiface/pixel, slint
## Bugs
"The author's idea of friendly may differ to that of many other people."
-- quote from the minimalistic window manager 'evilwm'
## References
Useful links and other
external things which might be useful
* [Wikipedia Graphical widget](https://en.wikipedia.org/wiki/Graphical_widget)
* [GO Style Guide](https://google.github.io/styleguide/go/index) Code this way
* [MS Windows Application Library Kit](https://github.com/lxn/walk)
* [Federated git pull](https://github.com/forgefed/forgefed) Hopefully this will work for me with gitea
* [Github mirror](https://github.com/wit-go/gui) This repo on mirror. Hopefully I won't have to use this.
* [WIT GO projects](https://go.wit.org/) Attempt to model go.uber.org
## Functions
### func [GetDebug](/structs.go#L25)
`func GetDebug() bool`
### func [GetDebugToolkit](/structs.go#L37)
`func GetDebugToolkit() bool`
### func [IndentPrintln](/structs.go#L188)
`func IndentPrintln(a ...interface{})`
### func [Init](/main.go#L41)
`func Init()`
### func [LoadToolkit](/plugin.go#L37)
`func LoadToolkit(name string)`
loads and initializes a toolkit (andlabs/ui, gocui, etc)
### func [Main](/main.go#L56)
`func Main(f func())`
### func [Queue](/main.go#L77)
`func Queue(f func())`
Other goroutines must use this to access the GUI
You can not acess / process the GUI thread directly from
other goroutines. This is due to the nature of how
Linux, MacOS and Windows work (they all work differently. suprise. surprise.)
For example: gui.Queue(NewWindow())
### func [SetDebug](/structs.go#L29)
`func SetDebug(s bool)`
### func [SetDebugToolkit](/structs.go#L41)
`func SetDebugToolkit(s bool)`
### func [ShowDebugValues](/structs.go#L45)
`func ShowDebugValues()`
### func [StandardClose](/main.go#L83)
`func StandardClose(n *Node)`
The window is destroyed but the application does not quit
### func [StandardExit](/main.go#L90)
`func StandardExit(n *Node)`
The window is destroyed but the application does not quit
### func [Watchdog](/watchdog.go#L16)
`func Watchdog()`
This program sits here.
If you exit here, the whole thing will os.Exit()
This goroutine can be used like a watchdog timer
## Types
### type [GuiConfig](/structs.go#L68)
`type GuiConfig struct { ... }`
#### Variables
```golang
var Config GuiConfig
```
### type [GuiOptions](/structs.go#L56)
`type GuiOptions struct { ... }`
This struct can be used with go-arg
### type [Node](/structs.go#L87)
`type Node struct { ... }`
The Node is simply the name and the size of whatever GUI element exists
#### func [NewWindow](/window.go#L15)
`func NewWindow() *Node`
This routine creates a blank window with a Title and size (W x H)
This routine can not have any arguements due to the nature of how
it can be passed via the 'andlabs/ui' queue which, because it is
cross platform, must pass UI changes into the OS threads (that is
my guess).
### type [Symbol](/plugin.go#L17)
`type Symbol any`
## Sub Packages
* [toolkit](./toolkit)
---
Readme created from Go doc with [goreadme](https://github.com/posener/goreadme)