clean and rename examples

fix syntax
    try new goreadme
    remove autogenerated go readme.md

Signed-off-by: Jeff Carr <jcarr@wit.com>
This commit is contained in:
Jeff Carr 2023-12-03 16:08:39 -06:00
parent fe6a8dd969
commit eab47f738d
35 changed files with 240 additions and 730 deletions

18
.gitignore vendored
View File

@ -3,14 +3,18 @@
# ignore compiled plugins # ignore compiled plugins
*.so *.so
cmds/buttonplugin/buttonplugin examples/buttonplugin/buttonplugin
cmds/console-ui-helloworld/console-ui-helloworld examples/console-ui-helloworld/console-ui-helloworld
cmds/debug/debug examples/debug/debug
cmds/helloworld/helloworld examples/helloworld/helloworld
cmds/textbox/textbox examples/textbox/textbox
cmds/cloudflare/cloudflare examples/cloudflare/cloudflare
cmds/*/helloconsole examples/*/helloconsole
# temporary files when building debian packages # temporary files when building debian packages
/*.deb /*.deb
/files /files
/
# ignore the generated readme
/README-goreadme.md

View File

@ -1,14 +1,21 @@
.PHONY: README.md log .PHONY: README.md log examples
all: README.md all: README.md
reset # reset
@echo @echo
@echo "make examples # will run all the Example demos and commands" @echo "make examples # will run all the Example demos and commands"
@echo "make update # full git update of all the dependencies" @echo "make update # full git update of all the dependencies"
@echo @echo
@echo This Requires working IPv6
@echo
@sleep 1
ifeq (,$(wildcard go.mod))
go mod init gui
go mod tidy
endif
make clean make clean
make plugins make plugins
make cmds-buttonplugin make examples-buttons
build-dep: build-dep:
apt install -f libgtk-3-dev apt install -f libgtk-3-dev
@ -25,30 +32,30 @@ deb:
examples: \ examples: \
all \ all \
cmds-helloworld \ examples-helloworld \
cmds-buttonplugin \ examples-buttons \
cmds-console-ui-helloworld \ examples-console-ui-helloworld \
cmds-textbox \ examples-textbox \
cmds-debug examples-debug
cmds-buttonplugin: examples-buttons:
make -C cmds/buttonplugin make -C examples/buttons
cmds-console-ui-helloworld: examples-console-ui-helloworld:
make -C cmds/console-ui-helloworld make -C examples/console-ui-helloworld
# this is the most basic one. This syntax should always work # this is the most basic one. This syntax should always work
cmds-helloworld: examples-helloworld:
make -C cmds/helloworld make -C examples/helloworld
cmds-debug: examples-debug:
-make -C cmds/debug -make -C examples/debug
cmds-textbox: examples-textbox:
make -C cmds/textbox make -C examples/textbox
cmds-helloconsole: examples-helloconsole:
make -C cmds/plugin-consoleonly make -C examples/plugin-consoleonly
# sync repo to the github backup # sync repo to the github backup
# git remote add github git@github.com:witorg/gui.git # git remote add github git@github.com:witorg/gui.git
@ -65,10 +72,10 @@ github:
@echo @echo
doc: doc:
GO111MODULE="off" godoc -v godoc -v
goget: goget:
GO111MODULE="off" go get -v -t -u go get -v -t -u
make -C toolkit/gocui goget make -C toolkit/gocui goget
make -C toolkit/andlabs goget make -C toolkit/andlabs goget
@ -83,11 +90,11 @@ clean:
plugins: plugins-gocui plugins-andlabs plugins: plugins-gocui plugins-andlabs
plugins-gocui: plugins-gocui:
GO111MODULE="off" go build -C toolkit/gocui -v -buildmode=plugin -o ../gocui.so go build -C toolkit/gocui -v -buildmode=plugin -o ../gocui.so
GO111MODULE="off" go build -C toolkit/nocui -v -buildmode=plugin -o ../nocui.so go build -C toolkit/nocui -v -buildmode=plugin -o ../nocui.so
plugins-andlabs: plugins-andlabs:
GO111MODULE="off" go build -C toolkit/andlabs -v -buildmode=plugin -o ../andlabs.so go build -C toolkit/andlabs -v -buildmode=plugin -o ../andlabs.so
objdump: objdump:
objdump -t toolkit/andlabs.so |less objdump -t toolkit/andlabs.so |less

View File

@ -1,200 +0,0 @@
# 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 Style Guide]: [https://google.github.io/styleguide/go/index](https://google.github.io/styleguide/go/index)
```go
* [Wikipedia Graphical widget]
* [Github mirror]
* [Federated git pull]
* [GO Style Guide]
```
## Functions
### func [DebugWidgetWindow](/debugWidget.go#L52)
`func DebugWidgetWindow(w *Node)`
### func [DebugWindow](/debugWindow.go#L21)
`func DebugWindow()`
Creates a window helpful for debugging this package
### func [ExampleCatcher](/chan.go#L37)
`func ExampleCatcher(f func())`
### func [Indent](/debug.go#L124)
`func Indent(b bool, a ...interface{})`
### func [SetDebug](/debug.go#L28)
`func SetDebug(s bool)`
### func [SetFlag](/debug.go#L50)
`func SetFlag(s string, b bool)`
### func [ShowDebugValues](/debug.go#L82)
`func ShowDebugValues()`
### func [StandardExit](/main.go#L153)
`func StandardExit()`
The window is destroyed and the application exits
TODO: properly exit the plugin since Quit() doesn't do it
### func [Watchdog](/watchdog.go#L16)
`func Watchdog()`
This program sits here.
If you exit here, the whole thing will os.Exit()
TODO: use Ticker
This goroutine can be used like a watchdog timer
## Types
### type [GuiArgs](/structs.go#L29)
`type GuiArgs struct { ... }`
This struct can be used with the go-arg package
#### Variables
```golang
var GuiArg GuiArgs
```
### type [Node](/structs.go#L59)
`type Node struct { ... }`
The Node is a binary tree. This is how all GUI elements are stored
simply the name and the size of whatever GUI element exists
#### func [New](/main.go#L120)
`func New() *Node`
There should only be one of these per application
This is due to restrictions by being cross platform
some toolkit's on some operating systems don't support more than one
Keep things simple. Do the default expected thing whenever possible
### type [Symbol](/plugin.go#L17)
`type Symbol any`
## Sub Packages
* [log](./log)
* [toolkit](./toolkit)
---
Readme created from Go doc with [goreadme](https://github.com/posener/goreadme)

141
README.md
View File

@ -4,19 +4,33 @@ Package gui implements a abstraction layer for Go visual elements.
Definitions: Definitions:
```go
* Toolkit: the underlying GUI library (MacOS gui, Windows gui, gtk, qt, etc) * Toolkit: the underlying GUI library (MacOS gui, Windows gui, gtk, qt, etc)
* Node: A binary tree of all the underlying widgets * Node: A binary tree of all the underlying widgets
```
Principles: Principles:
```go
* Make code using this package simple to use * Make code using this package simple to use
* Hide complexity internally here * Hide complexity internally here
* Isolate the GUI toolkit * Isolate the GUI toolkit
* Widget names should try to match [Wikipedia Graphical widget] * Widget names should try to match [Wikipedia Graphical widget]
* When in doubt, search upward in the binary tree * When in doubt, search upward in the binary tree
* It's ok to guess. Try to do something sensible. * It's ok to guess. Try to do something sensible.
```
Quick Start ## Debian Build
This worked on debian sid (mate-desktop) on 2023/12/03
I didn't record the dependances needed (gtk-dev)
```go
export GO111MODULE="off"
make
```
Hello World Example
```go ```go
// This creates a simple hello world window // This creates a simple hello world window
@ -56,22 +70,12 @@ func addTab(w *gui.Node, title string) {
} }
``` ```
## Debian Build External Toolkits
This worked on debian sid on 2022/10/20
I didn't record the dependances needed
```go ```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) * andlabs - [https://github.com/andlabs/ui](https://github.com/andlabs/ui)
* gocui - [https://github.com/awesome-gocui/gocui](https://github.com/awesome-gocui/gocui) * 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. The next step is to allow this to work against go-gtk and go-qt.
@ -89,75 +93,56 @@ hopefully also things like libSDL, faiface/pixel, slint
Useful links and other Useful links and other
external things which might be useful external things which might be useful
* [Wikipedia Graphical widget](https://en.wikipedia.org/wiki/Graphical_widget) [Wikipedia Graphical widget]: [https://en.wikipedia.org/wiki/Graphical_widget](https://en.wikipedia.org/wiki/Graphical_widget)
* [GO Style Guide](https://google.github.io/styleguide/go/index) Code this way [Github mirror]: [https://github.com/witorg/gui](https://github.com/witorg/gui)
* [MS Windows Application Library Kit](https://github.com/lxn/walk) [Federated git pull]: [https://github.com/forgefed/forgefed](https://github.com/forgefed/forgefed)
* [Federated git pull](https://github.com/forgefed/forgefed) Hopefully this will work for me with gitea [GO Style Guide]: [https://google.github.io/styleguide/go/index](https://google.github.io/styleguide/go/index)
* [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 ```go
* [Wikipedia Graphical widget]
* [Github mirror]
* [Federated git pull]
* [GO Style Guide]
```
## Functions ## Functions
### func [GetDebug](/structs.go#L25) ### func [DebugWidgetWindow](/debugWidget.go#L52)
`func GetDebug() bool` `func DebugWidgetWindow(w *Node)`
### func [GetDebugToolkit](/structs.go#L37) ### func [DebugWindow](/debugWindow.go#L21)
`func GetDebugToolkit() bool` `func DebugWindow()`
### func [IndentPrintln](/structs.go#L188) Creates a window helpful for debugging this package
`func IndentPrintln(a ...interface{})` ### func [ExampleCatcher](/chan.go#L37)
### func [Init](/main.go#L41) `func ExampleCatcher(f func())`
`func Init()` ### func [Indent](/debug.go#L124)
### func [LoadToolkit](/plugin.go#L37) `func Indent(b bool, a ...interface{})`
`func LoadToolkit(name string)` ### func [SetDebug](/debug.go#L28)
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 SetDebug(s bool)`
### func [SetDebugToolkit](/structs.go#L41) ### func [SetFlag](/debug.go#L50)
`func SetDebugToolkit(s bool)` `func SetFlag(s string, b bool)`
### func [ShowDebugValues](/structs.go#L45) ### func [ShowDebugValues](/debug.go#L82)
`func ShowDebugValues()` `func ShowDebugValues()`
### func [StandardClose](/main.go#L83) ### func [StandardExit](/main.go#L153)
`func StandardClose(n *Node)` `func StandardExit()`
The window is destroyed but the application does not quit The window is destroyed and the application exits
TODO: properly exit the plugin since Quit() doesn't do it
### 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](/watchdog.go#L16)
@ -165,43 +150,39 @@ The window is destroyed but the application does not quit
This program sits here. This program sits here.
If you exit here, the whole thing will os.Exit() If you exit here, the whole thing will os.Exit()
TODO: use Ticker
This goroutine can be used like a watchdog timer This goroutine can be used like a watchdog timer
## Types ## Types
### type [GuiConfig](/structs.go#L68) ### type [GuiArgs](/structs.go#L29)
`type GuiConfig struct { ... }` `type GuiArgs struct { ... }`
This struct can be used with the go-arg package
#### Variables #### Variables
```golang ```golang
var Config GuiConfig var GuiArg GuiArgs
``` ```
### type [GuiOptions](/structs.go#L56) ### type [Node](/structs.go#L59)
`type GuiOptions struct { ... }`
This struct can be used with go-arg
### type [Node](/structs.go#L87)
`type Node struct { ... }` `type Node struct { ... }`
The Node is simply the name and the size of whatever GUI element exists The Node is a binary tree. This is how all GUI elements are stored
simply the name and the size of whatever GUI element exists
#### func [NewWindow](/window.go#L15) #### func [New](/main.go#L120)
`func NewWindow() *Node` `func New() *Node`
This routine creates a blank window with a Title and size (W x H) There should only be one of these per application
This is due to restrictions by being cross platform
This routine can not have any arguements due to the nature of how some toolkit's on some operating systems don't support more than one
it can be passed via the 'andlabs/ui' queue which, because it is Keep things simple. Do the default expected thing whenever possible
cross platform, must pass UI changes into the OS threads (that is
my guess).
### type [Symbol](/plugin.go#L17) ### type [Symbol](/plugin.go#L17)
@ -209,6 +190,8 @@ my guess).
## Sub Packages ## Sub Packages
* [log](./log)
* [toolkit](./toolkit) * [toolkit](./toolkit)
--- ---

View File

@ -1,6 +0,0 @@
run: build
./debug
build:
# go build
GO111MODULE="off" go build

View File

@ -1,20 +0,0 @@
// A simple helloworld window
package main
import (
"log"
"git.wit.org/wit/gui"
)
// This creates a window
func helloworld() {
var w *gui.Node
gui.Config.Title = "helloworld golang wit/gui window"
gui.Config.Width = 400
gui.Config.Height = 100
w = gui.NewWindow()
w.NewButton("hello", func () {
log.Println("world")
})
}

View File

@ -1,54 +0,0 @@
package main
import (
"log"
"os"
"time"
"git.wit.org/wit/gui"
)
// This initializes the first window
//
// BUG: THIS PROGRAM DOESN'T EXIT PROPERLY (NOT REALLY A BUG)
//
// Then starts a goroutine to demonstrate how to
// inject things into the GUI
func main() {
log.Println("Starting my Control Panel")
// gui.Init()
// go gui.Main(helloworld)
go gui.Main(gui.DebugWindow)
// go gui.DemoToolkitWindow()
watchGUI()
}
// This demonstrates how to properly interact with the GUI
// You can not involke the GUI from external goroutines in most cases.
func watchGUI() {
var i = 1
for {
log.Println("Waiting", i, "seconds")
i += 1
time.Sleep(1 * time.Second)
if i == 2 {
log.Println("Opening a Debug Window via the gui.Queue()")
gui.Config.Width = 800
gui.Config.Height = 300
gui.Config.Exit = myExit
// gui.DebugWindow()
time.Sleep(1 * time.Second)
// gui.DebugTab()
}
}
}
// TODO: myExit isn't getting used anymore
func myExit(n *gui.Node) {
log.Println()
log.Println("Entered myExit() on node.Name =", n.Name)
log.Println()
os.Exit(0)
}

View File

@ -1,25 +0,0 @@
// This is a simple example
package main
import (
"log"
"git.wit.org/wit/gui"
)
func main() {
// gui.Init()
gui.Main(helloworld)
}
// This creates a window
func helloworld() {
var w *gui.Node
gui.Config.Title = "helloworld golang wit/gui window"
gui.Config.Width = 640
gui.Config.Height = 480
w = gui.NewWindow()
w.NewButton("hello", func () {
log.Println("world")
})
}

View File

@ -1,14 +0,0 @@
run: build
./helloconsole
build-release:
go get -v -u -x .
go install -v -o helloconsole
helloconsole
build:
GO111MODULE="off" go get -v -x .
GO111MODULE="off" go build -v -o helloconsole
update:
GO111MODULE="off" go get -v -u -x .

View File

@ -1,31 +0,0 @@
// This creates a simple hello world window
package main
import (
"log"
"git.wit.org/wit/gui"
arg "github.com/alexflint/go-arg"
)
type LogOptions struct {
LogFile string
Verbose bool
User string `arg:"env:USER"`
}
var args struct {
LogOptions
gui.GuiArgs
}
func init() {
arg.MustParse(&args)
log.Println("Toolkit = ", args.Toolkit)
if (args.GuiDebug) {
gui.DebugWindow()
}
if (args.GuiVerbose) {
gui.SetDebug(true)
}
}

View File

@ -1,33 +0,0 @@
// This is a simple example
package main
import (
"log"
"git.wit.org/wit/gui"
)
func main() {
gui.InitPlugins([]string{"gocui"})
gui.Main(helloworld)
}
// This creates a window
func helloworld() {
var w *gui.Node
gui.Config.Title = "helloworld golang wit/gui window"
gui.Config.Width = 640
gui.Config.Height = 480
w = gui.NewWindow()
w.NewButton("hello", func () {
log.Println("world")
})
w.NewButton("Flags", func () {
log.Println("the debugging flags window")
w.DebugFlags(false)
})
w.NewButton("Widgets", func () {
w.DebugWidgets(false)
log.Println("debug the widgets window")
})
}

View File

@ -1,14 +0,0 @@
run: build
# GOTRACEBACK=all ./textbox --gui-debug
GOTRACEBACK=all ./textbox --gui-debug >/tmp/witgui.log.stderr 2>&1
build-release:
go get -v -u -x .
go build
build:
GO111MODULE="off" go get -v -x .
GO111MODULE="off" GOTRACEBACK=all go build
update:
GO111MODULE="off" go get -v -u -x .

View File

@ -1,96 +0,0 @@
// This creates a simple hello world window
package main
import (
"os"
"log"
"git.wit.org/wit/gui"
arg "github.com/alexflint/go-arg"
)
type LogOptions struct {
LogFile string
Verbose bool
User string `arg:"env:USER"`
}
var args struct {
LogOptions
gui.GuiArgs
}
func main() {
// this implements ./cmd --gui-debug --gui-toolkit, etc
arg.MustParse(&args)
log.Println("Toolkit = ", args.Toolkit)
// gui.SetDebug(true)
// gui.InitPlugins([]string{"gocui"})
gui.Main(initGUI)
}
// This initializes the first window
func initGUI() {
var w *gui.Node
gui.Config.Title = "Hello World"
gui.Config.Width = 642
gui.Config.Height = 481
gui.Config.Exit = myDefaultExit
w = gui.NewWindow()
w.Custom = func () {
log.Println("myDefaultExit(w)")
myDefaultExit(w)
}
addDemoTab(w, "A Simple Tab Demo")
addDemoTab(w, "A Second Tab")
if (args.GuiDebug) {
gui.DebugWindow()
}
if (args.GuiVerbose) {
gui.SetDebug(true)
}
}
func addDemoTab(window *gui.Node, title string) {
var newNode, g *gui.Node
newNode = window.NewTab(title)
log.Println("addDemoTab() newNode START")
// newNode.Dump(true)
g = newNode.NewGroup("group 1")
g1 := g.NewGrid("grid 1", 2, 2)
g1.NewLabel("less")
dd := g1.NewDropdown("more")
dd.AddDropdownName("more 1")
dd.AddDropdownName("more 2")
dd.AddDropdownName("more 3")
// g.SetNext(3,1)
// g1.NewLabel("label (3,1)")
// g.SetNext(3,2)
// g1.NewLabel("label (3,2)")
g2 := newNode.NewGroup("group 2")
tb := g2.NewTextbox("tb")
log.Println("tb =", tb.GetText())
tb.Custom = func() {
s := tb.GetText()
log.Println("text =", s)
}
dd.Custom = func() {
s := dd.GetText()
log.Println("hello world " + args.User + "\n" + s + "\n")
tb.SetText("hello world " + args.User + "\n" + s + "\n")
}
}
func myDefaultExit(n *gui.Node) {
log.Println("You can Do exit() things here")
os.Exit(0)
}

View File

@ -187,7 +187,7 @@ func (n *Node) Standard() *Node {
return n return n
} }
func (n *Node) DoMargin() *Node { func (n *Node) SetMargin() *Node {
log(debugError, "DoMargin() not implemented yet") log(debugError, "DoMargin() not implemented yet")
return n return n
} }

View File

@ -134,7 +134,7 @@ func (n *Node) dumpWidget(b bool) string {
} }
info = n.WidgetType.String() info = n.WidgetType.String()
d = strconv.Itoa(n.id) + " " + info d = strconv.Itoa(n.id) + " " + info + " " + n.Name
var tabs string var tabs string
for i := 0; i < listChildrenDepth; i++ { for i := 0; i < listChildrenDepth; i++ {

40
doc.go
View File

@ -16,7 +16,16 @@ Principles:
* When in doubt, search upward in the binary tree * When in doubt, search upward in the binary tree
* It's ok to guess. Try to do something sensible. * It's ok to guess. Try to do something sensible.
Quick Start Debian Build
This worked on debian sid (mate-desktop) on 2023/12/03
I didn't record the dependances needed (gtk-dev)
export GO111MODULE="off"
make
Hello World Example
// This creates a simple hello world window // This creates a simple hello world window
package main package main
@ -54,18 +63,7 @@ Quick Start
}) })
} }
External Toolkits
Debian Build
This worked on debian sid on 2022/10/20
I didn't record the dependances needed
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
Toolkits
* andlabs - https://github.com/andlabs/ui * andlabs - https://github.com/andlabs/ui
* gocui - https://github.com/awesome-gocui/gocui * gocui - https://github.com/awesome-gocui/gocui
@ -86,16 +84,12 @@ References
Useful links and other Useful links and other
external things which might be useful external things which might be useful
[Wikipedia Graphical widget]: https://en.wikipedia.org/wiki/Graphical_widget * [Wikipedia Graphical widget](https://en.wikipedia.org/wiki/Graphical_widget)
[Github mirror]: https://github.com/witorg/gui * [GO Style Guide](https://google.github.io/styleguide/go/index) Code this way
[Federated git pull]: https://github.com/forgefed/forgefed * [MS Windows Application Library Kit](https://github.com/lxn/walk)
[GO Style Guide]: https://google.github.io/styleguide/go/index * [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.
* [Wikipedia Graphical widget] * [WIT GO projects](https://go.wit.org/) Attempt to model go.uber.org
* [Github mirror]
* [Federated git pull]
* [GO Style Guide]
*/ */
package gui package gui

