added inheritance support for the wardrobe

also exposed “costumes” as an attribute
upd4.1
Jens Mönig 2017-05-12 15:21:12 +02:00
rodzic c14e15f7b1
commit 1a872934de
5 zmienionych plików z 53 dodań i 11 usunięć

Wyświetl plik

@ -150,7 +150,7 @@ CustomCommandBlockMorph*/
// Global stuff ////////////////////////////////////////////////////////
modules.blocks = '2017-May-09';
modules.blocks = '2017-May-12';
var SyntaxElementMorph;
var BlockMorph;
@ -8133,6 +8133,7 @@ InputSlotMorph.prototype.gettablesMenu = function () {
dict.parent = ['parent'];
}
dict.name = ['name'];
dict.costumes = ['costumes'];
dict['dangling?'] = ['dangling?'];
dict['rotation x'] = ['rotation x'];
dict['rotation y'] = ['rotation y'];

19
gui.js
Wyświetl plik

@ -74,7 +74,7 @@ isRetinaSupported, SliderMorph, Animation*/
// Global stuff ////////////////////////////////////////////////////////
modules.gui = '2017-April-10';
modules.gui = '2017-May-12';
// Declarations
@ -7111,6 +7111,7 @@ CostumeIconMorph.prototype.userMenu = function () {
};
CostumeIconMorph.prototype.editCostume = function () {
this.disinherit();
if (this.object instanceof SVG_Costume) {
this.object.editRotationPointOnly(this.world());
} else {
@ -7129,6 +7130,7 @@ CostumeIconMorph.prototype.editRotationPointOnly = function () {
};
CostumeIconMorph.prototype.renameCostume = function () {
this.disinherit();
var costume = this.object,
wardrobe = this.parentThatIsA(WardrobeMorph),
ide = this.parentThatIsA(IDE_Morph);
@ -7189,9 +7191,21 @@ CostumeIconMorph.prototype.exportCostume = function () {
CostumeIconMorph.prototype.createBackgrounds
= SpriteIconMorph.prototype.createBackgrounds;
// CostumeIconMorph inheritance
CostumeIconMorph.prototype.disinherit = function () {
var wardrobe = this.parentThatIsA(WardrobeMorph),
idx = this.parent.children.indexOf(this);
if (wardrobe.sprite.inheritsAttribute('costumes')) {
wardrobe.sprite.shadowAttribute('costumes');
this.object = wardrobe.sprite.costumes.at(idx - 2);
}
};
// CostumeIconMorph drag & drop
CostumeIconMorph.prototype.prepareToBeGrabbed = function () {
this.disinherit();
this.mouseClickLeft(); // select me
this.removeCostume();
};
@ -7521,6 +7535,7 @@ WardrobeMorph.prototype.step = function () {
// Wardrobe ops
WardrobeMorph.prototype.removeCostumeAt = function (idx) {
this.sprite.shadowAttribute('costumes');
this.sprite.costumes.remove(idx);
this.updateList();
};
@ -7533,6 +7548,7 @@ WardrobeMorph.prototype.paintNew = function () {
ide = this.parentThatIsA(IDE_Morph),
myself = this;
cos.edit(this.world(), ide, true, null, function () {
myself.sprite.shadowAttribute('costumes');
myself.sprite.addCostume(cos);
myself.updateList();
if (ide) {
@ -7558,6 +7574,7 @@ WardrobeMorph.prototype.reactToDropOf = function (icon) {
idx += 1;
}
});
this.sprite.shadowAttribute('costumes');
this.sprite.costumes.add(costume, idx + 1);
this.updateList();
icon.mouseClickLeft(); // select

Wyświetl plik

@ -3422,6 +3422,11 @@ Fixes:
* added tools to the library browser
* added attributes to the “delete” blocks drop-down menu
170512
------
* added inheritance support for the wardrobe
Features:
* polymorphic sprite-local custom blocks
* inheritance of sprite-local custom blocks

Wyświetl plik

@ -82,7 +82,7 @@ SpeechBubbleMorph, RingMorph, isNil, FileReader, TableDialogMorph,
BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, localize,
TableMorph, TableFrameMorph, normalizeCanvas, BooleanSlotMorph, HandleMorph*/
modules.objects = '2017-May-09';
modules.objects = '2017-May-12';
var SpriteMorph;
var StageMorph;
@ -119,7 +119,8 @@ SpriteMorph.prototype.attributes =
'x position',
'y position',
'direction',
'size'
'size',
'costumes'
];
SpriteMorph.prototype.categories =
@ -2901,6 +2902,7 @@ SpriteMorph.prototype.addCostume = function (costume) {
if (!costume.name) {
costume.name = 'costume' + (this.costumes.length() + 1);
}
this.shadowAttribute('costumes');
this.costumes.add(costume);
};
@ -5149,7 +5151,8 @@ SpriteMorph.prototype.shadowedAttributes = function () {
};
SpriteMorph.prototype.shadowAttribute = function (aName) {
var ide;
var ide, wardrobe,
myself = this;
if (!this.inheritsAttribute(aName)) {
return;
}
@ -5157,7 +5160,17 @@ SpriteMorph.prototype.shadowAttribute = function (aName) {
this.inheritedAttributes = this.inheritedAttributes.filter(
function (each) {return each !== aName; }
);
if (ide) {
if (aName === 'costumes') {
wardrobe = new List();
this.costumes.asArray().forEach(function (costume) {
var cst = costume.copy();
wardrobe.add(cst);
if (costume === myself.costume) {
myself.wearCostume(cst);
}
});
this.costumes = wardrobe;
} else if (ide) {
ide.flushBlocksCache(); // optimization: specify category if known
ide.refreshPalette();
}
@ -5170,10 +5183,14 @@ SpriteMorph.prototype.inheritAttribute = function (aName) {
}
if (!this.inheritsAttribute(aName)) {
this.inheritedAttributes.push(aName);
this.refreshInheritedAttribute(aName);
if (ide) {
ide.flushBlocksCache(); // optimization: specify category if known
ide.refreshPalette();
if (aName === 'costumes') {
this.costumes = this.exemplar.costumes;
} else {
this.refreshInheritedAttribute(aName);
if (ide) {
ide.flushBlocksCache(); // optimization: specify category
ide.refreshPalette();
}
}
}
};

Wyświetl plik

@ -61,7 +61,7 @@ StageMorph, SpriteMorph, StagePrompterMorph, Note, modules, isString, copy,
isNil, WatcherMorph, List, ListWatcherMorph, alert, console, TableMorph,
TableFrameMorph, ColorSlotMorph, isSnapObject*/
modules.threads = '2017-May-09';
modules.threads = '2017-May-12';
var ThreadManager;
var Process;
@ -3010,6 +3010,8 @@ Process.prototype.reportGet = function (query) {
return thisObj.name;
case 'stage':
return thisObj.parentThatIsA(StageMorph);
case 'costumes':
return thisObj.reportCostumes();
}
}
return '';