fyne changes to see if it can work

This commit is contained in:
Jeff Carr 2025-03-04 01:57:59 -06:00
parent dcd32c255c
commit f65d80862e
11 changed files with 242 additions and 33 deletions

View File

@ -26,6 +26,10 @@ non-plugin:
go build -v -x go build -v -x
./fyne ./fyne
GO111-non-plugin:
GO111MODULE=off go build -v -x
./fyne
check-git-clean: check-git-clean:
@git diff-index --quiet HEAD -- || (echo "Git repository is dirty, please commit your changes first"; exit 1) @git diff-index --quiet HEAD -- || (echo "Git repository is dirty, please commit your changes first"; exit 1)

View File

@ -1,5 +1,18 @@
# nogui # fyne
Package gui implements a abstraction layer for Go visual elements. Package gui implements a abstraction layer for Go visual elements.
This is a sample plugin. It's a skeleton intended to be used when making a new toolkit plugin. This is a sample plugin. It's a skeleton intended to be used when making a new toolkit plugin.
fyne appears to require:
runtime.LockOSThread() // Ensure main stays on one OS thread
a := app.New()
w := a.NewWindow("Fyne Plugin Fix")
w.ShowAndRun()
error:
gui doing TestDraw() Forge: (this kinda works sometimes)
panic: Run() or ShowAndRun() must be called from main goroutine
so for fyne to work, there must be a protocol buffer GO GUI plugin first that
can spawn and talk to fyne

View File

@ -7,6 +7,8 @@ package main
*/ */
import ( import (
"slices"
"go.wit.com/lib/protobuf/guipb" "go.wit.com/lib/protobuf/guipb"
"go.wit.com/log" "go.wit.com/log"
"go.wit.com/toolkits/tree" "go.wit.com/toolkits/tree"
@ -105,22 +107,54 @@ func addText(n *tree.Node, s string) {
// w.AddText(s) // w.AddText(s)
} }
func enableWidget(n *tree.Node) {
log.Info("do enable() here")
}
func disableWidget(n *tree.Node) {
log.Info("do enable() here")
}
func setChecked(n *tree.Node, b bool) { func setChecked(n *tree.Node, b bool) {
log.Info("do enable() here") log.Info("do enable() here")
} }
func showTable(n *guipb.Table) {
log.Info("do enable() here")
}
func toolkitClose() { func toolkitClose() {
log.Info("do enable() here") log.Info("do enable() here")
} }
func showTable(t *guipb.Table) {
log.Info("gocui: should show table here")
if t == nil {
return
}
log.Info("gocui: table.Title", t.Title)
}
func enableWidget(n *tree.Node) {
tk := n.TK.(*guiWidget)
tk.Enable()
}
func disableWidget(n *tree.Node) {
tk := n.TK.(*guiWidget)
tk.Disable()
}
func showWidget(n *tree.Node) {
tk := n.TK.(*guiWidget)
tk.Show()
}
func hideWidget(n *tree.Node) {
tk := n.TK.(*guiWidget)
if n.WidgetType == widget.Window {
// tk.windowFrame.Hide()
// tk.hideWidgets()
}
tk.Hide()
tk.deleteWidget()
}
func (tk *guiWidget) deleteWidget() {
log.Info("gocui deleteWidget() looking for child to delete:", tk.cuiName)
p := tk.parent
for i, child := range p.children {
if tk == child {
log.Info("deleteWidget() found parent with child to delete:", i, child.cuiName)
p.children = slices.Delete(p.children, i, i+1)
}
}
}

View File

@ -17,8 +17,8 @@ var WARN *log.LogFlag
var ERROR *log.LogFlag var ERROR *log.LogFlag
func init() { func init() {
full := "toolkit/nocui" full := "toolkit/fyne"
short := "nocui" short := "fyne"
NOW = log.NewFlag("NOW", true, full, short, "temp debugging stuff") NOW = log.NewFlag("NOW", true, full, short, "temp debugging stuff")
INFO = log.NewFlag("INFO", true, full, short, "normal debugging stuff") INFO = log.NewFlag("INFO", true, full, short, "normal debugging stuff")

View File

@ -9,6 +9,7 @@ import (
"fyne.io/fyne/v2/app" "fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"go.wit.com/log"
) )
var a fyne.App var a fyne.App
@ -16,6 +17,7 @@ var w fyne.Window
var w2 fyne.Window var w2 fyne.Window
func fynetest() { func fynetest() {
log.Info("FYNE TEST START")
a = app.New() a = app.New()
w = a.NewWindow("Hello") w = a.NewWindow("Hello")
@ -28,6 +30,7 @@ func fynetest() {
}), }),
)) ))
log.Info("FYNE TEST SHOW")
w.Show() w.Show()
// bobWindow() // bobWindow()

54
main.go
View File