View File

@ -7,12 +7,12 @@
# #
run: build run: build
./buttonplugin --gui gocui >/tmp/witgui.log.stderr 2>&1 ./buttons --gui andlabs
build-release: build-release:
go get -v -u -x . go get -v -u -x .
go build go build
./buttonplugin ./buttons
build: build:
GO111MODULE="off" go get -v -x . GO111MODULE="off" go get -v -x .

View File

@ -31,22 +31,46 @@ type DNSRecords struct {
func loadDNS(hostname string) { func loadDNS(hostname string) {
log.Println("adding DNS record") log.Println("adding DNS record")
// more2.NewButton(name, func () {
// log.Println(name, "ip =", ip)
// })
newt := mainWindow.NewTab(hostname) newt := mainWindow.NewTab(hostname)
newg := newt.NewGroup("more") newg := newt.NewGroup("more")
more2 := newg.NewGrid("gridnuts", 5, gridH) grid := newg.NewGrid("gridnuts", 5, gridH)
// grid.NewButton("Type", func () {
// log.Println("sort by Type")
// })
typedrop := grid.NewDropdown("type")
typedrop.AddText("A")
typedrop.AddText("AAAA")
typedrop.AddText("CNAME")
typedrop.Custom = func () {
log.Println("custom dropdown() a =", typedrop.Name, typedrop.S)
}
grid.NewButton("Name", func () {
log.Println("sort by Name")
})
grid.NewButton("Protection", func () {
log.Println("sort proxied")
})
grid.NewButton("TTL", func () {
log.Println("sort by TTL")
})
grid.NewButton("Value", func () {
log.Println("sort by Value")
})
newt.NewButton("Save", func () {
log.Println("save stuff to cloudflare")
})
records := getRecords() records := getRecords()
for _, record := range records.Result { for _, record := range records.Result {
more2.NewLabel(record.Type) grid.NewLabel(record.Type)
more2.NewLabel(record.Name) textbox := grid.NewTextbox(record.Name)
textbox.SetText(record.Name)
if (record.Proxied) { if (record.Proxied) {
more2.NewLabel("Proxied") grid.NewLabel("Proxied")
} else { } else {
more2.NewLabel("DNS") grid.NewLabel("DNS")
} }
var ttl, short string var ttl, short string
if (record.TTL == 1) { if (record.TTL == 1) {
@ -54,62 +78,55 @@ func loadDNS(hostname string) {
} else { } else {
ttl = strconv.Itoa(record.TTL) ttl = strconv.Itoa(record.TTL)
} }
more2.NewLabel(ttl) grid.NewLabel(ttl)
// short = fmt.Sprintf("%80s", record.Content) // short = fmt.Sprintf("%80s", record.Content)
short = record.Content short = record.Content
if len(short) > 40 { if len(short) > 40 {
short = short[:40] // Slice the first 20 characters short = short[:40] // Slice the first 20 characters
} }
more2.NewLabel(short)
namebox := grid.NewTextbox(short)
namebox.SetText(short)
fmt.Printf("ID: %s, Type: %s, Name: %s, short Content: %s\n", record.ID, record.Type, record.Name, short) fmt.Printf("ID: %s, Type: %s, Name: %s, short Content: %s\n", record.ID, record.Type, record.Name, short)
fmt.Printf("\tproxied: %b, %b, string TTL: %i\n", record.Proxied, record.Proxiable, ttl) fmt.Printf("\tproxied: %b, %b, string TTL: %i\n", record.Proxied, record.Proxiable, ttl)
} }
} }
func getRecords() *DNSRecords { func getRecords() *DNSRecords {
var url string = os.Getenv("CLOUDFLARE_URL") var url string = os.Getenv("CLOUDFLARE_URL")
req, err := http.NewRequest("GET", url, nil) req, err := http.NewRequest("GET", url, nil)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return nil return nil
} }
var authKey string = os.Getenv("CLOUDFLARE_AUTHKEY") var authKey string = os.Getenv("CLOUDFLARE_AUTHKEY")
var email string = os.Getenv("CLOUDFLARE_EMAIL") var email string = os.Getenv("CLOUDFLARE_EMAIL")
// Set headers // Set headers
req.Header.Set("X-Auth-Key", authKey) req.Header.Set("X-Auth-Key", authKey)
req.Header.Set("X-Auth-Email", email) req.Header.Set("X-Auth-Email", email)
client := &http.Client{} client := &http.Client{}
resp, err := client.Do(req) resp, err := client.Do(req)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return nil return nil
} }
defer resp.Body.Close() defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body) body, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return nil return nil
} }
var records DNSRecords var records DNSRecords
if err := json.Unmarshal(body, &records); err != nil { if err := json.Unmarshal(body, &records); err != nil {
fmt.Println(err) fmt.Println(err)
return nil return nil
} }
// Process the records as needed
/*
for _, record := range records.Result {
fmt.Printf("ID: %s, Type: %s, Name: %s, Content: %s\n", record.ID, record.Type, record.Name, record.Content)
fmt.Printf("\tproxied: %b, %b, TTL: %i\n", record.Proxied, record.Proxiable, record.TTL)
}
*/
return &records return &records
} }

