naive/naive_darwin.go
2025-01-20 07:34:39 +01:00

98 lines
3.2 KiB
Go

package naive
import (
"github.com/progrium/darwinkit/macos/appkit"
"github.com/progrium/darwinkit/macos/foundation"
"github.com/progrium/darwinkit/objc"
)
func startNativeApp(view View) {
if nativeAppWindow != nil {
return
}
app := appkit.Application_SharedApplication()
delegate := &appkit.ApplicationDelegate{}
delegate.SetApplicationDidFinishLaunching(func(notification foundation.Notification) {
w := appkit.NewWindowWithSize(720, 440)
nativeAppWindow = &w
objc.Retain(nativeAppWindow)
nativeAppWindow.SetTitle(appTitle)
nativeAppWindow.SetContentView(view.toNative())
nativeAppWindow.Center()
nativeAppWindow.MakeKeyAndOrderFront(nil)
nativeAppWindow.SetFrameAutosaveName(appkit.WindowFrameAutosaveName(appTitle))
setSystemBar(app)
app.SetActivationPolicy(appkit.ApplicationActivationPolicyRegular)
app.ActivateIgnoringOtherApps(true)
})
delegate.SetApplicationWillFinishLaunching(func(foundation.Notification) {
setMainMenu(app)
})
delegate.SetApplicationShouldTerminateAfterLastWindowClosed(func(appkit.Application) bool {
return true
})
app.SetDelegate(delegate)
app.Run()
}
type (
View interface {
toNative() appkit.IView
}
)
var (
nativeAppWindow *appkit.Window
)
func nativeSetView(view View) {
nativeAppWindow.SetContentView(view.toNative())
}
func setNativeTitle(title string) {
nativeAppWindow.SetTitle(title)
}
func setMainMenu(app appkit.Application) {
menu := appkit.NewMenuWithTitle("main")
app.SetMainMenu(menu)
mainMenuItem := appkit.NewMenuItemWithSelector("", "", objc.Selector{})
mainMenuMenu := appkit.NewMenuWithTitle("App")
mainMenuMenu.AddItem(appkit.NewMenuItemWithAction("Hide", "h", func(sender objc.Object) { app.Hide(nil) }))
mainMenuMenu.AddItem(appkit.NewMenuItemWithAction("Quit", "q", func(sender objc.Object) { app.Terminate(nil) }))
mainMenuItem.SetSubmenu(mainMenuMenu)
menu.AddItem(mainMenuItem)
testMenuItem := appkit.NewMenuItemWithSelector("", "", objc.Selector{})
editMenu := appkit.NewMenuWithTitle("Edit")
editMenu.AddItem(appkit.NewMenuItemWithSelector("Select All", "a", objc.Sel("selectAll:")))
editMenu.AddItem(appkit.MenuItem_SeparatorItem())
editMenu.AddItem(appkit.NewMenuItemWithSelector("Copy", "c", objc.Sel("copy:")))
editMenu.AddItem(appkit.NewMenuItemWithSelector("Paste", "v", objc.Sel("paste:")))
editMenu.AddItem(appkit.NewMenuItemWithSelector("Cut", "x", objc.Sel("cut:")))
editMenu.AddItem(appkit.NewMenuItemWithSelector("Undo", "z", objc.Sel("undo:")))
editMenu.AddItem(appkit.NewMenuItemWithSelector("Redo", "Z", objc.Sel("redo:")))
testMenuItem.SetSubmenu(editMenu)
menu.AddItem(testMenuItem)
}
func setSystemBar(app appkit.Application) {
item := appkit.StatusBar_SystemStatusBar().StatusItemWithLength(appkit.VariableStatusItemLength)
objc.Retain(&item)
img := appkit.Image_ImageWithSystemSymbolNameAccessibilityDescription("multiply.circle.fill", "A multiply symbol inside a filled circle.")
item.Button().SetImage(img)
menu := appkit.NewMenuWithTitle("main")
menu.AddItem(appkit.NewMenuItemWithAction("Hide", "h", func(sender objc.Object) { app.Hide(nil) }))
menu.AddItem(appkit.NewMenuItemWithAction("Quit", "q", func(sender objc.Object) { app.Terminate(nil) }))
item.SetMenu(menu)
}