smalruby-editor 0.1.15 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +16 -1
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +8 -1
  4. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +59 -7
  5. data/app/assets/javascripts/blocks/motion.js.coffee.erb +1 -2
  6. data/app/assets/javascripts/models/character.js.coffee +27 -0
  7. data/app/assets/javascripts/smalruby.js.coffee +4 -0
  8. data/app/assets/javascripts/views/character_modal_view.js.coffee +22 -1
  9. data/app/assets/javascripts/views/character_selector_view.js.coffee +7 -6
  10. data/app/assets/stylesheets/application.css +8 -0
  11. data/app/assets/stylesheets/editor.css.scss +15 -5
  12. data/app/controllers/application_controller.rb +4 -7
  13. data/app/models/concerns/ruby_to_block/block/character.rb +14 -6
  14. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car.rb +1 -1
  15. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_commands.rb +15 -0
  16. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_run.rb +19 -0
  17. data/app/models/concerns/ruby_to_block/block/motion_set_x.rb +1 -24
  18. data/app/models/concerns/ruby_to_block/block/motion_set_x_y.rb +21 -0
  19. data/app/models/source_code.rb +9 -6
  20. data/app/views/editor/_block_tab.html.haml +3 -1
  21. data/app/views/editor/_character_modal.html.haml +14 -5
  22. data/app/views/editor/_toolbox.html.haml +91 -78
  23. data/bin/smalruby-editor +15 -0
  24. data/lib/smalruby_editor/version.rb +1 -1
  25. data/lib/smalruby_editor.rb +39 -4
  26. data/public/assets/{application-51ab300acd1779bfba20b099e7000b7e.css → application-7f560d8d6d224f87269691c57ca9a376.css} +23 -9
  27. data/public/assets/{application-51ab300acd1779bfba20b099e7000b7e.css.gz → application-7f560d8d6d224f87269691c57ca9a376.css.gz} +0 -0
  28. data/public/assets/{application-dc485e2270d6c5fce20c149d1e2c4f8d.js → application-842ac8f5aa3fcc87bbb0e8b3a0fef5d7.js} +148 -21
  29. data/public/assets/{application-dc485e2270d6c5fce20c149d1e2c4f8d.js.gz → application-842ac8f5aa3fcc87bbb0e8b3a0fef5d7.js.gz} +0 -0
  30. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  31. data/smalruby-editor.gemspec +1 -1
  32. data/spec/acceptance/block_mode/blocks/motion/set_x_y.feature +2 -4
  33. data/spec/lib/smalruby_editor_spec.rb +12 -0
  34. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +90 -10
  35. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +3 -6
  36. metadata +11 -8
@@ -21,27 +21,36 @@
21
21
  %label.control-label{:for => 'character_name'}<
22
22
  名前
23
23
  .controls
24
- %input#character_name{:name => 'character[name]', :type => 'text', :placeholder => 'car1やball1など', :class => 'input-medium'}
24
+ %input#character_name{:name => 'character[name]', :type => 'text', :placeholder => 'car1やball1など', :class => 'input-large'}
25
25
  .control-group
26
26
  %label.control-label{:for => 'character_x'}<
27
27
  X座標
28
28
  .controls
29
- %input#character_x{:name => 'character[x]', :type => 'range', :min => '0', :max => '639', :class => 'input-medium'}
29
+ %input#character_x{:name => 'character[x]', :type => 'range', :min => '0', :max => '639', :class => 'input-large'}
30
30
  %span#character_x_value{:class => 'character_value'}
31
31
  300
32
32
  .control-group
33
33
  %label.control-label{:for => 'character_y'}<
34
34
  Y座標
35
35
  .controls
36
- %input#character_y{:name => 'character[y]', :type => 'range', :min => '0', :max => '439', :class => 'input-medium'}
36
+ %input#character_y{:name => 'character[y]', :type => 'range', :min => '0', :max => '439', :class => 'input-large'}
37
37
  %span#character_y_value{:class => 'character_value'}
38
38
  200
39
39
  .control-group
40
40
  %label.control-label{:for => 'character_angle'}<
41
41
  向き
42
42
  .controls
