Michael Aschauer 2017-01-13 14:47:14 +01:00
commit 9baf70fc86
218 zmienionych plików z 28927 dodań i 3704 usunięć

1
.gitignore vendored
Wyświetl plik

@ -1,2 +1,3 @@
.DS_Store
*.swp
.tern-port

Wyświetl plik

@ -0,0 +1,12 @@
atom-playground.jpg Atom Playground
bedroom1.gif Bedroom 1
bedroom2.gif Bedroom 2
berkeley-mural.jpg Berkeley Mural
brick-wall-and-stairs.jpg Brick Wall and Stairs
brick-wall1.jpg Brick Wall 1
brick-wall2.jpg Brick Wall 2
desert.gif Desert
night-city-with-street.gif Night City with Street
party-room.jpg Party Room
pathway.jpg Pathway
xy-grid.gif XY Grid

32
Costumes/COSTUMES 100644
Wyświetl plik

@ -0,0 +1,32 @@
alonzo.png Alonzo
bat1-a.png Bat 1a
bat1-b.png Bat 1b
bat2-a.png Bat 2a
bat2-b.png Bat 2b
boy1-standing.gif Boy 1 Standing
boy1-walking.gif Boy 1 Walking
boy2.gif Boy 2
boy3.gif Boy 3
cat2.gif Cat 2
cat3.png Cat 3
cat4.png Cat 4
cat5.gif Cat 5
dog1-a.png Dog 1a
dog1-b.png Dog 1b
dog2-a.png Dog 2a
dog2-b.png Dog 2b
dog2-c.png Dog 2c
dragon1-a.png Dragon 1a
dragon1-b.png Dragon 1b
dragon2.gif Dragon 2
girl1-standing.gif Girl 1 Standing
girl1-walking.gif Girl 1 Walking
girl2-shouting.gif Girl 2 Shouting
girl2-standing.gif Girl 2 Standing
girl3-basketball.gif Girl 3 Basketball
girl3-running.gif Girl 3 Running
girl3-standing.gif Girl 3 Standing
marissa-crouching.gif Marissa Crouching
marissa-sitting.gif Marissa Sitting
marissa.gif Marissa
unicorn1.png Unicorn

10
Examples/EXAMPLES 100644
Wyświetl plik

@ -0,0 +1,10 @@
animal-game.xml Animal Game
Codification.xml Codification
copter.xml Copter
count-change.xml Count Change
icecream-visual.xml Icecream Visual
JSfunctions.xml JSfunctions
live-tree.xml Live Tree
swimmer.xml Swimmer
tree.xml Tree
vee.xml Vee

File diff suppressed because one or more lines are too long

2
FileSaver.min.js vendored 100644
Wyświetl plik

@ -0,0 +1,2 @@
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs=saveAs||function(e){"use strict";if(typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),i="download"in r,o=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},a=/Version\/[\d\.]+.*Safari/.test(navigator.userAgent),f=e.webkitRequestFileSystem,u=e.requestFileSystem||f||e.mozRequestFileSystem,s=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},c="application/octet-stream",d=0,l=500,w=function(t){var r=function(){if(typeof t==="string"){n().revokeObjectURL(t)}else{t.remove()}};if(e.chrome){r()}else{setTimeout(r,l)}},p=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var i=e["on"+t[r]];if(typeof i==="function"){try{i.call(e,n||e)}catch(o){s(o)}}}},v=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob(["\ufeff",e],{type:e.type})}return e},y=function(t,s,l){if(!l){t=v(t)}var y=this,m=t.type,S=false,h,R,O=function(){p(y,"writestart progress write writeend".split(" "))},g=function(){if(R&&a&&typeof FileReader!=="undefined"){var r=new FileReader;r.onloadend=function(){var e=r.result;R.location.href="data:attachment/file"+e.slice(e.search(/[,;]/));y.readyState=y.DONE;O()};r.readAsDataURL(t);y.readyState=y.INIT;return}if(S||!h){h=n().createObjectURL(t)}if(R){R.location.href=h}else{var i=e.open(h,"_blank");if(i==undefined&&a){e.location.href=h}}y.readyState=y.DONE;O();w(h)},b=function(e){return function(){if(y.readyState!==y.DONE){return e.apply(this,arguments)}}},E={create:true,exclusive:false},N;y.readyState=y.INIT;if(!s){s="download"}if(i){h=n().createObjectURL(t);r.href=h;r.download=s;setTimeout(function(){o(r);O();w(h);y.readyState=y.DONE});return}if(e.chrome&&m&&m!==c){N=t.slice||t.webkitSlice;t=N.call(t,0,t.size,c);S=true}if(f&&s!=="download"){s+=".download"}if(m===c||f){R=e}if(!u){g();return}d+=t.size;u(e.TEMPORARY,d,b(function(e){e.root.getDirectory("saved",E,b(function(e){var n=function(){e.getFile(s,E,b(function(e){e.createWriter(b(function(n){n.onwriteend=function(t){R.location.href=e.toURL();y.readyState=y.DONE;p(y,"writeend",t);w(e)};n.onerror=function(){var e=n.error;if(e.code!==e.ABORT_ERR){g()}};"writestart progress write abort".split(" ").forEach(function(e){n["on"+e]=y["on"+e]});n.write(t);y.abort=function(){n.abort();y.readyState=y.DONE};y.readyState=y.WRITING}),g)}),g)};e.getFile(s,{create:false},b(function(e){e.remove();n()}),b(function(e){if(e.code===e.NOT_FOUND_ERR){n()}else{g()}}))}),g)}),g)},m=y.prototype,S=function(e,t,n){return new y(e,t,n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){if(!n){e=v(e)}return navigator.msSaveOrOpenBlob(e,t||"download")}}m.abort=function(){var e=this;e.readyState=e.DONE;p(e,"abort")};m.readyState=m.INIT=0;m.WRITING=1;m.DONE=2;m.error=m.onwritestart=m.onprogress=m.onwrite=m.onabort=m.onerror=m.onwriteend=null;return S}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!=null){define([],function(){return saveAs})}

Wyświetl plik

@ -15,7 +15,7 @@ visual, blocks based programming language inspired by Scratch
written by Jens Mönig and Brian Harvey
Copyright (C) 2015 by Jens Mönig and Brian Harvey
Copyright (C) 2016 by Jens Mönig and Brian Harvey
This is free software: you can redistribute it and/or modify
@ -30,3 +30,6 @@ GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Want to use Snap! but scared by the open-source license? Get in touch with us,
we'll make it work.

12
Sounds/SOUNDS 100644
Wyświetl plik

@ -0,0 +1,12 @@
Cat.mp3 Cat
Chord.wav Chord
Dog1.wav Dog 1
Dog2.wav Dog 2
FingerSnap.wav Finger Snap
Kitten.wav Kitten
Laugh-female.wav Laugh Female
Laugh-male1.wav Laugh Male 1
Laugh-male2.wav Laugh Male 2
Laugh-male3.mp3 Laugh Male 3
Meow.wav Meow
Pop.wav Pop

1364
blocks.js

Plik diff jest za duży Load Diff

481
byob.js
Wyświetl plik

