smalruby-editor 0.1.1-x86-mingw32 → 0.1.2-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of smalruby-editor might be problematic. Click here for more details.

Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/demos/default.xml +1 -1
  3. data/app/assets/javascripts/application.js +1 -0
  4. data/app/assets/javascripts/blocks/blockly.js.coffee.erb +1 -1
  5. data/app/assets/javascripts/blocks/events.js.coffee.erb +2 -3
  6. data/app/assets/javascripts/blocks/field_character.js.coffee.erb +108 -0
  7. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +35 -2
  8. data/app/assets/javascripts/blocks/motion.js.coffee.erb +4 -4
  9. data/app/assets/javascripts/blocks/operators.js.coffee.erb +27 -29
  10. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +4 -6
  11. data/app/assets/javascripts/generators/ruby.js.coffee.erb +21 -19
  12. data/app/assets/javascripts/models/character.js.coffee +21 -0
  13. data/app/assets/javascripts/views/character_modal_view.js.coffee +24 -3
  14. data/app/views/editor/_character_modal.html.haml +1 -1
  15. data/app/views/editor/_toolbox.html.haml +7 -3
  16. data/lib/smalruby_editor/version.rb +1 -1
  17. data/public/assets/{application-0c2ae32cd8822cec7ba6e445e2501010.js → application-735e172a0df828da16d22f5d3c26671f.js} +294 -59
  18. data/public/assets/{application-0c2ae32cd8822cec7ba6e445e2501010.js.gz → application-735e172a0df828da16d22f5d3c26671f.js.gz} +0 -0
  19. data/public/assets/{default-7f438ebd7f8ab6ef65c5b9744786e57f.xml → default-5d1886100d7c8961e9962bbc4bb0c714.xml} +1 -1
  20. data/public/assets/manifest-1f254fa92a71ba4faad0f99136daeed8.json +1 -1
  21. data/spec/acceptance/block_mode/blocks/hardware/servo_set_position.feature +104 -0
  22. data/spec/acceptance/block_mode/blocks/operators/and_or.feature +61 -0
  23. data/spec/acceptance/block_mode/blocks/operators/four_arithmetic_and_compares.feature +85 -0
  24. data/spec/acceptance/block_mode/blocks/operators/index_of.feature +60 -0
  25. data/spec/acceptance/block_mode/blocks/operators/length.feature +52 -0
  26. data/spec/acceptance/block_mode/blocks/operators/math_method.feature +109 -0
  27. data/spec/acceptance/block_mode/blocks/operators/negate.feature +47 -0
  28. data/spec/acceptance/block_mode/blocks/operators/rand.feature +60 -0
  29. data/spec/acceptance/block_mode/blocks/operators/round.feature +52 -0
  30. data/spec/acceptance/block_mode/blocks/operators/true_false.feature +36 -0
  31. data/spec/acceptance/block_mode/blocks/ruby/expression.feature +36 -0
  32. data/spec/acceptance/block_mode/blocks/ruby/p.feature +34 -0
  33. data/spec/acceptance/block_mode/blocks/ruby/statement_comment.feature +25 -0
  34. data/spec/javascripts/models/character_spec.coffee +44 -5
  35. data/spec/steps/ace_steps.rb +9 -0
  36. data/spec/steps/block_mode_steps.rb +14 -0
  37. data/spec/steps/fix_turnip.rb +35 -0
  38. data/spec/steps/text_editor_steps.rb +1 -0
  39. data/spec/teaspoon_env.rb +1 -1
  40. data/spec/turnip_helper.rb +1 -0
  41. metadata +34 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0260bba256e25005f4bb317cde9e826d10e12109
4
- data.tar.gz: 5e1eb533ec3c00d45ecec7d4144703c851912b63
3
+ metadata.gz: 96882af4698c86e6f93655993010b2e4c3fb7bdd
4
+ data.tar.gz: 744c0843a58a6ee7a8c2831d69ee6ad81278c86f
5
5
  SHA512:
6
- metadata.gz: 9430d59c96d38189e8f7475dbe597bccdae279767a3608ebd18c519fed937f6c26a1d70856b4798e2fa1ba42642f4f8d9c2bbb3e22cf5ea271ff60681d2ed680
7
- data.tar.gz: 15638f5552baadbeffbfeffebd3cfca8f0642b6a78303f0d8b06882020e4ab922963bb82a850d61879dcc4fb6078fc19d7dc114c4f5cc6f64ebddaf96f28db05
6
+ metadata.gz: 831ca11f66993f73f36ee423244eb39ad0e2ff7e983ea021c317e0899e8bff26d71c59ffffe98a7cb72a02dfd462d525a142d81864aa7d51fe05fbc853e3f103
7
+ data.tar.gz: b26681dd47e00bef42f77433fc2cdbf615421187435e7f3530176888815b936b74740fd2b72219c3c7ce905b936cd4a5a2a4ab3c88d9d4b57e2cb7dcd525b835
@@ -77,7 +77,7 @@
77
77
  <block type="control_loop">
