kopia lustrzana https://github.com/backface/turtlestitch
				
				
				
			enable symbols as custom block label parts
as well as enabling Costumes to become Symbols, and additional symbols (speech bubble, arrows, robot)pull/3/merge
							rodzic
							
								
									3c209e8421
								
							
						
					
					
						commit
						2226f0c92a
					
				
							
								
								
									
										384
									
								
								blocks.js
								
								
								
								
							
							
						
						
									
										384
									
								
								blocks.js
								
								
								
								
							| 
						 | 
				
			
			@ -149,13 +149,13 @@ useBlurredShadows, version, window, SpeechBubbleMorph, modules, StageMorph,
 | 
			
		|||
fontHeight*/
 | 
			
		||||
 | 
			
		||||
/*global SpriteMorph, Context, ListWatcherMorph, CellMorph,
 | 
			
		||||
DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph*/
 | 
			
		||||
DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph, Costume*/
 | 
			
		||||
 | 
			
		||||
/*global IDE_Morph, BlockDialogMorph, BlockEditorMorph, localize, isNil*/
 | 
			
		||||
 | 
			
		||||
// Global stuff ////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
modules.blocks = '2013-October-08';
 | 
			
		||||
modules.blocks = '2013-October-25';
 | 
			
		||||
 | 
			
		||||
var SyntaxElementMorph;
 | 
			
		||||
var BlockMorph;
 | 
			
		||||
