summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmoenig <jens@moenig.org>2013-07-30 13:48:12 +0200
committerjmoenig <jens@moenig.org>2013-07-30 13:48:12 +0200
commit15914663173d092dba5498a693c921d94e1aa562 (patch)
treef7afd57f52544775d4ffd7dd8591a6bc0b64d9a2
parent20c1d4d14f3dfb6a50d6d1be3dc47a4ca9cf5921 (diff)
downloadsnap-15914663173d092dba5498a693c921d94e1aa562.tar.gz
snap-15914663173d092dba5498a693c921d94e1aa562.zip
PAUSE primitive command block
-rw-r--r--blocks.js10
-rwxr-xr-xhistory.txt2
-rw-r--r--objects.js19
-rw-r--r--threads.js20
4 files changed, 46 insertions, 5 deletions
diff --git a/blocks.js b/blocks.js
index e288a64..a955a7f 100644
--- a/blocks.js
+++ b/blocks.js
@@ -1196,6 +1196,16 @@ SyntaxElementMorph.prototype.labelPart = function (spec) {
new Point() : this.embossing;
part.drawNew();
break;
+ case '%pause':
+ part = new SymbolMorph('pause');
+ part.size = this.fontSize;
+ part.color = new Color(160, 80, 0);
+ part.isProtectedLabel = true; // doesn't participate in zebraing
+ part.shadowColor = this.color.darker(this.labelContrast);
+ part.shadowOffset = MorphicPreferences.isFlat ?
+ new Point() : this.embossing;
+ part.drawNew();
+ break;
default:
// nop();
}
diff --git a/history.txt b/history.txt
index 593c1cd..bd9b0fc 100755
--- a/history.txt
+++ b/history.txt
@@ -1827,4 +1827,4 @@ ______
130730
------
* Blocks: Made it harder to drop reporters on the variadic input per se (as opposed to into one of its slots) in (default) "prefer empty slot drops" setting
-
+* Blocks, Threads, Objects: PAUSE primitive command block
diff --git a/objects.js b/objects.js
index 421b207..3c566e9 100644
--- a/objects.js
+++ b/objects.js
@@ -123,7 +123,7 @@ PrototypeHatBlockMorph*/
// Global stuff ////////////////////////////////////////////////////////
-modules.objects = '2013-July-15';
+modules.objects = '2013-July-30';
var SpriteMorph;
var StageMorph;
@@ -662,6 +662,14 @@ SpriteMorph.prototype.initBlocks = function () {
spec: 'delete this clone'
},
+ // Debugging - pausing
+
+ doPauseAll: {
+ type: 'command',
+ category: 'control',
+ spec: 'pause all %pause'
+ },
+
// Sensing
reportTouchingObject: {
@@ -1613,6 +1621,8 @@ SpriteMorph.prototype.blockTemplates = function (category) {
blocks.push(block('receiveOnClone'));
blocks.push(block('createClone'));
blocks.push(block('removeClone'));
+ blocks.push('-');
+ blocks.push(block('doPauseAll'));
} else if (cat === 'sensing') {
@@ -3701,7 +3711,10 @@ StageMorph.prototype.fireStopAllEvent = function () {
});
this.removeAllClones();
if (ide) {
- ide.controlBar.pauseButton.refresh();
+ ide.nextSteps([
+ nop,
+ function () {ide.controlBar.pauseButton.refresh(); }
+ ]);
}
};
@@ -3878,6 +3891,8 @@ StageMorph.prototype.blockTemplates = function (category) {
blocks.push(block('reportCallCC'));
blocks.push('-');
blocks.push(block('createClone'));
+ blocks.push('-');
+ blocks.push(block('doPauseAll'));
} else if (cat === 'sensing') {
diff --git a/threads.js b/threads.js
index 5368b18..0674d94 100644
--- a/threads.js
+++ b/threads.js
@@ -83,7 +83,7 @@ ArgLabelMorph, localize, XML_Element, hex_sha512*/
// Global stuff ////////////////////////////////////////////////////////
-modules.threads = '2013-July-15';
+modules.threads = '2013-July-30';
var ThreadManager;
var Process;
@@ -339,7 +339,7 @@ Process.prototype.runStep = function () {
a step is an an uninterruptable 'atom', it can consist
of several contexts, even of several blocks
*/
- if (this.isPaused) {
+ if (this.isPaused) { // allow pausing in between atomic steps:
return this.pauseStep();
}
this.readyToYield = false;
@@ -348,6 +348,10 @@ Process.prototype.runStep = function () {
&& (this.isAtomic ?
(Date.now() - this.lastYield < this.timeout) : true)
) {
+ // also allow pausing inside atomic steps - for PAUSE block primitive:
+ if (this.isPaused) {
+ return this.pauseStep();
+ }
this.evaluateContext();
}
this.lastYield = Date.now();
@@ -1433,6 +1437,18 @@ Process.prototype.doSetFastTracking = function (bool) {
}
};
+Process.prototype.doPauseAll = function () {
+ var stage, ide;
+ if (this.homeContext.receiver) {
+ stage = this.homeContext.receiver.parentThatIsA(StageMorph);
+ if (stage) {
+ stage.threads.pauseAll(stage);
+ }
+ ide = stage.parentThatIsA(IDE_Morph);
+ if (ide) {ide.controlBar.pauseButton.refresh(); }
+ }
+};
+
// Process loop primitives
Process.prototype.doForever = function (body) {