78
78
  <statement name="DO">
79
79
  <block type="motion_point_towards_character">
80
- <field name="VAR">car1</field>
80
+ <field name="CHAR">car1</field>
81
81
  <next>
82
82
  <block type="motion_move" inline="true">
83
83
  <value name="STEP">
@@ -34,5 +34,6 @@
34
34
  //= require_tree ./routers
35
35
  //= require ./block_mode
36
36
  //= require_tree ./generators
37
+ //= require ./blocks/field_character
37
38
  //= require_tree ./blocks
38
39
  //= require ./ruby_mode
@@ -5,7 +5,7 @@
5
5
  <% n = "#{category}_number" %>
6
6
  Blockly.Ruby['<%= n %>'] = (block) ->
7
7
  code = parseFloat(@getFieldValue('NUM'))
8
- order = if code < 0 then Blockly.Ruby.ORDER_UNARY_SIGN else Blockly.Ruby.ORDER_ATOMIC
8
+ order = if code < 0 then Blockly.Ruby.ORDER_UNARY_MINUS_SIGN else Blockly.Ruby.ORDER_ATOMIC
9
9
  [code, order]
10
10
 
11
11
 
@@ -69,7 +69,7 @@ Blockly.Blocks['<%= n %>'] =
69
69
  @setHelpUrl('')
70
70
  @setColour(<%= color %>)
71
71
  @appendDummyInput()
72
- .appendField(new Blockly.FieldVariable('car1'), 'CHAR') # TODO
72
+ .appendField(new Smalruby.FieldCharacter(), 'CHAR') # TODO
73
73
  .appendField('にぶつかったとき')
74
74
  @appendStatementInput('DO')
75
75
  @setPreviousStatement(true)
@@ -77,6 +77,5 @@ Blockly.Blocks['<%= n %>'] =
77
77
  @setTooltip('')
78
78
 
79
79
  Blockly.Ruby['<%= n %>'] = (block) ->
80
- char = Blockly.Ruby.variableDB_
81
- .getName(block.getFieldValue('CHAR'), Blockly.Variables.NAME_TYPE)
80
+ char = @getFieldValue('CHAR')
82
81
  Blockly.Ruby.characterEvent_(block, 'DO', 'hit', char)
