summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmoenig <jens@moenig.org>2014-07-30 16:28:01 +0200
committerjmoenig <jens@moenig.org>2014-07-30 16:28:01 +0200
commit61dd479a2b5b79714cf9125d222fb7996674f1a7 (patch)
tree008cc0e5e941741646e5e3934564f457d96003f7
parent9f7028dbf95262cde83a524abc59987736eb5d32 (diff)
downloadsnap-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.js54
-rwxr-xr-xhistory.txt1
-rw-r--r--threads.js26
3 files changed, 73 insertions, 8 deletions
diff --git a/blocks.js b/blocks.js
index 5a15fa4..2e297ab 100644
--- a/blocks.js
+++ b/blocks.js
@@ -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)
diff --git a/threads.js b/threads.js
index 4989a23..3324ac6 100644
--- a/threads.js
+++ b/threads.js
@@ -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();