5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-04 01:00:21 +08:00

Misc fixes for events

This commit is contained in:
Lea Anthony 2020-10-03 15:03:14 +10:00
parent 7f9c59a021
commit ae677ce9db
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
5 changed files with 31 additions and 20 deletions

View File

@ -13,6 +13,7 @@ type EventMessage struct {
type OnEventMessage struct { type OnEventMessage struct {
Name string Name string
Callback func(optionalData ...interface{}) Callback func(optionalData ...interface{})
Counter int
} }
// eventMessageParser does what it says on the tin! // eventMessageParser does what it says on the tin!
@ -28,8 +29,6 @@ func eventMessageParser(message string) (*parsedMessage, error) {
// Switch the event type (with or without data) // Switch the event type (with or without data)
switch message[0] { switch message[0] {
case 'e':
eventMessage.Name = message[2:]
case 'E': case 'E':
m := message[2:] m := message[2:]
err := json.Unmarshal([]byte(m), eventMessage) err := json.Unmarshal([]byte(m), eventMessage)

View File

@ -8,6 +8,7 @@ import (
// Events defines all events related operations // Events defines all events related operations
type Events interface { type Events interface {
On(eventName string, callback func(optionalData ...interface{})) On(eventName string, callback func(optionalData ...interface{}))
Once(eventName string, callback func(optionalData ...interface{}))
Emit(eventName string, optionalData ...interface{}) Emit(eventName string, optionalData ...interface{})
} }
@ -28,6 +29,17 @@ func (r *event) On(eventName string, callback func(optionalData ...interface{}))
eventMessage := &message.OnEventMessage{ eventMessage := &message.OnEventMessage{
Name: eventName, Name: eventName,
Callback: callback, Callback: callback,
Counter: -1,
}
r.bus.Publish("event:on", eventMessage)
}
// On pass through
func (r *event) Once(eventName string, callback func(optionalData ...interface{})) {
eventMessage := &message.OnEventMessage{
Name: eventName,
Callback: callback,
Counter: 1,
} }
r.bus.Publish("event:on", eventMessage) r.bus.Publish("event:on", eventMessage)
} }

View File

@ -137,17 +137,11 @@ export function Notify(notifyMessage) {
*/ */
export function Emit(eventName) { export function Emit(eventName) {
// Calculate the data const payload = {
if (arguments.length > 1) { name: eventName,
// Notify backend data: [].slice.apply(arguments).slice(1),
const payload = { };
name: eventName, SendMessage('Ej' + JSON.stringify(payload));
data: [].slice.apply(arguments).slice(1),
};
SendMessage('Ej' + JSON.stringify(payload));
} else {
SendMessage('ej' + eventName);
}
} }

View File

@ -15,7 +15,7 @@ import (
// means it does not expire (default). // means it does not expire (default).
type eventListener struct { type eventListener struct {
callback func(...interface{}) // Function to call with emitted event data callback func(...interface{}) // Function to call with emitted event data
counter int64 // The number of times this callback may be called. -1 = infinite counter int // The number of times this callback may be called. -1 = infinite
delete bool // Flag to indicate that this listener should be deleted delete bool // Flag to indicate that this listener should be deleted
} }
@ -60,12 +60,12 @@ func NewEvent(bus *servicebus.ServiceBus, logger *logger.Logger) (*Event, error)
} }
// RegisterListener provides a means of subscribing to events of type "eventName" // RegisterListener provides a means of subscribing to events of type "eventName"
func (e *Event) RegisterListener(eventName string, callback func(...interface{})) { func (e *Event) RegisterListener(eventName string, callback func(...interface{}), counter int) {
// Create new eventListener // Create new eventListener
thisListener := &eventListener{ thisListener := &eventListener{
callback: callback, callback: callback,
counter: 0, counter: counter,
delete: false, delete: false,
} }
@ -120,7 +120,7 @@ func (e *Event) Start() error {
var message *message.OnEventMessage = eventMessage.Data().(*message.OnEventMessage) var message *message.OnEventMessage = eventMessage.Data().(*message.OnEventMessage)
eventName := message.Name eventName := message.Name
callback := message.Callback callback := message.Callback
e.RegisterListener(eventName, callback) e.RegisterListener(eventName, callback, message.Counter)
e.logger.Trace("Registered listener for event '%s' with callback %p", eventName, callback) e.logger.Trace("Registered listener for event '%s' with callback %p", eventName, callback)
default: default:
e.logger.Error("unknown event message: %+v", eventMessage) e.logger.Error("unknown event message: %+v", eventMessage)
@ -179,13 +179,16 @@ func (e *Event) notifyListeners(eventName string, message *message.EventMessage)
} }
} }
// Save new listeners // Save new listeners or remove entry
e.listeners[eventName] = newListeners if len(newListeners) > 0 {
e.listeners[eventName] = newListeners
} else {
delete(e.listeners, eventName)
}
} }
// Unlock // Unlock
e.notifyLock.Unlock() e.notifyLock.Unlock()
} }
func (e *Event) shutdown() { func (e *Event) shutdown() {

View File

@ -23,6 +23,9 @@ func (r *RuntimeTest) WailsInit(runtime *wails.Runtime) error {
r.runtime.Events.On("testevent", func(optionalParams ...interface{}) { r.runtime.Events.On("testevent", func(optionalParams ...interface{}) {
println("Wooohoooo! I got called!") println("Wooohoooo! I got called!")
}) })
r.runtime.Events.Once("testeventonce", func(optionalParams ...interface{}) {
println("I only get called once!")
})
return nil return nil
} }