@@ -0,0 +1,108 @@
1
+ 'use strict'
2
+
3
+ goog.provide('Smalruby.FieldCharacter')
4
+
5
+ goog.require('Blockly.FieldDropdown')
6
+
7
+
8
+ Smalruby.FieldCharacter = (character, opt_changeHandler) ->
9
+ if opt_changeHandler
10
+ changeHandler = (value) =>
11
+ retVal = Smalruby.FieldCharacter.dropdownChange.call(@, value)
12
+ if retVal
13
+ newVal = retVal
14
+ else
15
+ retVal = @getValue()
16
+ opt_changeHandler.call(@, newVal)
17
+ retVal
18
+ else
19
+ changeHandler = Smalruby.FieldCharacter.dropdownChange
20
+
21
+ Smalruby.FieldCharacter.superClass_.constructor
22
+ .call(@, Smalruby.FieldCharacter.dropdownCreate, changeHandler)
23
+
24
+ charSet = Smalruby.Collections.CharacterSet
25
+ charSet.on('add', @onCharacterSetAdd_, @)
26
+ charSet.on('remove', @onCharacterSetRemove_, @)
27
+ charSet.on('reset', @onCharacterSetReset_, @)
28
+
29
+ @character = Smalruby.FieldCharacter.NullCharacter
30
+
31
+ unless character
32
+ character = Smalruby.Collections.CharacterSet.first()
33
+ @setCharacter(character)
34
+
35
+ goog.inherits(Smalruby.FieldCharacter, Blockly.FieldDropdown)
36
+
37
+ Smalruby.FieldCharacter.prototype.setCharacter = (character) ->
38
+ return if character == @character
39
+
40
+ @character.unlink(@)
41
+ @character.off('change:name', @onCharacterChangeName_, @)
42
+ @character = if character then character else Smalruby.FieldCharacter.NullCharacter
43
+ @character.link(@)
44
+ @character.on('change:name', @onCharacterChangeName_, @)
45
+
46
+ @setValue(@character.get('name'))
47
+
48
+ Smalruby.FieldCharacter.prototype.onCharacterSetAdd_ = (model, collection, options) ->
49
+ if @character == Smalruby.FieldCharacter.NullCharacter
50
+ @setCharacter(model)
51
+
52
+ Smalruby.FieldCharacter.prototype.onCharacterSetRemove_ = (model, collection, options) ->
53
+ if model == @character
54
+ @setCharacter()
55
+
56
+ Smalruby.FieldCharacter.prototype.onCharacterSetReset_ = (collection, options) ->
57
+ if @character == Smalruby.FieldCharacter.NullCharacter
58
+ @setCharacter(collection.first())
59
+ else
60
+ @setCharacter(collection.findWhere({ name: @getValue() }))
61
+
62
+ Smalruby.FieldCharacter.prototype.onCharacterChangeName_ = (model, value, options) ->
63
+ @setValue(value)
64
+
65
+ Smalruby.FieldCharacter.prototype.clone = ->
66
+ new Smalruby.FieldCharacter(@character, @changeHandler_)
67
+
68
+ Smalruby.FieldCharacter.prototype.dispose = ->
69
+ charSet = Smalruby.Collections.CharacterSet
70
+ charSet.off('add', @onCharacterSetAdd_, @)
71
+ charSet.off('remove', @onCharacterSetRemove_, @)
72
+ charSet.off('reset', @onCharacterSetReset_, @)
73
+ @setCharacter()
74
+
75
+ Blockly.FieldDropdown.prototype.dispose.call(@)
76
+
77
+ Smalruby.FieldCharacter.prototype.setText = (value) ->
78
+ # HACK: XMLをロードしたときにキャラクターとリンクさせる
79
+ unless @character
80
+ @character = Smalruby.FieldCharacter.NullCharacter
81
+ charSet = Smalruby.Collections.CharacterSet
82
+ @setCharacter(charSet.findWhere({ name: value }))
83
+ Blockly.FieldDropdown.prototype.setText.call(@, value)
84
+
85
+ Smalruby.FieldCharacter.dropdownCreate = ->
86
+ charSet = Smalruby.Collections.CharacterSet
87
+ if charSet.length > 0
88
+ Smalruby.Collections.CharacterSet.map (c) ->
89
+ n = c.get('name')
90
+ [n, n]
91
+ else
92
+ [[Smalruby.FieldCharacter.NullCharacter.get('name'), '']]
93
+
94
+ Smalruby.FieldCharacter.dropdownChange = (value) ->
95
+ c = Smalruby.Collections.CharacterSet.findWhere({ name: value })
96
+ if c
97
+ @setCharacter(c)
98
+ value
99
+ else
100
+ null
101
+
102
+ Smalruby.FieldCharacter.NullCharacter =
103
+ get: (name) ->
104
+ 'キャラクターなし'
105
+ on: -> $.noop
106
+ off: -> $.noop
107
+ link: -> $.noop
108
+ unlink: -> $.noop
@@ -9,12 +9,16 @@
9
9
  window.SmalrubyEditor.Hardware =
10
10
  Type: 'Arduino' # 種別
11
11
  DioPins: [2..13] # デジタルIOピン
12
+ PwmPins: [3, 5, 6, 9, 10, 11] # デジタルIOピンのうちPWMに対応しているピン
12
13
  AiPins: [0..5] # アナログ入力ピン
13
14
 
14
15
  dioPinDropdown =
15
16
  (["D#{n}", "D#{n}"] for n in window.SmalrubyEditor.Hardware.DioPins)
16
17
 
17
18
  pwmPinDropdown =
19
+ (["D#{n}", "D#{n}"] for n in window.SmalrubyEditor.Hardware.PwmPins)
20
+
21
+ rgbLedPinDropdown =
18
22
  (["D#{n}", "D#{n}"] for n in [3, 9])
19
23
 
20
24
  aiPinDropdown =
@@ -81,7 +85,7 @@ Blockly.Blocks['<%= n %>'] =
81
85
  .appendField('RGB LED')
82
86
  .appendField(new Blockly.FieldDropdown(acDropdown), 'AC')
83
87
  .appendField('コモン')
84
- .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
88
+ .appendField(new Blockly.FieldDropdown(rgbLedPinDropdown), 'PIN')
85
89
  .appendField('を')
86
90
  .appendField(new Blockly.FieldColour('#ff0000'), 'COLOUR')
87
91
  .appendField('にする')
@@ -109,7 +113,7 @@ Blockly.Blocks['<%= n %>'] =
109
113
  .appendField('RGB LED')
110
114
  .appendField(new Blockly.FieldDropdown(acDropdown), 'AC')
111
115
  .appendField('コモン')
