let users make C-shape slots with loop arrow symbols. Sigh.

pull/89/head
jmoenig 2019-01-21 13:13:37 +01:00
rodzic 573ce00e8c
commit 7cf1c56d1d
4 zmienionych plików z 67 dodań i 12 usunięć

Wyświetl plik

@ -3,6 +3,7 @@
## in development ## in development
### 2019-01-21 ### 2019-01-21
* let users make C-shape slots with loop arrow symbols. Sigh.
* updated Indonesian translation, thanks, Emmanuella Rumanti * updated Indonesian translation, thanks, Emmanuella Rumanti
### 2019-01-19 ### 2019-01-19

Wyświetl plik

@ -6,13 +6,13 @@
<link rel="shortcut icon" href="src/favicon.ico"> <link rel="shortcut icon" href="src/favicon.ico">
<script type="text/javascript" src="src/morphic.js?version=2019-01-10"></script> <script type="text/javascript" src="src/morphic.js?version=2019-01-10"></script>
<script type="text/javascript" src="src/widgets.js?version=2018-10-02"></script> <script type="text/javascript" src="src/widgets.js?version=2018-10-02"></script>
<script type="text/javascript" src="src/blocks.js?version=2019-01-19"></script> <script type="text/javascript" src="src/blocks.js?version=2019-01-21"></script>
<script type="text/javascript" src="src/threads.js?version=2019-01-12"></script> <script type="text/javascript" src="src/threads.js?version=2019-01-12"></script>
<script type="text/javascript" src="src/objects.js?version=2019-01-14"></script> <script type="text/javascript" src="src/objects.js?version=2019-01-14"></script>
<script type="text/javascript" src="src/gui.js?version=2019-01-17"></script> <script type="text/javascript" src="src/gui.js?version=2019-01-17"></script>
<script type="text/javascript" src="src/paint.js?version=2018-10-02"></script> <script type="text/javascript" src="src/paint.js?version=2018-10-02"></script>
<script type="text/javascript" src="src/lists.js?version=2019-01-10"></script> <script type="text/javascript" src="src/lists.js?version=2019-01-10"></script>
<script type="text/javascript" src="src/byob.js?version=2018-11-12"></script> <script type="text/javascript" src="src/byob.js?version=2019-01-21"></script>
<script type="text/javascript" src="src/tables.js?version=2018-10-02"></script> <script type="text/javascript" src="src/tables.js?version=2018-10-02"></script>
<script type="text/javascript" src="src/symbols.js?version=2019-01-14"></script> <script type="text/javascript" src="src/symbols.js?version=2019-01-14"></script>
<script type="text/javascript" src="src/sketch.js?version=2018-10-02"></script> <script type="text/javascript" src="src/sketch.js?version=2018-10-02"></script>

Wyświetl plik

