new-gui/README-goreadme.md

282 lines
5.8 KiB
Markdown
Raw Normal View History

# gui
Package gui implements a abstraction layer for Go visual elements.
Definitions:
```go
* Toolkit: the underlying GUI library (MacOS gui, Windows gui, gtk, qt, etc)
* Node: A binary tree of all the underlying widgets
```
Principles:
```go
* 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
```go
* 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](https://en.wikipedia.org/wiki/Graphical_widget)
[Github mirror]: [https://github.com/witorg/gui](https://github.com/witorg/gui)
[Federated git pull]: [https://github.com/forgefed/forgefed](https://github.com/forgefed/forgefed)
```go
* [Wikipedia Graphical widget]
* [Github mirror]
* [Federated git pull]
```
## Functions
### func [DebugTab](/example_window_debug.go#L26)
`func DebugTab()`
this function is used by the examples to add a tab
dynamically to the bugWin node
TODO: make this smarter once this uses toolkit/
### func [DebugWindow](/example_window_debug.go#L14)
`func DebugWindow()`
Creates a window helpful for debugging this package
### func [DemoWindow](/example_window_demo.go#L10)
`func DemoWindow()`
This creates a window that shows how this package works
### func [GetDebug](/structs.go#L25)
`func GetDebug() bool`
### func [GetDebugToolkit](/structs.go#L37)
`func GetDebugToolkit() bool`
### func [GolangDebugWindow](/example_window_golang_debug.go#L12)
`func GolangDebugWindow()`
### func [IndentPrintln](/structs.go#L188)
`func IndentPrintln(a ...interface{})`
### func [Init](/main.go#L41)
`func Init()`
### func [LoadToolkit](/plugin.go#L50)
`func LoadToolkit(name string) bool`
loads and initializes a toolkit (andlabs/ui, gocui, etc)
### func [Main](/main.go#L86)
`func Main(f func())`
This should not pass a function
### 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#L128)
`func StandardClose(n *Node)`
The window is destroyed but the application does not quit
### func [StandardExit](/main.go#L135)
`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 [GuiDebug](/structs.go#L56)
`type GuiDebug 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 [NewStandardWindow](/example_window_demo.go#L22)
`func NewStandardWindow(title string) *Node`
#### 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).
This example demonstrates how to create a NewWindow()
Interacting with a GUI in a cross platform fashion adds some
unusual problems. To obvuscate those, andlabs/ui starts a
goroutine that interacts with the native gui toolkits
on the Linux, MacOS, Windows, etc.
Because of this oddity, to initialize a new window, the
function is not passed any arguements and instead passes
the information via the Config type.
```golang
package main
import (
"git.wit.org/wit/gui"
)
func main() {
// Define the name and size
gui.Config.Title = "WIT GUI Window 1"
gui.Config.Width = 640
gui.Config.Height = 480
// Create the Window
gui.NewWindow()
}
```
Output:
```
You get a window
```
### type [Symbol](/plugin.go#L17)
`type Symbol any`
## Sub Packages
* [toolkit](./toolkit)
---
Readme created from Go doc with [goreadme](https://github.com/posener/goreadme)