43
- %input#character_angle{:name => 'character[angle]', :type => 'range', :min => '0', :max => '359', :class => 'input-medium'}
44
- %span#character_angle_value{:class => 'character_value'}
43
+ #character_rotation_style.btn-group
44
+ %button#character_rotation_style_free.btn{type: "button", class: "btn-small", value: "free"}<
45
+ %i.icon-repeat
46
+ %button#character_rotation_style_left_right.btn{type: "button", class: "btn-small", value: "left_right"}<
47
+ %i.icon-resize-horizontal
48
+ %button#character_rotation_style_none.btn{type: "button", class: "btn-small", value: "none"}<
49
+ %i.icon-arrow-right
50
+ %input#character_angle{:name => 'character[angle]', :type => 'range', :min => '0', :max => '359', :class => 'input-small', style: "margin-left: 4px;"}
51
+ %span#character_angle_vector{:class => 'character_value'}
52
+
53
+ %span#character_angle_value{:class => 'character_value', style: "margin-left: 4px;"}
45
54
  100°
46
55
 
47
56
  .modal-footer
@@ -341,87 +341,100 @@
341
341
  %block{:type => "#{category}_p"}
342
342
 
343
343
  - category = 'hardware'
344
- %category{:name => 'アクチュエータ'}
344
+ %category{:name => 'ハードウェア'}
345
345
  %category{:name => '準備'}
346
346
  -# ハードウェアを準備する
347
347
  %block{:type => "#{category}_init_hardware"}
348
348
 