@ -9,7 +9,7 @@
written by Jens Mönig
jens@moenig.org
Copyright (C) 2015 by Jens Mönig
Copyright (C) 2016 by Jens Mönig
This file is part of Snap!.
@ -51,6 +51,7 @@
BlockEditorMorph
BlockExportDialogMorph
BlockImportDialogMorph
BlockRemovalDialogMorph
InputSlotDialogMorph
VariableDialogMorph
@ -90,6 +91,7 @@
VariableDialogMorph
BlockExportDialogMorph
BlockImportDialogMorph
BlockRemovalDialogMorph
*/
@ -97,16 +99,16 @@
StringMorph, Color, DialogBoxMorph, ScriptsMorph, ScrollFrameMorph,
Point, HandleMorph, HatBlockMorph, BlockMorph, detect, List, Process,
AlignmentMorph, ToggleMorph, InputFieldMorph, ReporterBlockMorph,
Context, StringMorph, nop, newCanvas, radians, BoxMorph,
ArrowMorph, PushButtonMorph, contains, InputSlotMorph, ShadowMorph,
ToggleButtonMorph, IDE_Morph, MenuMorph, copy, ToggleElementMorph,
Morph, fontHeight, StageMorph, SyntaxElementMorph, SnapSerializer,
CommentMorph, localize, CSlotMorph, SpeechBubbleMorph, MorphicPreferences,
SymbolMorph, isNil, CursorMorph*/
StringMorph, nop, newCanvas, radians, BoxMorph, ArrowMorph, PushButtonMorph,
contains, InputSlotMorph, ToggleButtonMorph, IDE_Morph, MenuMorph, copy,
ToggleElementMorph, Morph, fontHeight, StageMorph, SyntaxElementMorph,
SnapSerializer, CommentMorph, localize, CSlotMorph, SpeechBubbleMorph,
MorphicPreferences, SymbolMorph, isNil, CursorMorph, VariableFrame,
WatcherMorph, Variable*/
// Global stuff ////////////////////////////////////////////////////////
modules.byob = '2015-July-28';
modules.byob = '2016-September-27';
// Declarations
@ -125,6 +127,7 @@ var VariableDialogMorph;
var JaggedBlockMorph;
var BlockExportDialogMorph;
var BlockImportDialogMorph;
var BlockRemovalDialogMorph;
// CustomBlockDefinition ///////////////////////////////////////////////
@ -139,12 +142,15 @@ function CustomBlockDefinition(spec, receiver) {
this.spec = spec || '';
// format: {'inputName' : [type, default, options, readonly]}
this.declarations = {};
this.variableNames = [];
this.comment = null;
this.codeMapping = null; // experimental, generate text code
this.codeHeader = null; // experimental, generate text code
// don't serialize (not needed for functionality):
this.receiver = receiver || null; // for serialization only (pointer)
this.editorDimensions = null; // a rectangle, last bounds of the editor
this.cachedIsRecursive = null; // for automatic yielding
}
// CustomBlockDefinition instantiating blocks
@ -338,10 +344,40 @@ CustomBlockDefinition.prototype.parseSpec = function (spec) {
return parts;
};
CustomBlockDefinition.prototype.isDirectlyRecursive = function () {
var myspec;
if (this.cachedIsRecursive !== null) {
return this.cachedIsRecursive;
}
if (!this.body) {
this.cachedIsRecursive = false;
} else {
myspec = this.spec;
this.cachedIsRecursive = this.body.expression.anyChild(
function (morph) {
return morph instanceof BlockMorph &&
morph.definition &&
morph.definition.spec === myspec;
}
);
}
return this.cachedIsRecursive;
};
// CustomBlockDefinition picturing
CustomBlockDefinition.prototype.scriptsPicture = function () {
var scripts, proto, block, comment;
return this.scriptsModel().scriptsPicture();
};
CustomBlockDefinition.prototype.sortedElements = function () {
return this.scriptsModel().sortedElements();
};
CustomBlockDefinition.prototype.scriptsModel = function () {
// answer a restored scripting area for the sake
// of creating script pictures
var scripts, proto, block, comment, template;
scripts = new ScriptsMorph();
scripts.cleanUpMargin = 10;
@ -370,9 +406,12 @@ CustomBlockDefinition.prototype.scriptsPicture = function () {
proto.allComments().forEach(function (comment) {
comment.align(proto);
});
proto.children[0].fixLayout();
template = proto.parts()[0];
template.fixLayout();
template.forceNormalColoring();
template.fixBlockColor(proto, true);
scripts.fixMultiArgs();
return scripts.scriptsPicture();
return scripts;
};
// CustomCommandBlockMorph /////////////////////////////////////////////
@ -392,17 +431,29 @@ function CustomCommandBlockMorph(definition, isProto) {
CustomCommandBlockMorph.prototype.init = function (definition, isProto) {
this.definition = definition; // mandatory
this.isPrototype = isProto || false; // optional
CustomCommandBlockMorph.uber.init.call(this);
CustomCommandBlockMorph.uber.init.call(this, true); // silently
this.category = definition.category;
this.selector = 'evaluateCustomBlock';
this.variables = null;
this.initializeVariables();
if (definition) { // needed for de-serializing
this.refresh();
}
};
CustomCommandBlockMorph.prototype.refresh = function () {
CustomCommandBlockMorph.prototype.initializeVariables = function (oldVars) {
var myself = this;
this.variables = new VariableFrame();
this.definition.variableNames.forEach(function (name) {
var v = oldVars ? oldVars[name] : null;
myself.variables.addVar(
name,
v instanceof Variable ? v.value : null
);
});
};
CustomCommandBlockMorph.prototype.refresh = function (silently) {
var def = this.definition,
newSpec = this.isPrototype ?
def.spec : def.blockSpec(),
@ -416,7 +467,7 @@ CustomCommandBlockMorph.prototype.refresh = function () {
} else {
this.fixBlockColor();
}
this.setSpec(newSpec);
this.setSpec(newSpec, silently);
this.fixLabelColor();
this.restoreInputs(oldInputs);
} else { // update all input slots' drop-downs
@ -435,6 +486,15 @@ CustomCommandBlockMorph.prototype.refresh = function () {
inp.setContents(def.inputNames()[idx]);
}
});
// initialize block vars
// preserve values of unchanged variable names
this.initializeVariables(this.variables.vars);
// make (double) sure I'm colored correctly
this.forceNormalColoring();
this.drawNew();
this.fixBlockColor(null, true);
};
CustomCommandBlockMorph.prototype.restoreInputs = function (oldInputs) {
@ -449,7 +509,7 @@ CustomCommandBlockMorph.prototype.restoreInputs = function (oldInputs) {
old = oldInputs[i];
if (old instanceof ReporterBlockMorph &&
(!(inp instanceof TemplateSlotMorph))) {
myself.silentReplaceInput(inp, old);
myself.silentReplaceInput(inp, old.fullCopy());
} else if (old instanceof InputSlotMorph
&& inp instanceof InputSlotMorph) {
inp.setContents(old.evaluate());
@ -658,7 +718,7 @@ CustomCommandBlockMorph.prototype.mouseClickLeft = function () {
};
CustomCommandBlockMorph.prototype.edit = function () {
var myself = this, block, hat;
var myself = this, editor, block, hat;
if (this.isPrototype) {
block = this.definition.blockInstance();
@ -683,7 +743,11 @@ CustomCommandBlockMorph.prototype.edit = function () {
myself.isInUse()
);
} else {
new BlockEditorMorph(this.definition, this.receiver()).popUp();
Morph.prototype.trackChanges = false;
editor = new BlockEditorMorph(this.definition, this.receiver());
editor.popUp();
Morph.prototype.trackChanges = true;
editor.changed();
}
};
@ -726,25 +790,97 @@ CustomCommandBlockMorph.prototype.attachTargets = function () {
};
CustomCommandBlockMorph.prototype.isInUse = function () {
// anser true if an instance of my definition is found
// answer true if an instance of my definition is found
// in any of my receiver's scripts or block definitions
return this.receiver().usesBlockInstance(this.definition);
var def = this.definition,
ide = this.receiver().parentThatIsA(IDE_Morph);
if (def.isGlobal && ide) {
return ide.sprites.asArray().concat([ide.stage]).some(
function (any, idx) {
return any.usesBlockInstance(def, false, idx);
}
);
}
return this.receiver().usesBlockInstance(def);
};
// CustomCommandBlockMorph menu:
CustomCommandBlockMorph.prototype.userMenu = function () {
var menu;
var hat = this.parentThatIsA(PrototypeHatBlockMorph),
rcvr = this.receiver(),
myself = this,
menu;
function monitor(vName) {
var stage = rcvr.parentThatIsA(StageMorph),
varFrame = myself.variables;
menu.addItem(
vName + '...',
function () {
var watcher = detect(
stage.children,
function (morph) {
return morph instanceof WatcherMorph
&& morph.target === varFrame
&& morph.getter === vName;
}
),
others;
if (watcher !== null) {
watcher.show();
watcher.fixLayout(); // re-hide hidden parts
return;
}
watcher = new WatcherMorph(
vName + ' ' + localize('(temporary)'),
SpriteMorph.prototype.blockColor.variables,
varFrame,
vName
);
watcher.setPosition(stage.position().add(10));
others = stage.watchers(watcher.left());
if (others.length > 0) {
watcher.setTop(others[others.length - 1].bottom());
}
stage.add(watcher);
watcher.fixLayout();
}
);
}
if (this.isPrototype) {
menu = new MenuMorph(this);
menu.addItem(
"script pic...",
function () {
window.open(this.topBlock().fullImage().toDataURL());
var ide = this.world().children[0];
ide.saveCanvasAs(
this.topBlock().scriptPic(),
ide.projectName || localize('Untitled') + ' ' +
localize('script pic'),
true // request opening a new window
);
},
'open a new window\nwith a picture of this script'
);
if (hat.inputs().length < 2) {
menu.addItem(
"block variables...",
function () {
hat.enableBlockVars();
},
'experimental -\nunder construction'
);
} else {
menu.addItem(
"remove block variables...",
function () {
hat.enableBlockVars(false);
},
'experimental -\nunder construction'
);
}
} else {
menu = this.constructor.uber.userMenu.call(this);
if (!menu) {
@ -755,14 +891,20 @@ CustomCommandBlockMorph.prototype.userMenu = function () {
// menu.addItem("export definition...", 'exportBlockDefinition');
menu.addItem("delete block definition...", 'deleteBlockDefinition');
this.variables.names().forEach(function (vName) {
monitor(vName);
});
}
menu.addItem("edit...", 'edit'); // works also for prototypes
return menu;
};
CustomCommandBlockMorph.prototype.exportBlockDefinition = function () {
var xml = new SnapSerializer().serialize(this.definition);
window.open('data:text/xml,' + encodeURIComponent(xml));
var xml = new SnapSerializer().serialize(this.definition),
ide = this.parentThatIsA(IDE_Morph);
ide.saveXMLAs(xml, this.spec);
};
CustomCommandBlockMorph.prototype.deleteBlockDefinition = function () {
@ -815,7 +957,7 @@ CustomCommandBlockMorph.prototype.mouseEnter = function () {
comment.contents.lines.forEach(function (line) {
help = help + '\n' + line;
});
this.bubbleHelp(
this.popUpbubbleHelp(
help.substr(1),
this.definition.comment.color
);
@ -828,20 +970,6 @@ CustomCommandBlockMorph.prototype.mouseLeave = function () {
}
};
// CustomCommandBlockMorph bubble help:
CustomCommandBlockMorph.prototype.bubbleHelp = function (contents, color) {
var myself = this;
this.fps = 2;
this.step = function () {
if (this.bounds.containsPoint(this.world().hand.position())) {
myself.popUpbubbleHelp(contents, color);
}
myself.fps = 0;
delete myself.step;
};
};
CustomCommandBlockMorph.prototype.popUpbubbleHelp = function (
contents,
color
@ -913,18 +1041,21 @@ CustomReporterBlockMorph.prototype.init = function (
) {
this.definition = definition; // mandatory
this.isPrototype = isProto || false; // optional
CustomReporterBlockMorph.uber.init.call(this, isPredicate);
CustomReporterBlockMorph.uber.init.call(this, isPredicate, true); // sil.
this.category = definition.category;
this.variables = new VariableFrame();
this.initializeVariables();
this.selector = 'evaluateCustomBlock';
if (definition) { // needed for de-serializing
this.refresh();
}
};
CustomReporterBlockMorph.prototype.initializeVariables =
CustomCommandBlockMorph.prototype.initializeVariables;
CustomReporterBlockMorph.prototype.refresh = function () {
CustomCommandBlockMorph.prototype.refresh.call(this);
CustomCommandBlockMorph.prototype.refresh.call(this, true);
if (!this.isPrototype) {
this.isPredicate = (this.definition.type === 'predicate');
}
@ -1448,7 +1579,7 @@ BlockDialogMorph.prototype.createScopeButtons = function () {
var myself = this;
this.addScopeButton(
function () {myself.setScope('gobal'); },
function () {myself.setScope('global'); },
"for all sprites",
function () {return myself.isGlobal; }
);
@ -1481,7 +1612,7 @@ BlockDialogMorph.prototype.addScopeButton = function (action, label, query) {
BlockDialogMorph.prototype.setScope = function (varType) {
this.isGlobal = (varType === 'gobal');
this.isGlobal = (varType === 'global');
this.scopes.children.forEach(function (c) {
c.refresh();
});
@ -1620,6 +1751,15 @@ BlockDialogMorph.prototype.fixLayout = function () {
}
};
BlockDialogMorph.prototype.accept = function () {
if ((this.body instanceof InputFieldMorph) &&
(this.normalizeSpaces(this.body.getValue()) === '')) {
this.edit();
} else {
BlockDialogMorph.uber.accept.call(this);
}
};
// BlockEditorMorph ////////////////////////////////////////////////////
// BlockEditorMorph inherits from DialogBoxMorph:
@ -1635,7 +1775,9 @@ function BlockEditorMorph(definition, target) {
}
BlockEditorMorph.prototype.init = function (definition, target) {
var scripts, proto, scriptsFrame, block, comment, myself = this;
var scripts, proto, scriptsFrame, block, comment, myself = this,
isLive = Process.prototype.enableLiveCoding ||
Process.prototype.enableSingleStepping;
// additional properties:
this.definition = definition;
@ -1656,6 +1798,7 @@ BlockEditorMorph.prototype.init = function (definition, target) {
// create scripting area
scripts = new ScriptsMorph(target);
scripts.rejectsHats = true;
scripts.isDraggable = false;
scripts.color = IDE_Morph.prototype.groupColor;
scripts.cachedTexture = IDE_Morph.prototype.scriptsPaneTexture;
@ -1663,19 +1806,19 @@ BlockEditorMorph.prototype.init = function (definition, target) {
proto = new PrototypeHatBlockMorph(this.definition);
proto.setPosition(scripts.position().add(10));
if (definition.comment !== null) {
comment = definition.comment.fullCopy();
proto.comment = comment;
comment.block = proto;
}
if (definition.body !== null) {
proto.nextBlock(definition.body.expression.fullCopy());
proto.nextBlock(isLive ? definition.body.expression
: definition.body.expression.fullCopy()
);
}
scripts.add(proto);
proto.fixBlockColor(null, true);
proto.drawNew();
this.definition.scripts.forEach(function (element) {
block = element.fullCopy();
@ -1701,13 +1844,18 @@ BlockEditorMorph.prototype.init = function (definition, target) {
this.addBody(scriptsFrame);
this.addButton('ok', 'OK');
this.addButton('updateDefinition', 'Apply');
this.addButton('cancel', 'Cancel');
if (!isLive) {
this.addButton('updateDefinition', 'Apply');
this.addButton('cancel', 'Cancel');
}
this.setExtent(new Point(375, 300));
this.setExtent(new Point(375, 300)); // normal initial extent
this.fixLayout();
proto.children[0].fixLayout();
scripts.fixMultiArgs();
block = proto.parts()[0];
block.forceNormalColoring();
block.fixBlockColor(proto, true);
};
BlockEditorMorph.prototype.popUp = function () {
@ -1715,6 +1863,7 @@ BlockEditorMorph.prototype.popUp = function () {
if (world) {
BlockEditorMorph.uber.popUp.call(this, world);
this.setInitialDimensions();
this.handle = new HandleMorph(
this,
280,
@ -1722,9 +1871,18 @@ BlockEditorMorph.prototype.popUp = function () {
this.corner,
this.corner
);
world.keyboardReceiver = null;
}
};
BlockEditorMorph.prototype.justDropped = function () {
// override the inherited default behavior, which is to
// give keyboard focus to dialog boxes, as in this case
// we want Snap-global keyboard-shortcuts like ctrl-f
// to still work
nop();
};
// BlockEditorMorph ops
BlockEditorMorph.prototype.accept = function (origin) {
@ -1828,7 +1986,10 @@ BlockEditorMorph.prototype.updateDefinition = function () {
this.definition.receiver = this.target; // only for serialization
this.definition.spec = this.prototypeSpec();
this.definition.declarations = this.prototypeSlots();
this.definition.variableNames = this.variableNames();
this.definition.scripts = [];
this.definition.editorDimensions = this.bounds.copy();
this.definition.cachedIsRecursive = null; // flush the cache, don't update
this.body.contents.children.forEach(function (morph) {
if (morph instanceof PrototypeHatBlockMorph) {
@ -1903,8 +2064,36 @@ BlockEditorMorph.prototype.prototypeSlots = function () {
).parts()[0].declarationsFromFragments();
};
BlockEditorMorph.prototype.variableNames = function () {
// answer the variable declarations from my prototype hat
return detect(
this.body.contents.children,
function (c) {return c instanceof PrototypeHatBlockMorph; }
).variableNames();
};
// BlockEditorMorph layout
BlockEditorMorph.prototype.setInitialDimensions = function () {
var world = this.world(),
mex = world.extent().subtract(new Point(this.padding, this.padding)),
th = fontHeight(this.titleFontSize) + this.titlePadding * 2,
bh = this.buttons.height();
if (this.definition.editorDimensions) {
this.setPosition(this.definition.editorDimensions.origin);
this.setExtent(this.definition.editorDimensions.extent().min(mex));
this.keepWithin(world);
return;
}
this.setExtent(
this.body.contents.extent().add(
new Point(this.padding, this.padding + th + bh)
).min(mex)
);
this.setCenter(this.world().center());
};
BlockEditorMorph.prototype.fixLayout = function () {
var th = fontHeight(this.titleFontSize) + this.titlePadding * 2;
@ -1949,7 +2138,8 @@ function PrototypeHatBlockMorph(definition) {
}
PrototypeHatBlockMorph.prototype.init = function (definition) {
var proto = definition.prototypeInstance();
var proto = definition.prototypeInstance(),
vars;
this.definition = definition;
@ -1962,8 +2152,17 @@ PrototypeHatBlockMorph.prototype.init = function (definition) {
this.color = SpriteMorph.prototype.blockColor.control;
this.category = 'control';
this.add(proto);
if (definition.variableNames.length) {
vars = this.labelPart('%blockVars');
this.add(this.labelPart('%br'));
this.add(vars);
definition.variableNames.forEach(function (name) {
vars.addInput(name);
});
}
proto.refreshPrototypeSlotTypes(); // show slot type indicators
this.fixLayout();
proto.fixBlockColor(this, true);
};
PrototypeHatBlockMorph.prototype.mouseClickLeft = function () {
@ -1975,11 +2174,11 @@ PrototypeHatBlockMorph.prototype.mouseClickLeft = function () {
if (this.world().currentKey === 16) { // shift-clicked
return this.focus();
}
this.children[0].mouseClickLeft();
this.parts()[0].mouseClickLeft();
};
PrototypeHatBlockMorph.prototype.userMenu = function () {
return this.children[0].userMenu();
return this.parts()[0].userMenu();
};
// PrototypeHatBlockMorph zebra coloring
@ -1988,7 +2187,7 @@ PrototypeHatBlockMorph.prototype.fixBlockColor = function (
nearestBlock,
isForced
) {
var nearest = this.children[0] || nearestBlock;
var nearest = this.parts()[0] || nearestBlock;
if (!this.zebraContrast && !isForced) {
return;
@ -2011,6 +2210,25 @@ PrototypeHatBlockMorph.prototype.fixBlockColor = function (
}
};
// PrototypeHatBlockMorph block instance variables
PrototypeHatBlockMorph.prototype.variableNames = function (choice) {
var parts = this.parts();
if (parts.length < 3) {return []; }
return parts[2].evaluate();
};
PrototypeHatBlockMorph.prototype.enableBlockVars = function (choice) {
var prot = this.parts()[0];
if (choice === false) {
this.setSpec('%s', true);
} else {
this.setSpec('%s %br %blockVars', true);
}
this.replaceInput(this.parts()[0], prot);
this.spec = null;
};
// BlockLabelFragment //////////////////////////////////////////////////
// BlockLabelFragment instance creation:
@ -2249,8 +2467,11 @@ BlockLabelFragmentMorph.prototype.userMenu = function () {
tuple[0] = '$' + string;
myself.text = tuple.join('-');
myself.fragment.labelString = myself.text;
myself.parent.parent.changed();
myself.drawNew();
myself.changed();
myself.parent.parent.fixLayout();
myself.parent.parent.changed();
},
null,
this,
@ -2371,21 +2592,38 @@ BlockLabelPlaceHolderMorph.prototype.drawNew = function () {
if (this.parent.fixLayout) {
this.parent.fixLayout();
}
if (this.parent.parent instanceof PrototypeHatBlockMorph) {
this.parent.parent.fixLayout();
}
}
};
// BlockLabelPlaceHolderMorph events:
BlockLabelPlaceHolderMorph.prototype.mouseEnter = function () {
var hat = this.parentThatIsA(PrototypeHatBlockMorph);
this.isHighlighted = true;
this.drawNew();
this.changed();
if (this.plainLabel && hat) {
hat.changed();
this.drawNew();
hat.changed();
} else {
this.drawNew();
this.changed();
}
};
BlockLabelPlaceHolderMorph.prototype.mouseLeave = function () {
var hat = this.parentThatIsA(PrototypeHatBlockMorph);
this.isHighlighted = false;
this.drawNew();
this.changed();
if (this.plainLabel && hat) {
hat.changed();
this.drawNew();
hat.changed();
} else {
this.drawNew();
this.changed();
}
};
BlockLabelPlaceHolderMorph.prototype.mouseClickLeft
@ -2472,6 +2710,7 @@ InputSlotDialogMorph.prototype.init = function (
this.isExpanded = false;
this.category = category || 'other';
this.cachedRadioButton = null; // "template" for radio button backgrounds
this.noDelete = false;
// initialize inherited properties:
BlockDialogMorph.uber.init.call(
@ -2590,8 +2829,9 @@ InputSlotDialogMorph.prototype.getInput = function () {
this.fragment.labelString = lbl;
this.fragment.defaultValue = this.slots.defaultInputField.getValue();
return lbl;
} else if (!this.noDelete) {
this.fragment.isDeleted = true;
}
this.fragment.isDeleted = true;
return null;
};
@ -2676,6 +2916,8 @@ InputSlotDialogMorph.prototype.open = function (
this.addButton('ok', 'OK');
if (!noDeleteButton) {
this.addButton('deleteFragment', 'Delete');
} else {
this.noDelete = true;
}
this.addButton('cancel', 'Cancel');
this.fixLayout();
@ -3068,7 +3310,7 @@ VariableDialogMorph.prototype.createTypeButtons = function () {
var myself = this;
this.addTypeButton(
function () {myself.setType('gobal'); },
function () {myself.setType('global'); },
"for all sprites",
function () {return myself.isGlobal; }
);
@ -3083,7 +3325,7 @@ VariableDialogMorph.prototype.addTypeButton
= BlockDialogMorph.prototype.addTypeButton;
VariableDialogMorph.prototype.setType = function (varType) {
this.isGlobal = (varType === 'gobal');
this.isGlobal = (varType === 'global');
this.types.children.forEach(function (c) {
c.refresh();
});
@ -3304,17 +3546,21 @@ BlockExportDialogMorph.prototype.selectNone = function () {
// BlockExportDialogMorph ops
BlockExportDialogMorph.prototype.exportBlocks = function () {
var str = encodeURIComponent(
this.serializer.serialize(this.blocks)
);
var str = this.serializer.serialize(this.blocks),
ide = this.world().children[0];
if (this.blocks.length > 0) {
window.open('data:text/xml,<blocks app="'
str = '<blocks app="'
+ this.serializer.app
+ '" version="'
+ this.serializer.version
+ '">'
+ str
+ '</blocks>');
+ '</blocks>';
ide.saveXMLAs(
str,
ide.projectName || localize('Untitled') + ' ' + localize('blocks')
);
} else {
new DialogBoxMorph().inform(
'Export blocks',
@ -3420,3 +3666,96 @@ BlockImportDialogMorph.prototype.importBlocks = function (name) {
BlockImportDialogMorph.prototype.fixLayout
= BlockEditorMorph.prototype.fixLayout;
// BlockRemovalDialogMorph ///////////////////////////////////////////////////
// BlockRemovalDialogMorph inherits from DialogBoxMorph
// and pseudo-inherits from BlockExportDialogMorph:
BlockRemovalDialogMorph.prototype = new DialogBoxMorph();
BlockRemovalDialogMorph.prototype.constructor = BlockImportDialogMorph;
BlockRemovalDialogMorph.uber = DialogBoxMorph.prototype;
// BlockRemovalDialogMorph constants:
BlockRemovalDialogMorph.prototype.key = 'blockRemove';
// BlockRemovalDialogMorph instance creation:
function BlockRemovalDialogMorph(blocks, target) {
this.init(blocks, target);
}
BlockRemovalDialogMorph.prototype.init = function (blocks, target) {
var myself = this;
// additional properties:
this.blocks = blocks.slice(0);
this.handle = null;
// initialize inherited properties:
BlockExportDialogMorph.uber.init.call(
this,
target,
function () {myself.removeBlocks(); },
null // environment
);
// override inherited properites:
this.labelString = localize('Remove unused blocks')
+ (name ? ': ' : '')
+ name || '';
this.createLabel();
// build contents
this.buildContents();
};
BlockRemovalDialogMorph.prototype.buildContents
= BlockExportDialogMorph.prototype.buildContents;
BlockRemovalDialogMorph.prototype.popUp
= BlockExportDialogMorph.prototype.popUp;
// BlockRemovalDialogMorph menu
BlockRemovalDialogMorph.prototype.userMenu
= BlockExportDialogMorph.prototype.userMenu;
BlockRemovalDialogMorph.prototype.selectAll
= BlockExportDialogMorph.prototype.selectAll;
BlockRemovalDialogMorph.prototype.selectNone
= BlockExportDialogMorph.prototype.selectNone;
// BlockRemovalDialogMorph ops
BlockRemovalDialogMorph.prototype.removeBlocks = function () {
var ide = this.target.parentThatIsA(IDE_Morph);
if (!ide) {return; }
if (this.blocks.length > 0) {
this.blocks.forEach(function (def) {
var idx = ide.stage.globalBlocks.indexOf(def);
if (idx !== -1) {
ide.stage.globalBlocks.splice(idx, 1);
}
});
ide.flushPaletteCache();
ide.refreshPalette();
ide.showMessage(
this.blocks.length + ' ' + localize('unused block(s) removed'),
2
);
} else {
new DialogBoxMorph().inform(
'Remove unused blocks',
'no blocks were selected',
this.world()
);
}
};
// BlockRemovalDialogMorph layout
BlockRemovalDialogMorph.prototype.fixLayout
= BlockEditorMorph.prototype.fixLayout;

Wyświetl plik

@ -30,7 +30,7 @@
/*global modules, IDE_Morph, SnapSerializer, hex_sha512, alert, nop,
localize*/
modules.cloud = '2015-January-12';
modules.cloud = '2015-December-15';
// Global stuff
@ -65,7 +65,7 @@ Cloud.prototype.hasProtocol = function () {
};
Cloud.prototype.setRoute = function (username) {
var routes = 10,
var routes = 20,
userNum = 0,
i;
@ -145,13 +145,12 @@ Cloud.prototype.getPublicProject = function (
// where the values are url-component encoded
// callBack is a single argument function, errorCall take two args
var request = new XMLHttpRequest(),
responseList,
myself = this;
try {
request.open(
"GET",
(this.hasProtocol() ? '' : 'http://')
+ this.url + 'Public'
+ this.url + 'RawPublic'
+ '?'
+ id,
true
@ -170,12 +169,9 @@ Cloud.prototype.getPublicProject = function (
request.responseText
);
} else {
responseList = myself.parseResponse(
request.responseText
);
callBack.call(
null,
responseList[0].SourceCode
request.responseText
);
}
} else {
@ -330,7 +326,9 @@ Cloud.prototype.reconnect = function (
Cloud.prototype.saveProject = function (ide, callBack, errorCall) {
var myself = this,
pdata,
media;
media,
size,
mediaSize;
ide.serializer.isCollectingMedia = true;
pdata = ide.serializer.serialize(ide.stage);
@ -339,6 +337,19 @@ Cloud.prototype.saveProject = function (ide, callBack, errorCall) {
ide.serializer.isCollectingMedia = false;
ide.serializer.flushMedia();
mediaSize = media ? media.length : 0;
size = pdata.length + mediaSize;
if (mediaSize > 10485760) {
new DialogBoxMorph().inform(
'Snap!Cloud - Cannot Save Project',
'The media inside this project exceeds 10 MB.\n' +
'Please reduce the size of costumes or sounds.\n',
ide.world(),
ide.cloudIcon(null, new Color(180, 0, 0))
);
throw new Error('Project media exceeds 10 MB size limit');
}
// check if serialized data can be parsed back again
try {
ide.serializer.parse(pdata);
@ -357,6 +368,7 @@ Cloud.prototype.saveProject = function (ide, callBack, errorCall) {
ide.serializer.isCollectingMedia = false;
ide.serializer.flushMedia();
ide.showMessage('Uploading ' + Math.round(size / 1024) + ' KB...');
myself.reconnect(
function () {
myself.callService(
@ -544,9 +556,13 @@ Cloud.prototype.callService = function (
if (serviceName === 'login') {
myself.api = myself.parseAPI(request.responseText);
}
responseList = myself.parseResponse(
request.responseText
);
if (serviceName === 'getRawProject') {
responseList = request.responseText;
} else {
responseList = myself.parseResponse(
request.responseText
);
}
callBack.call(null, responseList, service.url);
}
};

1652
gui.js

Plik diff jest za duży Load Diff

BIN
help/foreachof.png 100644

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 55 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 116 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 27 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.0 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 974 B

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.0 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.0 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 284 KiB

Wyświetl plik

@ -0,0 +1,187 @@
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{baskervald} % Default font
\usepackage[onehalfspacing]{setspace}
\usepackage{graphicx}
\usepackage{color}
\usepackage{textcomp}
\usepackage[hidelinks, pdfusetitle]{hyperref}
\usepackage{float}
\usepackage{ltxcmds}
\usepackage{fp}
\usepackage{tikz}
\usepackage{etoolbox}
% We frequently prevent page breaks before pictures, and it has a tendency to create a lot of widowed lines. Let's prevent it from happening.
\usepackage[all]{nowidow}
\usepackage{wasysym}
\usetikzlibrary{calc}
\usetikzlibrary{fit}
% This macro produces a "Snap!" logo.
%
% Note that in Polish (and other languages), nouns are inflected. The form "Snap!" with suffix looks plain stupid, so the macro takes a suffix as argument. If the suffix is non-empty, no exclamation mark is generated, and the suffix is used instead.
\newcommand{\Snap}[1]{%
\textsf{%
Snap%
\ifx\\#1\\\textit{!\@}%
\else #1%
\fi%
}%
}
\newcommand{\code}[1]{\textsf{\textbf{#1}}}
\makeatletter
\newcommand{\defaultGraphicsScale}{0.6}
\makeatother
\renewcommand{\thechapter}{\Roman{chapter}}
\renewcommand{\thesection}{\Alph{section}}
\renewcommand{\thesubsection}{}
\makeatletter
\edef\defaultFontSize{\f@size}
% A dirty hack: Apparently, this is the only way to multiply a length by a constant factor in the code below. What a mess.
\newdimen\raiseLength
\newcommand{\inlinepicraised}[3]{%
{%
\FPeval\fontSizeRatio{\f@size / \defaultFontSize}%
\FPeval\scale{#3 * \fontSizeRatio}%
\raiseLength=#2%
\raisebox{\fontSizeRatio\raiseLength}{%
\includegraphics[scale=\scale]{#1}%
}%
}%
% Add kerns if the next character is punctuation.
\ltx@ifnextchar@nospace.{\,}{%
\ltx@ifnextchar@nospace,{\,}{%
}%
}%
}
\makeatother
\newcommand{\inlinepic}[2][\defaultGraphicsScale]{%
\inlinepicraised{#2}{-4pt}{#1}%
}
\newcommand{\inlinereporterpic}[2][\defaultGraphicsScale]{%
\inlinepicraised{#2}{-1.5pt}{#1}%
}
\newcommand{\bigpic}[1]{
\begin{figure}[H]
\centering
\includegraphics[scale=\defaultGraphicsScale]{#1}
\end{figure}
}
\newcommand{\manualtitlepage}[2][]{ {
\def\title{#2}
\def\translator{#1}
\begin{titlepage}
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}
\begin{tikzpicture}[remember picture, overlay, text depth=0]
\definecolor{title blue}{HTML}{206C8F}
\definecolor{title orange}{HTML}{F59201}
\pgfdeclareimage[width=0.2\textwidth]{logo}{../common/logo}
\pgfdeclareimage{cover picture}{../common/cover-picture}
\coordinate (NW) at ($(current page.north west) + (0.5, -0.5)$);
\coordinate (NE) at ($(current page.north east) + (-0.5, -0.5)$);
\coordinate (SW) at ($(current page.south west) + (0.5, 0.5)$);
\coordinate (SE) at ($(current page.south east) + (-0.5, 0.5)$);
% Logo at the top left corner.
\node[
below right,
align=left,
font=\Large,
execute at begin node=\setlength\baselineskip{3ex}]
at ($(NW) + (1.5, -1.5)$) {
\pgfuseimage{logo}\\
Build Your Own Blocks
};
% Version number.
\node[
below right,
color=white,
font=\fontsize{40pt}{48pt}\selectfont]
at ($(NE) - (7, 5)$) {
4.0
};
% Title. Note: the % at the end is necessary for correct spacing between the text and orange background.
\node[
left,
text=white,
align=right,
inner sep=15pt,
font=\fontsize{40pt}{42pt}\selectfont]
(title text)
at ($(NE) - (1.5, 9)$) {
\title%
};
% The cover picture.
\node[below left, inner sep=0] (cover picture)
at ($(NE) - (0, 12)$) {
\pgfuseimage{cover picture}
};
\draw[white, ultra thick]
(cover picture.north west) -- (cover picture.north east);
\draw[white, ultra thick]
(cover picture.south west) -- (cover picture.south east);
% Authors.
\node[above right, color=white, align=left, font=\Large]
at ($(SE) + (-7, 3)$) {
Brian Harvey\\
Jens M\"onig
};
% Translator.
\ifdefempty{\translator}{}{
\node [below right, color=white, align=left, font=\large]
at ($(SE) + (-7, 2)$) {
\translator
};
}
\begin{pgfonlayer}{background}
% Blue bar on the right.
\fill[title blue] ($(NE) - (7.5, 0)$) rectangle (SE);
% Title background stretches to the left until it reaches the left edge, which means (NW.x, title text.west.y).
\coordinate (title background left point)
at (NW |- title text.west);
% Orange title background.
\node[
fit=(title text) (title background left point),
shape=rectangle,
fill=title orange,
text=white,
draw=white,
ultra thick,
align=right,
inner sep=0,
font=\fontsize{40pt}{42pt}\selectfont] {};
\end{pgfonlayer}
\end{tikzpicture}
\end{titlepage}
} }
\newcommand{\TODO}[1]{%
\colorbox{yellow}{\textcolor{red}{\textbf{%
TODO%
\ifstrempty{#1}{}{%
: #1
}%
}}}%
}

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.9 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.4 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 7.9 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.4 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 6.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 33 KiB

Wyświetl plik

@ -0,0 +1,751 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="545.56427"
height="392"
id="svg9055"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="block-prototype-with-plus-highlighted.svg">
<defs
id="defs9057">
<filter
id="filter7491"
inkscape:label="Drop Shadow"
color-interpolation-filters="sRGB">
<feFlood
id="feFlood7493"
flood-opacity="0.5"
flood-color="rgb(0,0,0)"
result="flood" />
<feComposite
in2="SourceGraphic"
id="feComposite7495"
in="flood"
operator="in"
result="composite1" />
<feGaussianBlur
id="feGaussianBlur7497"
stdDeviation="2"
result="blur" />
<feOffset
id="feOffset7499"
dx="4"
dy="4"
result="offset" />
<feComposite
in2="offset"
id="feComposite7501"
in="SourceGraphic"
operator="over"
result="composite2" />
</filter>
<marker
inkscape:stockid="Arrow2Mend6Iq"
orient="auto"
refY="0"
refX="0"
id="Arrow2Mend6Iq"
style="overflow:visible">
<path
id="path6035"
style="fill:#d99900;fill-rule:evenodd;stroke:#d99900;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="scale(-0.6,-0.6)"
inkscape:connector-curvature="0" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="265.56429"
inkscape:cy="206"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1362"
inkscape:window-height="725"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<metadata
id="metadata9060">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-69.435714,-266.36218)">
<image
y="266.36218"
x="119"
id="image9249"
xlink:href="data:image/png;base64,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
"
height="392"
width="496" />
<g
transform="translate(28.410714,32.41071)"
id="g7487"
style="filter:url(#filter7491)">
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path3982"
d="m 54,345.36218 48.92678,0"
style="fill:none;stroke:#d99900;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend6Iq)" />
<rect
y="329.36218"
x="47.5"
height="29.75"
width="64.75"
id="rect7485"
style="fill:none;stroke:none" />
</g>
</g>
</svg>

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 50 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.4 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 18 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 15 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.2 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 10 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 16 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.2 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 22 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 6.4 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 20 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 15 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.3 KiB

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 2.5 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.5 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 4.0 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 5.0 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.5 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 2.8 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.2 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 6.2 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 11 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 16 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 8.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 4.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 8.5 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 15 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 17 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 20 KiB

Wyświetl plik

@ -0,0 +1,525 @@
\documentclass{report}
\input{../common/defs.tex}
\begin{document}
\title{Snap! Reference Manual}
\author{Brian Harvey\texorpdfstring{ \and}{,} Jens M\"onig}
\date{}
\manualtitlepage{Snap! Reference Manual}
\tableofcontents
\chapter*{}
\section*{Acknowledgements}
We have been extremely lucky in our mentors. Jens cut his teeth in the company of the Smalltalk pioneers: Alan Kay, Dan Ingalls, and the rest of the gang who invented personal computing and object oriented programming in the great days of Xerox PARC. He worked with John Maloney, of the MIT Scratch Team, who developed the Morphic graphics framework that's still at the heart of \Snap{}. The brilliant design of Scratch, from the Lifelong Kindergarten Group at the MIT Media Lab, is crucial to \Snap{}.
\textbf{\emph{Our earlier version, BYOB, was a direct modification of the Scratch source code. \Snap{} is a complete rewrite, but its code structure and its user interface remain deeply indebted to Scratch. And the Scratch Team, who could have seen us as rivals, have been entirely supportive and welcoming to us.}}
Brian grew up at the MIT and Stanford Artificial Intelligence Labs, learning from Lisp inventor John McCarthy, Scheme inventors Gerald~J. Sussman and Guy Steele, and the authors of the world's best computer science book, \textit{Structure and Interpretation of Computer Programs}, Hal Abelson and Gerald~J. Sussman with Julie Sussman, among many other heroes of computer science.
\textbf{\emph{In the glory days of the MIT Logo Lab, we used to say, ``Logo is Lisp disguised as BASIC.'' Now, with its first class procedures, lexical scope, and first class continuations, \Snap{} is Scheme disguised as Scratch.}}
We have been fortunate to get to know an amazing group of brilliant middle school (!\@) and high school students through the Scratch Advanced Topics forum, several of whom have contributed code to \Snap{}: Kartik Chandra, Nathan Dinsmore, Connor Hudson, and Ian Reynolds. Many more have contributed ideas and alpha-testing bug reports. UC Berkeley students who've contributed code include Michael Ball, Achal Dave, Kyle Hotchkiss, Ivan Motyashov, and Yuan Yuan. Contributors of translations are too numerous to list here, but they're in the ``About\ldots'' box in \Snap{} itself.
This work was supported in part by the National Science Foundation grant 1143566, and in part by MioSoft.
\clearpage
\begin{center}
\bf \Huge \Snap{} Reference Manual \\
\huge Version 4.0
\vspace{40pt}
\end{center}
\Snap{} (formerly BYOB) is an extended reimplementation of Scratch (\url{http://scratch.mit.edu}) that allows you to Build Your Own Blocks. It also features first class lists, first class procedures, and continuations. These added capabilities make it suitable for a serious introduction to computer science for high school or college students.
To run \Snap{}, open a browser window and connect to either \url{http://snap.berkeley.edu/run} to start with a minimal set of blocks or \url{http://snap.berkeley.edu/init} to load a small set of additional blocks (a little slower startup, but recommended for convenience and assumed in this manual).
\clearpage
\chapter{Blocks, Scripts, and Sprites}
This chapter describes the \Snap{} features inherited from Scratch; experienced Scratch users can skip to section~\ref{sec:nesting-sprites}.
\Snap{} is a programming language---a notation in which you can tell a computer what you want it to do. Unlike most programming languages, though, \Snap{} is a visual language; instead of writing a program using the keyboard, the \Snap{} programmer uses the same drag-and-drop interface familiar to computer users.
Start \Snap{}. You should see the following arrangement of regions in the window:\nopagebreak
\begin{center}
\includegraphics[width=\textwidth]{window-regions}
\end{center}
(The proportions of these areas may be different, depending on the size and shape of your browser window.)
A \Snap{} program consists of one or more \emph{scripts}, each of which is made of \emph{blocks}. Here's a typical script:\nopagebreak
\label{fig:typical-script}
\bigpic{typical-script}
The five blocks that make up this script have three different colors, corresponding to three of the eight \emph{palettes} in which blocks can be found. The palette area at the left edge of the window shows one palette at a time, chosen with the eight buttons just above the palette area. In this script, the gold blocks are from the Control palette; the green block is from the Pen palette; and the blue blocks are from the Motion palette. A script is assembled by dragging blocks from a palette into the \emph{scripting area} in the middle part of the window. Blocks snap together (hence the name \Snap{} for the language) when you drag a block so that its indentation is near the tab of the one above it:\nopagebreak
\bigpic{snapping-blocks}
The white horizontal line is a signal that if you let go of the green block it will snap into the tab of the gold one.
\subsection{Hat Blocks and Command Blocks}
At the top of the script is a \emph{hat} block, which indicates when the script should be carried out. Hat block names typically start with the word ``\code{when}''; in this example, the script should be run when the green flag near the right end of the \Snap{} tool bar is clicked. (The \Snap{} tool bar is part of the \Snap{} window, not the same as the browser's or operating system's menu bar.) A script isn't required to have a hat block, but if not, then the script will be run only if the user clicks on the script itself. A script can't have more than one hat block, and the hat block can be used only at the top of the script; its distinctive shape is meant to remind you of that.
The other blocks in this script are \emph{command} blocks. Each command block corresponds to an action that \Snap{} already knows how to carry out. For example, the block \inlinepic{move-10-steps} tells the sprite (the arrowhead shape on the \emph{stage} at the right end of the window) to move ten steps (a step is a very small unit of distance) in the direction in which the arrowhead is pointing. We'll see shortly that there can be more than one sprite, and that each sprite has its own scripts. Also, a sprite doesn't have to look like an arrowhead, but can have any picture as a costume. The shape of the \code{move} block is meant to remind you of a Lego\texttrademark{} brick; a script is a stack of blocks. (The word ``block'' denotes both the graphical shape on the screen and the procedure, the action, that the block carries out.)
The number~$10$ in the \code{move} block above is called an \emph{input} to the block. By clicking on the white oval, you can type any number in place of the $10$. The sample script on page~\pageref{fig:typical-script} uses $100$ as the input value. We'll see later that inputs can have non-oval shapes that accept values other than numbers. We'll also see that you can compute input values, instead of typing a particular value into the oval. A block can have more than one input slot. For example, the \code{glide} block located about halfway down the Motion palette has three inputs.
Most command blocks have that brick shape, but some, like the \code{repeat} block in the sample script, are \emph{C-shaped}. Most C-shaped blocks are found in the Control palette. The slot inside the C shape is a special kind of input slot that accepts a \emph{script} as the input. In the sample script, the \code{repeat} block has two inputs: the number $4$ and the script\nopagebreak
\bigpic{typical-script-inner}
\section{Sprites and Parallelism}
Just below the stage is the ``new sprite'' button~\inlinepic{../common/btn-new-sprite}. Click the button to add a new sprite to the stage. The new sprite will appear in a random position on the stage, facing in a random direction, with a random color.
Each sprite has its own scripts. To see the scripts for a particular sprite in the scripting area, click on the picture of that sprite in the \emph{sprite corral} in the bottom right corner of the window. Try putting one of the following scripts in each sprite's scripting area:\nopagebreak
\begin{figure}[H]
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-1}
\end{minipage}%
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-2}
\end{minipage}
\end{figure}
When you click the green flag~\inlinepic{../common/btn-start}, you should see one sprite rotate while the other moves back and forth. This experiment illustrates the way different scripts can run in parallel. The turning and the moving happen together. Parallelism can be seen with multiple scripts of a single sprite also. Try this example:\nopagebreak
\begin{figure}[H]
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-3}
\end{minipage}%
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-4}
\end{minipage}
\end{figure}
When you press the space key, the sprite should turn forever in a circle, because the \code{move} and \code{turn} blocks are run in parallel. (To stop the program, click the red stop sign~\inlinepic{../common/btn-stop} at the right end of the tool bar.)
\subsection{Costumes and Sounds}
To change the appearance of a sprite, import a new \emph{costume} for it. There are three ways to do this. First, select the desired sprite in the sprite corral. Then, one way is to click on the file icon~\inlinepic{../common/btn-file} in the tool bar, then choose the ``\code{Costumes\ldots}'' menu item. You will see a list of costumes from the public media library, and can choose one. The second way, for a costume stored on your own computer, is too click on the file icon and choose the ``\code{Import\ldots}'' menu item. You can then select a file in any picture format (PNG, JPEG, etc.) supported by your browser. The third way is quicker if the file you want is visible on the desktop: Just drag the file onto the \Snap{} window. In any of these cases, the scripting area will be replaced by something like this:\nopagebreak
\bigpic{scripting-area-with-additional-costume}
Just above this part of the window is a set of three tabs: Scripts, Costumes, and Sounds. You'll see that the Costumes tab is now selected. In this view, the sprite's \emph{wardrobe}, you can choose whether the sprite should wear its Turtle costume or its Alonzo costume. (Alonzo, the \Snap{} mascot, is named after Alonzo Church, a mathematician who invented the idea of procedures as data, the most important way in which \Snap{} is different from Scratch.) You can give a sprite as many costumes as you like, and then choose which it will wear either by clicking in its wardrobe or by using the \inlinepic{switch-to-costume-turtle} or \inlinepic{next-costume} block in a script. (Every costume has a number as well as a name. The \code{next costume} block selects the next costume by number; after the highest-numbered costume it switches to costume~1. The Turtle, costume~0, is never chosen by \code{next costume}.) The Turtle costume is the only one that changes color to match a change in the sprite's pen color.
In addition to its costumes, a sprite can have \emph{sounds}; the equivalent for sounds of the sprite's wardrobe is called its \emph{jukebox}. Sound files can be imported in any format (WAV, OGG, MP3, etc.) supported by your browser. Two blocks accomplish the task of playing sounds. If you would like a script to continue running while the sound is playing, use the block \inlinepic{play-sound-help}. In contrast, you can use the \inlinepic{play-sound-help-until-done} block to wait for the sound's completion before continuing the rest of the script.
\subsection{Inter-Sprite Communication with Broadcast}
Earlier we saw an example of two sprites moving at the same time. In a more interesting program, though, the sprites on stage will interact to tell a story, play a game, etc. Often one sprite will have to tell another sprite to run a script. Here's a simple example:\nopagebreak
\begin{figure}[H]
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=0.4]{../common/boy1-walking}
\end{minipage}%
\begin{minipage}{0.5\textwidth}
\centering
\reflectbox{\includegraphics[scale=0.3]{../common/dog2-c}}
\end{minipage}
\vspace{3ex}
\begin{minipage}[t]{0.5\textwidth}
\centering
\vspace{0pt} % REALLY align to top
\includegraphics[scale=\defaultGraphicsScale]{inter-sprite-communication-1}
\end{minipage}%
\begin{minipage}[t]{0.5\textwidth}
\centering
\vspace{0pt} % REALLY align to top
\includegraphics[scale=\defaultGraphicsScale]{inter-sprite-communication-2}
\end{minipage}
\end{figure}
In the \inlinepic{broadcast-bark-and-wait} block, the word ``bark'' is just an arbitrary name I made up. When you click on the downward arrowhead in that input slot, one of the choices (the only choice, the first time) is ``\code{new},'' which then prompts you to enter a name for the new broadcast. When this block is run, the chosen message is sent to \emph{every} sprite, which is why the block is called ``broadcast.'' In this program, though, only one sprite has a script to run when that broadcast is sent, namely the dog. Because the boy's script uses \code{broadcast and wait} rather than just \code{broadcast}, the boy doesn't go on to his next \code{say} block until the dog's script finishes. That's why the two sprites take turns talking, instead of both talking at once.
Notice, by the way, that the \code{say} block's first input slot is rectangular rather than oval. This means the input can be any text string, not only a number. In the text input slots, a space character is shown as a brown dot, so that you can count the number of spaces between words, and in particular you can tell the difference between an empty slot and one containing spaces. The brown dots are \emph{not} shown on the stage when the block is run.
The stage has its own scripting area. It can be selected by clicking on the Stage icon at the left of the sprite corral. Unlike a sprite, though, the stage can't move. Instead of costumes, it has \emph{backgrounds}: pictures that fill the entire stage area. The sprites appear in front of the current background. In a complicated project, it's often convenient to use a script in the stage's scripting area as the overall director of the action.
\section{Nesting Sprites: Anchors and Parts}
\label{sec:nesting-sprites}
Sometimes it's desirable to make a sort of ``super-sprite'' composed of pieces that can move together but can also be separately articulated. The classic example is a person's body made up of a torso, limbs, and a head. \Snap{} allows one sprite to be designated as the \emph{anchor} of the combined shape, with other sprites as its \emph{parts}. To set up sprite nesting, drag the sprite corral icon of a \emph{part} sprite onto the stage display (not the sprite corral icon!) of the desired \emph{anchor} sprite.
Sprite nesting is shown in the sprite corral icons of both anchors and parts:\nopagebreak
\bigpic{nested-sprites-in-corral}
In this illustration, it is desired to animate Alonzo's arm. (The arm has been colored green in this picture to make the relationship of the two sprites clearer, but in a real project they'd be the same color, probably.) Sprite1, representing Alonzo's body, is the anchor; Sprite2 is the arm. The icon for the anchor shows small images of up to three attached parts at the bottom. The icon for each part shows a small image of the anchor in its top left corner, and a \emph{synchronous rotation flag} in the top right corner. In its initial setting, as shown above, it means that the when the anchor sprite rotates, the part sprite also rotates as well as revolving around the anchor. When clicked, it changes from a circular arrow to a straight arrow, and indicates that when the anchor sprite rotates, the part sprite revolves around it, but does not rotate, keeping its original orientation. (The part can also be rotated separately, using its \code{turn} blocks.) Any change in the position or size of the anchor is always extended to its parts.
\begin{figure}[H]
\centering
\includegraphics[scale=\defaultGraphicsScale]{hand-waving-command}%
\hspace{2em}%
\includegraphics[scale=0.4]{../common/alonzo-waving}
\end{figure}
\section{Reporter Blocks and Expressions}
So far, we've used two kinds of blocks: hat blocks and command blocks. Another kind is the \emph{reporter} block, which has an oval shape: \inlinereporterpic{x-position}. It's called a ``reporter'' because when it's run, instead of carrying out an action, it reports a value that can be used as an input to another block. If you drag a reporter into the scripting area by itself and click on it, the value it reports will appear in a speech balloon next to the block:\nopagebreak
\bigpic{x-position-returns-a-number}
When you drag a reporter block over another block's input slot, a white ``halo'' appears around that input slot, analogous to the white line that appears when snapping command blocks together. Here's a simple script that uses a reporter block:\nopagebreak
\begin{figure}[H]
\centering
\includegraphics[scale=\defaultGraphicsScale]{example-script-that-uses-a-reporter}%
\hspace{2em}%
\includegraphics{../common/turtle-says-its-position}
\end{figure}
Here the \code{x position} reporter provides the first input to the \code{say} block. (The sprite's X position is its horizontal position, how far left (negative values) or right (positive values) it is compared to the center of the stage. Similarly, the Y position is measured vertically, in steps above (positive) or below (negative) the center.)
You can do arithmetic using reporters in the Operators palette:\nopagebreak
\begin{figure}[H]
\centering
\includegraphics[scale=\defaultGraphicsScale]{using-reporters-for-arithmetic}%
\hspace{2em}%
\includegraphics{../common/turtle-says-its-rounded-position}
\end{figure}
The \code{round} block rounds $35.3905\ldots$ to $35$, and the \code{+}~block adds $100$ to that. (By the way, the \code{round} block is in the Operators palette, just like~\code{+}, but in this script it's a lighter color with black lettering because \Snap{} alternates light and dark versions of the palette colors when a block is nested inside another block from the same palette:\nopagebreak
\bigpic{zebra-coloring}
This aid to readability is called \emph{zebra coloring}.) A reporter block with its inputs, maybe including other reporter blocks, such as \inlinepic{round-x-position-plus-100}, is called an \emph{expression}.
\section{Predicates and Conditional Evaluation}
Most reporters report either a number, like \inlinereporterpic{plus}, or a text string, like \inlinereporterpic{join-hello-world}. A \emph{predicate} is a special kind of reporter that always reports \code{true} or \code{false}. Predicates have a hexagonal shape:\nopagebreak
\bigpic{mouse-down}
The special shape is a reminder that predicates don't generally make sense in an input slot of blocks that are expecting a number or text. You wouldn't say \inlinepic{move-mouse-down-steps}, although (as you can see from the picture) \Snap{} lets you do it if you really want. Instead, you normally use predicates in special hexagonal input slots like this one:\nopagebreak
\bigpic{if}
The C-shaped \code{if} block runs its input script if (and only if) the expression in its hexagonal input reports \code{true}.\nopagebreak
\bigpic{predicates-and-conditional-evaluation-1}
A really useful block in animations runs its input script \emph{repeatedly} until a predicate is satisfied:\nopagebreak
\bigpic{predicates-and-conditional-evaluation-2}
If, while working on a project, you want to omit temporarily some commands in a script, but you don't want to forget where they belong, you can say\nopagebreak
\bigpic{predicates-and-conditional-evaluation-3}
Sometimes you want to take the same action whether some condition is true or false, but with a different input value. For this purpose you can use the \emph{reporter} \code{if} block:\footnote{\onehalfspacing If you don't see it in the Control palette, click on the File button~\inlinepic{../common/btn-file} in the Tool Bar and choose ``Import tools.''}\nopagebreak
\bigpic{predicates-and-conditional-evaluation-4}
The technical term for a \code{true} or \code{false} value is a ``Boolean'' value; it has a capital~B because it's named after a person, George Boole, who developed the mathematical theory of Boolean values. Don't get confused; a hexagonal block is a \emph{predicate}, but the value it reports is a \emph{Boolean}.
Another quibble about vocabulary: Many programming languages reserve the name ``procedure'' for Commands (that carry out an action) and use the name ``function'' for Reporters and Predicates. In this manual, a \emph{procedure} is any computational capability, including those that report values and those that don't. Commands, Reporters, and Predicates are all procedures. The words ``a Procedure type'' are shorthand for ``Command type, Reporter type, or Predicate type.''
\section{Variables}
Try this script:\footnote{The \code{for} block is also in the tools library; choose ``\code{Import tools}'' from the file menu if you don't have it in the Control palette.}\nopagebreak
\bigpic{squiral-script}
The input to the \code{move} block is an orange oval. To get it there, drag the orange oval that's part of the \code{for} block:\nopagebreak
\bigpic{variable-dragging}
The orange oval is a \emph{variable}: a symbol that represents a value. (I took this screenshot before changing the second number input to the \code{for} block from the default $10$ to $200$, and before dragging in a \code{turn} block.) \code{For} runs its script input repeatedly, just like \code{repeat}, but before each repetition it sets the variable \code{i} to a number starting with its first numeric input, adding $1$ for each repetition, until it reaches the second numeric input. In this case, there will be $200$ repetitions, first with $\code{i}=1$, then with $\code{i}=2$, then $3$, and so on until $\code{i}=200$ for the final repetition. The result is that each \code{move} draws a longer and longer line segment, and that's why the picture you see is a kind of spiral. (If you try again with a turn of $90$ degrees instead of $92$, you'll see why this picture is called a ``squiral.'')
The variable~\code{i} is created by the \code{for} block, and it can only be used in the script inside the block's C-slot. (By the way, if you don't like the name~\code{i}, you can change it by clicking on the orange oval without dragging it, which will pop up a dialog window in which you can enter a different name:\nopagebreak
\bigpic{script-variable-name-dialog}
``\code{I}'' isn't a very descriptive name; you might prefer ``\code{length}'' to indicate its purpose in the script. ``\code{I}'' is traditional because mathematicians tend to use letters between~\code{i} and~\code{n} to represent integer values, but in programming languages we don't have to restrict ourselves to single-letter variable names.)
\subsection{Global Variables}
You can create variables ``by hand'' that aren't limited to being used within a single block. At the top of the Variables palette, click the ``\code{Make a variable}'' button:\nopagebreak
\bigpic{make-a-variable}
This will bring up a dialog window in which you can give your variable a name:\nopagebreak
\bigpic{variable-name-dialog}
The dialog also gives you a choice to make the variable available to all sprites (which is almost always what you want) or to make it visible only in the current sprite. You'd do that if you're going to give several sprites individual variables \emph{with the same name}, so that you can share a script between sprites (by dragging it from the current sprite's scripting area to the picture of another sprite in the sprite corral), and the different sprites will do slightly different things when running that script because each has a different value for that variable name.
If you give your variable the name ``\code{name}'' then the Variables palette will look like this:\nopagebreak
\bigpic{variable-on-a-palette}
There's now a ``\code{Delete a variable}'' button, and there's an orange oval with the variable name in it, just like the orange oval in the \code{for} block. You can drag the variable into any script in the scripting area. Next to the oval is a checkbox, initially checked. When it's checked, you'll also see a \emph{variable watcher} on the stage:\nopagebreak
\bigpic{variable-watcher}
When you give the variable a value, the orange box in its watcher will display the value.
\emph{How} do you give it a value? You use the \code{set} block:\nopagebreak
\bigpic{ask-and-set}
Note that you \emph{don't} drag the variable's oval into the \code{set} block! You click on the down arrow in the first input slot, and you get a menu of all the available variable names.
\subsection{Script Variables}
In that example, our project is going to carry on an interaction with the user, and we want to remember her name throughout the project. That's a good example of a situation in which a \emph{global} variable (the kind you make with the ``\code{Make a variable}'' button) is appropriate. Another common example is a variable called ``\code{score}'' in a game project. But sometimes you only need a variable temporarily, during the running of a particular script. In that case you can use the \code{script variables} block to make the variable:\nopagebreak
\begin{figure}[H]
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{wiggling-line-script}%
\end{minipage}%
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics{../common/wiggling-line}
\end{minipage}%
\end{figure}
As in the \code{for} block, you can click on an orange oval in the \code{script variables} block without dragging to change its name. You can also make more than one temporary variable by clicking on the right arrow at the end of the block to add another variable oval:\nopagebreak
\bigpic{script-variables-a-b-c}
\section{Etcetera}
This manual doesn't explain every block in detail. There are many more motion blocks, sound blocks, costume and graphics effects blocks, and so on. You can learn what they all do by experimentation, and also by reading the ``help screens'' that you can get by right-clicking or control-clicking a block and selecting ``\code{help\ldots}'' from the menu that appears. If you forget what palette (color) a block is, but you remember at least part of its name, type control-F and enter the name in the text block that appears in the palette area.
\chapter{Saving and Loading Projects and Media}
After you've created a project, you'll want to save it, so that you can have access to it the next time you use \Snap{}. There are several ways to do that. You can save a project on your own computer, or you can save it at the \Snap{} web site. The advantage of saving on the net is that you have access to your project even if you are using a different computer, or a mobile device such as a tablet or smartphone. The advantage of saving on your computer is that you have access to the saved project while on an airplane or otherwise not on the net. This is why we have multiple ways to save.
\section{Local Storage}
There are two different ways to save a project (or a media file such as a costume) on your computer. The reason for this complexity is that JavaScript, in which \Snap{} is implemented, deliberately restricts the ability of programs running in a browser to affect the computer. This is a good thing, because it means that you can confidently run someone else's \Snap{} project without worrying that it will delete all your files or infect your computer with a virus. But it does make things a little complicated.
\subsection{Localstore}
{\Huge \TODO{}}
\subsection{XML Export}
The second way to save a project on your computer requires two steps, but it doesn't have the limitations of localstore (\TODO{rename}). Projects saved in this second way are normal files on your computer and can be shared with friends, can be opened in any browser, and have no size limitation.
From the file menu~\inlinepic{../common/btn-file}, choose ``Export project\ldots'' The entire \Snap{} window will disappear, replaced by a screenful of what looks like gibberish. Don't panic! This is what's supposed to happen. You are looking at your project, in a notation called XML. The main reason it looks like gibberish is that it includes an encoding of the pictures and other media in the project. If you look through the XML, the actual scripts of the project are pretty readable, although they don't look like \Snap{} blocks. \Snap{} has opened a new browser tab for this XML text; the actual \Snap{} window is still there, hiding in its original tab.
But the point of this XML text isn't for you to read. Once you're looking at that tab, use your browser's Save command (in its File menu, or usually with a shortcut of command-S (Mac) or control-S (everything else). You can choose a filename for it, and it'll be saved in your usual Downloads folder. You can then close that tab and return to the \Snap{} tab.
\section{Cloud Storage}
The other possibility is to save your project ``in the cloud,'' at the \Snap{} web site. In order to do this, you need an account with us. Click on the Cloud button (\,\inlinepic{../common/btn-cloud}\,) in the Tool Bar. Choose the ``Signup\ldots'' option. This will show you a window that looks like this:\nopagebreak
\bigpic{sign-up}
You must choose a user name that will identify you on the web site, such as \code{Jens} or \code{bh}. If you're a Scratch user, you can use your Scratch name for \Snap{} too. If you're a kid, don't pick a user name that includes your family name, but first names or initials are okay. Don't pick something you'd be embarrassed to have other users (or your parents) see! If the name you want is already taken, you'll have to choose another one.
We ask for your month and year of birth; we use this information only to decide whether to ask for your own email address or your parent's email address. (If you're a kid, you shouldn't sign up for anything on the net, not even \Snap{}, without your parent's knowledge.) We do not store your birthdate information on our server; it is used on your own computer only during this initial signup. We do not ask for your \emph{exact} birthdate, even for this one-time purpose, because that's an important piece of personally identifiable information.
When you click OK, an email will be sent to the email address you gave, with an initial password for your account. We keep your email address on file so that, if you forget your password, we can send you a password-reset link. We will also email you if your account is suspended for violation of the Terms of Service. We do not use your address for any other purpose. You will never receive marketing emails of any kind through this site, neither from us nor from third parties. If, nevertheless, you are worried about providing this information, do a web search for ``temporary email.''
Finally, you must read and agree to the Terms of Service. A quick summary: Don't interfere with anyone else's use of the web site, and don't put copyrighted media or personally identifiable information in projects that you share with other users. And we're not responsible if something goes wrong. (Not that we \emph{expect} anything to go wrong; since \Snap{} runs in JavaScript in your browser, it is strongly isolated from the rest of your computer. But the lawyers make us say this.)
Once you've created your account, you can log into it using the ``Login\ldots'' option from the Cloud menu:\nopagebreak
\bigpic{sign-in}
Use the user name and password that you set up earlier. If you check the ``Stay signed in'' box, then you will be logged in automatically the next time you run \Snap{} from the same browser on the same computer. Check the box if you're using your own computer and you don't share it with siblings. Don't check the box if you're using a public computer at the library, at school, etc.
Once logged in, you can choose the ``Cloud'' option in the ``Save as\ldots'' dialog shown on page~\TODO{Link to the picture}. You enter a project name, and optionally project notes, just as for Localstore \TODO{name} saving, but your project will be saved online and can be loaded from anywhere with net access.
\section{Loading Saved Projects}
Once you've saved a project, you want to be able to load it back into \Snap{}. There are two ways to do this:
\begin{enumerate}
\item If you saved the project in Localstore or in your online \Snap{} account, choose the ``Open\ldots'' option from the File menu. Choose the ``Browser'' or ``Cloud'' button, then select your project from the list in the big text box and click OK. (A third button, ``Examples,'' lets you choose from example projects that we provide. You can see what each of these projects is about by clicking on it and reading its project notes.)
\item If you saved the project as an XML file on your computer, choose ``Import\ldots'' from the File menu. This will give you an ordinary browser file-open window, in which you can navigate to the file as you would in other software. Alternatively, find the XML file on your desktop, and just drag it onto the \Snap{} window.
\end{enumerate}
The second technique above also allows you to import media (costumes and sounds) into a project. Just choose ``Import\ldots'' and then select a picture or sound file instead of an XML file.
\Snap{} can also import projects created in BYOB~3.0, or in Scratch~1.4 or (with some effort; see our web site) 2.0. Almost all such projects work correctly in \Snap{}, apart from a small number of incompatible blocks. BYOB~3.1 projects that don't use first class sprites work, too; all BYOB~3.1 projects will work in \Snap{}~4.1.
\chapter{Building a Block}
The first version of \Snap{} was called BYOB, for ``Build Your Own Blocks.'' This was the first and is still the most important capability we added to Scratch. (The name was changed because a few teachers have no sense of humor.~\frownie{} You pick your battles.) The new Scratch~2.0 also has a partial custom block capability.
\section{Simple Blocks}
In the Variables palette, at or near the bottom, is a button labeled ``Make a block.''\nopagebreak
\begin{figure}[H]
\centering
\includegraphics[scale=0.5]{variables-palette}
\end{figure}
Clicking this button will display a dialog window in which you choose the block's name, shape, and palette/color. You also decide whether the block will be available to all sprites, or only to the current sprite and its children. Note: You can also enter the ``Make a block'' dialog by right-click/control-click on the script area background and then choose ``\code{Make a block}'' from the menu that appears.
\bigpic{make-a-block}
In this dialog box, you can choose the block's palette, shape and name. With one exception, there is one color per palette, e.g., all Motion blocks are blue. But the Variables palette includes the orange variable-related blocks and the red list-related blocks. Both colors are available, along with an ``Other'' option that makes grey blocks in the Variables palette for blocks that don't fit any category.
There are three block shapes, following a convention that should be familiar to Scratch users: The jigsaw-puzzle-piece shaped blocks are Commands, and don't report a value. The oval blocks are Reporters, and the hexagonal blocks are Predicates, which is the technical term for reporters that report Boolean (true or false) values.
Suppose you want to make a block named ``square'' that draws a square. You would choose Motion, Command, and type ``\code{square}'' into the name field. When you click OK, you enter the Block Editor. This works just like making a script in the sprite's scripting area, except that the ``hat'' block at the top, instead of saying something like ``\code{when I am clicked},'' has a picture of the block you're building. This hat block is called the \emph{prototype} of your custom block.\footnote{This use of the word ``prototype'' is unrelated to the \emph{prototyping object oriented programming} discussed later.} You drag blocks under the hat to program your custom block, then click OK:\nopagebreak
\bigpic{dragging-block-into-block-editor}
\bigpic{block-editor-square}
Your block appears at the bottom of the Motion palette. Here's the block and the result of using it:\nopagebreak
\begin{figure}[H]
\centering
\includegraphics[scale=\defaultGraphicsScale]%
{square-block-on-palette}
\includegraphics[scale=\defaultGraphicsScale]{../common/square}
\end{figure}
\subsection{Custom Blocks with Inputs}
But suppose you want to be able to draw squares of different sizes. Control-click or right-click on the block, choose ``\code{edit},'' and the Block Editor will open. Notice the plus signs before and after the word \code{square} in the prototype block. If you hover the mouse over one, it lights up:\nopagebreak
\bigpic{block-prototype-with-plus-highlighted}
Click on the plus on the right. You will then see the ``input name'' dialog:\nopagebreak
\bigpic{create-input-name}
Type in the name ``\code{size}'' and click OK. There are other options in this dialog; you can choose ``\code{title text}'' if you want to add words to the block name, so it can have text after an input slot, like the ``\code{move~(\,)~steps}'' block. Or you can select a more extensive dialog with a lot of options about your input name. But we'll leave that for later. When you click OK, the new input appears in the block prototype:\nopagebreak
\bigpic{square-block-script-with-size-input}
You can now drag the orange variable down into the script, then click okay:\nopagebreak
\bigpic{dragging-block-input}
Your block now appears in the Motion palette with an input box:\nopagebreak
\bigpic{square-block}
You can draw any size square by entering the length of its side in the box and running the block as usual, by clicking it or by putting it in a script.
\section{Recursion}
Since the new custom block appears in its palette as soon as you \emph{start} editing it, you can write recursive blocks (blocks that call themselves) by dragging the block into its own definition:\nopagebreak
\begin{figure}[H]
\centering
\includegraphics[scale=\defaultGraphicsScale]{tree-block-script}\\
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]%
{tree-block-inside-script}
\end{minipage}%
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{../common/tree}
\end{minipage}%
\end{figure}
If recursion is new to you, here are a few brief hints: It's crucial that the recursion have a \emph{base case}, that is, some small(est) case that the block can handle without using recursion. In this example, it's the case $\code{depth}=0$, for which the block does nothing at all, because of the enclosing \code{if}. Without a base case, the recursion would run forever, calling itself over and over.
Don't try to trace the exact sequence of steps that the computer follows in a recursive program. Instead, imagine that inside the computer there are many small people, and if Theresa is drawing a tree of size~100, depth~6, she hires Tom to make a tree of size~70, depth~5, and later hires Theo to make another tree of size~70, depth~5. Tom in turn hires Tammy and Tallulah, and so on. Each little person has his or her own local variables \code{size} and \code{depth}, each with different values.
You can also write recursive reporters, like this block to compute the factorial function:\nopagebreak
\begin{figure}[H]
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]{factorial-block-script}
\end{minipage}%
\begin{minipage}{0.5\textwidth}
\centering
\includegraphics[scale=\defaultGraphicsScale]%
{factorial-5-with-result}
\end{minipage}%
\end{figure}
Note the use of the \code{report} block. When a reporter block uses this block, the reporter finishes its work and reports the value given; any further blocks in the script are not evaluated. Thus, the \code{if else} block in the script above could have been just an \code{if}, with the second \code{report} block below it instead of inside it, and the result would be the same, because when the first \code{report} is seen in the base case, that finishes the block invocation, and the second \code{report} is ignored. There is also a \code{stop this block} block that has a similar purpose, ending the block invocation early, for command blocks. (By contrast, the \code{stop this script} block stops not only the current block invocation, but also the entire top-level script that called it.)
Here's a slightly more compact way to write the factorial function:\nopagebreak
\bigpic{concise-factorial-block-script}
(If you don't see the reporter-\code{if} block in the Control palette, click the file button~\inlinepic{../common/btn-file} in the tool bar and choose ``\code{Import tools}.'')
For more on recursion, see \textit{Thinking Recursively} by Eric Roberts. (The original edition is ISBN~978--0471816522; a more recent \textit{Thinking Recursively in Java} is ISBN~978--0471701460.)
\section{Block Libraries}
\chapter{First Class Lists}
\section{The list Block}
\section{Lists of Lists}
\section{Functional and Imperative List Programming}
\section{Higher Order List Operations and Rings}
\chapter{Typed Inputs}
\section{Scratch's Type Notation}
\section{The \Snap{} Input Type Dialog}
\subsection{Procedure Types}
\subsection{Pulldown inputs}
\subsection{Input variants}
\subsection{Prototype Hints}
\subsection{Title Text and Symbols}
\chapter{Procedures as Data}
\section{Call and Run}
\subsection{Call/Run with inputs}
\subsection{Variables in Ring Slots}
\section{Writing Higher Order Procedures}
\subsection{Recursive Calls to Multiple-Input Blocks}
\section{Formal Parameters}
\section{Procedures as Data}
\section{Special Forms}
\subsection{Special Forms in Scratch}
\chapter{Object Oriented Programming}
\section{Local State with Script Variables}
\section{Messages and Dispatch Procedures}
\section{Inheritance via Delegation}
\section{An Implementation of Prototyping OOP}
\chapter{The Outside World}
\section{The World Wide Web}
\section{Hardware Devices}
\section{Date and Time}
\chapter{Continuations}
\section{Continuation Passing Style}
\section{Call/Run w/Continuation}
\subsection{Nonlocal exit}
\chapter{User Interface Elements}
\section{Tool Bar Features}
\subsection{The \Snap{} Logo Menu}
\subsection{The File Menu}
\subsection{The Cloud Menu}
\subsection{The Settings Menu}
\subsection{Stage Resizing Buttons}
\subsection{Project Control Buttons}
\section{The Palette Area}
\subsection{Context Menus for Palette Blocks}
\subsection{Context Menu for the Palette Background}
\section{The Scripting Area}
\subsection{Sprite Appearance and Behavior Controls}
\subsection{Scripting Area Tabs}
\subsection{Scripts and Blocks Within Scripts}
\subsection{Scripting Area Background Context Menu}
\subsection{Controls in the Costumes Tab}
\subsection{The Paint Editor}
\subsection{Controls in the Sounds Tab}
\section{Controls on the Stage}
\section{The Sprite Corral and Sprite Creation Buttons}
\end{document}

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 7.7 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.2 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 7.5 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 8.0 KiB

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,230 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="279.5"
height="170"
id="svg4875"
version="1.1"
inkscape:version="0.91 r"
sodipodi:docname="square-block-on-palette.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="293.85"
inkscape:cy="59.714291"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1362"
inkscape:window-height="724"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<defs
id="defs4877">
<filter
inkscape:label="Drop Shadow"
id="filter7491"
style="color-interpolation-filters:sRGB">
<feFlood
result="flood"
flood-color="rgb(0,0,0)"
flood-opacity="0.5"
id="feFlood7493" />
<feComposite
result="composite1"
operator="in"
in="flood"
id="feComposite7495"
in2="SourceGraphic" />
<feGaussianBlur
result="blur"
stdDeviation="2"
id="feGaussianBlur7497" />
<feOffset
result="offset"
dy="4"
dx="4"
id="feOffset7499" />
<feComposite
result="composite2"
operator="over"
in="SourceGraphic"
id="feComposite7501"
in2="offset" />
</filter>
<marker
style="overflow:visible"
id="Arrow2Mend6Iq"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend6Iq">
<path
inkscape:connector-curvature="0"
transform="scale(-0.6,-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#d99900;fill-rule:evenodd;stroke:#d99900;stroke-width:0.625;stroke-linejoin:round"
id="path6035" />
</marker>
</defs>
<metadata
id="metadata4880">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-81.150004,-262.07648)"
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<g
style="filter:url(#filter7491)"
id="g7487"
transform="translate(40.125004,65.267857)">
<path
style="fill:none;stroke:#d99900;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend6Iq)"
d="m 54,345.36218 48.92678,0"
id="path3982"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<rect
style="fill:none;stroke:none"
id="rect7485"
width="64.75"
height="29.75"
x="47.5"
y="329.36218" />
</g>
<image
y="262.07648"
x="155.64999"
id="image3698"
xlink:href="data:image/png;base64,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
rSD+H3BNLJzRIpBYAAAAAElFTkSuQmCC
"
preserveAspectRatio="none"
height="170"
width="205" />
</g>
</svg>

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 11 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.6 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 3.3 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.0 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 28 KiB

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 4.5 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 4.5 KiB

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 11 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 11 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 16 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 12 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 8.7 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 17 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.7 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 21 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 28 KiB

Wyświetl plik

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 139 KiB

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 139 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 9.1 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.7 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 26 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Plik binarny nie jest wyświetlany.

Wyświetl plik

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="301.375"
height="168.75"
id="svg8640"
version="1.1"
inkscape:version="0.91 r"
sodipodi:docname="blok-kwadrat-na-palecie.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="259.99286"
inkscape:cy="158.51074"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1362"
inkscape:window-height="724"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="0"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" />
<defs
id="defs8642">
<filter
inkscape:label="Drop Shadow"
id="filter7491"
style="color-interpolation-filters:sRGB">
<feFlood
result="flood"
flood-color="rgb(0,0,0)"
flood-opacity="0.5"
id="feFlood7493" />
<feComposite
result="composite1"
operator="in"
in="flood"
id="feComposite7495"
in2="SourceGraphic" />
<feGaussianBlur
result="blur"
stdDeviation="2"
id="feGaussianBlur7497" />
<feOffset
result="offset"
dy="4"
dx="4"
id="feOffset7499" />
<feComposite
result="composite2"
operator="over"
in="SourceGraphic"
id="feComposite7501"
in2="offset" />
</filter>
<marker
style="overflow:visible"
id="Arrow2Mend6Iq"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Mend6Iq">
<path
inkscape:connector-curvature="0"
transform="scale(-0.6,-0.6)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#d99900;fill-rule:evenodd;stroke:#d99900;stroke-width:0.625;stroke-linejoin:round"
id="path6035" />
</marker>
</defs>
<metadata
id="metadata8645">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-115.00714,-522.12292)"
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<g
style="filter:url(#filter7491)"
id="g7487"
transform="translate(73.982139,326.41072)">
<path
style="fill:none;stroke:#d99900;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Mend6Iq)"
d="m 54,345.36218 48.92678,0"
id="path3982"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<rect
style="fill:none;stroke:none"
id="rect7485"
width="64.75"
height="29.75"
x="47.5"
y="329.36218" />
</g>
<image
y="522.12292"
x="187.63214"
id="image5260"
xlink:href="data:image/png;base64,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
EAepBCHO/wNJ17b6ULxWkgAAAABJRU5ErkJggg==
"
preserveAspectRatio="none"
height="168.75"
width="228.75" />
</g>
</svg>

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 13 KiB

Plik binarny nie jest wyświetlany.

Po

Szerokość:  |  Wysokość:  |  Rozmiar: 1.8 KiB

Some files were not shown because too many files have changed in this diff Show More