Refactor application API to use options by default. Updated examples.

This commit is contained in:
Lea Anthony 2022-12-31 10:38:36 +11:00
commit cf5def05a6
No known key found for this signature in database
GPG key ID: 33DAF7BB90A58405
13 changed files with 102 additions and 100 deletions

View file

@ -5,14 +5,20 @@ import (
"log"
"time"
"github.com/wailsapp/wails/exp/pkg/options"
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
app := application.New()
app.SetName("Clipboard Demo")
app.SetDescription("A demo of the clipboard")
app := application.New(options.Application{
Name: "Clipboard Demo",
Description: "A demo of the clipboard API",
Mac: options.Mac{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create a custom menu
menu := app.NewMenu()

View file

@ -7,15 +7,20 @@ import (
"runtime"
"strings"
"github.com/wailsapp/wails/exp/pkg/options"
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
app := application.New()
app.SetName("Dialogs Demo")
app.SetDescription("A demo of the Wails dialogs")
app := application.New(options.Application{
Name: "Dialogs Demo",
Description: "A demo of the dialogs API",
Mac: options.Mac{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create a custom menu
menu := app.NewMenu()
menu.AddRole(application.AppMenu)

View file

@ -12,9 +12,11 @@ import (
)
func main() {
app := application.NewWithOptions(&options.Application{
Mac: &options.Mac{
//ActivationPolicy: options.ActivationPolicyAccessory,
app := application.New(options.Application{
Name: "Menu Demo",
Description: "A demo of the menu system",
Mac: options.Mac{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
/*
@ -121,7 +123,7 @@ func main() {
Alpha: 30,
},
StartState: options.WindowStateMaximised,
Mac: &options.MacWindow{
Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
Appearance: options.NSAppearanceNameDarkAqua,
},
@ -189,7 +191,7 @@ func main() {
Height: 768,
AlwaysOnTop: false,
URL: "https://google.com",
Mac: &options.MacWindow{
Mac: options.MacWindow{
Backdrop: options.MacBackdropTranslucent,
},
})
@ -206,7 +208,7 @@ func main() {
myWindow2Lock.RLock()
myWindow.SetTitle("Wooooo")
myWindow.SetAlwaysOnTop(true)
myWindow2.SetTitle("OMFG")
myWindow2.SetTitle("OMG")
myWindow2.SetURL("https://wails.io")
myWindow.SetMinSize(600, 600)
myWindow.SetMaxSize(650, 650)

View file

@ -4,14 +4,20 @@ import (
_ "embed"
"log"
"github.com/wailsapp/wails/exp/pkg/options"
"github.com/wailsapp/wails/exp/pkg/application"
)
func main() {
app := application.New()
app.SetName("Menu Demo")
app.SetDescription("A demo of the menu system")
app := application.New(options.Application{
Name: "Menu Demo",
Description: "A demo of the menu system",
Mac: options.Mac{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create a custom menu
menu := app.NewMenu()

View file

@ -10,15 +10,19 @@ import (
)
func main() {
app := application.New()
app := application.New(options.Application{
Name: "Plain",
Description: "A demo of using raw HTML & CSS",
Mac: options.Mac{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
// Create window
app.NewWindowWithOptions(&options.Window{
Title: "Plain Bundle",
EnableDevTools: true,
HTML: `<html><head><title>Plain Bundle</title></head><body><div class="main"><h1>Plain Bundle</h1><p>This is a plain bundle. It has no frontend code.</p></div></body></html>`,
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: &options.MacWindow{
Title: "Plain Bundle",
HTML: `<html><head><title>Plain Bundle</title></head><body><div class="main"><h1>Plain Bundle</h1><p>This is a plain bundle. It has no frontend code.</p></div></body></html>`,
CSS: `body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }`,
Mac: options.MacWindow{
InvisibleTitleBarHeight: 50,
Backdrop: options.MacBackdropTranslucent,
TitleBar: options.TitleBarHiddenInset,

View file

@ -3,6 +3,7 @@ package main
import (
_ "embed"
"log"
"runtime"
"github.com/wailsapp/wails/exp/pkg/options"
@ -10,17 +11,27 @@ import (
)
func main() {
app := application.New()
app.SetActivationPolicy(options.ActivationPolicyAccessory)
app := application.New(options.Application{
Name: "Systray Demo",
Description: "A demo of the Systray API",
Mac: options.Mac{
ActivationPolicy: options.ActivationPolicyAccessory,
},
})
systemTray := app.NewSystemTray().SetIcon(application.DefaultMacTemplateIcon)
systemTray := app.NewSystemTray()
if runtime.GOOS == "darwin" {
systemTray.SetIcon(application.DefaultMacTemplateIcon)
}
myMenu := app.NewMenu()
myMenu.Add("Hello World!").OnClick(func(ctx *application.Context) {
ctx.ClickedMenuItem().SetLabel("Clicked!")
app.NewInfoDialog().SetTitle("Hello World!").SetMessage("Hello World!").Show()
})
subMenu := myMenu.AddSubmenu("Submenu")
subMenu.Add("Submenu Item")
subMenu.Add("Click me!").OnClick(func(ctx *application.Context) {
ctx.ClickedMenuItem().SetLabel("Clicked!")
})
myMenu.AddSeparator()
myMenu.Add("Quit").OnClick(func(ctx *application.Context) {
app.Quit()

View file

@ -17,10 +17,13 @@ import (
)
func main() {
app := application.New()
app.SetName("Window Demo")
app.ApplicationShouldTerminateAfterLastWindowClosed()
app.SetDescription("A demo of the windowing capabilities")
app := application.New(options.Application{
Name: "Window Demo",
Description: "A demo of the Window API",
Mac: options.Mac{
ApplicationShouldTerminateAfterLastWindowClosed: true,
},
})
app.On(events.Mac.ApplicationDidFinishLaunching, func() {
log.Println("ApplicationDidFinishLaunching")
})

View file

@ -16,28 +16,35 @@ func init() {
runtime.LockOSThread()
}
func New() *App {
func New(appOptions options.Application) *App {
if globalApplication != nil {
return globalApplication
}
return NewWithOptions(options.ApplicationDefaults)
}
func NewWithOptions(appOptions options.Application) *App {
if globalApplication != nil {
return globalApplication
}
appOptions = options.ApplicationDefaults
mergeApplicationDefaults(&appOptions)
result := &App{
options: appOptions,
applicationEventListeners: make(map[uint][]func()),
systemTrays: make(map[uint]*SystemTray),
icon: DefaultApplicationIcon,
}
globalApplication = result
return result
}
func mergeApplicationDefaults(o *options.Application) {
if o.Name == "" {
o.Name = "My Wails Application"
}
if o.Description == "" {
o.Description = "An application written using Wails"
}
if o.Icon == nil {
o.Icon = DefaultApplicationIcon
}
}
type platformApp interface {
run() error
destroy()
@ -89,10 +96,7 @@ type App struct {
ApplicationMenu *Menu
// About MessageDialog
name string
description string
icon []byte
clipboard *Clipboard
clipboard *Clipboard
}
func (a *App) getSystemTrayID() uint {
@ -202,9 +206,7 @@ func (a *App) Run() error {
a.impl.setApplicationMenu(a.ApplicationMenu)
// set the application icon
if a.icon != nil {
a.impl.setIcon(a.icon)
}
a.impl.setIcon(a.options.Icon)
return a.impl.run()
}
@ -288,47 +290,15 @@ func (a *App) Quit() {
a.impl.destroy()
}
func (a *App) SetActivationPolicy(accessory options.ActivationPolicy) {
a.options.Mac.ActivationPolicy = accessory
}
func (a *App) SetMenu(menu *Menu) {
a.ApplicationMenu = menu
if a.impl != nil {
a.impl.setApplicationMenu(menu)
}
}
func (a *App) SetName(name string) {
a.name = name
}
func (a *App) Name() string {
return a.name
}
func (a *App) SetIcon(icon []byte) {
a.icon = icon
if a.impl != nil {
a.impl.setIcon(icon)
}
}
func (a *App) Icon() []byte {
return a.icon
}
func (a *App) SetDescription(description string) {
a.description = description
}
func (a *App) Description() string {
return a.description
}
func (a *App) ShowAboutDialog() {
if a.impl != nil {
a.impl.showAboutDialog(a.name, a.description, a.icon)
a.impl.showAboutDialog(a.options.Name, a.options.Description, a.options.Icon)
}
}
@ -383,8 +353,3 @@ func (a *App) dispatchOnMainThread(fn func()) {
// Call platform specific dispatch function
a.impl.dispatchOnMainThread(id)
}
func (a *App) ApplicationShouldTerminateAfterLastWindowClosed() {
a.options.Mac.ApplicationShouldTerminateAfterLastWindowClosed = true
}

View file

@ -339,8 +339,8 @@ func (m *macosDialog) show() {
} else {
// if it's an error, use the application icon
if m.dialog.dialogType == ErrorDialog {
iconData = unsafe.Pointer(&globalApplication.icon[0])
iconLength = C.int(len(globalApplication.icon))
iconData = unsafe.Pointer(&globalApplication.options.Icon[0])
iconLength = C.int(len(globalApplication.options.Icon))
}
}

View file

@ -402,7 +402,7 @@ func newSpeechMenu() *MenuItem {
}
func newHideMenuItem() *MenuItem {
return newMenuItem("Hide " + globalApplication.Name()).
return newMenuItem("Hide " + globalApplication.options.Name).
SetAccelerator("CmdOrCtrl+h").
OnClick(func(ctx *Context) {
C.hideApplication()
@ -482,7 +482,7 @@ func newDeleteMenuItem() *MenuItem {
}
func newQuitMenuItem() *MenuItem {
return newMenuItem("Quit " + globalApplication.Name()).
return newMenuItem("Quit " + globalApplication.options.Name).
SetAccelerator("CmdOrCtrl+q").
OnClick(func(ctx *Context) {
globalApplication.Quit()
@ -498,7 +498,7 @@ func newSelectAllMenuItem() *MenuItem {
}
func newAboutMenuItem() *MenuItem {
return newMenuItem("About " + globalApplication.Name()).
return newMenuItem("About " + globalApplication.options.Name).
OnClick(func(ctx *Context) {
globalApplication.ShowAboutDialog()
})

View file

@ -98,7 +98,7 @@ func newAppMenu() *MenuItem {
appMenu.AddRole(UnHide)
appMenu.AddSeparator()
appMenu.AddRole(Quit)
subMenu := newSubMenuItem(globalApplication.Name())
subMenu := newSubMenuItem(globalApplication.options.Name)
subMenu.submenu = appMenu
return subMenu
}

View file

@ -1,11 +1,8 @@
package options
type Application struct {
Mac Mac
}
var ApplicationDefaults = Application{
Mac: Mac{
ActivationPolicy: ActivationPolicyRegular,
},
Name string
Description string
Icon []byte
Mac Mac
}

View file

@ -4,6 +4,8 @@ type ActivationPolicy int
const (
ActivationPolicyRegular ActivationPolicy = iota
// ActivationPolicyAccessory is used for applications that do not have a main window,
// such as system tray applications or background applications.
ActivationPolicyAccessory
ActivationPolicyProhibited
)
@ -11,7 +13,8 @@ const (
type Mac struct {
// ActivationPolicy is the activation policy for the application. Defaults to
// applicationActivationPolicyRegular.
ActivationPolicy ActivationPolicy
ActivationPolicy ActivationPolicy
// If set to true, the application will terminate when the last window is closed.
ApplicationShouldTerminateAfterLastWindowClosed bool
}