From 6a62b1a7e32f043c085f0d0898f324c4ad3dbefe Mon Sep 17 00:00:00 2001 From: John Starich Date: Wed, 12 Apr 2023 00:55:25 -0500 Subject: [PATCH] Remove onblur listener once file should open and remove synchronous open --- cmd/editor/dom/element.go | 12 +++++++++--- cmd/editor/ide/window.go | 31 ++++++++++++++----------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/cmd/editor/dom/element.go b/cmd/editor/dom/element.go index 442949b..4727ce8 100644 --- a/cmd/editor/dom/element.go +++ b/cmd/editor/dom/element.go @@ -112,14 +112,20 @@ func (e *Element) QuerySelectorAll(query string) []*Element { return sliceFromArray(e.elem.Call("querySelectorAll", query)) } -func (e *Element) AddEventListener(name string, listener EventListener) { - e.elem.Call("addEventListener", name, js.FuncOf(func(this js.Value, args []js.Value) interface{} { +func (e *Element) RemoveEventListener(name string, listener js.Func) { + e.elem.Call("removeEventListener", name, listener) +} + +func (e *Element) AddEventListener(name string, listener EventListener) js.Func { + listenerFunc := js.FuncOf(func(_ js.Value, args []js.Value) interface{} { defer common.CatchExceptionHandler(func(err error) { log.Error("recovered from panic: ", err, "\n", string(debug.Stack())) }) listener(args[0]) return nil - })) + }) + e.elem.Call("addEventListener", name, listenerFunc) + return listenerFunc } func (e *Element) Focus() { diff --git a/cmd/editor/ide/window.go b/cmd/editor/ide/window.go index 9b2aae0..33446a5 100644 --- a/cmd/editor/ide/window.go +++ b/cmd/editor/ide/window.go @@ -184,11 +184,12 @@ func (w *window) makeDefaultEditor(id int, title, contents *dom.Element) Tabber title.SetInnerHTML(``) inputElem := title.QuerySelector("input") - dom.QueueMicrotask(func() { - inputElem.Focus() // run focus on next run loop so opening a file immediately doesn't trigger onblur - }) + inputElem.Focus() - keydownFn := func(event js.Value) { + blurListener := inputElem.AddEventListener("blur", func(js.Value) { + w.editorsPane.closeTabID(id) + }) + title.AddEventListener("keydown", func(event js.Value) { if event.Get("key").String() != "Enter" { return } @@ -200,19 +201,15 @@ func (w *window) makeDefaultEditor(id int, title, contents *dom.Element) Tabber if fileName == "" { return } - title.SetInnerText("New file") - err := editor.OpenFile(fileName) - if err != nil { - log.Error(err) - } - w.editorsPane.focusID(id) - } - title.AddEventListener("keydown", keydownFn) - inputElem.AddEventListener("blur", func(event js.Value) { - titleText := title.InnerText() - if titleText != "New file" { - w.editorsPane.closeTabID(id) - } + inputElem.RemoveEventListener("blur", blurListener) + title.SetInnerText("New file") // setting inner text triggers onblur because the input HTML is about to be removed + go func() { + err := editor.OpenFile(fileName) + if err != nil { + log.Error(err) + } + w.editorsPane.focusID(id) + }() }) return editor }