summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blocks.js54
-rw-r--r--gui.js4
-rwxr-xr-xhistory.txt6
-rwxr-xr-xlang-pt.js2
-rw-r--r--objects.js19
-rw-r--r--threads.js26
6 files changed, 101 insertions, 10 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/gui.js b/gui.js
index 9850184..a4e1dd5 100644
--- a/gui.js
+++ b/gui.js
@@ -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)
diff --git a/lang-pt.js b/lang-pt.js
index 488c706..2c0e1be 100755
--- a/lang-pt.js
+++ b/lang-pt.js
@@ -835,6 +835,8 @@ SnapTranslator.dict.pt = {
// actores:
'edit':
'editar',
+ 'move':
+ 'mover',
'detach from':
'soltar de',
'detach all parts':
diff --git a/objects.js b/objects.js
index c4c4eb8..fbb9e84 100644
--- a/objects.js
+++ b/objects.js
@@ -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) {
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();