summaryrefslogtreecommitdiff
path: root/threads.js
diff options
context:
space:
mode:
Diffstat (limited to 'threads.js')
-rw-r--r--threads.js34
1 files changed, 30 insertions, 4 deletions
diff --git a/threads.js b/threads.js
index 59dd23a..c21375e 100644
--- a/threads.js
+++ b/threads.js
@@ -83,7 +83,7 @@ ArgLabelMorph, localize, XML_Element, hex_sha512*/
// Global stuff ////////////////////////////////////////////////////////
-modules.threads = '2014-November-26';
+modules.threads = '2014-December-04';
var ThreadManager;
var Process;
@@ -1679,6 +1679,26 @@ Process.prototype.reportMap = function (reporter, list) {
}
};
+Process.prototype.doForEach = function (upvar, list, script) {
+ // perform a script for each element of a list, assigning the
+ // current iteration's element to a variable with the name
+ // specified in the "upvar" parameter, so it can be referenced
+ // within the script. Uses the context's - unused - fourth
+ // element as temporary storage for the current list index
+
+ if (isNil(this.context.inputs[3])) {this.context.inputs[3] = 1; }
+ var index = this.context.inputs[3];
+ this.context.outerContext.variables.addVar(upvar);
+ this.context.outerContext.variables.setVar(
+ upvar,
+ list.at(index)
+ );
+ if (index > list.length()) {return; }
+ this.context.inputs[3] += 1;
+ this.pushContext();
+ this.evaluate(script, new List(), true);
+};
+
// Process interpolated primitives
Process.prototype.doWait = function (secs) {
@@ -2368,6 +2388,7 @@ Process.prototype.objectTouchingObject = function (thisObj, name) {
var myself = this,
those,
stage,
+ box,
mouse;
if (this.inputOption(name) === 'mouse-pointer') {
@@ -2379,9 +2400,14 @@ Process.prototype.objectTouchingObject = function (thisObj, name) {
} else {
stage = thisObj.parentThatIsA(StageMorph);
if (stage) {
- if (this.inputOption(name) === 'edge' &&
- !stage.bounds.containsRectangle(thisObj.bounds)) {
- return true;
+ if (this.inputOption(name) === 'edge') {
+ box = thisObj.bounds;
+ if (!thisObj.costume && thisObj.penBounds) {
+ box = thisObj.penBounds.translateBy(thisObj.position());
+ }
+ if (!stage.bounds.containsRectangle(box)) {
+ return true;
+ }
}
if (this.inputOption(name) === 'pen trails' &&
thisObj.isTouching(stage.penTrailsMorph())) {