View File

@ -5,7 +5,6 @@ import (
"os" "os"
"fmt" "fmt"
"log" "log"
"strconv"
"git.wit.org/wit/gui" "git.wit.org/wit/gui"
) )
@ -42,10 +41,7 @@ func buttonWindow() {
more = g1.NewGroup("more") more = g1.NewGroup("more")
showCloudflareCredentials(more) showCloudflareCredentials(more)
g1.NewButton("hello", func () { // more2 = g1.NewGrid("gridnuts", gridW, gridH)
log.Println("world")
})
more2 = g1.NewGrid("gridnuts", gridW, gridH)
var domain string = os.Getenv("CLOUDFLARE_DOMAIN") var domain string = os.Getenv("CLOUDFLARE_DOMAIN")
if (domain == "") { if (domain == "") {
@ -66,40 +62,6 @@ func buttonWindow() {
myGui.LoadToolkit("andlabs") myGui.LoadToolkit("andlabs")
}) })
g.NewButton("NewButton(more)", func () {
name := "foobar " + strconv.Itoa(buttonCounter)
log.Println("NewButton(more) Adding button", name)
buttonCounter += 1
more.NewButton(name, func () {
log.Println("Got all the way to main() name =", name)
})
})
g.NewButton("NewButton(more2)", func () {
name := "foobar " + strconv.Itoa(buttonCounter)
log.Println("NewButton(more2) Adding button", name)
buttonCounter += 1
more2.NewButton(name, func () {
log.Println("Got all the way to main() name =", name)
})
})
g.NewButton("NewButton(more2 d)", func () {
name := "d" + strconv.Itoa(buttonCounter)
log.Println("NewButton(more2 d) Adding button", name)
buttonCounter += 1
more2.NewButton(name, func () {
log.Println("Got all the way to main() name =", name)
})
})
g.NewButton("NewGroup()", func () {
name := "neat " + strconv.Itoa(buttonCounter)
log.Println("NewGroup() Adding button", name)
buttonCounter += 1
more.NewGroup(name)
})
g.NewButton("gui.DebugWindow()", func () { g.NewButton("gui.DebugWindow()", func () {
gui.DebugWindow() gui.DebugWindow()
}) })

