From 15914663173d092dba5498a693c921d94e1aa562 Mon Sep 17 00:00:00 2001 From: jmoenig Date: Tue, 30 Jul 2013 13:48:12 +0200 Subject: [PATCH] PAUSE primitive command block --- blocks.js | 10 ++++++++++ history.txt | 2 +- objects.js | 19 +++++++++++++++++-- threads.js | 20 ++++++++++++++++++-- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/blocks.js b/blocks.js index e288a64e..a955a7f3 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 593c1cdb..bd9b0fc2 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 421b2071..3c566e93 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 5368b183..0674d94f 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) {