112
- .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
116
+ .appendField(new Blockly.FieldDropdown(rgbLedPinDropdown), 'PIN')
113
117
  .appendField('をオフにする')
114
118
  @setPreviousStatement(true)
115
119
  @setNextStatement(true)
@@ -209,6 +213,35 @@ Blockly.Blocks['<%= n %>'] =
209
213
  Blockly.Ruby['<%= n %>'] = (block) ->
210
214
  "seven_segment_display.off\n"
211
215
 
216
+ # 「サーボ」サブジャンル
217
+
218
+ # 「サーボ[▼ピン]を( )度(5~180)にする」ブロック
219
+ <% n = "#{category}_servo_set_position" %>
220
+ Blockly.Blocks['<%= n %>'] =
221
+ init: ()->
222
+ @setHelpUrl('')
223
+ @setColour(<%= color %>)
224
+ @appendDummyInput()
225
+ .appendField('サーボ')
226
+ .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
227
+ .appendField('を')
228
+ @appendValueInput('POS')
229
+ .setCheck('Number')
230
+ @appendDummyInput()
231
+ .appendField('度(5~180)にする')
232
+ @setInputsInline(true)
233
+ @setPreviousStatement(true)
234
+ @setNextStatement(true)
235
+ @setTooltip('')
236
+
237
+ Blockly.Ruby['<%= n %>'] = (block) ->
238
+ pin = @getFieldValue('PIN') #p sensor("A0").value
239
+ #p sensor("A0").value.class
240
+ #p(sensor("A0").value / 6)
241
+
242
+ pos = Blockly.Ruby.valueToCode(@, 'POS', Blockly.Ruby.ORDER_FUNCTION_CALL) || '5'
243
+ Blockly.Ruby.characterMethodCall_("servo(#{Blockly.Ruby.quote_(pin)}).position = #{pos}")
244
+
212
245
  # 「ボタン」サブジャンル
213
246
 
214
247
  # 条件:ボタン[▼]を押している
@@ -90,14 +90,14 @@ Blockly.Blocks['<%= n %>'] =
90
90
  @setHelpUrl('')
91
91
  @setColour(<%= color %>)
92
92
  @appendDummyInput()
93
- .appendField(new Blockly.FieldVariable('char1'), 'VAR')
93
+ .appendField(new Smalruby.FieldCharacter(), 'CHAR')
94
94
  .appendField('へ向ける')
95
95
  @setPreviousStatement(true)
96
96
  @setNextStatement(true)
97
97
  @setTooltip('')
98
98
 
99
99
  Blockly.Ruby['<%= n %>'] = (block) ->
100
- char = Blockly.Ruby.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE)
100
+ char = @getFieldValue('CHAR')
101
101
  Blockly.Ruby.characterMethodCall_('point_towards', char)
102
102
 
103
103
  # x座標を( )、y座標を( )にする
@@ -144,14 +144,14 @@ Blockly.Blocks['<%= n %>'] =
144
144
  @setHelpUrl('')
145
145
  @setColour(<%= color %>)
146
146
  @appendDummyInput()
147
- .appendField(new Blockly.FieldVariable('char1'), 'VAR')
147
+ .appendField(new Smalruby.FieldCharacter(), 'CHAR')
148
148
  .appendField('へ行く')
149
149
  @setPreviousStatement(true)
150
150
  @setNextStatement(true)
151
151
  @setTooltip('')
152
152
 
153
153
  Blockly.Ruby['<%= n %>'] = (block) ->
154
- var0 = Blockly.Ruby.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE)
154
+ char = @getFieldValue('CHAR')
155
155
  "#{Blockly.Ruby.rn()}go_to(#{var0})\n"
156
156
 
157
157
  # ( )秒でx座標を( )、y座標を( )に変える
@@ -11,11 +11,11 @@
11
11
  # 変数:( ) / ( )
12
12
  <%
13
13
  [
14
- ['add', '+', 'ADDITIVE', '+'],
15
- ['minus', 'ー', 'ADDITIVE', '-'],
16
- ['multiply', '×', 'MULTIPLICATIVE', '*'],
17
- ['divide', '÷', 'MULTIPLICATIVE', '/'],
18
- ].each do |suffix, operator_label, order_suffix, operator|
14
+ ['add', '+', 'ADDITIVE', '+', '0', '0'],
15
+ ['minus', 'ー', 'ADDITIVE', '-', '0', '0'],
16
+ ['multiply', '×', 'MULTIPLICATIVE', '*', '0', '0'],
17
+ ['divide', '÷', 'MULTIPLICATIVE', '/', '0', '1'],
18
+ ].each do |suffix, operator_label, order_suffix, operator, default_a, default_b|
19
19
  n = "#{category}_#{suffix}"