349
- %category{:name => 'LED'}
350
- -# LED[▼ピン]をオンにする
351
- %block{:type => "#{category}_led_on"}
352
-
353
- -# LED[▼ピン]をオフにする
354
- %block{:type => "#{category}_led_off"}
355
-
356
- %category{:name => 'RGB LED'}
357
- -# RGB LED[▼アノード]コモン[▼ピン]を[カラー]にする
358
- %block{:type => "#{category}_rgb_led_on"}
359
-
360
- -# RGB LED[▼アノード]コモン[▼ピン]をオフにする
361
- %block{:type => "#{category}_rgb_led_off"}
362
-
363
- -#%category{:name => '7セグディスプレイ'}
364
- -# -# 7セグディスプレイに[▼0-9]を表示する
365
- -# %block{:type => "#{category}_seven_segment_display_show"}
366
- -#
367
- -# -# 7セグディスプレイをオフにする
368
- -# %block{:type => "#{category}_seven_segment_display_off"}
369
-
370
- -#%category{:name => 'LCD'}
371
- -# -# LCDに( )を表示する
372
- -# %block{:type => "#{category}_lcd_puts"}
373
- -# = toolbox_text_value('TEXT', 'Hello')
374
- -#
375
- -# -# LCDをクリアする
376
- -# %block{:type => "#{category}_lcd_clear"}
377
-
378
- -#%category{:name => 'サーボ'}
379
- -# -# サーボ[▼ピン]を( )度(5~180)にする
380
- -# %block{:type => "#{category}_servo_set_position"}
381
- -# = toolbox_number_value('POS', 90)
382
-
383
- %category{:name => '車'}
384
- -# 2WD車[▼ピン]を進める」ブロック
385
- %block{:type => "#{category}_two_wheel_drive_car_forward"}
386
- %field{:name => 'PIN'}<
387
- D6
388
-
389
- -# 「2WD車[▼ピン]をバックさせる」ブロック
390
- %block{:type => "#{category}_two_wheel_drive_car_backward"}
391
- %field{:name => 'PIN'}<
392
- D6
393
-
394
- -# 「2WD車[▼ピン]を左に曲げる」ブロック
395
- %block{:type => "#{category}_two_wheel_drive_car_turn_left"}
396
- %field{:name => 'PIN'}<
397
- D6
398
-
399
- -# 「2WD車[▼ピン]を右に曲げる」ブロック
400
- %block{:type => "#{category}_two_wheel_drive_car_turn_right"}
401
- %field{:name => 'PIN'}<
402
- D6
403
-
404
- -# 「2WD車[▼ピン]を止める」ブロック
405
- %block{:type => "#{category}_two_wheel_drive_car_stop"}
406
- %field{:name => 'PIN'}<
407
- D6
349
+ %category{:name => 'アクチュエータ'}
350
+ %category{:name => 'LED'}
351
+ -# LED[▼ピン]をオンにする
352
+ %block{:type => "#{category}_led_on"}
353
+
354
+ -# LED[▼ピン]をオフにする
355
+ %block{:type => "#{category}_led_off"}
356
+
357
+ -# RGB LED[▼アノード]コモン[▼ピン]を[カラー]にする
358
+ -#%block{:type => "#{category}_rgb_led_on"}
359
+
360
+ -# RGB LED[▼アノード]コモン[▼ピン]をオフにする
361
+ -#%block{:type => "#{category}_rgb_led_off"}
362
+
363
+ -# 7セグディスプレイに[▼0-9]を表示する
364
+ -#%block{:type => "#{category}_seven_segment_display_show"}
365
+
366
+ -# 7セグディスプレイをオフにする
367
+ -#%block{:type => "#{category}_seven_segment_display_off"}
368
+
369
+ -#%category{:name => 'LCD'}
370
+ -# LCDに( )を表示する
371
+ %block{:type => "#{category}_lcd_puts"}
372
+ = toolbox_text_value('TEXT', 'Hello')
373
+
374
+ -# LCDをクリアする
375
+ %block{:type => "#{category}_lcd_clear"}
376
+
377
+ -#%category{:name => 'サーボ'}
378
+ -# サーボ[▼ピン]を( )度(5~180)にする
379
+ %block{:type => "#{category}_servo_set_position"}
380
+ = toolbox_number_value('POS', 90)
381
+
382
+ - subcategory = 'two_wheel_drive_car'
383
+ %category{:name => '車'}
384
+ -# 2WD車[▼ピン]を( )秒[▼コマンド]
385
+ %block{:type => "#{category}_#{subcategory}_run"}
386
+ %field{:name => 'PIN'}<
387
+ D6
388
+ = toolbox_number_value('SEC', 1)
389
+ %value{:name => 'COMMAND'}
390
+ %block{:type => "#{category}_#{subcategory}_commands"}
391
+
392
+ -# [▼コマンド]
393
+ %block{:type => "#{category}_#{subcategory}_commands"}
394
+ %field{:name => 'COMMAND'}<
395
+ forward
396
+
397
+ -# 2WD車[▼ピン]を進める
398
+ %block{:type => "#{category}_#{subcategory}_forward"}
399
+ %field{:name => 'PIN'}<
400
+ D6
401
+
402
+ -# 2WD車[▼ピン]をバックさせる
403
+ %block{:type => "#{category}_#{subcategory}_backward"}
404
+ %field{:name => 'PIN'}<
405
+ D6
406
+
407
+ -# 2WD車[▼ピン]を左に曲げる
408
+ %block{:type => "#{category}_#{subcategory}_turn_left"}
409
+ %field{:name => 'PIN'}<
410
+ D6
411
+
412
+ -# 2WD車[▼ピン]を右に曲げる
413
+ %block{:type => "#{category}_#{subcategory}_turn_right"}
414
+ %field{:name => 'PIN'}<
415
+ D6
416
+
417
+ -# 2WD車[▼ピン]を止める
418
+ %block{:type => "#{category}_#{subcategory}_stop"}
419
+ %field{:name => 'PIN'}<
420
+ D6
421
+
422
+ %category{:name => 'センサー'}
423
+ -# センサー[▼PIN]
424
+ %block{:type => "#{category}_sensor_value"}
425
+
426
+ -# センサー[▼PIN]が変化したとき
427
+ %block{:type => "#{category}_on_sensor_change"}
408
428
 
409
429
  -#%category{:name => 'ボタン'}
