diff options
| author | jmoenig <jens@moenig.org> | 2014-07-30 16:28:01 +0200 |
|---|---|---|
| committer | jmoenig <jens@moenig.org> | 2014-07-30 16:28:01 +0200 |
| commit | 61dd479a2b5b79714cf9125d222fb7996674f1a7 (patch) | |
| tree | 008cc0e5e941741646e5e3934564f457d96003f7 | |
| parent | 9f7028dbf95262cde83a524abc59987736eb5d32 (diff) | |
| download | snap-61dd479a2b5b79714cf9125d222fb7996674f1a7.tar.gz snap-61dd479a2b5b79714cf9125d222fb7996674f1a7.zip | |
export script pic with result bubble
hidden option in the shift-context-menu of reporter scripts
| -rw-r--r-- | blocks.js | 54 | ||||
| -rwxr-xr-x | history.txt | 1 | ||||
| -rw-r--r-- | threads.js | 26 |
3 files changed, 73 insertions, 8 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 () { diff --git a/history.txt b/history.txt index b67e91c..0a7dfe6 100755 --- a/history.txt +++ b/history.txt @@ -2255,3 +2255,4 @@ ______ ------ * 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) @@ -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(); |