20
20
  %>
21
21
 
@@ -24,8 +24,8 @@ Blockly.Blocks['<%= n %>'] =
24
24
  @setHelpUrl('')
25
25
  @setColour(<%= color %>)
26
26
  @interpolateMsg('%1<%= operator_label %>%2',
27
- ['A', null, Blockly.ALIGN_RIGHT],
28
- ['B', null, Blockly.ALIGN_RIGHT],
27
+ ['A', null, Blockly.ALIGN_RIGHT],
28
+ ['B', null, Blockly.ALIGN_RIGHT],
29
29
  Blockly.ALIGN_RIGHT)
30
30
  @setInputsInline(true)
31
31
  @setOutput(true, null)
@@ -33,8 +33,8 @@ Blockly.Blocks['<%= n %>'] =
33
33
 
34
34
  Blockly.Ruby['<%= n %>'] = (block) ->
35
35
  order = Blockly.Ruby.ORDER_<%= order_suffix %>
36
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '0'
37
- b = Blockly.Ruby.valueToCode(block, 'B', order) || '0'
36
+ a = Blockly.Ruby.valueToCode(block, 'A', order) || '<%= default_a %>'
37
+ b = Blockly.Ruby.valueToCode(block, 'B', order) || '<%= default_b %>'
38
38
  [a + ' <%= operator %> ' + b, order]
39
39
  <% end %>
40
40
 
@@ -45,12 +45,12 @@ Blockly.Ruby['<%= n %>'] = (block) ->
45
45
  # 条件:( ) > ( )
46
46
  <%
47
47
  [
48
- ['compare_gt', '<', '<'],
49
- ['compare_gte', '≦', '<='],
50
- ['compare_eq', '=', '=='],
51
- ['compare_lte', '≧', '>='],
52
- ['compare_lt', '>', '>'],
53
- ].each do |suffix, operator_label, operator|
48
+ ['compare_lt', '<', '<', 'RELATIONAL'],
49
+ ['compare_lte', '≦', '<=', 'RELATIONAL'],
50
+ ['compare_eq', '=', '==', 'EQUALS'],
51
+ ['compare_gte', '≧', '>=', 'RELATIONAL'],
52
+ ['compare_gt', '>', '>', 'RELATIONAL'],
53
+ ].each do |suffix, operator_label, operator, order_suffix|
54
54
  n = "#{category}_#{suffix}"
55
55
  %>
56
56
 
@@ -67,7 +67,7 @@ Blockly.Blocks['<%= n %>'] =
67
67
  @setTooltip('')
68
68
 
69
69
  Blockly.Ruby['<%= n %>'] = (block) ->
70
- order = Blockly.Ruby.ORDER_RELATIONAL;
70
+ order = Blockly.Ruby.ORDER_<%= order_suffix %>;
71
71
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0'
72
72
  b = Blockly.Ruby.valueToCode(block, 'B', order) || '0'
73
73
  [a + ' <%= operator %> ' + b, order]
@@ -88,10 +88,9 @@ Blockly.Blocks['<%= n %>'] =
88
88
  @setTooltip('')
89
89
 
90
90
  Blockly.Ruby['<%= n %>'] = (block) ->
91
- order = Blockly.Ruby.ORDER_FUNCTION_CALL
92
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '0'
93
- b = Blockly.Ruby.valueToCode(block, 'B', order) || '0'
94
- ["rand(#{a}..#{b})", order]
91
+ a = Blockly.Ruby.valueToCode(block, 'A', Blockly.Ruby.ORDER_RANGE) || '0'
92
+ b = Blockly.Ruby.valueToCode(block, 'B', Blockly.Ruby.ORDER_RANGE) || '0'
93
+ ["rand(#{a}..#{b})", Blockly.Ruby.ORDER_FUNCTION_CALL]
95
94
 
96
95
  # 条件:< > かつ < >
97
96
  # 条件:< > または < >
@@ -136,11 +135,11 @@ Blockly.Blocks['<%= n %>'] =
136
135
  @setTooltip('')
137
136
 
138
137
  Blockly.Ruby['<%= n %>'] = (block) ->
139
- order = Blockly.Ruby.ORDER_LOGICAL_NOT
138
+ order = Blockly.Ruby.ORDER_UNARY_SIGN
140
139
  a = Blockly.Ruby.valueToCode(block, 'A', order) || 'true'
141
140
  ["!#{a}", order]
142
141
 
143
- # 変数:( )の[ ]番目
142
+ # 変数:( )の( )番目
144
143
  <% n = "#{category}_index_of" %>
145
144
  Blockly.Blocks['<%= n %>'] =
146
145
  init: ()->
