From 43a8b9fe584b0fd565f504ec253d7f483c688bc3 Mon Sep 17 00:00:00 2001 From: anoshenko Date: Tue, 2 May 2023 17:20:01 +0300 Subject: [PATCH] Bug fixing & optimisation --- animationEvents.go | 10 ++++-- focusEvents.go | 5 ++- keyEvents.go | 84 +++++++++++++++++++++++++++++++++++----------- mouseEvents.go | 5 ++- pointerEvents.go | 5 ++- theme.go | 2 +- touchEvents.go | 5 ++- 7 files changed, 90 insertions(+), 26 deletions(-) diff --git a/animationEvents.go b/animationEvents.go index 7d2178d..fb1d998 100644 --- a/animationEvents.go +++ b/animationEvents.go @@ -91,7 +91,10 @@ func transitionEventsHtml(view View, buffer *strings.Builder) { for tag, js := range transitionEvents { if value := view.getRaw(tag); value != nil { if listeners, ok := value.([]func(View, string)); ok && len(listeners) > 0 { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + buffer.WriteString(js.jsEvent) + buffer.WriteString(`="`) + buffer.WriteString(js.jsFunc) + buffer.WriteString(`(this, event)" `) } } } @@ -157,7 +160,10 @@ func animationEventsHtml(view View, buffer *strings.Builder) { for tag, js := range animationEvents { if value := view.getRaw(tag); value != nil { if listeners, ok := value.([]func(View)); ok && len(listeners) > 0 { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + buffer.WriteString(js.jsEvent) + buffer.WriteString(`="`) + buffer.WriteString(js.jsFunc) + buffer.WriteString(`(this, event)" `) } } } diff --git a/focusEvents.go b/focusEvents.go index dace937..6065b1b 100644 --- a/focusEvents.go +++ b/focusEvents.go @@ -143,7 +143,10 @@ func getFocusListeners(view View, subviewID []string, tag string) []func(View) { func focusEventsHtml(view View, buffer *strings.Builder) { if view.Focusable() { for _, js := range focusEvents { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + buffer.WriteString(js.jsEvent) + buffer.WriteString(`="`) + buffer.WriteString(js.jsFunc) + buffer.WriteString(`(this, event)" `) } } } diff --git a/keyEvents.go b/keyEvents.go index f1c5188..e174f73 100644 --- a/keyEvents.go +++ b/keyEvents.go @@ -372,11 +372,12 @@ func valueToEventWithOldListeners[V View, E any](value any) ([]func(V, E, E), bo return nil, false } -var keyEvents = map[string]struct{ jsEvent, jsFunc string }{ - KeyDownEvent: {jsEvent: "onkeydown", jsFunc: "keyDownEvent"}, - KeyUpEvent: {jsEvent: "onkeyup", jsFunc: "keyUpEvent"}, -} - +/* + var keyEvents = map[string]struct{ jsEvent, jsFunc string }{ + KeyDownEvent: {jsEvent: "onkeydown", jsFunc: "keyDownEvent"}, + KeyUpEvent: {jsEvent: "onkeyup", jsFunc: "keyUpEvent"}, + } +*/ func (view *viewData) setKeyListener(tag string, value any) bool { listeners, ok := valueToEventListeners[View, KeyEvent](value) if !ok { @@ -386,22 +387,37 @@ func (view *viewData) setKeyListener(tag string, value any) bool { if listeners == nil { view.removeKeyListener(tag) - } else if js, ok := keyEvents[tag]; ok { - view.properties[tag] = listeners - if view.created { - view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") - } } else { - return false + switch tag { + case KeyDownEvent: + if view.created { + view.session.updateProperty(view.htmlID(), "onkeydown", "keyDownEvent(this, event)") + } + + case KeyUpEvent: + if view.created { + view.session.updateProperty(view.htmlID(), "onkeyup", "keyUpEvent(this, event)") + } + + default: + return false + } } + return true } func (view *viewData) removeKeyListener(tag string) { delete(view.properties, tag) if view.created { - if js, ok := keyEvents[tag]; ok { - view.session.removeProperty(view.htmlID(), js.jsEvent) + switch tag { + case KeyDownEvent: + if !view.Focusable() { + view.session.removeProperty(view.htmlID(), "onkeydown") + } + + case KeyUpEvent: + view.session.removeProperty(view.htmlID(), "onkeyup") } } } @@ -434,22 +450,52 @@ func getEventListeners[V View, E any](view View, subviewID []string, tag string) } func keyEventsHtml(view View, buffer *strings.Builder) { - for tag, js := range keyEvents { - if listeners := getEventListeners[View, KeyEvent](view, nil, tag); len(listeners) > 0 { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + if len(getEventListeners[View, KeyEvent](view, nil, KeyDownEvent)) > 0 { + buffer.WriteString(`onkeydown="keyDownEvent(this, event)" `) + } else if view.Focusable() { + if len(getEventListeners[View, MouseEvent](view, nil, ClickEvent)) > 0 { + buffer.WriteString(`onkeydown="keyDownEvent(this, event)" `) } } + + if listeners := getEventListeners[View, KeyEvent](view, nil, KeyUpEvent); len(listeners) > 0 { + buffer.WriteString(`onkeyup="keyUpEvent(this, event)" `) + } } func handleKeyEvents(view View, tag string, data DataObject) { + var event KeyEvent + event.init(data) listeners := getEventListeners[View, KeyEvent](view, nil, tag) - if len(listeners) > 0 { - var event KeyEvent - event.init(data) + if len(listeners) > 0 { for _, listener := range listeners { listener(view, event) } + return + } + + if tag == KeyDownEvent && view.Focusable() && (event.Key == " " || event.Key == "Enter") && !IsDisabled(view) { + if listeners := getEventListeners[View, MouseEvent](view, nil, ClickEvent); len(listeners) > 0 { + clickEvent := MouseEvent{ + TimeStamp: event.TimeStamp, + Button: PrimaryMouseButton, + Buttons: PrimaryMouseMask, + CtrlKey: event.CtrlKey, + AltKey: event.AltKey, + ShiftKey: event.ShiftKey, + MetaKey: event.MetaKey, + ClientX: view.Frame().Width / 2, + ClientY: view.Frame().Height / 2, + X: view.Frame().Width / 2, + Y: view.Frame().Height / 2, + ScreenX: view.Frame().Left + view.Frame().Width/2, + ScreenY: view.Frame().Top + view.Frame().Height/2, + } + for _, listener := range listeners { + listener(view, clickEvent) + } + } } } diff --git a/mouseEvents.go b/mouseEvents.go index b578147..614ecf7 100644 --- a/mouseEvents.go +++ b/mouseEvents.go @@ -188,7 +188,10 @@ func mouseEventsHtml(view View, buffer *strings.Builder, hasTooltip bool) { for tag, js := range mouseEvents { if value := view.getRaw(tag); value != nil { if listeners, ok := value.([]func(View, MouseEvent)); ok && len(listeners) > 0 { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + buffer.WriteString(js.jsEvent) + buffer.WriteString(`="`) + buffer.WriteString(js.jsFunc) + buffer.WriteString(`(this, event)" `) } } } diff --git a/pointerEvents.go b/pointerEvents.go index a362a28..f97ec0b 100644 --- a/pointerEvents.go +++ b/pointerEvents.go @@ -129,7 +129,10 @@ func pointerEventsHtml(view View, buffer *strings.Builder) { for tag, js := range pointerEvents { if value := view.getRaw(tag); value != nil { if listeners, ok := value.([]func(View, PointerEvent)); ok && len(listeners) > 0 { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + buffer.WriteString(js.jsEvent) + buffer.WriteString(`="`) + buffer.WriteString(js.jsFunc) + buffer.WriteString(`(this, event)" `) } } } diff --git a/theme.go b/theme.go index 1adb7de..a592b4f 100644 --- a/theme.go +++ b/theme.go @@ -528,7 +528,7 @@ func (theme *theme) cssText(session Session) string { styleList := func(styles map[string]ViewStyle) []string { ruiStyles := []string{} customStyles := []string{} - for tag, _ := range styles { + for tag := range styles { if strings.HasPrefix(tag, "rui") { ruiStyles = append(ruiStyles, tag) } else { diff --git a/touchEvents.go b/touchEvents.go index 8a4e92f..a6a8b54 100644 --- a/touchEvents.go +++ b/touchEvents.go @@ -130,7 +130,10 @@ func touchEventsHtml(view View, buffer *strings.Builder) { for tag, js := range touchEvents { if value := view.getRaw(tag); value != nil { if listeners, ok := value.([]func(View, TouchEvent)); ok && len(listeners) > 0 { - buffer.WriteString(js.jsEvent + `="` + js.jsFunc + `(this, event)" `) + buffer.WriteString(js.jsEvent) + buffer.WriteString(`="`) + buffer.WriteString(js.jsFunc) + buffer.WriteString(`(this, event)" `) } } }