Ctrl+f in ktxt2 editor

This commit is contained in:
2021-11-17 16:29:56 -07:00
parent 6bb03cc468
commit 1d6e51dffd
2 changed files with 40 additions and 11 deletions

View File

@@ -34,7 +34,7 @@
(window.addEventListener "message"
->:Void event
(case (the MessageToEditor event.data)
((object type "update" text text)
((objectWith [type "update"] text)
// Either create the first EditorState, or get the last one
(let [newState (getState)]
(set newState.text text)
@@ -44,6 +44,8 @@
(updateContent "told by the provider" text)
(activateFromState newState)
})))
((objectWith [type "find"] text)
(_find text))
(otherType (throw "bad message $event for KTxt2Editor"))))
(window.addEventListener "scroll"
@@ -52,6 +54,10 @@
(setState s)))
(window.addEventListener "keydown" ->:Void e
(if e.ctrlKey
(case e.key
("f" (find))
(otherwise))
(unless activeEditor
(case e.key
("g" (pageTop))
@@ -61,7 +67,7 @@
("ArrowLeft" (scrollToPageTop))
("ArrowRight" (scrollToPageBottom))
("s" (export))
(otherwise))))
(otherwise)))))
// Don't use getState helper here because we don't want to force updateContent with blank text
(whenLet [state (the EditorState (_vscode.getState))]
@@ -444,3 +450,23 @@
(function export []
(postMessage (object type "export")))
(function find []
(postMessage (object type "find")))
(defMacro __find []
`(let [elem (nth ktxt2Elements idx)]
(assertLet [(Block block) elem]
(whenLet [(Some foundIdx) (indexOf "${block.source}${block.output}" text)]
(changeElementScrollY ->(set elementScrollY idx))
(return)))))
(function :Void _find [text]
// TODO use (indexOf) to find the text in source/output of elements, then set elementScrollY to that element
(let [startIdx elementScrollY]
(doFor idx (range (+ 1 startIdx) ktxt2Elements.length)
(__find))
(doFor idx (range 0 (+ 1 startIdx))
(__find))
(print "No occurances of `${text}` were found.")))

View File

@@ -74,6 +74,9 @@
(errorMessage "No automatic conversions are valid for the chosen block."))))
((object type "export")
(exportSourceAndOutputFiles document))
((object type "find")
(awaitLet [str (inputBox)]
(webviewPanel.webview.postMessage (object type "find" text str))))
(otherwise
(errorMessage "bad message $e from KTxt2Editor"))))