@ -8,34 +8,36 @@ package main
*/ */
import ( import (
"runtime"
"fyne.io/fyne/v2/app"
"go.wit.com/log" "go.wit.com/log"
) )
var PLUGIN string = "fyne" var PLUGIN string = "fyne"
func blah() {
fynetest()
a.Run()
}
func initPlugin() { func initPlugin() {
log.Log(INFO, "Init()") log.Log(INFO, "Init()")
me.myTree = initTree() me.myTree = initTree()
/*
me.myTree.PluginName = "nocui"
// me.myTree.ActionFromChannel = doAction
me.myTree.NodeAction = newaction
me.myTree.Add = Add
me.myTree.SetTitle = SetTitle
me.myTree.SetLabel = SetLabel
me.myTree.SetText = SetText
me.myTree.AddText = AddText
*/
me.exit = false me.exit = false
log.Log(INFO, "Init() END")
showOptions() showOptions()
go simpleStdin() go simpleStdin()
log.Log(INFO, "Init() FYNE END")
// blah()
me.myTree.InitOK()
}
func init() {
// fynetest()
// a.Run()
} }
// this must be defined for plugin's, but is never run // this must be defined for plugin's, but is never run
@ -44,3 +46,25 @@ func main() {
fynetest() fynetest()
a.Run() a.Run()
} }
// this is called at the very initial connection
// between the app and this gocui plugin
// this is a good place to initialize gocui's default behavior
func toolkitInit() {
log.Log(INFO, "TOOLKIT Init()")
me.exit = false
showOptions()
log.Log(INFO, "TOOLKIT Init() END")
fynetest()
go a.Run()
}
func testmain() {
runtime.LockOSThread() // Ensure main stays on one OS thread
a := app.New()
w := a.NewWindow("Fyne Plugin Fix")
w.ShowAndRun()
// use w.QueueUpdate() to talk to fyne (?)
}

63
node.go Normal file
View File

@ -0,0 +1,63 @@
// Copyright 2017-2025 WIT.COM Inc. All rights reserved.
// Use of this source code is governed by the GPL 3.0
package main
import (
"go.wit.com/widget"
)
func (tk *guiWidget) WidgetType() widget.WidgetType {
if tk.node == nil {
return widget.Label
}
return tk.node.WidgetType
}
func (tk *guiWidget) WidgetId() int {
return tk.node.WidgetId
}
func (tk *guiWidget) GetLabel() string {
return tk.node.GetLabel()
}
func (tk *guiWidget) IsEnabled() bool {
return tk.node.IsEnabled()
}
func (tk *guiWidget) Checked() bool {
return tk.node.State.Checked
}
func (tk *guiWidget) Hidden() bool {
if tk.node == nil {
return false
}
if tk.parent == nil {
return tk.node.Hidden()
}
if tk.parent.WidgetId() == 0 {
return tk.node.Hidden()
}
if tk.parent.Hidden() {
return true
}
return tk.node.Hidden()
}
func (tk *guiWidget) Direction() widget.Orientation {
return tk.node.State.Direction
}
func (tk *guiWidget) GridW() int {
return tk.node.State.AtW
}
func (tk *guiWidget) GridH() int {
return tk.node.State.AtH
}
func (tk *guiWidget) SetChecked(b bool) {
tk.node.State.Checked = b
}

46
plugin.go Normal file
View File

@ -0,0 +1,46 @@
package main
import (
"go.wit.com/log"
"go.wit.com/widget"
)
func (tk *guiWidget) Show() {
}
func (tk *guiWidget) Hide() {
}
func (tk *guiWidget) Disable() {
if tk == nil {
log.Info("widget is nil")
return
}
switch tk.WidgetType() {
case widget.Box:
return
case widget.Button:
return
default:
log.Log(NOW, "fixme")
}
}
func (tk *guiWidget) Enable() {
if tk == nil {
log.Info("widget is nil")
return
}
switch tk.WidgetType() {
case widget.Box:
// hideDisable()
return
case widget.Button:
// tk.restoreEnableColor()
return
default:
log.Log(NOW, "fixme")
}
}

View File

@ -33,7 +33,7 @@ func showOptions() {
func simpleStdin() { func simpleStdin() {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
log.Warn("nocui YAHOOOO Recovered in simpleStdin()", r) log.Warn("fyne YAHOOOO Recovered in simpleStdin()", r)
log.Println("Recovered from panic:", r) log.Println("Recovered from panic:", r)
log.Println("Stack trace:") log.Println("Stack trace:")
debug.PrintStack() debug.PrintStack()

View File

@ -8,6 +8,10 @@ import (
// stores the raw toolkit internals // stores the raw toolkit internals
type guiWidget struct { type guiWidget struct {
parent *guiWidget
children []*guiWidget
node *tree.Node // the pointer back to the tree
cuiName string
Width int Width int
Height int Height int

View File

@ -32,6 +32,9 @@ package main
*/ */
import ( import (
"time"
log "go.wit.com/log"
"go.wit.com/toolkits/tree" "go.wit.com/toolkits/tree"
"go.wit.com/widget" "go.wit.com/widget"
) )
@ -49,9 +52,20 @@ func Callback(guiCallback chan widget.Action) {
func PluginChannel() chan widget.Action { func PluginChannel() chan widget.Action {
initOnce.Do(initPlugin) initOnce.Do(initPlugin)
for {
if me.myTree != nil {
break
}
log.Info("me.myTree == nil")
time.Sleep(300 * time.Millisecond)
}
return me.myTree.PluginChannel() return me.myTree.PluginChannel()
} }
func FrozenChannel() chan widget.Action {
return me.myTree.FrozenChannel()
}
func initTree() *tree.TreeInfo { func initTree() *tree.TreeInfo {
t := tree.New() t := tree.New()
t.PluginName = PLUGIN t.PluginName = PLUGIN
@ -64,7 +78,11 @@ func initTree() *tree.TreeInfo {
t.Enable = enableWidget t.Enable = enableWidget
t.Disable = disableWidget t.Disable = disableWidget
t.Show = showWidget
t.Hide = hideWidget
t.SetChecked = setChecked t.SetChecked = setChecked
t.ToolkitInit = toolkitInit
t.ToolkitClose = toolkitClose t.ToolkitClose = toolkitClose
t.ShowTable = showTable t.ShowTable = showTable