diff options
| -rw-r--r-- | blocks.js | 54 | ||||
| -rw-r--r-- | gui.js | 4 | ||||
| -rwxr-xr-x | history.txt | 6 | ||||
| -rwxr-xr-x | lang-pt.js | 2 | ||||
| -rw-r--r-- | objects.js | 19 | ||||
| -rw-r--r-- | threads.js | 26 |
6 files changed, 101 insertions, 10 deletions
@@ -155,7 +155,7 @@ DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph, Costume*/ // Global stuff //////////////////////////////////////////////////////// -modules.blocks = '2014-July-29'; +modules.blocks = '2014-July-30'; var SyntaxElementMorph; @@ -1621,7 +1621,7 @@ SyntaxElementMorph.prototype.isEmptySlot = function () { // SyntaxElementMorph speech bubble feedback: -SyntaxElementMorph.prototype.showBubble = function (value) { +SyntaxElementMorph.prototype.showBubble = function (value, exportPic) { var bubble, txt, img, @@ -1695,11 +1695,28 @@ SyntaxElementMorph.prototype.showBubble = function (value) { this.rightCenter().add(new Point(2, 0)), isClickable ); + if (exportPic) { + this.exportPictureWithResult(bubble); + } if (sf) { bubble.keepWithin(sf); } }; +SyntaxElementMorph.prototype.exportPictureWithResult = function (aBubble) { + var scr = this.fullImage(), + bub = aBubble.fullImageClassic(), + taller = Math.max(0, bub.height - scr.height), + pic = newCanvas(new Point( + scr.width + bub.width + 2, + scr.height + taller + )), + ctx = pic.getContext('2d'); + ctx.drawImage(scr, 0, pic.height - scr.height); + ctx.drawImage(bub, scr.width + 2, 0); + window.open(pic.toDataURL()); +}; + // SyntaxElementMorph code mapping /* @@ -2026,13 +2043,29 @@ BlockMorph.prototype.userMenu = function () { var menu = new MenuMorph(this), world = this.world(), myself = this, + shiftClicked = world.currentKey === 16, alternatives, + top, blck; menu.addItem( "help...", 'showHelp' ); + if (shiftClicked) { + top = this.topBlock(); + if (top instanceof ReporterBlockMorph) { + menu.addItem( + "script pic with result...", + function () { + top.ExportResultPic(); + }, + 'open a new window\n' + + 'with a picture of both\nthis script and its result', + new Color(100, 0, 0) + ); + } + } if (this.isTemplate) { if (!(this.parent instanceof SyntaxElementMorph)) { if (this.selector !== 'evaluateCustomBlock') { @@ -4115,6 +4148,23 @@ ReporterBlockMorph.prototype.mouseClickLeft = function (pos) { } }; +// ReporterBlock exporting picture with result bubble + +ReporterBlockMorph.prototype.ExportResultPic = function () { + var top = this.topBlock(), + receiver = top.receiver(), + stage; + if (top !== this) {return; } + if (receiver) { + stage = receiver.parentThatIsA(StageMorph); + if (stage) { + stage.threads.stopProcess(top); + stage.threads.startProcess(top, false, true); + } + } +}; + + // ReporterBlockMorph deleting ReporterBlockMorph.prototype.userDestroy = function () { @@ -1828,7 +1828,9 @@ IDE_Morph.prototype.duplicateSprite = function (sprite) { }; IDE_Morph.prototype.removeSprite = function (sprite) { - var idx = this.sprites.asArray().indexOf(sprite) + 1; + var idx, myself = this; + sprite.parts.forEach(function (part) {myself.removeSprite(part); }); + idx = this.sprites.asArray().indexOf(sprite) + 1; this.stage.threads.stopAllForReceiver(sprite); sprite.destroy(); this.stage.watchers().forEach(function (watcher) { diff --git a/history.txt b/history.txt index 0568bda..0a7dfe6 100755 --- a/history.txt +++ b/history.txt @@ -2250,3 +2250,9 @@ ______ * updated German translation * Morphic: fixed #497 (prevent bubble shadows from getting cut-off) * Blocks: keep result-bubbles within the enclosing scripting pane + +140730 +------ +* Objects: propagate HIDE and SHOW to nested sprite parts +* GUI: propagate DELETE to nested sprite parts +* Blocks, Threads: export script pic with result bubble (shift-context-menu of reporter scripts) @@ -835,6 +835,8 @@ SnapTranslator.dict.pt = { // actores: 'edit': 'editar', + 'move': + 'mover', 'detach from': 'soltar de', 'detach all parts': @@ -125,7 +125,7 @@ PrototypeHatBlockMorph*/ // Global stuff //////////////////////////////////////////////////////// -modules.objects = '2014-July-29'; +modules.objects = '2014-July-30'; var SpriteMorph; var StageMorph; @@ -2708,6 +2708,23 @@ SpriteMorph.prototype.removeClone = function () { // SpriteMorph primitives +// SpriteMorph hiding and showing: + +/* + override the inherited behavior to also hide/show all + nested parts. +*/ + +SpriteMorph.prototype.hide = function () { + SpriteMorph.uber.hide.call(this); + this.parts.forEach(function (part) {part.hide(); }); +}; + +SpriteMorph.prototype.show = function () { + SpriteMorph.uber.show.call(this); + this.parts.forEach(function (part) {part.show(); }); +}; + // SpriteMorph pen color SpriteMorph.prototype.setColor = function (aColor) { @@ -83,7 +83,7 @@ ArgLabelMorph, localize, XML_Element, hex_sha512*/ // Global stuff //////////////////////////////////////////////////////// -modules.threads = '2014-July-28'; +modules.threads = '2014-July-30'; var ThreadManager; var Process; @@ -134,7 +134,11 @@ ThreadManager.prototype.toggleProcess = function (block) { } }; -ThreadManager.prototype.startProcess = function (block, isThreadSafe) { +ThreadManager.prototype.startProcess = function ( + block, + isThreadSafe, + exportResult +) { var active = this.findProcess(block), top = block.topBlock(), newProc; @@ -147,6 +151,7 @@ ThreadManager.prototype.startProcess = function (block, isThreadSafe) { } top.addHighlight(); newProc = new Process(block.topBlock()); + newProc.exportResult = exportResult; this.processes.push(newProc); return newProc; }; @@ -232,11 +237,17 @@ ThreadManager.prototype.removeTerminatedProcesses = function () { if (proc.topBlock instanceof ReporterBlockMorph) { if (proc.homeContext.inputs[0] instanceof List) { - proc.topBlock.showBubble(new ListWatcherMorph( - proc.homeContext.inputs[0] - )); + proc.topBlock.showBubble( + new ListWatcherMorph( + proc.homeContext.inputs[0] + ), + proc.exportResult + ); } else { - proc.topBlock.showBubble(proc.homeContext.inputs[0]); + proc.topBlock.showBubble( + proc.homeContext.inputs[0], + proc.exportResult + ); } } } else { @@ -302,6 +313,8 @@ ThreadManager.prototype.findProcess = function (block) { httpRequest active instance of an HttpRequest or null pauseOffset msecs between the start of an interpolated operation and when the process was paused + exportResult boolean flag indicating whether a picture of the top + block along with the result bubble shoud be exported */ Process.prototype = {}; @@ -325,6 +338,7 @@ function Process(topBlock) { this.isPaused = false; this.pauseOffset = null; this.frameCount = 0; + this.exportResult = false; if (topBlock) { this.homeContext.receiver = topBlock.receiver(); |
