mirror of
https://github.com/taigrr/wails.git
synced 2026-04-14 02:48:21 -07:00
Develop (#343)
* Support Distribution 'ArcoLinux' #310 (#312) * Support Distribution 'ArcoLinux' #310 * Vuetify2 support (resurrected from git@github.com:MichaelHipp/wails.git) (#315) * Initial create of vuetify2-basic folder * Change template descr of vuetify-basic to say Vuetify 1.5 * Get vuetify2 template installing vuetify v2.0 (but with styling probs) * Update App.vue, HelloWorld.vue for Vuetify v2 * Remove babel-polyfill, add mdi/font * fix: codacy corrections * fix: babel -> core-js, regenerator-runtime Co-authored-by: Michael Hipp <michael@redmule.com> Co-authored-by: Lea Anthony <lea.anthony@gmail.com> * Update Contributors * v1.0.2-pre1 * [313-remote-conn] allow remote connections to the websocket bridge (#314) * [313-remote-conn] feat: compute wsURL based on window.location * [313-remote-conn] feat: allow any host to connect to vue server removing the 'host: "localhost"' specification causes the development server to listen on all interfaces. * [313-remote-conn] feat: allow any host to connect to angular dev server * test: reinject tabs Co-authored-by: Lea Anthony <lea.anthony@gmail.com> * fix: disable host check for vuetify 2 template * v1.0.2-pre2 * fix: shutdown ipcmanager * use channel to trigger shutdown * load linuxdb from relative path * Feat manjaro arm & deepin (#324) * feat: new distros: manjaroARM & Deepin * v1.0.2-pre3 * [326-platform-raspbian] feat: implement raspbian support (#327) * fix: emit arguments (#306) * v1.0.2-pre4 Raspbarian support * Initial support for Typescript decl file (#330) * v1.0.2-pre5 * revert to Go 1.12 * New CI (#331) * prepare * new CI/github actions * Rename later-pre.yml to latest-pre.yml * Update latest-pre.yml * Update README.md * Ensure version in go.mod is up to date (#339) * release v1.0.2-pre6 * Fix typescript generation * Release v1.0.2-pre7 * 316-multi-bridge-conn (#317) * [316-multi-bridge-conn] feat: use callback func for bridge response * [316-multi-bridge-conn] feat: implement multiple session support * split client handling portion into 'session' * keep track of sessions by remote address (ip & port) * notify each of the sessions anytime an event comes across the bus * [316-multi-bridge-conn] chore: move bridge files to package * [316-multi-bridge-conn] chore: remove deprecated Callback function The Callback function is no longer needed for the operation of the frontend callback since the ipc.Dispatch function now requires a callback function to be provided as an argument. This function can be a private function since it is passed by reference. * [316-multi-bridge-conn] chore: make webview.Callback private * [316-multi-bridge-conn] chore: remove unused injectCSS function I believe a slightly better method of doing this might need to be devised if it is needed in the future. I presume it should collect the values into a cache and then inject it into each sesssion as it appears. * [316-multi-bridge-conn] ensure wails:ready event is emitted Event is only emitted for the first session created from the Bridge. * [316-multi-bridge-conn] emit events for session lifecycle Emit an event for each session started and ended. * [316-multi-bridge-conn] fix: session handling fixes Co-authored-by: Lea Anthony <lea.anthony@gmail.com> * Release v1.0.2-pre8 * Release v1.0.2 Co-authored-by: Byron <ktc@protonmail.com> Co-authored-by: Travis McLane <tmclane@gmail.com> Co-authored-by: Michael Hipp <michael@redmule.com>
This commit is contained in:
@@ -2,7 +2,11 @@ package binding
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/wailsapp/wails/lib/interfaces"
|
||||
@@ -10,6 +14,8 @@ import (
|
||||
"github.com/wailsapp/wails/lib/messages"
|
||||
)
|
||||
|
||||
var typescriptDefinitionFilename = ""
|
||||
|
||||
// Manager handles method binding
|
||||
type Manager struct {
|
||||
methods map[string]*boundMethod
|
||||
@@ -21,16 +27,19 @@ type Manager struct {
|
||||
renderer interfaces.Renderer
|
||||
runtime interfaces.Runtime // The runtime object to pass to bound structs
|
||||
objectsToBind []interface{}
|
||||
bindPackageNames bool // Package name should be considered when binding
|
||||
bindPackageNames bool // Package name should be considered when binding
|
||||
structList map[string][]string // structList["mystruct"] = []string{"Method1", "Method2"}
|
||||
}
|
||||
|
||||
// NewManager creates a new Manager struct
|
||||
func NewManager() interfaces.BindingManager {
|
||||
|
||||
result := &Manager{
|
||||
methods: make(map[string]*boundMethod),
|
||||
functions: make(map[string]*boundFunction),
|
||||
log: logger.NewCustomLogger("Bind"),
|
||||
internalMethods: newInternalMethods(),
|
||||
structList: make(map[string][]string),
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -88,9 +97,55 @@ func (b *Manager) initialise() error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// If we wish to generate a typescript definition file...
|
||||
if typescriptDefinitionFilename != "" {
|
||||
err := b.generateTypescriptDefinitions()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Generate typescript
|
||||
func (b *Manager) generateTypescriptDefinitions() error {
|
||||
|
||||
var output strings.Builder
|
||||
|
||||
for structname, methodList := range b.structList {
|
||||
structname = strings.SplitN(structname, ".", 2)[1]
|
||||
output.WriteString(fmt.Sprintf("Interface %s {\n", structname))
|
||||
for _, method := range methodList {
|
||||
output.WriteString(fmt.Sprintf("\t%s: (...args : any[]) => Promise\n", method))
|
||||
}
|
||||
output.WriteString("}\n")
|
||||
}
|
||||
|
||||
output.WriteString("\n")
|
||||
output.WriteString("Interface Backend {\n")
|
||||
|
||||
for structname := range b.structList {
|
||||
structname = strings.SplitN(structname, ".", 2)[1]
|
||||
output.WriteString(fmt.Sprintf("\t%[1]s: %[1]s\n", structname))
|
||||
}
|
||||
output.WriteString("}\n")
|
||||
|
||||
globals := `
|
||||
declare global {
|
||||
interface Window {
|
||||
backend: Backend;
|
||||
}
|
||||
}`
|
||||
output.WriteString(globals)
|
||||
|
||||
b.log.Info("Written Typescript file: " + typescriptDefinitionFilename)
|
||||
|
||||
dir := filepath.Dir(typescriptDefinitionFilename)
|
||||
os.MkdirAll(dir, 0755)
|
||||
return ioutil.WriteFile(typescriptDefinitionFilename, []byte(output.String()), 0755)
|
||||
}
|
||||
|
||||
// bind the given struct method
|
||||
func (b *Manager) bindMethod(object interface{}) error {
|
||||
|
||||
@@ -104,6 +159,12 @@ func (b *Manager) bindMethod(object interface{}) error {
|
||||
|
||||
b.log.Debugf("Processing struct: %s", baseName)
|
||||
|
||||
// Calc actual name
|
||||
actualName := strings.TrimPrefix(baseName, "main.")
|
||||
if b.structList[actualName] == nil {
|
||||
b.structList[actualName] = []string{}
|
||||
}
|
||||
|
||||
// Iterate over method definitions
|
||||
for i := 0; i < objectType.NumMethod(); i++ {
|
||||
|
||||
@@ -113,6 +174,8 @@ func (b *Manager) bindMethod(object interface{}) error {
|
||||
fullMethodName := baseName + "." + methodName
|
||||
method := reflect.ValueOf(object).MethodByName(methodName)
|
||||
|
||||
b.structList[actualName] = append(b.structList[actualName], methodName)
|
||||
|
||||
// Skip unexported methods
|
||||
if !unicode.IsUpper([]rune(methodName)[0]) {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user