@@ -155,12 +154,11 @@ Blockly.Blocks['<%= n %>'] =
155
154
  @setTooltip('')
156
155
 
157
156
  Blockly.Ruby['<%= n %>'] = (block) ->
158
- order = Blockly.Ruby.ORDER_FUNCTION_CALL
159
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '""'
160
- index = Blockly.Ruby.valueToCode(block, 'INDEX', order) || '0'
161
- ["#{a}[#{index}]", order]
157
+ a = Blockly.Ruby.valueToCode(block, 'A', Blockly.Ruby.ORDER_FUNCTION_CALL) || '""'
158
+ index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_INDEX) || '0'
159
+ ["#{a}[#{index}]", Blockly.Ruby.ORDER_FUNCTION_CALL]
162
160
 
163
- # 変数:[ ]の長さ
161
+ # 変数:( )の長さ
164
162
  <% n = "#{category}_length" %>
165
163
  Blockly.Blocks['<%= n %>'] =
166
164
  init: ()->
@@ -194,8 +192,8 @@ Blockly.Blocks['<%= n %>'] =
194
192
 
195
193
  Blockly.Ruby['<%= n %>'] = (block) ->
196
194
  order = Blockly.Ruby.ORDER_MULTIPLICATIVE
197
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '5'
198
- b = Blockly.Ruby.valueToCode(block, 'B', order) || '2'
195
+ a = Blockly.Ruby.valueToCode(block, 'A', order) || '1'
196
+ b = Blockly.Ruby.valueToCode(block, 'B', order) || '1'
199
197
  ["#{a} % #{b}", order]
200
198
 
201
199
  # 変数:( )を丸める
@@ -98,14 +98,13 @@ Blockly.Blocks['<%= n %>'] =
98
98
  @setHelpUrl('')
99
99
  @setColour(<%= color %>)
100
100
  @appendDummyInput()
101
- .appendField(new Blockly.FieldVariable('car1'), 'CHAR')
101
+ .appendField(new Smalruby.FieldCharacter(), 'CHAR')
102
102
  .appendField('に触れた')
103
103
  @setOutput(true, 'Boolean')
104
104
  @setTooltip('')
105
105
 
106
106
  Blockly.Ruby['<%= n %>'] = (block) ->
107
- char = Blockly.Ruby.variableDB_
108
- .getName(block.getFieldValue('CHAR'), Blockly.Variables.NAME_TYPE)
107
+ char = @getFieldValue('CHAR')
109
108
  Blockly.Ruby.characterMethodCallInput_('hit?', char)
110
109
 
111
110
  # [ ]と聞いて待つ
@@ -186,15 +185,14 @@ Blockly.Blocks['<%= n %>'] =
186
185
  @setHelpUrl('')
187
186
  @setColour(<%= color %>)
188
187
  @appendDummyInput()
189
- .appendField(new Blockly.FieldVariable('car1'), 'CHAR')
188
+ .appendField(new Smalruby.FieldCharacter(), 'CHAR')
190
189
  .appendField('の')
191
190
  .appendField(new Blockly.FieldDropdown(dropdown), 'PROPERTY')
192
191
  @setOutput(true, ['Number', 'String'])
193
192
  @setTooltip('')
194
193
 
195
194
  Blockly.Ruby['<%= n %>'] = (block) ->
196
- char = Blockly.Ruby.variableDB_
197
- .getName(block.getFieldValue('CHAR'), Blockly.Variables.NAME_TYPE)
195
+ char = @getFieldValue('CHAR')
198
196
  property = @getFieldValue('PROPERTY')
199
197
  c = Smalruby.Collections.CharacterSet.findWhere({ name: char })
200
198
  Blockly.Ruby.characterMethodCallInput_(property, null, { object: c })
@@ -10,28 +10,30 @@ break elsif module retry unless __ENCODING__
10
10
  case end next return until
11
11
  '.split(/\s+/)
12
12
 
13
- # TODO: 確認すること
14
13
  Blockly.Ruby.ORDER_ATOMIC = 0 # 0 "" ...
15
14
  Blockly.Ruby.ORDER_COLLECTION = 1 # tuples, lists, dictionaries
16
15
  Blockly.Ruby.ORDER_STRING_CONVERSION = 1 # `expression...`
17
- Blockly.Ruby.ORDER_MEMBER = 2 # . []
18
- Blockly.Ruby.ORDER_FUNCTION_CALL = 2 # ()
19
- Blockly.Ruby.ORDER_EXPONENTIATION = 3 # **
20
- Blockly.Ruby.ORDER_UNARY_SIGN = 4 # + -
21
- Blockly.Ruby.ORDER_BITWISE_NOT = 4 # ~
22
- Blockly.Ruby.ORDER_MULTIPLICATIVE = 5 # * / // %
23
- Blockly.Ruby.ORDER_ADDITIVE = 6 # + -
24
- Blockly.Ruby.ORDER_BITWISE_SHIFT = 7 # << >>
25
- Blockly.Ruby.ORDER_BITWISE_AND = 8 # &
26
- Blockly.Ruby.ORDER_BITWISE_XOR = 9 # ^
27
- Blockly.Ruby.ORDER_BITWISE_OR = 10 # |
28
- Blockly.Ruby.ORDER_RELATIONAL = 11 # in, not in, is, is not,
29
- # <, <=, >, >=, <>, !=, ==
30
- Blockly.Ruby.ORDER_LOGICAL_NOT = 12 # not
31
- Blockly.Ruby.ORDER_LOGICAL_AND = 13 # and
32
- Blockly.Ruby.ORDER_LOGICAL_OR = 14 # or
33
- Blockly.Ruby.ORDER_CONDITIONAL = 15 # if else
34
- Blockly.Ruby.ORDER_LAMBDA = 16 # lambda
16
+ Blockly.Ruby.ORDER_MEMBER = 2 # ::
17
+ Blockly.Ruby.ORDER_INDEX = 3 # []
18
+ Blockly.Ruby.ORDER_FUNCTION_CALL = 4 # ()
19
+ Blockly.Ruby.ORDER_UNARY_SIGN = 5 # +(単項) ! ~
20
+ Blockly.Ruby.ORDER_EXPONENTIATION = 6 # **
21
+ Blockly.Ruby.ORDER_UNARY_MINUS_SIGN = 7 # -(単項)
22
+ Blockly.Ruby.ORDER_MULTIPLICATIVE = 8 # * / %
23
+ Blockly.Ruby.ORDER_ADDITIVE = 9 # + -
24
+ Blockly.Ruby.ORDER_BITWISE_SHIFT = 10 # << >>
25
+ Blockly.Ruby.ORDER_BITWISE_AND = 11 # &
26
+ Blockly.Ruby.ORDER_BITWISE_XOR = 12 # ^
27
+ Blockly.Ruby.ORDER_BITWISE_OR = 12 # |
28
+ Blockly.Ruby.ORDER_RELATIONAL = 13 # > >= < <=
29
+ Blockly.Ruby.ORDER_EQUALS = 14 # <=> == === != =~ !~
30
+ Blockly.Ruby.ORDER_LOGICAL_AND = 15 # &&
31
+ Blockly.Ruby.ORDER_LOGICAL_OR = 16 # ||
32
+ Blockly.Ruby.ORDER_RANGE = 17 # .. ...
33
+ Blockly.Ruby.ORDER_CONDITIONAL = 18 # ?:(条件演算子)
34
+ Blockly.Ruby.ORDER_ASSIGNMENT = 19 # =(+=, -= ... )
35
+ Blockly.Ruby.ORDER_NOT = 20 # not
36
+ Blockly.Ruby.ORDER_AND_OR = 21 # and or
35
37
  Blockly.Ruby.ORDER_NONE = 99 # (...)
36
38
 
37
39
  Blockly.Ruby.INFINITE_LOOP_TRAP = null
