espruino-web-ide
Version:
A Terminal and Graphical code Editor for Espruino JavaScript Microcontrollers
285 lines (274 loc) • 9.76 kB
JavaScript
/**
Copyright 2014 Gordon Williams (gw@pur3.co.uk)
This Source Code is subject to the terms of the Mozilla Public
License, v2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
------------------------------------------------------------------
Blockly blocks for Espruino Graphics (global variable g)
------------------------------------------------------------------
**/
var GFX_COL = 20;
function gfxStatement(blk, comment) {
blk.setPreviousStatement(true);
blk.setNextStatement(true);
blk.setColour(GFX_COL);
blk.setInputsInline(true);
blk.setTooltip(comment);
}
function gfxInput(blk, comment) {
blk.setOutput(true, 'Number');
blk.setColour(GFX_COL);
blk.setInputsInline(true);
blk.setTooltip(comment);
}
// ----------------------------------------------------------
Blockly.Blocks.gfx_clear = {
category: 'Graphics',
init: function() {
this.appendDummyInput()
.appendField('Clear Screen');
gfxStatement(this, 'Clear the screen');
}
};
Blockly.JavaScript.gfx_clear = function() {
return `g.clear();\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_flip = {
category: 'Graphics',
init: function() {
this.appendDummyInput()
.appendField('Update Screen');
gfxStatement(this, 'Update (flip) the screen to show what was just drawn (not needed on Bangle.js)');
}
};
Blockly.JavaScript.gfx_flip = function() {
return `g.flip();\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_setColor = {
category: 'Graphics',
init: function() {
this.appendDummyInput()
.appendField('Color')
.appendField(new Blockly.FieldColour('#ff0000'), 'COL');
gfxStatement(this, 'Set the color');
}
};
Blockly.JavaScript.gfx_setColor = function() {
var c = this.getFieldValue('COL');
var r = parseInt(c.substr(1,2),16)/255,
g = parseInt(c.substr(3,2),16)/255,
b = parseInt(c.substr(5,2),16)/255;
return `g.setColor(${r},${g},${b});\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_setBgColor = {
category: 'Graphics',
init: function() {
this.appendDummyInput()
.appendField('Background Color')
.appendField(new Blockly.FieldColour('#ff0000'), 'COL');
gfxStatement(this, 'Set the background color');
}
};
Blockly.JavaScript.gfx_setBgColor = function() {
var c = this.getFieldValue('COL');
var r = parseInt(c.substr(1,2),16)/255,
g = parseInt(c.substr(3,2),16)/255,
b = parseInt(c.substr(5,2),16)/255;
return `g.setBgColor(${r},${g},${b});\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_setFont = {
category: 'Graphics',
init: function() {
this.appendDummyInput().appendField('Set Font ').appendField(new Blockly.FieldDropdown([
["6x8","6x8"],
["4x6","4x6"],
["Vector","Vector"]
]), 'STYLE');
this.appendValueInput('SIZE')
.setCheck(['Number'])
.appendField('size');
this.appendDummyInput().appendField('Aligned').appendField(new Blockly.FieldDropdown([
["Left","-1"],
["Center","0"],
["Right","1"],
]), 'X').appendField(new Blockly.FieldDropdown([
["Top","-1"],
["Middle","0"],
["Bottom","1"],
]), 'Y');
gfxStatement(this, 'Set the font');
}
};
Blockly.JavaScript.gfx_setFont = function() {
var font = this.getFieldValue('STYLE');
var size = Blockly.JavaScript.valueToCode(this, 'SIZE', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var x = this.getFieldValue('X');
var y = this.getFieldValue('Y');
return `g.setFont("${font}",${size});g.setFontAlign(${x},${y});\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_drawString = {
category: 'Graphics',
init: function() {
this.appendValueInput('TEXT')
.setCheck(['String','Number','Boolean'])
.appendField('Draw Text')
this.appendValueInput('X')
.setCheck(['Number'])
.appendField('at X');
this.appendValueInput('Y')
.setCheck(['Number'])
.appendField('Y');
gfxStatement(this, 'Draw some text');
}
};
Blockly.JavaScript.gfx_drawString = function() {
var text = Blockly.JavaScript.valueToCode(this, 'TEXT', Blockly.JavaScript.ORDER_ASSIGNMENT) || '""';
var x = Blockly.JavaScript.valueToCode(this, 'X', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var y = Blockly.JavaScript.valueToCode(this, 'Y', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
return `g.drawString(${text},${x},${y},true);\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_moveTo = {
category: 'Graphics',
init: function() {
this.appendValueInput('X')
.setCheck(['Number'])
.appendField('Move to X');
this.appendValueInput('Y')
.setCheck(['Number'])
.appendField('Y');
gfxStatement(this, 'Move the cursor to a location');
}
};
Blockly.JavaScript.gfx_moveTo = function() {
var x = Blockly.JavaScript.valueToCode(this, 'X', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var y = Blockly.JavaScript.valueToCode(this, 'Y', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
return `g.moveTo(${x},${y});\n`;
};
Blockly.Blocks.gfx_lineTo = {
category: 'Graphics',
init: function() {
this.appendValueInput('X')
.setCheck(['Number'])
.appendField('Line to X');
this.appendValueInput('Y')
.setCheck(['Number'])
.appendField('Y');
gfxStatement(this, 'Draw a line to location');
}
};
Blockly.JavaScript.gfx_lineTo = function() {
var x = Blockly.JavaScript.valueToCode(this, 'X', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var y = Blockly.JavaScript.valueToCode(this, 'Y', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
return `g.lineTo(${x},${y});\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_draw = {
category: 'Graphics',
init: function() {
this.appendDummyInput().appendField('Draw ').appendField(new Blockly.FieldDropdown([
["Rectangle","drawRect"],
["Filled Rectangle","fillRect"],
["Cleared Rectangle","clearRect"],
["Ellipse","drawEllipse"],
["Filled Ellipse","fillEllipse"]
]), 'STYLE');
this.appendValueInput('X')
.setCheck(['Number'])
.appendField('from X');
this.appendValueInput('Y')
.setCheck(['Number'])
.appendField('Y');
this.appendValueInput('X2')
.setCheck(['Number'])
.appendField('to X');
this.appendValueInput('Y2')
.setCheck(['Number'])
.appendField('Y');
gfxStatement(this, 'Draw a rectangle');
}
};
Blockly.JavaScript.gfx_draw = function() {
var cmd = this.getFieldValue('STYLE');
var x = Blockly.JavaScript.valueToCode(this, 'X', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var y = Blockly.JavaScript.valueToCode(this, 'Y', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var x2 = Blockly.JavaScript.valueToCode(this, 'X2', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var y2 = Blockly.JavaScript.valueToCode(this, 'Y2', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
return `g.${cmd}(${x},${y},${x2},${y2});\n`;
};
// ----------------------------------------------------------
Blockly.Blocks.gfx_image = {
category: 'Graphics',
init: function() {
var block = this;
var defaultImage = "media/espruino.png";
var fi = new Blockly.FieldImage(
defaultImage,
64,64,"*", // width & height
onChooseImage);
fi.name = "IMAGE";
fi.EDITABLE = true;
this.appendDummyInput('IMAGE')
.appendField("image:")
.appendField(fi);
this.appendValueInput('X')
.setCheck(['Number'])
.appendField('at X');
this.appendValueInput('Y')
.setCheck(['Number'])
.appendField('Y');
gfxStatement(this, 'Draw an image');
function onChooseImage(field) {
//this.getSourceBlock()
var loaderId = "GfxImageLoader";
var fileLoader = document.getElementById(loaderId);
if (!fileLoader) {
fileLoader = document.createElement("input");
fileLoader.setAttribute("id", loaderId);
fileLoader.setAttribute("type", "file");
fileLoader.setAttribute("style", "z-index:-2000;position:absolute;top:0px;left:0px;");
fileLoader.setAttribute("accept","image/*");
fileLoader.addEventListener('click', function(e) {
e.target.value = ''; // handle repeated upload of the same file
});
document.body.appendChild(fileLoader);
}
fileLoader.onchange = function(e) {
var reader = new FileReader();
reader.onload = function(e) {
field.setValue(reader.result);
loadImage(reader.result);
};
reader.readAsDataURL(e.target.files[0]);
};
fileLoader.click();
}
function loadImage(url) {
var img = new Image();
img.src = url
img.onload = function () {
// Add a check for width and height here??
var str = imageconverter.imagetoString(img, {
mode:"4bitmac", // 1 bit on Pixl.js?
diffusion:"error",
transparent:true
//compression:true,
});
block.IMAGESTR = str;
}
}
loadImage(defaultImage);
}
};
Blockly.JavaScript.gfx_image = function() {
var cmd = this.getFieldValue('IMAGE');
var x = Blockly.JavaScript.valueToCode(this, 'X', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var y = Blockly.JavaScript.valueToCode(this, 'Y', Blockly.JavaScript.ORDER_ASSIGNMENT) || 0;
var img = this.IMAGESTR;
return `g.drawImage(${img}, ${x},${y});\n`;
};