@ -148,7 +148,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/
// Global stuff //////////////////////////////////////////////////////// // Global stuff ////////////////////////////////////////////////////////
modules.blocks = '2019-January-19'; modules.blocks = '2019-January-21';
var SyntaxElementMorph; var SyntaxElementMorph;
var BlockMorph; var BlockMorph;
@ -1464,6 +1464,11 @@ SyntaxElementMorph.prototype.labelPart = function (spec) {
case '%cs': case '%cs':
part = new CSlotMorph(); // non-static part = new CSlotMorph(); // non-static
break; break;
case '%ca':
part = new CSlotMorph(); // non-static
part.isLoop = true; // has a loop symbol
part.add(this.labelPart('%loopArrow'));
break;
case '%cl': case '%cl':
part = new CSlotMorph(); part = new CSlotMorph();
part.isStatic = true; // rejects reporter drops part.isStatic = true; // rejects reporter drops
@ -2219,6 +2224,7 @@ SyntaxElementMorph.prototype.endLayout = function () {
%l - list icon %l - list icon
%c - C-shaped command slot, special form for primitives %c - C-shaped command slot, special form for primitives
%loop - C-shaped with loop arrow, special form for certain primitives %loop - C-shaped with loop arrow, special form for certain primitives
%ca - C-shaped with loop arrow, for custom blocks
%cs - C-shaped, auto-reifying, accepts reporter drops %cs - C-shaped, auto-reifying, accepts reporter drops
%cl - C-shaped, auto-reifying, rejects reporters %cl - C-shaped, auto-reifying, rejects reporters
%clr - interactive color slot %clr - interactive color slot

Wyświetl plik

@ -108,7 +108,7 @@ BooleanSlotMorph, XML_Serializer, SnapTranslator*/
// Global stuff //////////////////////////////////////////////////////// // Global stuff ////////////////////////////////////////////////////////
modules.byob = '2018-November-12'; modules.byob = '2019-January-21';
// Declarations // Declarations
@ -1452,7 +1452,7 @@ function JaggedBlockMorph(spec) {
JaggedBlockMorph.prototype.init = function (spec) { JaggedBlockMorph.prototype.init = function (spec) {
JaggedBlockMorph.uber.init.call(this); JaggedBlockMorph.uber.init.call(this);
if (spec) {this.setSpec(spec); } if (spec) {this.setSpec(spec); }
if (spec === '%cs') { if (spec === '%cs' || (spec === '%ca')) {
this.minWidth = 25; this.minWidth = 25;
this.fixLayout(); this.fixLayout();
} }
@ -2581,7 +2581,7 @@ BlockLabelFragment.prototype.defTemplateSpecFragment = function () {
suff = ' \u2191'; suff = ' \u2191';
} else if (this.isMultipleInput()) { } else if (this.isMultipleInput()) {
suff = '...'; suff = '...';
} else if (this.type === '%cs') { } else if (this.type === '%cs' || this.type === '%ca') {
suff = ' \u03BB'; // ' [\u03BB' suff = ' \u03BB'; // ' [\u03BB'
} else if (this.type === '%b') { } else if (this.type === '%b') {
suff = ' ?'; suff = ' ?';
@ -2655,6 +2655,8 @@ BlockLabelFragment.prototype.setToMultipleInput = function () {
if (!this.type) {return null; } // not an input at all if (!this.type) {return null; } // not an input at all
if (this.type === '%upvar') { if (this.type === '%upvar') {
this.type = '%s'; this.type = '%s';
} else if (this.type === '%ca') {
this.type = '%cs';
} }
this.type = '%mult'.concat(this.singleInputType()); this.type = '%mult'.concat(this.singleInputType());
}; };
@ -3282,7 +3284,7 @@ InputSlotDialogMorph.prototype.deleteFragment = function () {
InputSlotDialogMorph.prototype.createSlotTypeButtons = function () { InputSlotDialogMorph.prototype.createSlotTypeButtons = function () {
// populate my 'slots' area with radio buttons, labels and input fields // populate my 'slots' area with radio buttons, labels and input fields
var myself = this, defLabel, defInput, defSwitch, var myself = this, defLabel, defInput, defSwitch, loopArrow,
oldFlag = Morph.prototype.trackChanges; oldFlag = Morph.prototype.trackChanges;
Morph.prototype.trackChanges = false; Morph.prototype.trackChanges = false;
@ -3297,7 +3299,7 @@ InputSlotDialogMorph.prototype.createSlotTypeButtons = function () {
this.addSlotTypeButton('Command\n(inline)', '%cmdRing'); //'%cmd'); this.addSlotTypeButton('Command\n(inline)', '%cmdRing'); //'%cmd');
this.addSlotTypeButton('Reporter', '%repRing'); //'%r'); this.addSlotTypeButton('Reporter', '%repRing'); //'%r');
this.addSlotTypeButton('Predicate', '%predRing'); //'%p'); this.addSlotTypeButton('Predicate', '%predRing'); //'%p');
this.addSlotTypeButton('Command\n(C-shape)', '%cs'); this.addSlotTypeButton('Command\n(C-shape)', ['%cs', '%ca']);
this.addSlotTypeButton('Any\n(unevaluated)', '%anyUE'); this.addSlotTypeButton('Any\n(unevaluated)', '%anyUE');
this.addSlotTypeButton('Boolean\n(unevaluated)', '%boolUE'); this.addSlotTypeButton('Boolean\n(unevaluated)', '%boolUE');
@ -3374,6 +3376,43 @@ InputSlotDialogMorph.prototype.createSlotTypeButtons = function () {
this.slots.add(defSwitch); this.slots.add(defSwitch);
defSwitch.drawNew(); defSwitch.drawNew();
// loop arrow checkbox //
loopArrow = new ToggleMorph(
'checkbox',
this, // target
function () { // action
if (myself.fragment.type === '%ca') {
myself.setType('%cs');
} else {
myself.setType('%ca');
}
},
null, // label string
function () {return myself.fragment.type === '%ca'; },
null, // environment
null, // hint
null, // template
new SymbolMorph(
'loop',
this.fontSize * 0.7,
new Color(255, 255, 255)
),
null // builder method that constructs the element morph
);
loopArrow.refresh = function () {
ToggleMorph.prototype.refresh.call(this);
if (myself.isExpanded && contains(
['%cs', '%ca'],
myself.fragment.type
)) {
loopArrow.show();
} else {
loopArrow.hide();
}
};
this.slots.loopArrow = loopArrow;
this.slots.add(loopArrow);
Morph.prototype.trackChanges = oldFlag; Morph.prototype.trackChanges = oldFlag;
}; };
@ -3402,7 +3441,7 @@ InputSlotDialogMorph.prototype.setSlotArity = function (arity) {
InputSlotDialogMorph.prototype.addSlotTypeButton = function ( InputSlotDialogMorph.prototype.addSlotTypeButton = function (
label, label,
spec spec // slot spec or array of specs (I *hate* the arrow symbol, -Jens)
) { ) {
/* /*
this method produces a radio button with a picture of the this method produces a radio button with a picture of the
@ -3423,13 +3462,17 @@ InputSlotDialogMorph.prototype.addSlotTypeButton = function (
faster. faster.
*/ */
var myself = this, var myself = this,
action = function () {myself.setSlotType(spec); }, action = function () {
myself.setSlotType(spec instanceof Array ? spec[0] : spec);
},
query, query,
element = new JaggedBlockMorph(spec), element = new JaggedBlockMorph(spec instanceof Array ? spec[0] : spec),
button; button;
query = function () { query = function () {
return myself.fragment.singleInputType() === spec; return spec instanceof Array ?
contains(spec, myself.fragment.singleInputType())
: myself.fragment.singleInputType() === spec;
}; };
element.setCategory(this.category); element.setCategory(this.category);
element.rebuild(); element.rebuild();
@ -3563,6 +3606,11 @@ InputSlotDialogMorph.prototype.fixSlotsLayout = function () {
0 0
)) ))
); );
// loop arrow
this.slots.loopArrow.setPosition(this.slots.defaultInputLabel.position());
Morph.prototype.trackChanges = oldFlag; Morph.prototype.trackChanges = oldFlag;
this.slots.changed(); this.slots.changed();
}; };