| 
						 | 
				
			
			@ -642,7 +642,7 @@ SyntaxElementMorph.prototype.fixBlockColor = function (
 | 
			
		|||
// SyntaxElementMorph label parts:
 | 
			
		||||
 | 
			
		||||
SyntaxElementMorph.prototype.labelPart = function (spec) {
 | 
			
		||||
    var part;
 | 
			
		||||
    var part, tokens;
 | 
			
		||||
    if (spec[0] === '%' &&
 | 
			
		||||
            spec.length > 1 &&
 | 
			
		||||
            this.selector !== 'reportGetVar') {
 | 
			
		||||
| 
						 | 
				
			
			@ -1232,6 +1232,57 @@ SyntaxElementMorph.prototype.labelPart = function (spec) {
 | 
			
		|||
        default:
 | 
			
		||||
            // nop();
 | 
			
		||||
        }
 | 
			
		||||
    } else if (spec[0] === '$' &&
 | 
			
		||||
            spec.length > 1 &&
 | 
			
		||||
            this.selector !== 'reportGetVar') {
 | 
			
		||||
/*
 | 
			
		||||
        // allow costumes as label symbols
 | 
			
		||||
        // has issues when loading costumes (asynchronously)
 | 
			
		||||
        // commented out for now
 | 
			
		||||
 | 
			
		||||
        var rcvr = this.definition.receiver || this.receiver(),
 | 
			
		||||
            id = spec.slice(1),
 | 
			
		||||
            cst;
 | 
			
		||||
        if (!rcvr) {return this.labelPart('%stop'); }
 | 
			
		||||
        cst = detect(
 | 
			
		||||
            rcvr.costumes.asArray(),
 | 
			
		||||
            function (each) {return each.name === id; }
 | 
			
		||||
        );
 | 
			
		||||
        part = new SymbolMorph(cst);
 | 
			
		||||
        part.size = this.fontSize * 1.5;
 | 
			
		||||
        part.color = new Color(255, 255, 255);
 | 
			
		||||
        part.isProtectedLabel = true; // doesn't participate in zebraing
 | 
			
		||||
        part.drawNew();
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
        // allow GUI symbols as label icons
 | 
			
		||||
        // usage: $symbolName[-size-r-g-b], size and color values are optional
 | 
			
		||||
        tokens = spec.slice(1).split('-');
 | 
			
		||||
        if (!contains(SymbolMorph.prototype.names, tokens[0])) {
 | 
			
		||||
            part = new StringMorph(spec);
 | 
			
		||||
            part.fontName = this.labelFontName;
 | 
			
		||||
            part.fontStyle = this.labelFontStyle;
 | 
			
		||||
            part.fontSize = this.fontSize;
 | 
			
		||||
            part.color = new Color(255, 255, 255);
 | 
			
		||||
            part.isBold = true;
 | 
			
		||||
            part.shadowColor = this.color.darker(this.labelContrast);
 | 
			
		||||
            part.shadowOffset = MorphicPreferences.isFlat ?
 | 
			
		||||
                    new Point() : this.embossing;
 | 
			
		||||
            part.drawNew();
 | 
			
		||||
            return part;
 | 
			
		||||
        }
 | 
			
		||||
        part = new SymbolMorph(tokens[0]);
 | 
			
		||||
        part.size = this.fontSize * (+tokens[1] || 1.2);
 | 
			
		||||
        part.color = new Color(
 | 
			
		||||
            +tokens[2] === 0 ? 0 : +tokens[2] || 255,
 | 
			
		||||
            +tokens[3] === 0 ? 0 : +tokens[3] || 255,
 | 
			
		||||
            +tokens[4] === 0 ? 0 : +tokens[4] || 255
 | 
			
		||||
        );
 | 
			
		||||
        part.isProtectedLabel = tokens.length > 2; // zebra colors
 | 
			
		||||
        part.shadowColor = this.color.darker(this.labelContrast);
 | 
			
		||||
        part.shadowOffset = MorphicPreferences.isFlat ?
 | 
			
		||||
                new Point() : this.embossing;
 | 
			
		||||
        part.drawNew();
 | 
			
		||||
    } else {
 | 
			
		||||
        part = new StringMorph(spec);
 | 
			
		||||
        part.fontName = this.labelFontName;
 | 
			
		||||
| 
						 | 
				
			
			@ -7427,6 +7478,10 @@ TextSlotMorph.prototype.layoutChanged = function () {
 | 
			
		|||
    I display graphical symbols, such as special letters. I have been
 | 
			
		||||
    called into existence out of frustration about not being able to
 | 
			
		||||
    consistently use Unicode characters to the same ends.
 | 
			
		||||
 | 
			
		||||
    Symbols can also display costumes, if one is specified in lieu
 | 
			
		||||
    of a name property, although this feature is currently not being
 | 
			
		||||
    used because of asynchronous image loading issues.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// SymbolMorph inherits from Morph:
 | 
			
		||||
| 
						 | 
				
			
			@ -7435,6 +7490,54 @@ SymbolMorph.prototype = new Morph();
 | 
			
		|||
SymbolMorph.prototype.constructor = SymbolMorph;
 | 
			
		||||
SymbolMorph.uber = Morph.prototype;
 | 
			
		||||
 | 
			
		||||
// SymbolMorph available symbols:
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.names = [
 | 
			
		||||
    'square',
 | 
			
		||||
    'pointRight',
 | 
			
		||||
    'gears',
 | 
			
		||||
    'file',
 | 
			
		||||
    'fullScreen',
 | 
			
		||||
    'normalScreen',
 | 
			
		||||
    'smallStage',
 | 
			
		||||
    'normalStage',
 | 
			
		||||
    'turtle',
 | 
			
		||||
    'stage',
 | 
			
		||||
    'turtleOutline',
 | 
			
		||||
    'pause',
 | 
			
		||||
    'flag',
 | 
			
		||||
    'octagon',
 | 
			
		||||
    'cloud',
 | 
			
		||||
    'cloudOutline',
 | 
			
		||||
    'cloudGradient',
 | 
			
		||||
    'turnRight',
 | 
			
		||||
    'turnLeft',
 | 
			
		||||
    'storage',
 | 
			
		||||
    'poster',
 | 
			
		||||
    'flash',
 | 
			
		||||
    'brush',
 | 
			
		||||
    'rectangle',
 | 
			
		||||
    'rectangleSolid',
 | 
			
		||||
    'circle',
 | 
			
		||||
    'circleSolid',
 | 
			
		||||
    'line',
 | 
			
		||||
    'crosshairs',
 | 
			
		||||
    'paintbucket',
 | 
			
		||||
    'eraser',
 | 
			
		||||
    'pipette',
 | 
			
		||||
    'speechBubble',
 | 
			
		||||
    'speechBubbleOutline',
 | 
			
		||||
    'arrowUp',
 | 
			
		||||
    'arrowUpOutline',
 | 
			
		||||
    'arrowLeft',
 | 
			
		||||
    'arrowLeftOutline',
 | 
			
		||||
    'arrowDown',
 | 
			
		||||
    'arrowDownOutline',
 | 
			
		||||
    'arrowRight',
 | 
			
		||||
    'arrowRightOutline',
 | 
			
		||||
    'robot'
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
// SymbolMorph instance creation:
 | 
			
		||||
 | 
			
		||||
function SymbolMorph(name, size, color, shadowOffset, shadowColor) {
 | 
			
		||||
| 
						 | 
				
			
			@ -7442,7 +7545,7 @@ function SymbolMorph(name, size, color, shadowOffset, shadowColor) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.init = function (
 | 
			
		||||
    name,
 | 
			
		||||
    name, // or costume
 | 
			
		||||
    size,
 | 
			
		||||
    color,
 | 
			
		||||
    shadowOffset,
 | 
			
		||||
| 
						 | 
				
			
			@ -7450,7 +7553,7 @@ SymbolMorph.prototype.init = function (
 | 
			
		|||
) {
 | 
			
		||||
    this.isProtectedLabel = false; // participate in zebraing
 | 
			
		||||
    this.isReadOnly = true;
 | 
			
		||||
    this.name = name || 'square';
 | 
			
		||||
    this.name = name || 'square'; // can also be a costume
 | 
			
		||||
    this.size = size || ((size === 0) ? 0 : 50);
 | 
			
		||||
    this.shadowOffset = shadowOffset || new Point(0, 0);
 | 
			
		||||
    this.shadowColor = shadowColor || null;
 | 
			
		||||
| 
						 | 
				
			
			@ -7503,7 +7606,12 @@ SymbolMorph.prototype.drawNew = function () {
 | 
			
		|||
 | 
			
		||||
SymbolMorph.prototype.symbolCanvasColored = function (aColor) {
 | 
			
		||||
    // private
 | 
			
		||||
    if (this.name instanceof Costume) {
 | 
			
		||||
        return this.name.thumbnail(new Point(this.symbolWidth(), this.size));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    var canvas = newCanvas(new Point(this.symbolWidth(), this.size));
 | 
			
		||||
 | 
			
		||||
    switch (this.name) {
 | 
			
		||||
    case 'square':
 | 
			
		||||
        return this.drawSymbolStop(canvas, aColor);
 | 
			
		||||
| 
						 | 
				
			
			@ -7569,6 +7677,28 @@ SymbolMorph.prototype.symbolCanvasColored = function (aColor) {
 | 
			
		|||
        return this.drawSymbolEraser(canvas, aColor);
 | 
			
		||||
    case 'pipette':
 | 
			
		||||
        return this.drawSymbolPipette(canvas, aColor);
 | 
			
		||||
    case 'speechBubble':
 | 
			
		||||
        return this.drawSymbolSpeechBubble(canvas, aColor);
 | 
			
		||||
    case 'speechBubbleOutline':
 | 
			
		||||
        return this.drawSymbolSpeechBubbleOutline(canvas, aColor);
 | 
			
		||||
    case 'arrowUp':
 | 
			
		||||
        return this.drawSymbolArrowUp(canvas, aColor);
 | 
			
		||||
    case 'arrowUpOutline':
 | 
			
		||||
        return this.drawSymbolArrowUpOutline(canvas, aColor);
 | 
			
		||||
    case 'arrowLeft':
 | 
			
		||||
        return this.drawSymbolArrowLeft(canvas, aColor);
 | 
			
		||||
    case 'arrowLeftOutline':
 | 
			
		||||
        return this.drawSymbolArrowLeftOutline(canvas, aColor);
 | 
			
		||||
    case 'arrowDown':
 | 
			
		||||
        return this.drawSymbolArrowDown(canvas, aColor);
 | 
			
		||||
    case 'arrowDownOutline':
 | 
			
		||||
        return this.drawSymbolArrowDownOutline(canvas, aColor);
 | 
			
		||||
    case 'arrowRight':
 | 
			
		||||
        return this.drawSymbolArrowRight(canvas, aColor);
 | 
			
		||||
    case 'arrowRightOutline':
 | 
			
		||||
        return this.drawSymbolArrowRightOutline(canvas, aColor);
 | 
			
		||||
    case 'robot':
 | 
			
		||||
        return this.drawSymbolRobot(canvas, aColor);
 | 
			
		||||
    default:
 | 
			
		||||
        return canvas;
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -7577,6 +7707,10 @@ SymbolMorph.prototype.symbolCanvasColored = function (aColor) {
 | 
			
		|||
SymbolMorph.prototype.symbolWidth = function () {
 | 
			
		||||
    // private
 | 
			
		||||
    var size = this.size;
 | 
			
		||||
 | 
			
		||||
    if (this.name instanceof Costume) {
 | 
			
		||||
        return (size / this.name.height()) * this.name.width();
 | 
			
		||||
    }
 | 
			
		||||
    switch (this.name) {
 | 
			
		||||
    case 'pointRight':
 | 
			
		||||
        return Math.sqrt(size * size - Math.pow(size / 2, 2));
 | 
			
		||||
| 
						 | 
				
			
			@ -7598,7 +7732,7 @@ SymbolMorph.prototype.symbolWidth = function () {
 | 
			
		|||
    case 'turnLeft':
 | 
			
		||||
        return size / 3 * 2;
 | 
			
		||||
    default:
 | 
			
		||||
        return this.size;
 | 
			
		||||
        return size;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -8391,6 +8525,244 @@ SymbolMorph.prototype.drawSymbolPipette = function (canvas, color) {
 | 
			
		|||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolSpeechBubble = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a speech bubble
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width,
 | 
			
		||||
        h = canvas.height,
 | 
			
		||||
        n = canvas.width / 3,
 | 
			
		||||
        l = Math.max(w / 20, 0.5);
 | 
			
		||||
 | 
			
		||||
    ctx.fillStyle = color.toString();
 | 
			
		||||
    ctx.lineWidth = l * 2;
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n, n * 2);
 | 
			
		||||
    ctx.quadraticCurveTo(l, n * 2, l, n);
 | 
			
		||||
    ctx.quadraticCurveTo(l, l, n, l);
 | 
			
		||||
    ctx.lineTo(n * 2, l);
 | 
			
		||||
    ctx.quadraticCurveTo(w - l, l, w - l, n);
 | 
			
		||||
    ctx.quadraticCurveTo(w - l, n * 2, n * 2, n * 2);
 | 
			
		||||
    ctx.lineTo(n / 2, h - l);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolSpeechBubbleOutline = function (
 | 
			
		||||
    canvas,
 | 
			
		||||
    color
 | 
			
		||||
) {
 | 
			
		||||
    // answer a canvas showing a speech bubble
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width,
 | 
			
		||||
        h = canvas.height,
 | 
			
		||||
        n = canvas.width / 3,
 | 
			
		||||
        l = Math.max(w / 20, 0.5);
 | 
			
		||||
 | 
			
		||||
    ctx.strokeStyle = color.toString();
 | 
			
		||||
    ctx.lineWidth = l * 2;
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n, n * 2);
 | 
			
		||||
    ctx.quadraticCurveTo(l, n * 2, l, n);
 | 
			
		||||
    ctx.quadraticCurveTo(l, l, n, l);
 | 
			
		||||
    ctx.lineTo(n * 2, l);
 | 
			
		||||
    ctx.quadraticCurveTo(w - l, l, w - l, n);
 | 
			
		||||
    ctx.quadraticCurveTo(w - l, n * 2, n * 2, n * 2);
 | 
			
		||||
    ctx.lineTo(n / 2, h - l);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.stroke();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowUp = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing an up arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width,
 | 
			
		||||
        h = canvas.height,
 | 
			
		||||
        n = canvas.width / 2,
 | 
			
		||||
        l = Math.max(w / 20, 0.5);
 | 
			
		||||
 | 
			
		||||
    ctx.fillStyle = color.toString();
 | 
			
		||||
    ctx.lineWidth = l * 2;
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(l, n);
 | 
			
		||||
    ctx.lineTo(n, l);
 | 
			
		||||
    ctx.lineTo(w - l, n);
 | 
			
		||||
    ctx.lineTo(w * 0.65, n);
 | 
			
		||||
    ctx.lineTo(w * 0.65, h - l);
 | 
			
		||||
    ctx.lineTo(w * 0.35, h - l);
 | 
			
		||||
    ctx.lineTo(w * 0.35, n);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowUpOutline = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing an up arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width,
 | 
			
		||||
        h = canvas.height,
 | 
			
		||||
        n = canvas.width / 2,
 | 
			
		||||
        l = Math.max(w / 20, 0.5);
 | 
			
		||||
 | 
			
		||||
    ctx.strokeStyle = color.toString();
 | 
			
		||||
    ctx.lineWidth = l * 2;
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(l, n);
 | 
			
		||||
    ctx.lineTo(n, l);
 | 
			
		||||
    ctx.lineTo(w - l, n);
 | 
			
		||||
    ctx.lineTo(w * 0.65, n);
 | 
			
		||||
    ctx.lineTo(w * 0.65, h - l);
 | 
			
		||||
    ctx.lineTo(w * 0.35, h - l);
 | 
			
		||||
    ctx.lineTo(w * 0.35, n);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.stroke();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowDown = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a down arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width;
 | 
			
		||||
    ctx.save();
 | 
			
		||||
    ctx.translate(w, w);
 | 
			
		||||
    ctx.rotate(radians(180));
 | 
			
		||||
    this.drawSymbolArrowUp(canvas, color);
 | 
			
		||||
    ctx.restore();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowDownOutline = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a down arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width;
 | 
			
		||||
    ctx.save();
 | 
			
		||||
    ctx.translate(w, w);
 | 
			
		||||
    ctx.rotate(radians(180));
 | 
			
		||||
    this.drawSymbolArrowUpOutline(canvas, color);
 | 
			
		||||
    ctx.restore();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowLeft = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a left arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width;
 | 
			
		||||
    ctx.save();
 | 
			
		||||
    ctx.translate(0, w);
 | 
			
		||||
    ctx.rotate(radians(-90));
 | 
			
		||||
    this.drawSymbolArrowUp(canvas, color);
 | 
			
		||||
    ctx.restore();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowLeftOutline = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a left arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width;
 | 
			
		||||
    ctx.save();
 | 
			
		||||
    ctx.translate(0, w);
 | 
			
		||||
    ctx.rotate(radians(-90));
 | 
			
		||||
    this.drawSymbolArrowUpOutline(canvas, color);
 | 
			
		||||
    ctx.restore();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowRight = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a right arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width;
 | 
			
		||||
    ctx.save();
 | 
			
		||||
    ctx.translate(w, 0);
 | 
			
		||||
    ctx.rotate(radians(90));
 | 
			
		||||
    this.drawSymbolArrowUp(canvas, color);
 | 
			
		||||
    ctx.restore();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolArrowRightOutline = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a right arrow
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width;
 | 
			
		||||
    ctx.save();
 | 
			
		||||
    ctx.translate(w, 0);
 | 
			
		||||
    ctx.rotate(radians(90));
 | 
			
		||||
    this.drawSymbolArrowUpOutline(canvas, color);
 | 
			
		||||
    ctx.restore();
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SymbolMorph.prototype.drawSymbolRobot = function (canvas, color) {
 | 
			
		||||
    // answer a canvas showing a humanoid robot
 | 
			
		||||
    var ctx = canvas.getContext('2d'),
 | 
			
		||||
        w = canvas.width,
 | 
			
		||||
        h = canvas.height,
 | 
			
		||||
        n = canvas.width / 6,
 | 
			
		||||
        n2 = n / 2,
 | 
			
		||||
        l = Math.max(w / 20, 0.5);
 | 
			
		||||
 | 
			
		||||
    ctx.fillStyle = color.toString();
 | 
			
		||||
    //ctx.lineWidth = l * 2;
 | 
			
		||||
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n + l, n);
 | 
			
		||||
    ctx.lineTo(n * 2, n);
 | 
			
		||||
    ctx.lineTo(n * 2.5, n * 1.5);
 | 
			
		||||
    ctx.lineTo(n * 3.5, n * 1.5);
 | 
			
		||||
    ctx.lineTo(n * 4, n);
 | 
			
		||||
    ctx.lineTo(n * 5 - l, n);
 | 
			
		||||
    ctx.lineTo(n * 4, n * 3);
 | 
			
		||||
    ctx.lineTo(n * 4, n * 4 - l);
 | 
			
		||||
    ctx.lineTo(n * 2, n * 4 - l);
 | 
			
		||||
    ctx.lineTo(n * 2, n * 3);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n * 2.75, n + l);
 | 
			
		||||
    ctx.lineTo(n * 2.4, n);
 | 
			
		||||
    ctx.lineTo(n * 2.2, 0);
 | 
			
		||||
    ctx.lineTo(n * 3.8, 0);
 | 
			
		||||
    ctx.lineTo(n * 3.6, n);
 | 
			
		||||
    ctx.lineTo(n * 3.25, n + l);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n * 2.5, n * 4);
 | 
			
		||||
    ctx.lineTo(n, n * 4);
 | 
			
		||||
    ctx.lineTo(n2 + l, h);
 | 
			
		||||
    ctx.lineTo(n * 2, h);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n * 3.5, n * 4);
 | 
			
		||||
    ctx.lineTo(n * 5, n * 4);
 | 
			
		||||
    ctx.lineTo(w - (n2 + l), h);
 | 
			
		||||
    ctx.lineTo(n * 4, h);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n, n);
 | 
			
		||||
    ctx.lineTo(l, n * 1.5);
 | 
			
		||||
    ctx.lineTo(l, n * 3.25);
 | 
			
		||||
    ctx.lineTo(n * 1.5, n * 3.5);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
 | 
			
		||||
    ctx.beginPath();
 | 
			
		||||
    ctx.moveTo(n * 5, n);
 | 
			
		||||
    ctx.lineTo(w - l, n * 1.5);
 | 
			
		||||
    ctx.lineTo(w - l, n * 3.25);
 | 
			
		||||
    ctx.lineTo(n * 4.5, n * 3.5);
 | 
			
		||||
    ctx.closePath();
 | 
			
		||||
    ctx.fill();
 | 
			
		||||
 | 
			
		||||
    return canvas;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// ColorSlotMorph //////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1968,3 +1968,7 @@ ______
 | 
			
		|||
131017
 | 
			
		||||
------
 | 
			
		||||
* Threads: fixed #213 - Empty else block breaks return to caller
 | 
			
		||||
 | 
			
		||||
131025
 | 
			
		||||
———
 | 
			
		||||
* Blocks: - enable Costumes as Symbols and Symbols as custom block label parts
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue