QuickWebview scripts in page

This commit is contained in:
2023-08-20 15:29:40 -06:00
parent c6eaec7982
commit e73f9000fe
5 changed files with 54 additions and 6 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
src/kiss_vscode_api/QuickWebviewScript.js

4
QuickWebviewScript.hxml Normal file
View File

@@ -0,0 +1,4 @@
-lib kiss
-cp src
-main kiss_vscode_api.QuickWebviewScript
-js src/kiss_vscode_api/QuickWebviewScript.js

View File

@@ -8,7 +8,11 @@ import vscode.*;
import kiss.Prelude;
import kiss_vscode_api.QuickWebviewScript;
typedef QuickWebviewSetup = (Document) -> Void;
// (document, elapsed, close) -> Void
typedef QuickWebviewUpdate = (Document, Float, Function) -> Void;
@:build(kiss.Kiss.build())

View File

@@ -1,16 +1,26 @@
// TODO provide for passing messages between webview and VSCode API
(function :WebviewPanel quickWebview [:String title :QuickWebviewSetup setup :QuickWebviewUpdate update &opt :ViewColumn column :Int fps]
(defMacro quickWebviewScriptJs [&builder b]
(assertProcess "haxe" ["QuickWebviewScript.hxml"] null null (libPath "kiss-vscode-api"))
(b.str (File.getContent "$(libPath "kiss-vscode-api")/src/kiss_vscode_api/QuickWebviewScript.js")))
(function :WebviewPanel quickWebview [:String title :QuickWebviewSetup setup &opt :String kissScript :QuickWebviewUpdate update :ViewColumn column :Int fps]
(let [dom (new JSDOM "<!DOCTYPE html><html><head><title>${title}</title></head><body></body></html>")
document dom.window.document]
document dom.window.document
scriptElement (document.createElement "script")]
(setup document)
(let [panel (Vscode.window.createWebviewPanel "kissVscodeQuickWebview" title (or column ViewColumn.Beside) (object))]
(set scriptElement.innerHTML (quickWebviewScriptJs))
(document.documentElement.appendChild scriptElement)
(let [panel (Vscode.window.createWebviewPanel "kissVscodeQuickWebview" title (or column ViewColumn.Beside) (object enableScripts ?kissScript))]
(set panel.webview.html document.documentElement.innerHTML)
(when kissScript
(panel.webview.postMessage (RunScript (Prelude.convertToHScript kissScript))))
// setInterval of the update function and allow for stopping it by disposing the panel or calling a close function passed to update
(let [&mut :Function close null
deltaMilli (/ 1000.0 (or fps 30))
deltaSec (/ deltaMilli 1000)
interval (Timers.setInterval ->{(update document deltaSec close) (set panel.webview.html document.documentElement.innerHTML)}deltaMilli)]
(panel.onDidDispose ->e (Timers.clearInterval interval))
interval (when update (Timers.setInterval ->{(update document deltaSec close) (set panel.webview.html document.documentElement.innerHTML)} deltaMilli))]
// TODO update needs to add the script again, but that will run the script again?
(panel.onDidDispose ->e (when update (Timers.clearInterval interval)))
(set close ->(panel.dispose)))
panel)))

View File

@@ -0,0 +1,29 @@
package kiss_vscode_api;
import kiss.KissInterp;
import kiss_vscode_api.WebviewExterns;
enum QuickWebviewMessage {
RunScript(hscript:String);
Message(m:Any);
}
class QuickWebviewScript {
static function main() {
var vscode = WebviewExterns.acquireVsCodeApi();
var interp = new KissInterp();
interp.variables["vscode"] = vscode;
interp.variables["window"] = WebviewExterns.window;
interp.variables["document"] = WebviewExterns.window.document;
WebviewExterns.window.addEventListener("message", event -> {
switch (event.data) {
case RunScript(hscript):
interp.evalHaxe(hscript);
default:
}
});
}
}