From 3c8cffc5adba6d3e4da451653fab05adbd5d1f36 Mon Sep 17 00:00:00 2001 From: Anand Chitipothu Date: Fri, 7 May 2021 13:59:38 +0530 Subject: [PATCH] fix: fixed the issue of unable to create sketches. The livecode API has been generalized and there was some backwackward-incompatible changes in that proces. Added livecode-canvas.js with the required options to fix the issue. --- community/public/build.json | 4 + community/public/js/livecode-canvas.js | 106 +++++++++++++++++++++++++ community/www/macros/livecode.html | 5 +- 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 community/public/js/livecode-canvas.js diff --git a/community/public/build.json b/community/public/build.json index 6be9391d..06a54a29 100644 --- a/community/public/build.json +++ b/community/public/build.json @@ -6,5 +6,9 @@ "public/css/style.css", "public/css/vars.css", "public/css/style.less" + ], + "js/livecode-canvas.js": [ + "public/js/livecode-canvas.js" ] + } diff --git a/community/public/js/livecode-canvas.js b/community/public/js/livecode-canvas.js new file mode 100644 index 00000000..af37a2d6 --- /dev/null +++ b/community/public/js/livecode-canvas.js @@ -0,0 +1,106 @@ + +function getLiveCodeOptions() { +var START = ` +import sketch +code = open("main.py").read() +env = dict(sketch.__dict__) +exec(code, env) +` + +var SKETCH = ` +import json + +def sendmsg(msgtype, function, args): + """Sends a message to the frontend. + + The frontend will receive the specified message whenever + this function is called. The frontend can decide to some + action on each of these messages. + """ + msg = dict(msgtype=msgtype, function=function, args=args) + print("--MSG--", json.dumps(msg)) + +def _draw(func, **kwargs): + sendmsg(msgtype="draw", function=func, args=kwargs) + +def circle(x, y, d): + """Draws a circle of diameter d with center (x, y). + """ + _draw("circle", x=x, y=y, d=d) + +def line(x1, y1, x2, y2): + """Draws a line from point (x1, y1) to point (x2, y2). + """ + _draw("line", x1=x1, y1=y1, x2=x2, y2=y2) + +def rect(x, y, w, h): + """Draws a rectangle on the canvas. + + Parameters + ---------- + x: x coordinate of the top-left corner of the rectangle + y: y coordinate of the top-left corner of the rectangle + w: width of the rectangle + h: height of the rectangle + """ + _draw("rect", x=x, y=y, w=w, h=h) + +def clear(): + _draw("clear") + +# clear the canvas on start +clear() +` + const CANVAS_FUNCTIONS = { + circle: function(ctx, args) { + ctx.beginPath(); + ctx.arc(args.x, args.y, args.d/2, 0, 2*Math.PI); + ctx.stroke(); + }, + line: function(ctx, args) { + ctx.beginPath(); + ctx.moveTo(args.x1, args.y1); + ctx.lineTo(args.x2, args.y2); + ctx.stroke(); + }, + rect: function(ctx, args) { + ctx.beginPath(); + ctx.rect(args.x, args.y, args.w, args.h); + ctx.stroke(); + }, + clear: function(ctx, args) { + var width = 300; + var height = 300; + ctx.clearRect(0, 0, width, height); + } + } + + function drawOnCanvas(canvasElement, funcName, args) { + var ctx = canvasElement.getContext('2d'); + var func = CANVAS_FUNCTIONS[funcName]; + + var scalex = canvasElement.width/300; + var scaley = canvasElement.height/300; + + ctx.save(); + ctx.scale(scalex, scaley); + func(ctx, args); + ctx.restore(); + } + + return { + runtime: "python", + files: [ + {filename: "start.py", contents: START}, + {filename: "sketch.py", contents: SKETCH}, + ], + command: ["python", "start.py"], + codemirror: true, + onMessage: { + draw: function(editor, msg) { + const canvasElement = editor.parent.querySelector("canvas"); + drawOnCanvas(canvasElement, msg.function, msg.args); + } + } + } +} diff --git a/community/www/macros/livecode.html b/community/www/macros/livecode.html index 763b1b54..6cadc70c 100644 --- a/community/www/macros/livecode.html +++ b/community/www/macros/livecode.html @@ -49,15 +49,16 @@ {% macro LiveCodeEditorJS(name, code) %} + +