From 72f0535ea47a2fec411260ea03d5232abe1e6d5e Mon Sep 17 00:00:00 2001 From: Eugenio Parodi Date: Mon, 20 Nov 2023 23:56:11 +0000 Subject: [PATCH] Extracted the bacis js routine from the sandbox --- tests/sandbox/js/ttkproxy.js | 205 +++++++++++++++++++++++++++++++++ tests/sandbox/sandbox.new.html | 184 +++++++++++++++++++++++++++++ 2 files changed, 389 insertions(+) create mode 100644 tests/sandbox/js/ttkproxy.js create mode 100644 tests/sandbox/sandbox.new.html diff --git a/tests/sandbox/js/ttkproxy.js b/tests/sandbox/js/ttkproxy.js new file mode 100644 index 00000000..6eff0038 --- /dev/null +++ b/tests/sandbox/js/ttkproxy.js @@ -0,0 +1,205 @@ +/* +MIT License + +Copyright (c) 2023 Eugenio Parodi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +// Declaration +class TTkProxy { + constructor(term) { + this.term = term + } + + pyodideProxy = { + consoleLog: function(m){ + console.log("TTk:",m) + }, + termPush: function (s) { + this.term.write(s); + }, + termSize: function () { + return [this.term.cols, this.term.rows] + }, + setTimeout: function(t, i) { + // console.log("TIME (Start)",i,t) + return setTimeout(() => this.ttk_timer(i), t) + }, + stopTimeout: function(t) { + // console.log("TIME (Stop)",t) + clearTimeout(t) + }, + clearTimeout: function(){ + let highestTimeoutId = setTimeout(";"); + for (let i = 0 ; i < highestTimeoutId ; i++) { + clearTimeout(i); + } + }, + setInterval: function(t, i) { + setTinterval(() => console.log('WIP -> Interval' + i), t) + } + }; + + async init(){ + this.pyodide = await loadPyodide(); + this.ttk_timer = (i) => console.log("ttk_timer unimplemented") + this.term.write('Pyodide ('+this.pyodide.version+') - Loaded\n\r') + + this.pyodide.registerJsModule("pyodideProxy", this.pyodideProxy); + this.term.write('Pyodide Proxy - Loaded\n\r') + } + + async loadLib(lib) { + let zipResponse = await fetch(lib); + let zipBinary = await zipResponse.arrayBuffer(); + this.pyodide.unpackArchive(zipBinary, ".tar.gz"); + } + + async loadFile(fileUri,file){ + this.pyodide.FS.writeFile(this.pyodide.FS.currentPath+file, await (await fetch(fileUri)).text()); + } + + readFile(file){ + return this.pyodide.FS.readFile(file, {encoding:'utf8'}) + } + + currentPath(){ + return this.pyodide.FS.currentPath + } + + getAllFiles(p){ + let ls = this.pyodide.FS.readdir(p) + let ret = [] + for(let i=0 ; i "+val.replace("\\033","") + " - ") + ttk.TTkHelper.paintAll() + + def ttk_clean(): + if ttk.TTkHelper._rootWidget: + ttk.TTkTimer.pyodideQuit() + ttk.TTkHelper._rootWidget.quit() + ttk.TTkHelper._focusWidget = None + ttk.TTkHelper._rootCanvas = None + ttk.TTkHelper._rootWidget = None + ttk.TTkHelper._updateBuffer = set() + ttk.TTkHelper._updateWidget = set() + ttk.TTkHelper._overlay = [] + ttk.TTkHelper._shortcut = [] + ttk.TTkLog._messageHandler = [message_handler] + + def ttk_init(): + ttk.TTkToolTip.toolTipTimer = ttk.TTkTimer() + ttk.TTkToolTip.toolTipTimer.timeout.connect(ttk.TTkToolTip._toolTipShow) + + def message_handler(mode, context, message): + msgType = "DEBUG" + if mode == ttk.TTkLog.InfoMsg: msgType = "[INFO]" + elif mode == ttk.TTkLog.WarningMsg: msgType = "[WARNING]" + elif mode == ttk.TTkLog.CriticalMsg: msgType = "[CRITICAL]" + elif mode == ttk.TTkLog.FatalMsg: msgType = "[FATAL]" + elif mode == ttk.TTkLog.ErrorMsg: msgType = "[ERROR]" + pyodideProxy.consoleLog(f"{msgType} {context.file} {message}") + # Register the callback to the message handler + ttk.TTkLog.installMessageHandler(message_handler) + `,{ globals: this.namespace } + ); + + this.ttk_log = this.namespace.get("ttk_log"); + this.ttk_input = this.namespace.get("ttk_input"); + this.ttk_timer = this.namespace.get("ttk_timer"); + this.ttk_resize = this.namespace.get("ttk_resize"); + this.ttk_clean = this.namespace.get("ttk_clean"); + this.ttk_init = this.namespace.get("ttk_init"); + + this.pyodideProxy.ttk_timer = this.ttk_timer + this.pyodideProxy.term = this.term + + this.term.onResize( (obj) => { + this.term.reset() + this.ttk_resize(obj.cols, obj.rows) + }); + this.term.onData((d, evt) => { this.ttk_input(d) }) + + this.pyodide.runPython(` + import sys,os + sys.path.append(os.path.join(sys.path[0],'demo')) + __name__ = "__main__" + `,{ globals: this.namespace } + ); + } + + run(code,filename,fps) { + this.ttk_clean() + console.log("Run App") + + let pwd = this.pyodide.PATH.dirname(filename) + + this.pyodide.runPython(` + __file__='`+filename+`' + os.chdir('`+pwd+`') + ttk.TTkCfg.maxFps = `+fps,{ globals: this.namespace }) + + this.ttk_init() + + this.pyodide.runPython(code,{ globals: this.namespace }); + + this.ttk_log(filename + " - LOADED") + } +} \ No newline at end of file diff --git a/tests/sandbox/sandbox.new.html b/tests/sandbox/sandbox.new.html new file mode 100644 index 00000000..036f960d --- /dev/null +++ b/tests/sandbox/sandbox.new.html @@ -0,0 +1,184 @@ + + + + Mr. pyTermTk Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + \ No newline at end of file