Skip to content

Commit e0da679

Browse files
committed
refactor: converting ruby to events block
1 parent 05ddbd2 commit e0da679

File tree

1 file changed

+86
-81
lines changed
  • src/lib/ruby-to-blocks-converter

1 file changed

+86
-81
lines changed

src/lib/ruby-to-blocks-converter/event.js

Lines changed: 86 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/* global Opal */
2-
import _ from 'lodash';
31
import Variable from 'scratch-vm/src/engine/variable';
42
import {KeyOptions} from './constants';
53

@@ -12,77 +10,90 @@ const GreaterThanMenu = [
1210
* Event converter
1311
*/
1412
const EventConverter = {
15-
// eslint-disable-next-line no-unused-vars
16-
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock) {
17-
let block;
18-
if ((this._isSelf(receiver) || receiver === Opal.nil) &&
19-
name === 'when' &&
20-
args.length >= 1 && args[0].type === 'sym' &&
21-
rubyBlockArgs && rubyBlockArgs.length === 0 &&
22-
rubyBlock) {
23-
switch (args[0].value) {
24-
case 'flag_clicked':
25-
case 'clicked':
26-
if (args.length === 1) {
27-
let opcode;
28-
switch (args[0].value) {
29-
case 'flag_clicked':
30-
opcode = 'event_whenflagclicked';
31-
break;
32-
case 'clicked':
33-
if (this._context.target && this._context.target.isStage) {
34-
opcode = 'event_whenstageclicked';
35-
} else {
36-
opcode = 'event_whenthisspriteclicked';
37-
}
38-
break;
39-
}
40-
block = this._createBlock(opcode, 'hat');
41-
this._setParent(rubyBlock, block);
42-
}
43-
break;
44-
case 'key_pressed':
45-
if (args.length === 2 && this._isString(args[1]) && KeyOptions.indexOf(args[1].toString()) >= 0) {
46-
block = this._createBlock('event_whenkeypressed', 'hat');
47-
this._addField(block, 'KEY_OPTION', args[1]);
48-
this._setParent(rubyBlock, block);
49-
}
50-
break;
51-
case 'backdrop_switches':
52-
if (args.length === 2 && this._isString(args[1])) {
53-
block = this._createBlock('event_whenbackdropswitchesto', 'hat');
54-
this._addField(block, 'BACKDROP', args[1]);
55-
this._setParent(rubyBlock, block);
56-
}
57-
break;
58-
case 'greater_than':
59-
if (args.length === 3 &&
60-
this._isString(args[1]) && GreaterThanMenu.indexOf(args[1].toString().toUpperCase()) >= 0 &&
61-
this._isNumberOrBlock(args[2])) {
62-
block = this._createBlock('event_whengreaterthan', 'hat');
63-
this._addField(block, 'WHENGREATERTHANMENU', args[1].toString().toUpperCase());
64-
this._addNumberInput(block, 'VALUE', 'math_number', args[2], 10);
65-
this._setParent(rubyBlock, block);
66-
}
67-
break;
68-
case 'receive':
69-
if (args.length === 2 && this._isString(args[1])) {
70-
const broadcastMsg = this._lookupOrCreateBroadcastMsg(args[1]);
71-
block = this._createBlock('event_whenbroadcastreceived', 'hat');
72-
this._addField(block, 'BROADCAST_OPTION', broadcastMsg.name, {
73-
id: broadcastMsg.id,
74-
variableType: Variable.BROADCAST_MESSAGE_TYPE
75-
});
76-
this._setParent(rubyBlock, block);
77-
}
78-
break;
13+
register: function (converter) {
14+
converter.registerCallMethodWithBlock('self', 'when', 1, 0, params => {
15+
const {receiverName, args, rubyBlock} = params;
16+
17+
if (args[0].type !== 'sym') return null;
18+
19+
if (args[0].value === 'flag_clicked') {
20+
const block = converter.createBlock('event_whenflagclicked', 'hat');
21+
converter.setParent(rubyBlock, block);
22+
return block;
7923
}
80-
}
8124

82-
return block;
83-
},
25+
if (args[0].value === 'clicked') {
26+
let opcode = 'event_whenthisspriteclicked';
27+
if (receiverName === 'stage') opcode = 'event_whenstageclicked';
28+
const block = converter.createBlock(opcode, 'hat');
29+
converter.setParent(rubyBlock, block);
30+
return block;
31+
}
32+
33+
return null;
34+
});
35+
36+
converter.registerCallMethodWithBlock('self', 'when', 2, 0, params => {
37+
const {args, rubyBlock} = params;
38+
39+
if (args[0].type !== 'sym') return null;
40+
41+
if (args[0].value === 'key_pressed') {
42+
if (!converter.isString(args[1])) return null;
43+
if (KeyOptions.indexOf(args[1].toString()) < 0) return null;
44+
45+
const block = converter.createBlock('event_whenkeypressed', 'hat');
46+
converter.addField(block, 'KEY_OPTION', args[1]);
47+
converter.setParent(rubyBlock, block);
48+
return block;
49+
}
50+
51+
if (args[0].value === 'backdrop_switches') {
52+
if (!converter.isString(args[1])) return null;
53+
54+
const block = converter.createBlock('event_whenbackdropswitchesto', 'hat');
55+
converter.addField(block, 'BACKDROP', args[1]);
56+
converter.setParent(rubyBlock, block);
57+
return block;
58+
}
59+
60+
if (args[0].value === 'receive') {
61+
if (!converter.isString(args[1])) return null;
62+
63+
const broadcastMsg = converter.lookupOrCreateBroadcastMsg(args[1]);
64+
const block = converter.createBlock('event_whenbroadcastreceived', 'hat');
65+
converter.addField(block, 'BROADCAST_OPTION', broadcastMsg.name, {
66+
id: broadcastMsg.id,
67+
variableType: Variable.BROADCAST_MESSAGE_TYPE
68+
});
69+
converter.setParent(rubyBlock, block);
70+
return block;
71+
}
72+
73+
return null;
74+
});
75+
76+
converter.registerCallMethodWithBlock('self', 'when', 3, 0, params => {
77+
const {args, rubyBlock} = params;
78+
79+
if (args[0].type !== 'sym') return null;
80+
81+
if (args[0].value === 'greater_than') {
82+
if (!converter.isString(args[1])) return null;
83+
const args1 = args[1].toString().toUpperCase();
84+
if (GreaterThanMenu.indexOf(args1) < 0) return null;
85+
if (!converter.isNumberOrBlock(args[2])) return null;
86+
87+
const block = converter.createBlock('event_whengreaterthan', 'hat');
88+
converter.addField(block, 'WHENGREATERTHANMENU', args1);
89+
converter.addNumberInput(block, 'VALUE', 'math_number', args[2], 10);
90+
converter.setParent(rubyBlock, block);
91+
return block;
92+
}
93+
94+
return null;
95+
});
8496

85-
register: function (converter) {
8697
converter.registerCallMethodWithBlock('self', 'when_flag_clicked', 0, 0, params => {
8798
const {rubyBlock} = params;
8899

@@ -103,18 +114,12 @@ const EventConverter = {
103114
return block;
104115
});
105116

106-
converter.registerCallMethodWithBlock('sprite', 'when_clicked', 0, 0, params => {
107-
const {rubyBlock} = params;
108-
109-
const block = converter.createBlock('event_whenthisspriteclicked', 'hat');
110-
converter.setParent(rubyBlock, block);
111-
return block;
112-
});
113-
114-
converter.registerCallMethodWithBlock('stage', 'when_clicked', 0, 0, params => {
115-
const {rubyBlock} = params;
117+
converter.registerCallMethodWithBlock('self', 'when_clicked', 0, 0, params => {
118+
const {receiverName, rubyBlock} = params;
116119

117-
const block = converter.createBlock('event_whenstageclicked', 'hat');
120+
let opcode = 'event_whenthisspriteclicked';
121+
if (receiverName === 'stage') opcode = 'event_whenstageclicked';
122+
const block = converter.createBlock(opcode, 'hat');
118123
converter.setParent(rubyBlock, block);
119124
return block;
120125
});

0 commit comments

Comments
 (0)