kopia lustrzana https://github.com/backface/turtlestitch
Hide Primitives feature
Primitive blocks in the palette can now be hidden in the project via their context menu. Each palette's context menu further lets you hide or show all its primitives depending on whether any primitives are left to hide or show. Hidden primitives are stored in the project data. This lets instructors create "simplified" examples and problem sets.pull/3/merge
rodzic
d0878399fe
commit
4580aa1e0d
26
blocks.js
26
blocks.js
|
@ -153,7 +153,7 @@ DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph*/
|
|||
|
||||
// Global stuff ////////////////////////////////////////////////////////
|
||||
|
||||
modules.blocks = '2013-April-23';
|
||||
modules.blocks = '2013-April-25';
|
||||
|
||||
var SyntaxElementMorph;
|
||||
var BlockMorph;
|
||||
|
@ -1784,6 +1784,12 @@ BlockMorph.prototype.userMenu = function () {
|
|||
'showHelp'
|
||||
);
|
||||
if (this.isTemplate) {
|
||||
if (this.selector !== 'evaluateCustomBlock') {
|
||||
menu.addItem(
|
||||
"hide",
|
||||
'hidePrimitive'
|
||||
);
|
||||
}
|
||||
return menu;
|
||||
}
|
||||
menu.addLine();
|
||||
|
@ -1883,6 +1889,24 @@ BlockMorph.prototype.developersMenu = function () {
|
|||
return menu;
|
||||
};
|
||||
|
||||
BlockMorph.prototype.hidePrimitive = function () {
|
||||
// passing a selector is optional
|
||||
var ide = this.parentThatIsA(IDE_Morph),
|
||||
cat;
|
||||
if (!ide) {return; }
|
||||
StageMorph.prototype.hiddenPrimitives[this.selector] = true;
|
||||
cat = {
|
||||
doWarp: 'control',
|
||||
reifyScript: 'operators',
|
||||
reifyReporter: 'operators',
|
||||
reifyPredicate: 'operators',
|
||||
doDeclareVariables: 'variables'
|
||||
}[this.selector] || this.category;
|
||||
if (cat === 'lists') {cat = 'variables'; }
|
||||
ide.flushBlocksCache(cat);
|
||||
ide.refreshPalette();
|
||||
};
|
||||
|
||||
BlockMorph.prototype.deleteBlock = function () {
|
||||
// delete just this one block, keep inputs and next block around
|
||||
var scripts = this.parentThatIsA(ScriptsMorph),
|
||||
|
|
3
gui.js
3
gui.js
|
@ -68,7 +68,7 @@ sb, CommentMorph, CommandBlockMorph*/
|
|||
|
||||
// Global stuff ////////////////////////////////////////////////////////
|
||||
|
||||
modules.gui = '2013-April-24';
|
||||
modules.gui = '2013-April-25';
|
||||
|
||||
// Declarations
|
||||
|
||||
|
@ -2244,6 +2244,7 @@ IDE_Morph.prototype.newProject = function () {
|
|||
this.globalVariables = new VariableFrame();
|
||||
this.currentSprite = new SpriteMorph(this.globalVariables);
|
||||
this.sprites = new List([this.currentSprite]);
|
||||
StageMorph.prototype.hiddenPrimitives = {};
|
||||
this.setProjectName('');
|
||||
this.projectNotes = '';
|
||||
this.createStage();
|
||||
|
|
|
@ -1663,3 +1663,7 @@ ______
|
|||
130424
|
||||
------
|
||||
* Widgets, BYOB, GUI: prevent multiple block editors on the same block definition, allow multiple dialogs on different objects, handle dialog instances in DialogBoxMorph.prototype
|
||||
|
||||
130425
|
||||
------
|
||||
* Objects, Blocks, GUI, Store: Hide primitives feature
|
||||
|
|
109
objects.js
109
objects.js
|
@ -120,7 +120,7 @@ PrototypeHatBlockMorph*/
|
|||
|
||||
// Global stuff ////////////////////////////////////////////////////////
|
||||
|
||||
modules.objects = '2013-April-23';
|
||||
modules.objects = '2013-April-25';
|
||||
|
||||
var SpriteMorph;
|
||||
var StageMorph;
|
||||
|
@ -1363,6 +1363,9 @@ SpriteMorph.prototype.blockTemplates = function (category) {
|
|||
cat = category || 'motion', txt;
|
||||
|
||||
function block(selector) {
|
||||
if (StageMorph.prototype.hiddenPrimitives[selector]) {
|
||||
return null;
|
||||
}
|
||||
var newBlock = SpriteMorph.prototype.blockForSelector(selector, true);
|
||||
newBlock.isTemplate = true;
|
||||
return newBlock;
|
||||
|
@ -1376,6 +1379,9 @@ SpriteMorph.prototype.blockTemplates = function (category) {
|
|||
}
|
||||
|
||||
function watcherToggle(selector) {
|
||||
if (StageMorph.prototype.hiddenPrimitives[selector]) {
|
||||
return null;
|
||||
}
|
||||
var info = SpriteMorph.prototype.blocks[selector];
|
||||
return new ToggleMorph(
|
||||
'checkbox',
|
||||
|
@ -1804,6 +1810,7 @@ SpriteMorph.prototype.freshPalette = function (category) {
|
|||
y = 5,
|
||||
ry = 0,
|
||||
blocks,
|
||||
hideNextSpace = false,
|
||||
myself = this,
|
||||
stage = this.parentThatIsA(StageMorph),
|
||||
oldFlag = Morph.prototype.trackChanges;
|
||||
|
@ -1814,6 +1821,90 @@ SpriteMorph.prototype.freshPalette = function (category) {
|
|||
palette.padding = unit / 2;
|
||||
palette.color = this.paletteColor;
|
||||
|
||||
// menu:
|
||||
|
||||
palette.userMenu = function () {
|
||||
var menu = new MenuMorph(),
|
||||
ide = this.parentThatIsA(IDE_Morph),
|
||||
more = {
|
||||
operators:
|
||||
['reifyScript', 'reifyReporter', 'reifyPredicate'],
|
||||
control:
|
||||
['doWarp'],
|
||||
variables:
|
||||
[
|
||||
'doDeclareVariables',
|
||||
'reportNewList',
|
||||
'reportCONS',
|
||||
'reportListItem',
|
||||
'reportCDR',
|
||||
'reportListLength',
|
||||
'reportListContainsItem',
|
||||
'doAddToList',
|
||||
'doDeleteFromList',
|
||||
'doInsertInList',
|
||||
'doReplaceInList'
|
||||
]
|
||||
};
|
||||
|
||||
function hasHiddenPrimitives() {
|
||||
var defs = SpriteMorph.prototype.blocks,
|
||||
hiddens = StageMorph.prototype.hiddenPrimitives;
|
||||
return Object.keys(hiddens).some(function (any) {
|
||||
return defs[any].category === category ||
|
||||
contains((more[category] || []), any);
|
||||
});
|
||||
}
|
||||
|
||||
function canHidePrimitives() {
|
||||
return palette.contents.children.some(function (any) {
|
||||
return contains(
|
||||
Object.keys(SpriteMorph.prototype.blocks),
|
||||
any.selector
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
if (canHidePrimitives()) {
|
||||
menu.addItem(
|
||||
'hide primitives',
|
||||
function () {
|
||||
var defs = SpriteMorph.prototype.blocks;
|
||||
Object.keys(defs).forEach(function (sel) {
|
||||
if (defs[sel].category === category) {
|
||||
StageMorph.prototype.hiddenPrimitives[sel] = true;
|
||||
}
|
||||
});
|
||||
(more[category] || []).forEach(function (sel) {
|
||||
StageMorph.prototype.hiddenPrimitives[sel] = true;
|
||||
});
|
||||
ide.flushBlocksCache(category);
|
||||
ide.refreshPalette();
|
||||
}
|
||||
);
|
||||
}
|
||||
if (hasHiddenPrimitives()) {
|
||||
menu.addItem(
|
||||
'show primitives',
|
||||
function () {
|
||||
var hiddens = StageMorph.prototype.hiddenPrimitives,
|
||||
defs = SpriteMorph.prototype.blocks;
|
||||
Object.keys(hiddens).forEach(function (sel) {
|
||||
if (defs[sel].category === category) {
|
||||
delete StageMorph.prototype.hiddenPrimitives[sel];
|
||||
}
|
||||
});
|
||||
(more[category] || []).forEach(function (sel) {
|
||||
delete StageMorph.prototype.hiddenPrimitives[sel];
|
||||
});
|
||||
ide.flushBlocksCache(category);
|
||||
ide.refreshPalette();
|
||||
}
|
||||
);
|
||||
}
|
||||
return menu;
|
||||
};
|
||||
|
||||
// primitives:
|
||||
|
||||
blocks = this.blocksCache[category];
|
||||
|
@ -1825,14 +1916,22 @@ SpriteMorph.prototype.freshPalette = function (category) {
|
|||
}
|
||||
|
||||
blocks.forEach(function (block) {
|
||||
if (block === null) {
|
||||
return;
|
||||
}
|
||||
if (block === '-') {
|
||||
if (hideNextSpace) {return; }
|
||||
y += unit * 0.8;
|
||||
hideNextSpace = true;
|
||||
} else if (block === '=') {
|
||||
if (hideNextSpace) {return; }
|
||||
y += unit * 1.6;
|
||||
hideNextSpace = true;
|
||||
} else if (block === '#') {
|
||||
x = 0;
|
||||
y = ry;
|
||||
} else {
|
||||
hideNextSpace = false;
|
||||
if (x === 0) {
|
||||
y += unit * 0.3;
|
||||
}
|
||||
|
@ -3063,6 +3162,8 @@ StageMorph.prototype.isCachingPrimitives
|
|||
StageMorph.prototype.sliderColor
|
||||
= SpriteMorph.prototype.sliderColor;
|
||||
|
||||
StageMorph.prototype.hiddenPrimitives = {};
|
||||
|
||||
// StageMorph instance creation
|
||||
|
||||
function StageMorph(globals) {
|
||||
|
@ -3545,6 +3646,9 @@ StageMorph.prototype.blockTemplates = function (category) {
|
|||
cat = category || 'motion', txt;
|
||||
|
||||
function block(selector) {
|
||||
if (myself.hiddenPrimitives[selector]) {
|
||||
return null;
|
||||
}
|
||||
var newBlock = SpriteMorph.prototype.blockForSelector(selector, true);
|
||||
newBlock.isTemplate = true;
|
||||
return newBlock;
|
||||
|
@ -3558,6 +3662,9 @@ StageMorph.prototype.blockTemplates = function (category) {
|
|||
}
|
||||
|
||||
function watcherToggle(selector) {
|
||||
if (myself.hiddenPrimitives[selector]) {
|
||||
return null;
|
||||
}
|
||||
var info = SpriteMorph.prototype.blocks[selector];
|
||||
return new ToggleMorph(
|
||||
'checkbox',
|
||||
|
|
18
store.js
18
store.js
|
@ -61,7 +61,7 @@ SyntaxElementMorph*/
|
|||
|
||||
// Global stuff ////////////////////////////////////////////////////////
|
||||
|
||||
modules.store = '2013-April-19';
|
||||
modules.store = '2013-April-25';
|
||||
|
||||
|
||||
// XML_Serializer ///////////////////////////////////////////////////////
|
||||
|
@ -368,6 +368,17 @@ SnapSerializer.prototype.loadProjectModel = function (xmlNode) {
|
|||
project.stage.isThreadSafe =
|
||||
model.stage.attributes.threadsafe === 'true';
|
||||
|
||||
model.hiddenPrimitives = model.project.childNamed('hidden');
|
||||
if (model.hiddenPrimitives) {
|
||||
model.hiddenPrimitives.contents.split(' ').forEach(
|
||||
function (sel) {
|
||||
if (sel) {
|
||||
StageMorph.prototype.hiddenPrimitives[sel] = true;
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
model.globalBlocks = model.project.childNamed('blocks');
|
||||
if (model.globalBlocks) {
|
||||
this.loadCustomBlocks(project.stage, model.globalBlocks, true);
|
||||
|
@ -1246,6 +1257,7 @@ StageMorph.prototype.toXML = function (serializer) {
|
|||
'<blocks>%</blocks>' +
|
||||
'<scripts>%</scripts><sprites>%</sprites>' +
|
||||
'</stage>' +
|
||||
'<hidden>$</hidden>' +
|
||||
'<blocks>%</blocks>' +
|
||||
'<variables>%</variables>' +
|
||||
'</project>',
|
||||
|
@ -1266,6 +1278,10 @@ StageMorph.prototype.toXML = function (serializer) {
|
|||
serializer.store(this.customBlocks),
|
||||
serializer.store(this.scripts),
|
||||
serializer.store(this.children),
|
||||
Object.keys(StageMorph.prototype.hiddenPrimitives).reduce(
|
||||
function(a, b) {return a + ' ' + b; },
|
||||
''
|
||||
),
|
||||
serializer.store(this.globalBlocks),
|
||||
(ide && ide.globalVariables) ?
|
||||
serializer.store(ide.globalVariables) : ''
|
||||
|
|
Ładowanie…
Reference in New Issue