diff --git a/go.mod b/go.mod index 5288207..aa5374c 100644 --- a/go.mod +++ b/go.mod @@ -7,4 +7,6 @@ require ( github.com/roblillack/gocoa v0.0.0-20240514094225-79029b8f9f7f ) +require github.com/rodrigocfd/windigo v0.0.0-20230809154420-8faa606d9f5f // indirect + // replace github.com/roblillack/gocoa => ./libs/gocoa diff --git a/go.sum b/go.sum index 26d0109..d022032 100644 --- a/go.sum +++ b/go.sum @@ -2,3 +2,5 @@ github.com/pwiecz/go-fltk v0.0.0-20240511142305-990b442ae1ed h1:7/j/4x3KAwuJB9sW github.com/pwiecz/go-fltk v0.0.0-20240511142305-990b442ae1ed/go.mod h1:uMK5daOr9p+ba2BPs5QadbfaqqrHR5TGj13yWGsAsmw= github.com/roblillack/gocoa v0.0.0-20240514094225-79029b8f9f7f h1:Rgio8nqLhyfyswHoxppubbgu13L7b03CMXecKjM70tA= github.com/roblillack/gocoa v0.0.0-20240514094225-79029b8f9f7f/go.mod h1:zySUFzLK/KSb3KDT903dTRJ2WPmMBbF3a2u8/39UzMg= +github.com/rodrigocfd/windigo v0.0.0-20230809154420-8faa606d9f5f h1:jIXpgDE/hOglaKyTP5ZRqe6rhcJx2dtCan2ncR66qhU= +github.com/rodrigocfd/windigo v0.0.0-20230809154420-8faa606d9f5f/go.mod h1:Vw0QLpSedVsbAFWYIVE/Zb1pa6XPIgwIMTUQQoUG8Wo= diff --git a/ui/button_fltk.go b/ui/button_fltk.go index 87be49e..8fc25c9 100644 --- a/ui/button_fltk.go +++ b/ui/button_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/button_windows.go b/ui/button_windows.go new file mode 100644 index 0000000..114f4b0 --- /dev/null +++ b/ui/button_windows.go @@ -0,0 +1,69 @@ +//go:build !fltk && windows + +package ui + +import ( + "github.com/roblillack/spot" + wui "github.com/rodrigocfd/windigo/ui" + "github.com/rodrigocfd/windigo/win" +) + +type nativeTypeButton = wui.Button + +func (b *Button) callback() { + if b.OnClick != nil { + b.OnClick() + } +} + +func (b *Button) Update(nextControl spot.Control) bool { + next, ok := nextControl.(*Button) + if !ok { + return false + } + + if b.ref == nil { + return false + } + + if next.Title != b.Title { + b.Title = next.Title + b.ref.SetText(b.Title) + } + + b.OnClick = next.OnClick + return true +} + +func (b *Button) Mount(parent spot.Control) any { + if b.ref != nil { + return b.ref + } + + if parent == nil { + return nil + } + + window, ok := parent.(*Window) + if !ok || window == nil || window.ref == nil { + return nil + } + + b.ref = wui.NewButton(window.ref, wui.ButtonOpts(). + Position(win.POINT{X: int32(b.X), Y: int32(b.Y)}). + Size(win.SIZE{Cx: int32(b.Width), Cy: int32(b.Height)}). + Text(b.Title)) + b.ref.On().BnClicked(b.callback) + + return b.ref +} + +func (b *Button) Unmount() { + // if b.ref == nil { + // return + // } + + // b.ref.Destroy() + // b.ref = nil + panic("not implemented") +} diff --git a/ui/checkbox.go b/ui/checkbox.go index f6e0155..f051f10 100644 --- a/ui/checkbox.go +++ b/ui/checkbox.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import "github.com/roblillack/spot" diff --git a/ui/checkbox_fltk.go b/ui/checkbox_fltk.go index b3e9653..420817c 100644 --- a/ui/checkbox_fltk.go +++ b/ui/checkbox_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/dial.go b/ui/dial.go index 4f8c955..a527f5b 100644 --- a/ui/dial.go +++ b/ui/dial.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import "github.com/roblillack/spot" diff --git a/ui/dial_fltk.go b/ui/dial_fltk.go index a42a2d4..b937153 100644 --- a/ui/dial_fltk.go +++ b/ui/dial_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/dropdown.go b/ui/dropdown.go index 051d1e2..df2b0b8 100644 --- a/ui/dropdown.go +++ b/ui/dropdown.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import ( diff --git a/ui/dropdown_fltk.go b/ui/dropdown_fltk.go index 107a427..d2064ac 100644 --- a/ui/dropdown_fltk.go +++ b/ui/dropdown_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/init_fltk.go b/ui/init_fltk.go index d8dec43..6c9abf4 100644 --- a/ui/init_fltk.go +++ b/ui/init_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/init_windows.go b/ui/init_windows.go new file mode 100644 index 0000000..b555e3f --- /dev/null +++ b/ui/init_windows.go @@ -0,0 +1,44 @@ +//go:build !fltk && windows + +package ui + +import ( + "runtime" + + "github.com/roblillack/spot" +) + +// BackendName is the name of the backend. It can be used to check which backend +// is currently in use by the application during runtime. +const BackendName = "windows" + +var activeWindow *Window + +func runOnMainLoop(fn func()) { + if activeWindow == nil { + fn() + } + + activeWindow.ref.RunUiThread(fn) +} + +// Init initializes the UI library for the FLTK backend. It locks the OS thread +// and sets up Spot to be able to intercept the main loop. +func Init() { + runtime.LockOSThread() + spot.RunOnMainLoop = runOnMainLoop +} + +// Run starts the main loop for the FLTK backend. +func Run() { + if activeWindow == nil { + return + } + + ref := activeWindow.ref + if ref == nil { + return + } + + ref.RunAsMain() +} diff --git a/ui/label.go b/ui/label.go index 1e8aacc..18d728b 100644 --- a/ui/label.go +++ b/ui/label.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import ( diff --git a/ui/label_fltk.go b/ui/label_fltk.go index 2494238..73c4dd6 100644 --- a/ui/label_fltk.go +++ b/ui/label_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/progressbar.go b/ui/progressbar.go index 96857ec..176d8c3 100644 --- a/ui/progressbar.go +++ b/ui/progressbar.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import "github.com/roblillack/spot" diff --git a/ui/progressbar_fltk.go b/ui/progressbar_fltk.go index 3acd611..dfb6e81 100644 --- a/ui/progressbar_fltk.go +++ b/ui/progressbar_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/slider.go b/ui/slider.go index a3a491c..124253c 100644 --- a/ui/slider.go +++ b/ui/slider.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import "github.com/roblillack/spot" diff --git a/ui/slider_fltk.go b/ui/slider_fltk.go index f50d3eb..345a494 100644 --- a/ui/slider_fltk.go +++ b/ui/slider_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/spinner.go b/ui/spinner.go index 128a073..2ae14c9 100644 --- a/ui/spinner.go +++ b/ui/spinner.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import "github.com/roblillack/spot" diff --git a/ui/spinner_fltk.go b/ui/spinner_fltk.go index 7614bb4..56b26ca 100644 --- a/ui/spinner_fltk.go +++ b/ui/spinner_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/textfield.go b/ui/textfield.go index 2062e7b..3931f21 100644 --- a/ui/textfield.go +++ b/ui/textfield.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import ( diff --git a/ui/textfield_fltk.go b/ui/textfield_fltk.go index ebc5d44..3d3f7d1 100644 --- a/ui/textfield_fltk.go +++ b/ui/textfield_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/textview.go b/ui/textview.go index 89afbc9..1a82c19 100644 --- a/ui/textview.go +++ b/ui/textview.go @@ -1,3 +1,5 @@ +//go:build ignore + package ui import "github.com/roblillack/spot" diff --git a/ui/textview_fltk.go b/ui/textview_fltk.go index 06ccd85..8ce3488 100644 --- a/ui/textview_fltk.go +++ b/ui/textview_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/window_fltk.go b/ui/window_fltk.go index 27dde4c..e324a43 100644 --- a/ui/window_fltk.go +++ b/ui/window_fltk.go @@ -1,4 +1,4 @@ -//go:build !cocoa && (fltk || !darwin) +//go:build !cocoa && (fltk || (!darwin && !windows)) package ui diff --git a/ui/window_windows.go b/ui/window_windows.go new file mode 100644 index 0000000..0c4b52c --- /dev/null +++ b/ui/window_windows.go @@ -0,0 +1,37 @@ +//go:build !fltk && windows + +package ui + +import ( + "github.com/roblillack/spot" + wui "github.com/rodrigocfd/windigo/ui" + "github.com/rodrigocfd/windigo/win" +) + +type nativeTypeWindow = wui.WindowMain + +func (w *Window) Update(nextComponent spot.Control) bool { + next, ok := nextComponent.(*Window) + if !ok { + return false + } + + if next.Title != w.Title { + w.Title = next.Title + // if w.ref != nil { + // w.ref.SetLabel(w.Title) + // } + } + + return true +} + +func (w *Window) Mount(parent spot.Control) any { + w.ref = wui.NewWindowMain( + wui.WindowMainOpts(). + Title(w.Title). + ClientArea(win.SIZE{Cx: int32(w.Width), Cy: int32(w.Height)})) + + activeWindow = w + return w.ref +}