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:
parent
7f9c59a021
commit
ae677ce9db
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user