View File

@ -0,0 +1,23 @@
// This is a simple example
package main
import (
"log"
"git.wit.org/wit/gui"
)
func main() {
helloworld()
// This is just a optional goroutine to watch that things are alive
gui.Watchdog()
}
// This creates a window
func helloworld() {
myGui := gui.New().Default()
myWindow := myGui.NewWindow("helloworld golang wit/gui window")
myWindow.NewButton("hello", func () {
log.Println("world")
})
}

11
go.mod
View File

@ -1,22 +1,25 @@
module git.wit.org/wit/gui module gui
go 1.18 go 1.21.1
require ( require (
git.wit.org/wit/gui v0.8.6
github.com/alexflint/go-arg v1.4.3 github.com/alexflint/go-arg v1.4.3
github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e github.com/andlabs/ui v0.0.0-20200610043537-70a69d6ae31e
github.com/awesome-gocui/gocui v1.1.0 github.com/awesome-gocui/gocui v1.1.0
github.com/davecgh/go-spew v1.1.1
golang.org/x/image v0.0.0-20221017200508-ffcb3fe7d1bf
) )
require ( require (
github.com/alexflint/go-scalar v1.2.0 // indirect github.com/alexflint/go-scalar v1.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/gdamore/encoding v1.0.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect
github.com/gdamore/tcell/v2 v2.6.0 // indirect github.com/gdamore/tcell/v2 v2.6.0 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/rivo/uniseg v0.4.4 // indirect github.com/rivo/uniseg v0.4.4 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/sys v0.5.0 // indirect golang.org/x/sys v0.5.0 // indirect
golang.org/x/term v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect
golang.org/x/text v0.7.0 // indirect golang.org/x/text v0.7.0 // indirect

17
go.sum
View File

@ -1,3 +1,5 @@
git.wit.org/wit/gui v0.8.6 h1:n4V1eSm2LPmObGniX8kTQPT07xxumV5rPuDlXVGz/n8=
git.wit.org/wit/gui v0.8.6/go.mod h1:Bzt8Nzznjmo4AjBZtMg+wJEFNdpGvP6amxacVLgVCWg=
github.com/alexflint/go-arg v1.4.3 h1:9rwwEBpMXfKQKceuZfYcwuc/7YY7tWJbFsgG5cAU/uo= github.com/alexflint/go-arg v1.4.3 h1:9rwwEBpMXfKQKceuZfYcwuc/7YY7tWJbFsgG5cAU/uo=
github.com/alexflint/go-arg v1.4.3/go.mod h1:3PZ/wp/8HuqRZMUUgu7I+e1qcpUbvmS258mRXkFH4IA= github.com/alexflint/go-arg v1.4.3/go.mod h1:3PZ/wp/8HuqRZMUUgu7I+e1qcpUbvmS258mRXkFH4IA=
github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o= github.com/alexflint/go-scalar v1.1.0/go.mod h1:LoFvNMqS1CPrMVltza4LvnGKhaSpc3oyLEBUZVhhS2o=
@ -27,18 +29,19 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69 h1:Lj6HJGCSn5AjxRAH2+r35Mir4icalbqku+CLUtjnvXY=
golang.org/x/image v0.0.0-20220902085622-e7cb96979f69/go.mod h1:doUCurBvlfPMKfmIpRIywoHmhN3VyhnoFDbvIEWF4hY=
golang.org/x/image v0.0.0-20221017200508-ffcb3fe7d1bf h1:nq7IoIHc0jQHd2/cn0Oedp7Z9gH80pVTiDd9bF7u+O4=
golang.org/x/image v0.0.0-20221017200508-ffcb3fe7d1bf/go.mod h1:iyPr49SD/G/TBxYVB/9RRtGUT5eNbo2u4NamWeQcD5c=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@ -59,9 +62,7 @@ golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View File

@ -129,9 +129,10 @@ func searchPaths(name string) *aplug {
return p return p
} }
} else { } else {
log(logError, filename, "was not embedded. Error:", err) log(logError, filename, "was not embedded in the binary. Error:", err)
} }
log(logError, "fuck off")
// attempt to write out the file from the internal resource // attempt to write out the file from the internal resource
filename = "toolkit/" + name + ".so" filename = "toolkit/" + name + ".so"
p := initToolkit(name, filename) p := initToolkit(name, filename)
@ -167,12 +168,20 @@ func searchPaths(name string) *aplug {
// load module // load module
// 1. open the shared object file to load the symbols // 1. open the shared object file to load the symbols
func initToolkit(name string, filename string) *aplug { func initToolkit(name string, filename string) *aplug {
if _, err := os.Stat(filename); err != nil {
if os.IsNotExist(err) {
log(true, "missing plugin", name, "as filename", filename)
return nil
}
}
log(true, "Found plugin", name, "as filename", filename)
plug, err := plugin.Open(filename) plug, err := plugin.Open(filename)
if err != nil { if err != nil {
log(debugGui, "plugin FAILED =", filename, err) log(debugError, "plugin FAILED =", filename, err)
return nil return nil
} }
log(debugGui, "initToolkit() loading plugin =", filename) log(debugPlugin, "initToolkit() loading plugin =", filename)
var newPlug *aplug var newPlug *aplug
newPlug = new(aplug) newPlug = new(aplug)