mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 13:02:04 +08:00
124 lines
3.3 KiB
Go
124 lines
3.3 KiB
Go
package wails
|
|
|
|
import (
|
|
"github.com/wailsapp/wails/cmd"
|
|
"github.com/wailsapp/wails/lib/binding"
|
|
"github.com/wailsapp/wails/lib/event"
|
|
"github.com/wailsapp/wails/lib/interfaces"
|
|
"github.com/wailsapp/wails/lib/ipc"
|
|
"github.com/wailsapp/wails/lib/logger"
|
|
"github.com/wailsapp/wails/lib/renderer"
|
|
)
|
|
|
|
// -------------------------------- Compile time Flags ------------------------------
|
|
|
|
// BuildMode indicates what mode we are in
|
|
var BuildMode = cmd.BuildModeProd
|
|
|
|
// ----------------------------------------------------------------------------------
|
|
|
|
// App defines the main application struct
|
|
type App struct {
|
|
config *AppConfig // The Application configuration object
|
|
cli *cmd.Cli // In debug mode, we have a cli
|
|
renderer interfaces.Renderer // The renderer is what we will render the app to
|
|
logLevel string // The log level of the app
|
|
ipc interfaces.IPCManager // Handles the IPC calls
|
|
log *logger.CustomLogger // Logger
|
|
bindingManager interfaces.BindingManager // Handles binding of Go code to renderer
|
|
eventManager interfaces.EventManager // Handles all the events
|
|
runtime interfaces.Runtime // The runtime object for registered structs
|
|
}
|
|
|
|
// CreateApp creates the application window with the given configuration
|
|
// If none given, the defaults are used
|
|
func CreateApp(optionalConfig ...*AppConfig) *App {
|
|
var userConfig *AppConfig
|
|
if len(optionalConfig) > 0 {
|
|
userConfig = optionalConfig[0]
|
|
}
|
|
|
|
result := &App{
|
|
logLevel: "info",
|
|
renderer: renderer.NewWebView(),
|
|
ipc: ipc.NewManager(),
|
|
bindingManager: binding.NewManager(),
|
|
eventManager: event.NewManager(),
|
|
log: logger.NewCustomLogger("App"),
|
|
}
|
|
|
|
appconfig, err := newConfig(userConfig)
|
|
if err != nil {
|
|
result.log.Fatalf("Cannot use custom HTML: %s", err.Error())
|
|
}
|
|
result.config = appconfig
|
|
|
|
// Set up the CLI if not in release mode
|
|
if BuildMode != cmd.BuildModeProd {
|
|
result.cli = result.setupCli()
|
|
} else {
|
|
// Disable Inspector in release mode
|
|
result.config.DisableInspector = true
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Run the app
|
|
func (a *App) Run() error {
|
|
if BuildMode != cmd.BuildModeProd {
|
|
return a.cli.Run()
|
|
}
|
|
|
|
a.logLevel = "error"
|
|
err := a.start()
|
|
if err != nil {
|
|
a.log.Error(err.Error())
|
|
}
|
|
return err
|
|
}
|
|
|
|
func (a *App) start() error {
|
|
|
|
// Set the log level
|
|
logger.SetLogLevel(a.logLevel)
|
|
|
|
// Log starup
|
|
a.log.Info("Starting")
|
|
|
|
// Check if we are to run in bridge mode
|
|
if BuildMode == cmd.BuildModeBridge {
|
|
a.renderer = &renderer.Bridge{}
|
|
}
|
|
|
|
// Initialise the renderer
|
|
err := a.renderer.Initialise(a.config, a.ipc, a.eventManager)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Start event manager and give it our renderer
|
|
a.eventManager.Start(a.renderer)
|
|
|
|
// Start the IPC Manager and give it the event manager and binding manager
|
|
a.ipc.Start(a.eventManager, a.bindingManager)
|
|
|
|
// Create the runtime
|
|
a.runtime = NewRuntime(a.eventManager, a.renderer)
|
|
|
|
// Start binding manager and give it our renderer
|
|
err = a.bindingManager.Start(a.renderer, a.runtime)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Run the renderer
|
|
return a.renderer.Run()
|
|
}
|
|
|
|
// Bind allows the user to bind the given object
|
|
// with the application
|
|
func (a *App) Bind(object interface{}) {
|
|
a.bindingManager.Bind(object)
|
|
}
|