@robotical/martyblocksjr 4.0.4 → 4.0.8
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.
- package/editions/free/src/app.bundle.js +1 -1
- package/editions/free/src/css/editor.css +6 -4
- package/editions/free/src/css/editorleftpanel.css +53 -0
- package/editions/free/src/css/librarymodal.css +12 -0
- package/editions/free/src/localizations/bg.json +10 -2
- package/editions/free/src/localizations/ca.json +10 -2
- package/editions/free/src/localizations/cs.json +10 -2
- package/editions/free/src/localizations/cy.json +10 -2
- package/editions/free/src/localizations/da.json +10 -2
- package/editions/free/src/localizations/de.json +10 -2
- package/editions/free/src/localizations/el.json +10 -2
- package/editions/free/src/localizations/en.json +10 -2
- package/editions/free/src/localizations/es.json +10 -2
- package/editions/free/src/localizations/fi.json +10 -2
- package/editions/free/src/localizations/fr.json +10 -2
- package/editions/free/src/localizations/it.json +10 -2
- package/editions/free/src/localizations/ja.json +10 -2
- package/editions/free/src/localizations/ko.json +10 -2
- package/editions/free/src/localizations/nl.json +10 -2
- package/editions/free/src/localizations/no.json +10 -2
- package/editions/free/src/localizations/pl.json +10 -2
- package/editions/free/src/localizations/pt-br.json +10 -2
- package/editions/free/src/localizations/pt.json +10 -2
- package/editions/free/src/localizations/sv.json +10 -2
- package/editions/free/src/localizations/th.json +10 -2
- package/editions/free/src/localizations/tr.json +10 -2
- package/editions/free/src/localizations/uk.json +10 -2
- package/editions/free/src/localizations/zh-cn.json +10 -2
- package/editions/free/src/localizations/zh-tw.json +10 -2
- package/editions/free/src/media.json +40 -38
- package/package.json +5 -1
- package/tests/e2e/marty-connection-ui.e2e.test.js +259 -0
- package/android/README.md +0 -1
- package/bin/readme.md +0 -3
|
@@ -476,6 +476,14 @@
|
|
|
476
476
|
"BLOCK_DESC_ON_TOUCH_Cog": "BÖRJA PÅ BERÖRNING",
|
|
477
477
|
"BLOCK_DESC_ON_MOVE": "BÖRJA PÅ RÖRELSE",
|
|
478
478
|
"BLOCK_DESC_ON_OBJECT_SENSED": "STARTA PÅ OBJEKT AVKÄNT",
|
|
479
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED": "START ON COLOR SENSED",
|
|
480
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected color.",
|
|
481
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED": "START ON OBSTACLE SENSED",
|
|
482
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether an obstacle is in front.",
|
|
483
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED": "START ON LIGHT SENSED",
|
|
484
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected light level.",
|
|
485
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED": "START ON NOISE SENSED",
|
|
486
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether there is noise.",
|
|
479
487
|
"BLOCK_DESC_ON_LIGHT": "BÖRJA PÅ LJUS",
|
|
480
488
|
"BLOCK_DESC_ON_ROTATE": "STARTA PÅ ROTERA",
|
|
481
489
|
"BLOCK_DESC_ON_STEER": "STARTA PÅ STYRNING",
|
|
@@ -534,8 +542,8 @@
|
|
|
534
542
|
"BLOCK_EYES_MARTY_WIGGLE": "Ögon vicka",
|
|
535
543
|
"BLOCK_WAVE_MARTY_LEFT": "Vinka vänster",
|
|
536
544
|
"BLOCK_WAVE_MARTY_RIGHT": "Vinka höger",
|
|
537
|
-
"BLOCK_LED_MARTY_EYES_P1": "
|
|
538
|
-
"BLOCK_LED_MARTY_EYES_P2": "
|
|
545
|
+
"BLOCK_LED_MARTY_EYES_P1": "Rainbow",
|
|
546
|
+
"BLOCK_LED_MARTY_EYES_P2": "Pinwheel",
|
|
539
547
|
"BLOCK_LED_MARTY_EYES_COLOUR": "LED ögonfärg",
|
|
540
548
|
"BLOCK_MARTY_CELEBRATE": "Fira",
|
|
541
549
|
"BLOCK_PLAY_MARTY_CONFUSION_SOUND": "Spela \"Confusion\"-ljud",
|
|
@@ -476,6 +476,14 @@
|
|
|
476
476
|
"BLOCK_DESC_ON_TOUCH_Cog": "เริ่มสัมผัส",
|
|
477
477
|
"BLOCK_DESC_ON_MOVE": "เริ่มเคลื่อนไหว",
|
|
478
478
|
"BLOCK_DESC_ON_OBJECT_SENSED": "เริ่มต้นเมื่อวัตถุถูกสัมผัส",
|
|
479
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED": "START ON COLOR SENSED",
|
|
480
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected color.",
|
|
481
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED": "START ON OBSTACLE SENSED",
|
|
482
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether an obstacle is in front.",
|
|
483
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED": "START ON LIGHT SENSED",
|
|
484
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected light level.",
|
|
485
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED": "START ON NOISE SENSED",
|
|
486
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether there is noise.",
|
|
479
487
|
"BLOCK_DESC_ON_LIGHT": "เริ่มต้นด้วยแสง",
|
|
480
488
|
"BLOCK_DESC_ON_ROTATE": "เริ่มหมุน",
|
|
481
489
|
"BLOCK_DESC_ON_STEER": "เริ่มที่การบังคับเลี้ยว",
|
|
@@ -534,8 +542,8 @@
|
|
|
534
542
|
"BLOCK_EYES_MARTY_WIGGLE": "ตาขยับ",
|
|
535
543
|
"BLOCK_WAVE_MARTY_LEFT": "โบกมือซ้าย",
|
|
536
544
|
"BLOCK_WAVE_MARTY_RIGHT": "โบกมือขวา",
|
|
537
|
-
"BLOCK_LED_MARTY_EYES_P1": "
|
|
538
|
-
"BLOCK_LED_MARTY_EYES_P2": "
|
|
545
|
+
"BLOCK_LED_MARTY_EYES_P1": "Rainbow",
|
|
546
|
+
"BLOCK_LED_MARTY_EYES_P2": "Pinwheel",
|
|
539
547
|
"BLOCK_LED_MARTY_EYES_COLOUR": "สีตา LED",
|
|
540
548
|
"BLOCK_MARTY_CELEBRATE": "ฉลอง",
|
|
541
549
|
"BLOCK_PLAY_MARTY_CONFUSION_SOUND": "เล่นเสียง 'สับสน'",
|
|
@@ -476,6 +476,14 @@
|
|
|
476
476
|
"BLOCK_DESC_ON_TOUCH_Cog": "DOKUNMADAN BAŞLAYIN",
|
|
477
477
|
"BLOCK_DESC_ON_MOVE": "HAREKETE BAŞLA",
|
|
478
478
|
"BLOCK_DESC_ON_OBJECT_SENSED": "ALGILANAN NESNE ÜZERİNDEN BAŞLAYIN",
|
|
479
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED": "START ON COLOR SENSED",
|
|
480
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected color.",
|
|
481
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED": "START ON OBSTACLE SENSED",
|
|
482
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether an obstacle is in front.",
|
|
483
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED": "START ON LIGHT SENSED",
|
|
484
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected light level.",
|
|
485
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED": "START ON NOISE SENSED",
|
|
486
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether there is noise.",
|
|
479
487
|
"BLOCK_DESC_ON_LIGHT": "IŞIKTAN BAŞLA",
|
|
480
488
|
"BLOCK_DESC_ON_ROTATE": "DÖNDÜRMEYE BAŞLA",
|
|
481
489
|
"BLOCK_DESC_ON_STEER": "DİREKSİYONA BAŞLA",
|
|
@@ -534,8 +542,8 @@
|
|
|
534
542
|
"BLOCK_EYES_MARTY_WIGGLE": "Gözler Kıpırdıyor",
|
|
535
543
|
"BLOCK_WAVE_MARTY_LEFT": "Sola doğru dalga",
|
|
536
544
|
"BLOCK_WAVE_MARTY_RIGHT": "Sağa Salla",
|
|
537
|
-
"BLOCK_LED_MARTY_EYES_P1": "
|
|
538
|
-
"BLOCK_LED_MARTY_EYES_P2": "
|
|
545
|
+
"BLOCK_LED_MARTY_EYES_P1": "Rainbow",
|
|
546
|
+
"BLOCK_LED_MARTY_EYES_P2": "Pinwheel",
|
|
539
547
|
"BLOCK_LED_MARTY_EYES_COLOUR": "LED Göz Rengi",
|
|
540
548
|
"BLOCK_MARTY_CELEBRATE": "Kutlamak",
|
|
541
549
|
"BLOCK_PLAY_MARTY_CONFUSION_SOUND": "Karışıklık' sesini çal",
|
|
@@ -476,6 +476,14 @@
|
|
|
476
476
|
"BLOCK_DESC_ON_TOUCH_Cog": "ПОЧАТОК НА ДОТИК",
|
|
477
477
|
"BLOCK_DESC_ON_MOVE": "ПОЧИНАЙТЕ З РУХУ",
|
|
478
478
|
"BLOCK_DESC_ON_OBJECT_SENSED": "ПОЧАТИ З ВІДЗНАЧЕНОГО ОБ'ЄКТА",
|
|
479
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED": "START ON COLOR SENSED",
|
|
480
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected color.",
|
|
481
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED": "START ON OBSTACLE SENSED",
|
|
482
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether an obstacle is in front.",
|
|
483
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED": "START ON LIGHT SENSED",
|
|
484
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected light level.",
|
|
485
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED": "START ON NOISE SENSED",
|
|
486
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether there is noise.",
|
|
479
487
|
"BLOCK_DESC_ON_LIGHT": "ПОЧНІТЬ НА СВІТЛО",
|
|
480
488
|
"BLOCK_DESC_ON_ROTATE": "ПОЧАТИ НА ОБРАТ",
|
|
481
489
|
"BLOCK_DESC_ON_STEER": "ЗАПУСК НА КЕРМІВНИХ РЕЖИМАХ",
|
|
@@ -534,8 +542,8 @@
|
|
|
534
542
|
"BLOCK_EYES_MARTY_WIGGLE": "Ворушіння очима",
|
|
535
543
|
"BLOCK_WAVE_MARTY_LEFT": "Хвиля вліво",
|
|
536
544
|
"BLOCK_WAVE_MARTY_RIGHT": "Хвиля вправо",
|
|
537
|
-
"BLOCK_LED_MARTY_EYES_P1": "
|
|
538
|
-
"BLOCK_LED_MARTY_EYES_P2": "
|
|
545
|
+
"BLOCK_LED_MARTY_EYES_P1": "Rainbow",
|
|
546
|
+
"BLOCK_LED_MARTY_EYES_P2": "Pinwheel",
|
|
539
547
|
"BLOCK_LED_MARTY_EYES_COLOUR": "Світлодіодний колір очей",
|
|
540
548
|
"BLOCK_MARTY_CELEBRATE": "Святкуйте",
|
|
541
549
|
"BLOCK_PLAY_MARTY_CONFUSION_SOUND": "Відтворити звук \"Confusion\".",
|
|
@@ -476,6 +476,14 @@
|
|
|
476
476
|
"BLOCK_DESC_ON_TOUCH_Cog": "触摸开始",
|
|
477
477
|
"BLOCK_DESC_ON_MOVE": "开始行动",
|
|
478
478
|
"BLOCK_DESC_ON_OBJECT_SENSED": "检测到物体时开始",
|
|
479
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED": "START ON COLOR SENSED",
|
|
480
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected color.",
|
|
481
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED": "START ON OBSTACLE SENSED",
|
|
482
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether an obstacle is in front.",
|
|
483
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED": "START ON LIGHT SENSED",
|
|
484
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected light level.",
|
|
485
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED": "START ON NOISE SENSED",
|
|
486
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether there is noise.",
|
|
479
487
|
"BLOCK_DESC_ON_LIGHT": "从灯光开始",
|
|
480
488
|
"BLOCK_DESC_ON_ROTATE": "开始旋转",
|
|
481
489
|
"BLOCK_DESC_ON_STEER": "启动方向盘",
|
|
@@ -534,8 +542,8 @@
|
|
|
534
542
|
"BLOCK_EYES_MARTY_WIGGLE": "眼睛摆动",
|
|
535
543
|
"BLOCK_WAVE_MARTY_LEFT": "向左挥手",
|
|
536
544
|
"BLOCK_WAVE_MARTY_RIGHT": "向右挥手",
|
|
537
|
-
"BLOCK_LED_MARTY_EYES_P1": "
|
|
538
|
-
"BLOCK_LED_MARTY_EYES_P2": "
|
|
545
|
+
"BLOCK_LED_MARTY_EYES_P1": "Rainbow",
|
|
546
|
+
"BLOCK_LED_MARTY_EYES_P2": "Pinwheel",
|
|
539
547
|
"BLOCK_LED_MARTY_EYES_COLOUR": "LED眼睛颜色",
|
|
540
548
|
"BLOCK_MARTY_CELEBRATE": "庆祝",
|
|
541
549
|
"BLOCK_PLAY_MARTY_CONFUSION_SOUND": "播放“困惑”声音",
|
|
@@ -476,6 +476,14 @@
|
|
|
476
476
|
"BLOCK_DESC_ON_TOUCH_Cog": "觸摸開始",
|
|
477
477
|
"BLOCK_DESC_ON_MOVE": "開始行動",
|
|
478
478
|
"BLOCK_DESC_ON_OBJECT_SENSED": "偵測到物體時開始",
|
|
479
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED": "START ON COLOR SENSED",
|
|
480
|
+
"BLOCK_DESC_MARTY_ON_COLOUR_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected color.",
|
|
481
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED": "START ON OBSTACLE SENSED",
|
|
482
|
+
"BLOCK_DESC_MARTY_ON_OBSTACLE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether an obstacle is in front.",
|
|
483
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED": "START ON LIGHT SENSED",
|
|
484
|
+
"BLOCK_DESC_MARTY_ON_LIGHT_SENSED_DESCRIPTION": "Starts the script when Marty senses the selected light level.",
|
|
485
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED": "START ON NOISE SENSED",
|
|
486
|
+
"BLOCK_DESC_MARTY_ON_NOISE_SENSED_DESCRIPTION": "Starts the script when Marty senses whether there is noise.",
|
|
479
487
|
"BLOCK_DESC_ON_LIGHT": "從燈光開始",
|
|
480
488
|
"BLOCK_DESC_ON_ROTATE": "開始旋轉",
|
|
481
489
|
"BLOCK_DESC_ON_STEER": "啟動方向盤",
|
|
@@ -534,8 +542,8 @@
|
|
|
534
542
|
"BLOCK_EYES_MARTY_WIGGLE": "眼睛擺動",
|
|
535
543
|
"BLOCK_WAVE_MARTY_LEFT": "向左揮手",
|
|
536
544
|
"BLOCK_WAVE_MARTY_RIGHT": "向右揮手",
|
|
537
|
-
"BLOCK_LED_MARTY_EYES_P1": "
|
|
538
|
-
"BLOCK_LED_MARTY_EYES_P2": "
|
|
545
|
+
"BLOCK_LED_MARTY_EYES_P1": "Rainbow",
|
|
546
|
+
"BLOCK_LED_MARTY_EYES_P2": "Pinwheel",
|
|
539
547
|
"BLOCK_LED_MARTY_EYES_COLOUR": "LED眼睛顏色",
|
|
540
548
|
"BLOCK_MARTY_CELEBRATE": "慶祝",
|
|
541
549
|
"BLOCK_PLAY_MARTY_CONFUSION_SOUND": "播放“困惑”聲音",
|
|
@@ -3,61 +3,63 @@
|
|
|
3
3
|
"path": "./svglibrary/",
|
|
4
4
|
"samples": ["samples/Star.txt"],
|
|
5
5
|
"backgrounds": [
|
|
6
|
-
{"md5":"Mars.svg","width":480,"height":360,"ext":"svg","name":"Mars"},
|
|
7
|
-
{"md5":"RedCarpet.svg","width":480,"height":360,"ext":"svg","name":"RedCarpet"},
|
|
8
|
-
{"md5":"WoodenFloor.svg","width":480,"height":360,"ext":"svg","name":"WoodenFloor"},
|
|
6
|
+
{"md5":"Mars.svg","width":480,"height":360,"ext":"svg","name":"Mars","order":"backgrounds,01 Surfaces"},
|
|
7
|
+
{"md5":"RedCarpet.svg","width":480,"height":360,"ext":"svg","name":"RedCarpet","order":"backgrounds,01 Surfaces"},
|
|
8
|
+
{"md5":"WoodenFloor.svg","width":480,"height":360,"ext":"svg","name":"WoodenFloor","order":"backgrounds,01 Surfaces"},
|
|
9
9
|
|
|
10
|
-
{"md5":"Road1.svg","width":480,"height":360,"ext":"svg","name":"Road1"},
|
|
11
|
-
{"md5":"Road2.svg","width":480,"height":360,"ext":"svg","name":"Road2"},
|
|
12
|
-
{"md5":"USMap.svg","width":480,"height":360,"ext":"svg","name":"USMap"},
|
|
13
|
-
{"md5":"Beach.svg","width":480,"height":360,"ext":"svg","name":"Beach"},
|
|
14
|
-
{"md5":"Racetrack.svg","width":480,"height":360,"ext":"svg","name":"Racetrack"},
|
|
10
|
+
{"md5":"Road1.svg","width":480,"height":360,"ext":"svg","name":"Road1","order":"backgrounds,01 Surfaces"},
|
|
11
|
+
{"md5":"Road2.svg","width":480,"height":360,"ext":"svg","name":"Road2","order":"backgrounds,01 Surfaces"},
|
|
12
|
+
{"md5":"USMap.svg","width":480,"height":360,"ext":"svg","name":"USMap","order":"backgrounds,01 Surfaces"},
|
|
13
|
+
{"md5":"Beach.svg","width":480,"height":360,"ext":"svg","name":"Beach","order":"backgrounds,01 Surfaces"},
|
|
14
|
+
{"md5":"Racetrack.svg","width":480,"height":360,"ext":"svg","name":"Racetrack","order":"backgrounds,01 Surfaces"},
|
|
15
15
|
|
|
16
|
-
{"md5":"Farm.svg","width":480,"height":360,"ext":"svg","name":"Farm"},
|
|
17
|
-
{"md5":"Park.svg","width":480,"height":360,"ext":"svg","name":"Park"},
|
|
18
|
-
{"md5":"Suburbs.svg","width":480,"height":360,"ext":"svg","name":"Suburbs"},
|
|
19
|
-
{"md5":"City.svg","width":480,"height":360,"ext":"svg","name":"City"},
|
|
20
|
-
{"md5":"Library.svg","width":480,"height":360,"ext":"svg","name":"Library"},
|
|
21
|
-
{"md5":"Classroom.svg","width":480,"height":360,"ext":"svg","name":"Classroom"},
|
|
22
|
-
{"md5":"Theatre.svg","width":480,"height":360,"ext":"svg","name":"Theatre"},
|
|
23
|
-
{"md5":"Gym.svg","width":480,"height":360,"ext":"svg","name":"Gym"},
|
|
24
|
-
{"md5":"Gym2.svg","width":480,"height":360,"ext":"svg","name":"Gym"},
|
|
25
|
-
{"md5":"Bedroom.svg","width":480,"height":360,"ext":"svg","name":"Bedroom"},
|
|
26
|
-
{"md5":"EmptyRoom.svg","width":480,"height":360,"ext":"svg","name":"Empty Room"},
|
|
16
|
+
{"md5":"Farm.svg","width":480,"height":360,"ext":"svg","name":"Farm","order":"backgrounds,02 Backgrounds"},
|
|
17
|
+
{"md5":"Park.svg","width":480,"height":360,"ext":"svg","name":"Park","order":"backgrounds,02 Backgrounds"},
|
|
18
|
+
{"md5":"Suburbs.svg","width":480,"height":360,"ext":"svg","name":"Suburbs","order":"backgrounds,02 Backgrounds"},
|
|
19
|
+
{"md5":"City.svg","width":480,"height":360,"ext":"svg","name":"City","order":"backgrounds,02 Backgrounds"},
|
|
20
|
+
{"md5":"Library.svg","width":480,"height":360,"ext":"svg","name":"Library","order":"backgrounds,02 Backgrounds"},
|
|
21
|
+
{"md5":"Classroom.svg","width":480,"height":360,"ext":"svg","name":"Classroom","order":"backgrounds,02 Backgrounds"},
|
|
22
|
+
{"md5":"Theatre.svg","width":480,"height":360,"ext":"svg","name":"Theatre","order":"backgrounds,02 Backgrounds"},
|
|
23
|
+
{"md5":"Gym.svg","width":480,"height":360,"ext":"svg","name":"Gym","order":"backgrounds,02 Backgrounds"},
|
|
24
|
+
{"md5":"Gym2.svg","width":480,"height":360,"ext":"svg","name":"Gym","order":"backgrounds,02 Backgrounds"},
|
|
25
|
+
{"md5":"Bedroom.svg","width":480,"height":360,"ext":"svg","name":"Bedroom","order":"backgrounds,02 Backgrounds"},
|
|
26
|
+
{"md5":"EmptyRoom.svg","width":480,"height":360,"ext":"svg","name":"Empty Room","order":"backgrounds,02 Backgrounds"},
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
{"md5":"Summer.svg","width":480,"height":360,"ext":"svg","name":"Summer"},
|
|
30
|
-
{"md5":"Fall.svg","width":480,"height":360,"ext":"svg","name":"Fall"},
|
|
31
|
-
{"md5":"Winter.svg","width":480,"height":360,"ext":"svg","name":"Winter"},
|
|
32
|
-
{"md5":"Spring.svg","width":480,"height":360,"ext":"svg","name":"Spring"},
|
|
33
|
-
{"md5":"Creek.svg","width":480,"height":360,"ext":"svg","name":"River"},
|
|
34
|
-
{"md5":"Lake.svg","width":480,"height":360,"ext":"svg","name":"Lake"},
|
|
35
|
-
{"md5":"Woods.svg","width":480,"height":360,"ext":"svg","name":"Woods"},
|
|
29
|
+
{"md5":"Summer.svg","width":480,"height":360,"ext":"svg","name":"Summer","order":"backgrounds,02 Backgrounds"},
|
|
30
|
+
{"md5":"Fall.svg","width":480,"height":360,"ext":"svg","name":"Fall","order":"backgrounds,02 Backgrounds"},
|
|
31
|
+
{"md5":"Winter.svg","width":480,"height":360,"ext":"svg","name":"Winter","order":"backgrounds,02 Backgrounds"},
|
|
32
|
+
{"md5":"Spring.svg","width":480,"height":360,"ext":"svg","name":"Spring","order":"backgrounds,02 Backgrounds"},
|
|
33
|
+
{"md5":"Creek.svg","width":480,"height":360,"ext":"svg","name":"River","order":"backgrounds,02 Backgrounds"},
|
|
34
|
+
{"md5":"Lake.svg","width":480,"height":360,"ext":"svg","name":"Lake","order":"backgrounds,02 Backgrounds"},
|
|
35
|
+
{"md5":"Woods.svg","width":480,"height":360,"ext":"svg","name":"Woods","order":"backgrounds,02 Backgrounds"},
|
|
36
36
|
|
|
37
|
-
{"md5":"BeachDay.svg","width":480,"height":360,"ext":"svg","name":"Beach Day"},
|
|
38
|
-
{"md5":"BeachSunrise.svg","width":480,"height":360,"ext":"svg","name":"Beach Sunset"},
|
|
39
|
-
{"md5":"BeachNight.svg","width":480,"height":360,"ext":"svg","name":"Beach Night"},
|
|
40
|
-
{"md5":"Underwater.svg","width":480,"height":360,"ext":"svg","name":"Underwater"},
|
|
37
|
+
{"md5":"BeachDay.svg","width":480,"height":360,"ext":"svg","name":"Beach Day","order":"backgrounds,02 Backgrounds"},
|
|
38
|
+
{"md5":"BeachSunrise.svg","width":480,"height":360,"ext":"svg","name":"Beach Sunset","order":"backgrounds,02 Backgrounds"},
|
|
39
|
+
{"md5":"BeachNight.svg","width":480,"height":360,"ext":"svg","name":"Beach Night","order":"backgrounds,02 Backgrounds"},
|
|
40
|
+
{"md5":"Underwater.svg","width":480,"height":360,"ext":"svg","name":"Underwater","order":"backgrounds,02 Backgrounds"},
|
|
41
41
|
|
|
42
|
-
{"md5":"Jungle.svg","width":480,"height":360,"ext":"svg","name":"Jungle"},
|
|
43
|
-
{"md5":"Savannah.svg","width":480,"height":360,"ext":"svg","name":"Savannah"},
|
|
44
|
-
{"md5":"Desert.svg","width":480,"height":360,"ext":"svg","name":"Desert"},
|
|
45
|
-
{"md5":"Arctic.svg","width":480,"height":360,"ext":"svg","name":"Arctic"},
|
|
46
|
-
{"md5":"Space.svg","width":480,"height":360,"ext":"svg","name":"Space"},
|
|
47
|
-
{"md5":"MoonBkg.svg","width":480,"height":360,"ext":"svg","name":"Moon"},
|
|
42
|
+
{"md5":"Jungle.svg","width":480,"height":360,"ext":"svg","name":"Jungle","order":"backgrounds,02 Backgrounds"},
|
|
43
|
+
{"md5":"Savannah.svg","width":480,"height":360,"ext":"svg","name":"Savannah","order":"backgrounds,02 Backgrounds"},
|
|
44
|
+
{"md5":"Desert.svg","width":480,"height":360,"ext":"svg","name":"Desert","order":"backgrounds,02 Backgrounds"},
|
|
45
|
+
{"md5":"Arctic.svg","width":480,"height":360,"ext":"svg","name":"Arctic","order":"backgrounds,02 Backgrounds"},
|
|
46
|
+
{"md5":"Space.svg","width":480,"height":360,"ext":"svg","name":"Space","order":"backgrounds,02 Backgrounds"},
|
|
47
|
+
{"md5":"MoonBkg.svg","width":480,"height":360,"ext":"svg","name":"Moon","order":"backgrounds,02 Backgrounds"},
|
|
48
48
|
{
|
|
49
49
|
"md5": "Farm.svg",
|
|
50
50
|
"width": 480,
|
|
51
51
|
"height": 360,
|
|
52
52
|
"ext": "svg",
|
|
53
|
-
"name": "Farm"
|
|
53
|
+
"name": "Farm",
|
|
54
|
+
"order": "backgrounds,02 Backgrounds"
|
|
54
55
|
},
|
|
55
56
|
{
|
|
56
57
|
"md5": "Country_Park.svg",
|
|
57
58
|
"width": 480,
|
|
58
59
|
"height": 360,
|
|
59
60
|
"ext": "svg",
|
|
60
|
-
"name": "Country Park"
|
|
61
|
+
"name": "Country Park",
|
|
62
|
+
"order": "backgrounds,02 Backgrounds"
|
|
61
63
|
}
|
|
62
64
|
],
|
|
63
65
|
"sprites": [
|
package/package.json
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robotical/martyblocksjr",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.8",
|
|
4
4
|
"description": "ScratchJr",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/robotical/scratchjr"
|
|
8
|
+
},
|
|
5
9
|
"publishConfig": {
|
|
6
10
|
"registry": "https://registry.npmjs.org/",
|
|
7
11
|
"access": "public"
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
vi.mock('@/editor/ScratchJr', () => ({
|
|
4
|
+
default: {
|
|
5
|
+
isMartyModeEnabled: false,
|
|
6
|
+
stage: {
|
|
7
|
+
currentPage: {}
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}));
|
|
11
|
+
vi.mock('@/editor/blocks/BlockSpecs', () => ({ default: {} }));
|
|
12
|
+
vi.mock('@/editor/ui/Alert', () => ({ default: {} }));
|
|
13
|
+
vi.mock('@/editor/ui/Project', () => ({ default: {} }));
|
|
14
|
+
vi.mock('@/editor/ProjectCloud', () => ({ default: {} }));
|
|
15
|
+
vi.mock('@/editor/ui/Thumbs', () => ({ default: {} }));
|
|
16
|
+
vi.mock('@/editor/ui/Palette', () => ({ default: {} }));
|
|
17
|
+
vi.mock('@/editor/ui/Grid', () => ({ default: {} }));
|
|
18
|
+
vi.mock('@/editor/engine/Stage', () => ({ default: {} }));
|
|
19
|
+
vi.mock('@/editor/ui/ScriptsPane', () => ({ default: {} }));
|
|
20
|
+
vi.mock('@/editor/ui/Undo', () => ({ default: {} }));
|
|
21
|
+
vi.mock('@/editor/ui/Library', () => ({ default: {} }));
|
|
22
|
+
vi.mock('@/tablet/OS', () => ({ default: {} }));
|
|
23
|
+
vi.mock('@/tablet/IO', () => ({ default: {} }));
|
|
24
|
+
vi.mock('@/tablet/MediaLib', () => ({ default: {} }));
|
|
25
|
+
vi.mock('@/painteditor/Paint', () => ({ default: {} }));
|
|
26
|
+
vi.mock('@/utils/Events', () => ({ default: {} }));
|
|
27
|
+
vi.mock('@/utils/Localization', () => ({
|
|
28
|
+
default: {
|
|
29
|
+
localize: key => key
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
vi.mock('@/utils/ScratchAudio', () => ({ default: {} }));
|
|
33
|
+
vi.mock('@/utils/cloudLocalStore', () => ({
|
|
34
|
+
addStoredCloudId: vi.fn(),
|
|
35
|
+
getStoredCloudIds: vi.fn(() => []),
|
|
36
|
+
removeStoredCloudId: vi.fn(),
|
|
37
|
+
touchStoredCloudId: vi.fn()
|
|
38
|
+
}));
|
|
39
|
+
vi.mock('@/utils/goToLink', () => ({ default: vi.fn() }));
|
|
40
|
+
vi.mock('@/utils/lib', () => ({
|
|
41
|
+
frame: null,
|
|
42
|
+
gn: vi.fn(),
|
|
43
|
+
CSSTransition: vi.fn(),
|
|
44
|
+
localx: vi.fn(),
|
|
45
|
+
newHTML: vi.fn(),
|
|
46
|
+
newButton: vi.fn(),
|
|
47
|
+
scaleMultiplier: 1,
|
|
48
|
+
fullscreenScaleMultiplier: 1,
|
|
49
|
+
getIdFor: vi.fn(),
|
|
50
|
+
isTablet: false,
|
|
51
|
+
newDiv: vi.fn(),
|
|
52
|
+
newTextInput: vi.fn(),
|
|
53
|
+
isAndroid: false,
|
|
54
|
+
getDocumentWidth: vi.fn(() => 1024),
|
|
55
|
+
getDocumentHeight: vi.fn(() => 768),
|
|
56
|
+
setProps: vi.fn(),
|
|
57
|
+
globalx: vi.fn()
|
|
58
|
+
}));
|
|
59
|
+
vi.mock('@/utils/accessibility', () => ({
|
|
60
|
+
closeDialog: vi.fn(),
|
|
61
|
+
openDialog: vi.fn(),
|
|
62
|
+
registerDialog: vi.fn(),
|
|
63
|
+
setMainLandmark: vi.fn(),
|
|
64
|
+
setPressedState: vi.fn(),
|
|
65
|
+
setSelectedState: vi.fn()
|
|
66
|
+
}));
|
|
67
|
+
vi.mock('@/html-svgs/cog', () => ({ cogSvg: '<svg></svg>' }));
|
|
68
|
+
vi.mock('@/html-svgs/sprite', () => ({ spriteSvg: '<svg></svg>' }));
|
|
69
|
+
vi.mock('@/html-svgs/marty', () => ({ martySvg: '<svg></svg>' }));
|
|
70
|
+
vi.mock('@/html-svgs/sprite-deselected', () => ({ spriteDeselectedSvg: '<svg></svg>' }));
|
|
71
|
+
vi.mock('@/html-svgs/marty-deselected', () => ({ martyDeselectedSvg: '<svg></svg>' }));
|
|
72
|
+
vi.mock('@/html-svgs/marty_toggle_on', () => ({ martyToggleOn: '<svg></svg>' }));
|
|
73
|
+
vi.mock('@/html-svgs/sprite_toggle_on', () => ({ spriteToggleOn: '<svg></svg>' }));
|
|
74
|
+
vi.mock('@/html-svgs/battery-svg', () => ({ batterySvg: () => '<svg id="battery"></svg>' }));
|
|
75
|
+
vi.mock('@/html-svgs/signal-svg', () => ({ signalSvg: () => '<svg id="signal"></svg>' }));
|
|
76
|
+
vi.mock('@/utils/raft-subscription-helpers', () => ({
|
|
77
|
+
createRaftConnectionIssueDetectedHelper: () => ({
|
|
78
|
+
subscribe: vi.fn(),
|
|
79
|
+
unsubscribe: vi.fn()
|
|
80
|
+
}),
|
|
81
|
+
createRaftConnectionIssueResolvedHelper: () => ({
|
|
82
|
+
subscribe: vi.fn(),
|
|
83
|
+
unsubscribe: vi.fn()
|
|
84
|
+
}),
|
|
85
|
+
raftVerifiedSubscriptionHelper: () => ({
|
|
86
|
+
subscribe: vi.fn(),
|
|
87
|
+
unsubscribe: vi.fn()
|
|
88
|
+
}),
|
|
89
|
+
raftDisconnectedSubscriptionHelper: raft => {
|
|
90
|
+
const helper = {
|
|
91
|
+
subscribe: vi.fn(callback => {
|
|
92
|
+
raft.__disconnectCallback = callback;
|
|
93
|
+
}),
|
|
94
|
+
unsubscribe: vi.fn(() => {
|
|
95
|
+
raft.__disconnectedUnsubscribed = true;
|
|
96
|
+
})
|
|
97
|
+
};
|
|
98
|
+
return helper;
|
|
99
|
+
}
|
|
100
|
+
}));
|
|
101
|
+
vi.mock('@/utils/truncate-string', () => ({ truncateString: value => value }));
|
|
102
|
+
vi.mock('@/editor/ui/Trace', () => ({
|
|
103
|
+
default: {
|
|
104
|
+
clear: vi.fn()
|
|
105
|
+
}
|
|
106
|
+
}));
|
|
107
|
+
|
|
108
|
+
describe('Marty connection UI', () => {
|
|
109
|
+
let UI;
|
|
110
|
+
let ScratchJr;
|
|
111
|
+
let warnSpy;
|
|
112
|
+
|
|
113
|
+
beforeEach(async () => {
|
|
114
|
+
vi.useFakeTimers();
|
|
115
|
+
vi.clearAllMocks();
|
|
116
|
+
global.window = {
|
|
117
|
+
applicationManager: {
|
|
118
|
+
disconnectGeneric: vi.fn(raft => {
|
|
119
|
+
raft.__disconnectCallback();
|
|
120
|
+
})
|
|
121
|
+
},
|
|
122
|
+
martyManager: {
|
|
123
|
+
addMarty: vi.fn(),
|
|
124
|
+
wireMartyWithBlocks: vi.fn(() => {
|
|
125
|
+
throw new Error('metadata not ready');
|
|
126
|
+
}),
|
|
127
|
+
removeMarty: vi.fn(),
|
|
128
|
+
setMartySensorAvailability: vi.fn()
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
132
|
+
const [uiModule, scratchJrModule] = await Promise.all([
|
|
133
|
+
import('@/editor/ui/UI.js'),
|
|
134
|
+
import('@/editor/ScratchJr')
|
|
135
|
+
]);
|
|
136
|
+
UI = uiModule.default;
|
|
137
|
+
ScratchJr = scratchJrModule.default;
|
|
138
|
+
ScratchJr.isMartyModeEnabled = false;
|
|
139
|
+
ScratchJr.stage = {
|
|
140
|
+
currentPage: {}
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
afterEach(() => {
|
|
145
|
+
warnSpy.mockRestore();
|
|
146
|
+
vi.runOnlyPendingTimers();
|
|
147
|
+
vi.useRealTimers();
|
|
148
|
+
delete global.window;
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('installs the Marty disconnect action before sensor and block metadata are ready', () => {
|
|
152
|
+
const button = createConnectionButton();
|
|
153
|
+
const oldOnClick = vi.fn();
|
|
154
|
+
button.onclick = oldOnClick;
|
|
155
|
+
const raft = createMartyRaft();
|
|
156
|
+
|
|
157
|
+
UI.setupMartyConnectionButton(button, raft);
|
|
158
|
+
|
|
159
|
+
button.onclick();
|
|
160
|
+
vi.advanceTimersByTime(1000);
|
|
161
|
+
|
|
162
|
+
expect(window.applicationManager.disconnectGeneric).toHaveBeenCalledWith(raft);
|
|
163
|
+
expect(window.martyManager.removeMarty).toHaveBeenCalledWith(raft);
|
|
164
|
+
expect(button.onclick).toBe(oldOnClick);
|
|
165
|
+
expect(button.classList.contains('connectButtonConnected')).toBe(false);
|
|
166
|
+
expect(button.querySelector('.iconButtonContainer').classList.contains('notConnectedButtonContainer')).toBe(true);
|
|
167
|
+
expect(raft.__disconnectedUnsubscribed).toBe(true);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it('switches from Sprite mode to Marty mode after Marty connects', () => {
|
|
171
|
+
const button = createConnectionButton();
|
|
172
|
+
button.onclick = vi.fn();
|
|
173
|
+
const raft = createMartyRaft();
|
|
174
|
+
|
|
175
|
+
UI.setupMartyConnectionButton(button, raft);
|
|
176
|
+
|
|
177
|
+
expect(ScratchJr.isMartyModeEnabled).toBe(true);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('still disconnects Marty after switching back to Sprite mode', () => {
|
|
181
|
+
const button = createConnectionButton();
|
|
182
|
+
const oldOnClick = vi.fn();
|
|
183
|
+
button.onclick = oldOnClick;
|
|
184
|
+
const raft = createMartyRaft();
|
|
185
|
+
|
|
186
|
+
UI.setupMartyConnectionButton(button, raft);
|
|
187
|
+
UI.setMartyModeEnabled(false);
|
|
188
|
+
|
|
189
|
+
expect(ScratchJr.isMartyModeEnabled).toBe(false);
|
|
190
|
+
|
|
191
|
+
button.onclick();
|
|
192
|
+
vi.advanceTimersByTime(1000);
|
|
193
|
+
|
|
194
|
+
expect(window.applicationManager.disconnectGeneric).toHaveBeenCalledWith(raft);
|
|
195
|
+
expect(window.martyManager.removeMarty).toHaveBeenCalledWith(raft);
|
|
196
|
+
expect(button.onclick).toBe(oldOnClick);
|
|
197
|
+
expect(button.classList.contains('connectButtonConnected')).toBe(false);
|
|
198
|
+
expect(button.querySelector('.iconButtonContainer').classList.contains('notConnectedButtonContainer')).toBe(true);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
function createMartyRaft() {
|
|
203
|
+
return {
|
|
204
|
+
id: 'marty-1',
|
|
205
|
+
getFriendlyName: () => 'Marty One',
|
|
206
|
+
getBatteryStrength: () => 70,
|
|
207
|
+
getRSSI: () => -45,
|
|
208
|
+
publishedDataAnalyser: {
|
|
209
|
+
connectedSensors: undefined
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function createConnectionButton() {
|
|
215
|
+
const button = new FakeElement();
|
|
216
|
+
button.children['.iconButtonContainer'] = new FakeElement(['iconButtonContainer', 'notConnectedButtonContainer']);
|
|
217
|
+
button.children['.batteryIndicatorContainer'] = new FakeElement(['batteryIndicatorContainer']);
|
|
218
|
+
button.children['.signalIndicatorContainer'] = new FakeElement(['signalIndicatorContainer']);
|
|
219
|
+
button.children['.raftNameConnectButton'] = new FakeElement(['raftNameConnectButton']);
|
|
220
|
+
return button;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
class FakeElement {
|
|
224
|
+
constructor(classes = []) {
|
|
225
|
+
this.classList = new FakeClassList(classes);
|
|
226
|
+
this.children = {};
|
|
227
|
+
this.style = {};
|
|
228
|
+
this.attributes = {};
|
|
229
|
+
this.textContent = '';
|
|
230
|
+
this.innerHTML = '';
|
|
231
|
+
this.onclick = null;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
querySelector(selector) {
|
|
235
|
+
return this.children[selector] || null;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
setAttribute(name, value) {
|
|
239
|
+
this.attributes[name] = value;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
class FakeClassList {
|
|
244
|
+
constructor(classes = []) {
|
|
245
|
+
this.classes = new Set(classes);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
add(...classes) {
|
|
249
|
+
classes.forEach(className => this.classes.add(className));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
remove(...classes) {
|
|
253
|
+
classes.forEach(className => this.classes.delete(className));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
contains(className) {
|
|
257
|
+
return this.classes.has(className);
|
|
258
|
+
}
|
|
259
|
+
}
|
package/android/README.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
ScratchJr - Android Studio project containing Android build of Scratch Jr.
|
package/bin/readme.md
DELETED