Add global reference for application

Add default application meu for Mac
Add window example
Fix invalid accelerator error logging
This commit is contained in:
Lea Anthony 2022-12-15 21:21:19 +11:00
commit faf418eac0
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
6 changed files with 148 additions and 15 deletions

1
exp/.gitignore vendored
View file

@ -1,3 +1,4 @@
examples/kitchensink/kitchensink
cmd/wails/wails
/examples/systray/systray
/examples/window/window

View file

@ -12,13 +12,6 @@ import (
func main() {
app := application.New()
// Create menu
appMenu := app.NewMenu()
appMenu.AddSubmenu("")
fileMenu := appMenu.AddSubmenu("File")
fileMenu.Add("New")
app.SetMenu(appMenu)
// Create window
myWindow := app.NewWindow()
myWindow.On(events.Mac.WindowDidBecomeMain, func() {

View file

@ -11,23 +11,33 @@ import (
"github.com/wailsapp/wails/exp/pkg/options"
)
var globalApplication *App
func init() {
runtime.LockOSThread()
}
func New() *App {
if globalApplication != nil {
return globalApplication
}
return NewWithOptions(nil)
}
func NewWithOptions(appOptions *options.Application) *App {
if globalApplication != nil {
return globalApplication
}
if appOptions == nil {
appOptions = options.ApplicationDefaults
}
return &App{
result := &App{
options: appOptions,
applicationEventListeners: make(map[uint][]func()),
systemTrays: make(map[uint]*SystemTray),
}
globalApplication = result
return result
}
type platformApp interface {
@ -172,9 +182,8 @@ func (a *App) Run() error {
go systray.Run()
}
if a.ApplicationMenu != nil {
a.impl.setApplicationMenu(a.ApplicationMenu)
}
// set the application menu
a.impl.setApplicationMenu(a.ApplicationMenu)
return a.impl.run()
}

View file

@ -43,6 +43,81 @@ static void setApplicationMenu(void *menu) {
[NSApp setMainMenu:menu];
}
// Get the application name
static char *getAppName(void) {
NSString *appName = [NSRunningApplication currentApplication].localizedName;
if( appName == nil ) {
appName = [[NSProcessInfo processInfo] processName];
}
return strdup([appName UTF8String]);
}
// Call the copy selector on the pasteboard
static void copyToPasteboard(char *text) {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents];
[pasteboard setString:[NSString stringWithUTF8String:text] forType:NSPasteboardTypeString];
}
// Call the paste selector on the pasteboard
static char *pasteFromPasteboard(void) {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSString *text = [pasteboard stringForType:NSPasteboardTypeString];
if( text == nil ) {
return NULL;
}
return strdup([text UTF8String]);
}
// Call paste selector to paste text
static void paste(void) {
[NSApp sendAction:@selector(paste:) to:nil from:nil];
}
// Call copy selector to copy text
static void copy(void) {
[NSApp sendAction:@selector(copy:) to:nil from:nil];
}
// Call cut selector to cut text
static void cut(void) {
[NSApp sendAction:@selector(cut:) to:nil from:nil];
}
// Call selectAll selector to select all text
static void selectAll(void) {
[NSApp sendAction:@selector(selectAll:) to:nil from:nil];
}
// Call delete selector to delete text
static void delete(void) {
[NSApp sendAction:@selector(delete:) to:nil from:nil];
}
// Call undo selector to undo text
static void undo(void) {
[NSApp sendAction:@selector(undo:) to:nil from:nil];
}
// Call redo selector to redo text
static void redo(void) {
[NSApp sendAction:@selector(redo:) to:nil from:nil];
}
// Call startSpeaking selector to start speaking text
static void startSpeaking(void) {
[NSApp sendAction:@selector(startSpeaking:) to:nil from:nil];
}
// Call stopSpeaking selector to stop speaking text
static void stopSpeaking(void) {
[NSApp sendAction:@selector(stopSpeaking:) to:nil from:nil];
}
static void pasteAndMatchStyle(void) {
[NSApp sendAction:@selector(pasteAndMatchStyle:) to:nil from:nil];
}
*/
import "C"
import (
@ -56,22 +131,73 @@ type macosApp struct {
applicationMenu unsafe.Pointer
}
func (m macosApp) setApplicationMenu(menu *Menu) {
func (m *macosApp) setApplicationMenu(menu *Menu) {
if menu == nil {
// Create a default menu for mac
menu = m.createDefaultApplicationMenu()
}
menu.Update()
// Convert impl to macosMenu object
m.applicationMenu = (menu.impl).(*macosMenu).nsMenu
C.setApplicationMenu(m.applicationMenu)
}
func (m macosApp) run() error {
func (m *macosApp) run() error {
C.run()
return nil
}
func (m macosApp) destroy() {
func (m *macosApp) destroy() {
C.destroyApp()
}
func (m *macosApp) createDefaultApplicationMenu() *Menu {
// Create a default menu for mac
menu := NewMenu()
cAppName := C.getAppName()
defer C.free(unsafe.Pointer(cAppName))
appName := C.GoString(cAppName)
appMenu := menu.AddSubmenu(appName)
appMenu.Add("Quit " + appName).SetAccelerator("CmdOrCtrl+q").OnClick(func(ctx *Context) {
globalApplication.Quit()
})
editMenu := menu.AddSubmenu("Edit")
editMenu.Add("Undo").SetAccelerator("CmdOrCtrl+z").OnClick(func(ctx *Context) {
C.undo()
})
editMenu.Add("Redo").SetAccelerator("CmdOrCtrl+Shift+z").OnClick(func(ctx *Context) {
C.redo()
})
editMenu.AddSeparator()
editMenu.Add("Cut").SetAccelerator("CmdOrCtrl+x").OnClick(func(ctx *Context) {
C.cut()
})
editMenu.Add("Copy").SetAccelerator("CmdOrCtrl+c").OnClick(func(ctx *Context) {
C.copy()
})
editMenu.Add("Paste").SetAccelerator("CmdOrCtrl+v").OnClick(func(ctx *Context) {
C.paste()
})
editMenu.Add("Paste and Match Style").SetAccelerator("CmdOrCtrl+OptionOrAlt+Shift+v").OnClick(func(ctx *Context) {
C.pasteAndMatchStyle()
})
editMenu.Add("Delete").SetAccelerator("backspace").OnClick(func(ctx *Context) {
C.delete()
})
editMenu.Add("Select All").SetAccelerator("CmdOrCtrl+a").OnClick(func(ctx *Context) {
C.selectAll()
})
editMenu.AddSeparator()
speechMenu := editMenu.AddSubmenu("Speech")
speechMenu.Add("Start Speaking").SetAccelerator("CmdOrCtrl+OptionOrAlt+Shift+.").OnClick(func(ctx *Context) {
C.startSpeaking()
})
speechMenu.Add("Stop Speaking").SetAccelerator("CmdOrCtrl+OptionOrAlt+Shift+,").OnClick(func(ctx *Context) {
C.stopSpeaking()
})
return menu
}
func newPlatformApp(appOptions *options.Application) *macosApp {
if appOptions == nil {
appOptions = options.ApplicationDefaults

View file

@ -11,6 +11,10 @@ type Menu struct {
impl menuImpl
}
func NewMenu() *Menu {
return &Menu{}
}
func (m *Menu) Add(label string) *MenuItem {
result := newMenuItem(label)
m.items = append(m.items, result)

View file

@ -130,7 +130,7 @@ func (m *MenuItem) handleClick() {
func (m *MenuItem) SetAccelerator(shortcut string) *MenuItem {
accelerator, err := parseAccelerator(shortcut)
if err != nil {
println("ERROR: invalid accelerator", err)
println("ERROR: invalid accelerator:", err.Error())
return m
}
m.accelerator = accelerator