410
- -# -# 条件:ボタン[▼]を押している
411
- -# %block{:type => "#{category}_button_down"}
412
- -#
413
- -# -# 条件:ボタン[▼]を離している
414
- -# %block{:type => "#{category}_button_up"}
415
- -#
416
- -# -# ボタン[▼]を押したとき
417
- -# %block{:type => "#{category}_on_button_down"}
418
- -#
419
- -# -# ボタン[▼]を離したとき
420
- -# %block{:type => "#{category}_on_button_up"}
421
-
422
- %category{:name => 'センサー'}
423
- -# センサー[▼PIN]
424
- %block{:type => "#{category}_sensor_value"}
425
-
426
- -# センサー[▼PIN]が変化したとき
427
- %block{:type => "#{category}_on_sensor_change"}
430
+ -# 条件:ボタン[▼]を押している
431
+ %block{:type => "#{category}_button_down"}
432
+
433
+ -# 条件:ボタン[▼]を離している
434
+ %block{:type => "#{category}_button_up"}
435
+
436
+ -# ボタン[▼]を押したとき
437
+ %block{:type => "#{category}_on_button_down"}
438
+
439
+ -# ボタン[▼]を離したとき
440
+ %block{:type => "#{category}_on_button_up"}
data/bin/smalruby-editor CHANGED
@@ -84,6 +84,21 @@ end
84
84
  Rails::Server.new.tap do |server|
85
85
  require APP_PATH
86
86
  Dir.chdir(Rails.application.root)
87
+ if (pid_path = Pathname(server.default_options[:pid])).exist?
88
+ if SmalrubyEditor.windows?
89
+ pid = pid_path.read.to_i
90
+ require 'csv'
91
+ s = `tasklist /FI "IMAGENAME eq ruby.exe" /FO csv`
92
+ s.force_encoding('CP932')
93
+ csv = CSV.parse(s)
94
+ csv.shift # ヘッダを除去
95
+ pids = csv.map { |row| row[1].to_i }
96
+ if pids.include?(pid)
97
+ Process.kill('KILL', pid)
98
+ end
99
+ pid_path.unlink
100
+ end
101
+ end
87
102
  server.start
88
103
  end
89
104
  # rubocop:enable all
@@ -1,3 +1,3 @@
1
1
  module SmalrubyEditor
2
- VERSION = '0.1.15'
2
+ VERSION = '0.1.16'
3
3
  end
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  require 'smalruby_editor/version'
2
3
 
3
4
  module SmalrubyEditor
@@ -12,6 +13,42 @@ module SmalrubyEditor
12
13
  end
13
14
  module_function :create_home_directory
14
15
 
16
+ # Raspberry Piかどうかを返す
17
+ def raspberrypi?
18
+ if Rails.env != 'test' &&
19
+ (ENV['SMALRUBY_EDITOR_RASPBERRYPI_MODE'] ||
20
+ File.exist?(Rails.root.join('tmp', 'raspberrypi')))
21
+ true
22
+ else
23
+ RbConfig::CONFIG['arch'] == 'armv6l-linux-eabihf'
24
+ end
25
+ end
26
+ module_function :raspberrypi?
27
+
28
+ # Mac OS Xかどうかを返す
29
+ def osx?
30
+ if Rails.env != 'test' &&
31
+ (ENV['SMALRUBY_EDITOR_OSX_MODE'] ||
32
+ File.exist?(Rails.root.join('tmp', 'osx')))
33
+ true
34
+ else
35
+ /darwin/ =~ RbConfig::CONFIG['arch']
36
+ end
37
+ end
38
+ module_function :osx?
39
+
40
+ # Windowsかどうかを返す
41
+ def windows?
42
+ if Rails.env != 'test' &&
43
+ (ENV['SMALRUBY_EDITOR_WINDOWS_MODE'] ||
44
+ File.exist?(Rails.root.join('tmp', 'windows')))
45
+ true
46
+ else
47
+ /windows|mingw|cygwin/i.match(RbConfig::CONFIG['arch'])
48
+ end
49
+ end
50
+ module_function :windows?
51
+
15
52
  class << self
16
53
  private
17
54
 
@@ -36,10 +73,8 @@ standalone:
36
73
  def create_database_yml(home_dir)
37
74
  database_yml_path = home_dir.join('config', 'database.yml')
38
75
  db_path = home_dir.join('db', 'standalone.sqlite3')
39
- unless File.exist?(database_yml_path)
40
- File.open(database_yml_path, 'w') do |f|
41
- f.write(DATABASE_YML_TEMPLATE.gsub(/%db_path%/, db_path.to_s))
42
- end
76
+ File.open(database_yml_path, 'w') do |f|
77
+ f.write(DATABASE_YML_TEMPLATE.gsub(/%db_path%/, db_path.to_s))
43
78
  end