@@ -14,6 +14,27 @@ Smalruby.Character = Backbone.Model.extend({
14
14
  if @get('costumes').length == 0
15
15
  @set({ costumes: [Smalruby.Character.PRESET_COSTUMES[0]] })
16
16
 
17
+ validate: (attrs, options) ->
18
+ errors = []
19
+
20
+ name = attrs.name
21
+ if _.isUndefined(name) || _.isNull(name) ||
22
+ (_.isString(name) && name.length == 0)
23
+ errors.push
24
+ attr: 'name'
25
+ message: 'Name is required'
26
+
27
+ if _.isString(name) &&
28
+ name.match(/^[0-9A-Z]|[!\"\#$%&\'()\-=^~\\|@`\[{;+:*\]},<.>/?]/)
29
+ errors.push
30
+ attr: 'name'
31
+ message: 'Name is invalid'
32
+
33
+ if errors.length > 0
34
+ return errors
35
+
36
+ return
37
+
17
38
  link: (object) ->
18
39
  @objects.push(object)
19
40
  @objects = _.uniq(@objects)
@@ -37,9 +37,11 @@ Smalruby.CharacterModalView = Backbone.View.extend
37
37
  true
38
38
 
39
39
  self = @
40
- @$el.find('input[name="character[name]"]').change (e) ->
40
+ changeNameFunc = (e) ->
41
41
  self.model.set({ name: $(@).val() })
42
42
  self.nameChanged = true
43
+ @$el.find('input[name="character[name]"]').change(changeNameFunc)
44
+ @$el.find('input[name="character[name]"]').keyup(changeNameFunc)
43
45
 
44
46
  @$el.find('input[name="character[x]"]').change (e) ->
45
47
  self.model.set({ x: $(@).val() })
@@ -55,11 +57,14 @@ Smalruby.CharacterModalView = Backbone.View.extend
55
57
  @listenTo(@model, 'change:y', @onChangeY)
56
58
  @listenTo(@model, 'change:angle', @onChangeAngle)
57
59
  @listenTo(@model, 'change:costumes', @onChangeCostumes)
60
+ @listenTo(@model, 'change', @onChange)
58
61
 
59
- @onChange(@model)
62
+ @callAllOnChangeAttributes_()
60
63
 
61
64
  render: ->
65
+ @onChange(@model)
62
66
  @$el.modal('show')
67
+
63
68
  # HACK: ダイアログを表示して500ms程度待たないと画像のサイズが取得できなかった
64
69
  f = ->
65
70
  if @readImageSizeflag
@@ -74,7 +79,7 @@ Smalruby.CharacterModalView = Backbone.View.extend
74
79
  if @readImageSizeflag
75
80
  setTimeout(_.bind(f, @), 1)
76
81
 
77
- onChange: (model, options)->
82
+ callAllOnChangeAttributes_: ->
78
83
  @onChangeName(@model, @model.get('name'))
79
84
  @onChangeX(@model, @model.get('x'))
80
85
  @onChangeY(@model, @model.get('y'))
@@ -118,6 +123,22 @@ Smalruby.CharacterModalView = Backbone.View.extend
118
123
  else
119
124
  @readImageSizeflag = true
120
125
 
126
+ onChange: (model, options) ->
127
+ return unless @target
128
+
129
+ @$el.find('.control-group[for="character[name]"]').removeClass('error')
130
+ @$el.find('#character-modal-ok-button').removeClass('disabled').removeAttr('disabled')
131
+
132
+ unless @model.isValid()
133
+ @$el.find('.control-group[for="character[name]"]').addClass('error')
134
+ @$el.find('#character-modal-ok-button').addClass('disabled').attr({ disabled: 'disabled' })
135
+
136
+ name = @model.get('name')
137
+ if @target.get('name') != name &&
138
+ Smalruby.Collections.CharacterSet.findWhere({ name: name })
139
+ @$el.find('.control-group[for="character[name]"]').addClass('error')
140
+ @$el.find('#character-modal-ok-button').addClass('disabled').attr({ disabled: 'disabled' })
141
+
121
142
  onSelectCostume: (e) ->
122
143
  e.preventDefault()
123
144
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  #character-modal-attributes
19
19
  %form#character-modal-form{:class => 'form-horizontal'}
20
- .control-group
20
+ .control-group{:for => "character[name]"}
21
21
  %label.control-label{:for => 'character_name'}<
22
22
  名前
23
23
  .controls
@@ -22,7 +22,6 @@
22
22
 
23
23
  -# [▼]へ向ける
24
24
  %block{:type => "#{category}_point_towards_character"}
25
- = toolbox_character_field
26
25
 
27
26
  -# x座標を( )、y座標を( )にする
28
27
  %block{:type => "#{category}_set_x_y"}
@@ -247,12 +246,12 @@
247
246
  = toolbox_number_value('A', 1)
248
247
  = toolbox_number_value('B', 10)
249
248
 
250
- -# 変数:( )の[ ]番目
249
+ -# 変数:( )の( )番目
251
250
  %block{:type => "#{category}_index_of"}
252
251
  = toolbox_text_value('A', 'あいうえお')
253
252
  = toolbox_number_value('INDEX', 1)
254
253
 
255
- -# 変数:[ ]の長さ
254
+ -# 変数:( )の長さ
256
255
  %block{:type => "#{category}_length"}
257
256
  = toolbox_text_value('A', 'あいうえお')
258
257
 
@@ -363,6 +362,11 @@
363
362
  -# -# LCDをクリアする
364
363
  -# %block{:type => "#{category}_lcd_clear"}
365
364
 
365
+ %category{:name => 'サーボ'}
366
+ -# サーボ[▼ピン]を( )度(5~180)にする
367
+ %block{:type => "#{category}_servo_set_position"}
368
+ = toolbox_number_value('POS', 90)
369
+
366
370
  -#%category{:name => 'ボタン'}
367
371
  -# -# 条件:ボタン[▼]を押している
368
372
  -# %block{:type => "#{category}_button_down"}
@@ -1,3 +1,3 @@
1
1
  module SmalrubyEditor
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end