44
79
  end
45
80
  end
@@ -4777,6 +4777,14 @@ html, body {
4777
4777
  height: 100%;
4778
4778
  margin: 0;
4779
4779
  }
4780
+
4781
+ body {
4782
+ user-select: none;
4783
+ -moz-user-select: none;
4784
+ -khtml-user-select: none;
4785
+ -webkit-user-select: none;
4786
+ -ms-user-select: none;
4787
+ }
4780
4788
  .dropdown-menu > li > a {
4781
4789
  cursor: default; }
4782
4790
 
@@ -4895,6 +4903,9 @@ html, body {
4895
4903
  border: 5px solid white; }
4896
4904
  #modes-container .modes-tab-pane #block-tab-left-pane #selectors-container #selectors-tab-content .selector-tab .item a.character img, #modes-container .modes-tab-pane #block-tab-left-pane #selectors-container #selectors-tab-content .selector-tab .item a.character div {
4897
4905
  margin: -5px; }
4906
+ #modes-container .modes-tab-pane #block-tab-left-pane #selectors-container #selectors-tab-content .selector-tab .item a.character img {
4907
+ max-width: 160px;
4908
+ max-height: 160px; }
4898
4909
  #modes-container .modes-tab-pane #block-tab-left-pane #selectors-container #selectors-tab-content .selector-tab .item a.character:hover {
4899
4910
  border: 5px solid #0088cc; }
4900
4911
  #modes-container .modes-tab-pane #block-tab-left-pane #selectors-container #selectors-tab-content .selector-tab .item a#add-character-button.character {
@@ -4925,21 +4936,22 @@ html, body {
4925
4936
  font-size: 16pt; }
4926
4937
 
4927
4938
  #character-modal {
4928
- width: 847px;
4929
- height: 432px;
4930
- margin-left: -423.5px; }
4939
+ width: 849px;
4940
+ height: 434px;
4941
+ margin-left: -424.5px; }
4931
4942
  #character-modal .modal-body {
4932
4943
  position: relative;
4933
4944
  height: 100%;
4934
- max-height: 402px; }
4945
+ max-height: 404px; }
4935
4946
  #character-modal .modal-body #character-modal-left-pane {
4936
- width: 320px;
4947
+ width: 322px;
4937
4948
  overflow: hidden; }
4938
4949
  #character-modal .modal-body #character-modal-left-pane #character-modal-preview {
4939
4950
  position: relative;
4940
4951
  width: 320px;
4941
4952
  height: 240px;
4942
- background-color: black;
4953
+ background-color: white;
4954
+ border: 1px solid gray;
4943
4955
  overflow: hidden; }
4944
4956
  #character-modal .modal-body #character-modal-left-pane #character-modal-preview #character-modal-character {
4945
4957
  position: absolute;
@@ -4959,15 +4971,17 @@ html, body {
4959
4971
  #character-modal .modal-body #character-modal-left-pane #character-modal-attributes #character-modal-form .control-group {
4960
4972
  margin-bottom: 8px; }
4961
4973
  #character-modal .modal-body #character-modal-left-pane #character-modal-attributes #character-modal-form .control-group .control-label {
4962
- width: 100px; }
4974
+ width: 50px; }
4963
4975
  #character-modal .modal-body #character-modal-left-pane #character-modal-attributes #character-modal-form .control-group .controls {
4964
- margin-left: 115px; }
4976
+ margin-left: 65px; }
4965
4977
  #character-modal .modal-body #character-modal-left-pane #character-modal-attributes #character-modal-form .control-group .controls input[type=range] {
4966
4978
  padding: 0; }
4979
+ #character-modal .modal-body #character-modal-left-pane #character-modal-attributes #character-modal-form .control-group .controls span#character_angle_vector {
4980
+ display: inline-block; }
4967
4981
  #character-modal .modal-body #character-modal-right-pane {
4968
4982
  overflow: hidden; }
4969
4983
  #character-modal .modal-body #character-modal-right-pane #character-modal-costume-selector {
4970
- margin-left: 320px;
4984
+ margin-left: 322px;
4971
4985
  position: absolute;
4972
4986
  left: 0;
4973
4987
  top: 0;