easycoder 250105.1__tar.gz → 250106.2__tar.gz

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 easycoder might be problematic. Click here for more details.

Files changed (160) hide show
  1. {easycoder-250105.1 → easycoder-250106.2}/PKG-INFO +3 -3
  2. {easycoder-250105.1 → easycoder-250106.2}/README.md +1 -1
  3. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/import.md +3 -3
  4. {easycoder-250105.1 → easycoder-250106.2}/doc/graphics/README.md +2 -1
  5. easycoder-250106.2/doc/graphics/keywords/attach.md +18 -0
  6. easycoder-250106.2/doc/graphics/keywords/close.md +15 -0
  7. easycoder-250106.2/doc/graphics/keywords/create.md +15 -0
  8. easycoder-250106.2/doc/graphics/keywords/ellipse.md +15 -0
  9. easycoder-250106.2/doc/graphics/keywords/image.md +15 -0
  10. easycoder-250106.2/doc/graphics/keywords/move.md +17 -0
  11. easycoder-250106.2/doc/graphics/keywords/on.md +16 -0
  12. easycoder-250106.2/doc/graphics/keywords/rectangle.md +15 -0
  13. easycoder-250106.2/doc/graphics/keywords/render.md +18 -0
  14. easycoder-250106.2/doc/graphics/keywords/run.md +18 -0
  15. easycoder-250106.2/doc/graphics/keywords/set.md +15 -0
  16. easycoder-250106.2/doc/graphics/keywords/text.md +15 -0
  17. easycoder-250106.2/doc/graphics/values/attribute.md +15 -0
  18. easycoder-250106.2/doc/graphics/values/window.md +15 -0
  19. {easycoder-250105.1 → easycoder-250106.2}/easycoder/__init__.py +1 -1
  20. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_compiler.py +1 -1
  21. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_core.py +0 -1
  22. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_graphics.py +26 -12
  23. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_renderer.py +18 -15
  24. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_screenspec.py +4 -7
  25. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_value.py +2 -2
  26. {easycoder-250105.1 → easycoder-250106.2}/scripts/wave.ecg +1 -1
  27. {easycoder-250105.1 → easycoder-250106.2}/LICENSE +0 -0
  28. {easycoder-250105.1 → easycoder-250106.2}/doc/README.md +0 -0
  29. {easycoder-250105.1 → easycoder-250106.2}/doc/core/README.md +0 -0
  30. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/boolean.md +0 -0
  31. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/empty.md +0 -0
  32. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/ends.md +0 -0
  33. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/even.md +0 -0
  34. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/exists.md +0 -0
  35. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/greater.md +0 -0
  36. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/hasProperty.md +0 -0
  37. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/includes.md +0 -0
  38. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/is.md +0 -0
  39. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/less.md +0 -0
  40. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/list.md +0 -0
  41. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/none.md +0 -0
  42. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/not.md +0 -0
  43. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/numeric.md +0 -0
  44. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/object.md +0 -0
  45. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/odd.md +0 -0
  46. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/starts.md +0 -0
  47. {easycoder-250105.1 → easycoder-250106.2}/doc/core/conditions/string.md +0 -0
  48. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/add.md +0 -0
  49. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/append.md +0 -0
  50. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/assert.md +0 -0
  51. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/begin.md +0 -0
  52. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/clear.md +0 -0
  53. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/close.md +0 -0
  54. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/create.md +0 -0
  55. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/debug.md +0 -0
  56. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/decrement.md +0 -0
  57. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/delete.md +0 -0
  58. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/divide.md +0 -0
  59. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/exit.md +0 -0
  60. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/file.md +0 -0
  61. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/fork.md +0 -0
  62. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/get.md +0 -0
  63. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/go.md +0 -0
  64. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/gosub.md +0 -0
  65. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/if.md +0 -0
  66. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/increment.md +0 -0
  67. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/index.md +0 -0
  68. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/init.md +0 -0
  69. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/input.md +0 -0
  70. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/load.md +0 -0
  71. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/lock.md +0 -0
  72. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/module.md +0 -0
  73. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/multiply.md +0 -0
  74. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/negate.md +0 -0
  75. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/open.md +0 -0
  76. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/pop.md +0 -0
  77. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/post.md +0 -0
  78. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/print.md +0 -0
  79. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/push.md +0 -0
  80. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/put.md +0 -0
  81. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/read.md +0 -0
  82. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/release.md +0 -0
  83. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/replace.md +0 -0
  84. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/return.md +0 -0
  85. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/run.md +0 -0
  86. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/save.md +0 -0
  87. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/script.md +0 -0
  88. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/set.md +0 -0
  89. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/split.md +0 -0
  90. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/stack.md +0 -0
  91. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/stop.md +0 -0
  92. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/system.md +0 -0
  93. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/take.md +0 -0
  94. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/toggle.md +0 -0
  95. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/truncate.md +0 -0
  96. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/unlock.md +0 -0
  97. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/variable.md +0 -0
  98. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/wait.md +0 -0
  99. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/while.md +0 -0
  100. {easycoder-250105.1 → easycoder-250106.2}/doc/core/keywords/write.md +0 -0
  101. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/arg.md +0 -0
  102. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/args.md +0 -0
  103. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/cos.md +0 -0
  104. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/datime.md +0 -0
  105. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/decode.md +0 -0
  106. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/element.md +0 -0
  107. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/elements.md +0 -0
  108. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/empty.md +0 -0
  109. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/encode.md +0 -0
  110. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/error.md +0 -0
  111. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/files.md +0 -0
  112. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/float.md +0 -0
  113. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/from.md +0 -0
  114. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/hash.md +0 -0
  115. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/index.md +0 -0
  116. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/integer.md +0 -0
  117. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/json.md +0 -0
  118. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/keys.md +0 -0
  119. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/left.md +0 -0
  120. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/length.md +0 -0
  121. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/lowercase.md +0 -0
  122. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/memory.md +0 -0
  123. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/modification.md +0 -0
  124. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/modulo.md +0 -0
  125. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/newline.md +0 -0
  126. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/now.md +0 -0
  127. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/position.md +0 -0
  128. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/property.md +0 -0
  129. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/random.md +0 -0
  130. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/right.md +0 -0
  131. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/sin.md +0 -0
  132. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/stringify.md +0 -0
  133. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/tab.md +0 -0
  134. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/tan.md +0 -0
  135. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/timestamp.md +0 -0
  136. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/today.md +0 -0
  137. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/trim.md +0 -0
  138. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/type.md +0 -0
  139. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/uppercase.md +0 -0
  140. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/value.md +0 -0
  141. {easycoder-250105.1 → easycoder-250106.2}/doc/core/values/weekday.md +0 -0
  142. {easycoder-250105.1 → easycoder-250106.2}/easycoder/README.md +0 -0
  143. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec.py +0 -0
  144. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_classes.py +0 -0
  145. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_condition.py +0 -0
  146. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_handler.py +0 -0
  147. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_program.py +0 -0
  148. {easycoder-250105.1 → easycoder-250106.2}/easycoder/ec_timestamp.py +0 -0
  149. {easycoder-250105.1 → easycoder-250106.2}/images/Semoigo Dawn.jpg +0 -0
  150. {easycoder-250105.1 → easycoder-250106.2}/json/graphics-demo.json +0 -0
  151. {easycoder-250105.1 → easycoder-250106.2}/plugins/ec_p100.py +0 -0
  152. {easycoder-250105.1 → easycoder-250106.2}/plugins/example.py +0 -0
  153. {easycoder-250105.1 → easycoder-250106.2}/pyproject.toml +0 -0
  154. {easycoder-250105.1 → easycoder-250106.2}/scripts/README.md +0 -0
  155. {easycoder-250105.1 → easycoder-250106.2}/scripts/benchmark.ecs +0 -0
  156. {easycoder-250105.1 → easycoder-250106.2}/scripts/fizzbuzz.ecs +0 -0
  157. {easycoder-250105.1 → easycoder-250106.2}/scripts/graphics-demo.ecg +0 -0
  158. {easycoder-250105.1 → easycoder-250106.2}/scripts/hello.ecs +0 -0
  159. {easycoder-250105.1 → easycoder-250106.2}/scripts/points.ecs +0 -0
  160. {easycoder-250105.1 → easycoder-250106.2}/scripts/tests.ecs +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: easycoder
3
- Version: 250105.1
3
+ Version: 250106.2
4
4
  Summary: Rapid scripting in English
5
5
  Keywords: compiler,scripting,prototyping,programming,coding,python,low code,hypertalk,computer language,learn to code
6
6
  Author-email: Graham Trott <gtanyware@gmail.com>
@@ -77,7 +77,7 @@ A couple of demo graphical scripts are included in the `scripts` directory:
77
77
 
78
78
  - English-like syntax based on vocabulary rather than structure. Scripts can be read as English
79
79
  - Comprehensive feature set
80
- - Runs directly from source scripts, using a fast compiler to create efficient intermediate runtime code that is run immediately
80
+ - Runs directly from source scripts. A fast compiler creates efficient intermediate code that runs immediately after compilation
81
81
  - Low memory requirements
82
82
  - Minimim dependency on other 3rd-party packages
83
83
  - Built-in co-operative multitasking
@@ -66,7 +66,7 @@ A couple of demo graphical scripts are included in the `scripts` directory:
66
66
 
67
67
  - English-like syntax based on vocabulary rather than structure. Scripts can be read as English
68
68
  - Comprehensive feature set
69
- - Runs directly from source scripts, using a fast compiler to create efficient intermediate runtime code that is run immediately
69
+ - Runs directly from source scripts. A fast compiler creates efficient intermediate code that runs immediately after compilation
70
70
  - Low memory requirements
71
71
  - Minimim dependency on other 3rd-party packages
72
72
  - Built-in co-operative multitasking
@@ -2,15 +2,15 @@
2
2
 
3
3
  ## Syntax:
4
4
  `import {type} {variable} [and {type} {variable} ...]]`
5
- `import {classname} from {path}`
5
+ `import plugin {classname} from {path}`
6
6
 
7
7
  ## Examples:
8
8
  `import variable Name and variable Surname`
9
- `import Points from plugins/example.py`
9
+ `import plugin Points from plugins/example.py`
10
10
 
11
11
  ## Description:
12
12
  First form:
13
- This specifies which variable should be provided by a calling script
13
+ This specifies which variable should be provided by a calling script.
14
14
 
15
15
  Second form:
16
16
  As with [script](script.md), `import` is a compiler directive that should be placed at the top of the script, under the [script](script.md) directive. It's used to call in a plugin language extension where needed. The example above is provided in the repository, to be used as a starting point for your own extra functionality.
@@ -10,10 +10,11 @@ There are three primary components to the language:
10
10
 
11
11
  The core keywords are:
12
12
 
13
-
13
+ [attach](attach.md) [close](close.md) [create](create.md) [ellipse](ellipse.md) [image](image.md) [move](move.md) [on](on.md) [rectangle](rectangle.md) [render](render.md) [run](run.md) [set](set.md) [text](text.md)
14
14
 
15
15
  The core values are:
16
16
 
17
+ [attribute](attribute.md) [window](window.md)
17
18
 
18
19
  The core conditions are:
19
20
 
@@ -0,0 +1,18 @@
1
+ ## attach
2
+
3
+ ## Syntax:
4
+ `attach {id} to {graphic element}`
5
+
6
+ ## Examples:
7
+ ``attach `big-circle` to Ellipse1` ``
8
+ ``attach `container` to Container` ``
9
+
10
+ ## Description:
11
+ Attaches an **_EasyCoder_** graphic variable ([ellipse](ellipse.md), [rectangle](rectangle.md), [text](text.md), [image](image.md) etc.) to the rendered graphic item with the given id.
12
+
13
+ When a graphic specification is rendered, every item in the structure is added to 1) a list of items in the order they were rendered (the z-order) and 2) a dictionary of items indexed by their ids.
14
+
15
+ Next: [close](close.md)
16
+ Prev: [text](text.md)
17
+
18
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## close
2
+
3
+ ## Syntax:
4
+ `close window`
5
+
6
+ ## Examples:
7
+ `close window`
8
+
9
+ ## Description:
10
+ Close the window. This will also terminate the **_EasyCoder_** script.
11
+
12
+ Next: [create](create.md)
13
+ Prev: [attach](attach.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## create
2
+
3
+ ## Syntax:
4
+ `create window {parameters}`
5
+
6
+ ## Examples:
7
+ ``create window title `Demo` at 300 300 size 640 480 fill color 255 255 200` ``
8
+
9
+ ## Description:
10
+ Creates a window with the given parameters. There can only be one of these in a program.
11
+
12
+ Next: [ellipse](ellipse.md)
13
+ Prev: [close](close.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## ellipse
2
+
3
+ ## Syntax:
4
+ `ellipse {name}`
5
+
6
+ ## Examples:
7
+ `ellipse Circle`
8
+
9
+ ## Description:
10
+ Declares an ellipse variable. This will be attached to a rendered ellipse and used to pass commands to it. See also [image](image.md), [rectangle](rectangle.md) and [text](text.md).
11
+
12
+ Next: [image](image.md)
13
+ Prev: [create](create.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## image
2
+
3
+ ## Syntax:
4
+ `image {name}`
5
+
6
+ ## Examples:
7
+ `image House`
8
+
9
+ ## Description:
10
+ Declares an image variable. This will be attached to a rendered image and used to pass commands to it. See also [ellipse](ellipse.md), [rectangle](rectangle.md) and [text](text.md).
11
+
12
+ Next: [move](move.md)
13
+ Prev: [ellipse](ellipse.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,17 @@
1
+ ## move
2
+
3
+ ## Syntax:
4
+ `move {name} by {dx} {dy}`
5
+ `move {name} to {x} {y}`
6
+
7
+ ## Examples:
8
+ `move Blob by 5 10`
9
+ `move Button to X Y`
10
+
11
+ ## Description:
12
+ Moves a graphic element in its parent container, either by a relative amount or to a specified location.
13
+
14
+ Next: [on](on.md)
15
+ Prev: [image](image.md)
16
+
17
+ [Back](../../README.md)
@@ -0,0 +1,16 @@
1
+ ## on
2
+
3
+ ## Syntax:
4
+ `on click/tap {element} {action}`
5
+
6
+ ## Examples:
7
+ `on click Button stop`
8
+ `on tap Plus increment Count`
9
+
10
+ ## Description:
11
+ Handle a graphic event. When the user clicks/taps the specified element, perform the requested action, which can be a single command or a `begin...end` block.
12
+
13
+ Next: [rectangle](rectangle.md)
14
+ Prev: [move](move.md)
15
+
16
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## rectangle
2
+
3
+ ## Syntax:
4
+ `rectangle {name}`
5
+
6
+ ## Examples:
7
+ `rectangle BigBox`
8
+
9
+ ## Description:
10
+ Declares a rectangle variable. This will be attached to a rendered rectangle and used to pass commands to it. See also [ellipse](ellipse.md), [image](image.md) and [text](text.md).
11
+
12
+ Next: [render](render.md)
13
+ Prev: [on](on.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,18 @@
1
+ ## render
2
+
3
+ ## Syntax:
4
+ `render {specification} [in {parent}]`
5
+
6
+ ## Examples:
7
+ `render Spec`
8
+ `render Spec in BigBox`
9
+
10
+ ## Description:
11
+ Render a graphic specification, optionally giving the parent container.
12
+
13
+ Specifications are JSON structures that describe the layout and the element(s) comprising the graphic. See [specification](../specification.md).
14
+
15
+ Next: [run](run.md)
16
+ Prev: [rectangle](rectangle.md)
17
+
18
+ [Back](../../README.md)
@@ -0,0 +1,18 @@
1
+ ## run
2
+
3
+ ## Syntax:
4
+ `render {specification} [in {parent}]`
5
+
6
+ ## Examples:
7
+ `render Spec`
8
+ `render Spec in BigBox`
9
+
10
+ ## Description:
11
+ Render a graphic specification, optionally giving the parent container.
12
+
13
+ Specifications are JSON structures that describe the layout and the element(s) comprising the graphic. See [specification](../specification.md).
14
+
15
+ Next: [run](run.md)
16
+ Prev: [rectangle](rectangle.md)
17
+
18
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## set
2
+
3
+ ## Syntax:
4
+ `set attribute {name} of {element} to {value}`
5
+
6
+ ## Examples:
7
+ ``set attribute `left` of Button to Left`
8
+
9
+ ## Description:
10
+ Set an attribute of a graphic element. Valid attributes depend on the element but include such as `left`, `bottom`, `width` and `height`.
11
+
12
+ Next: [text](text.md)
13
+ Prev: [run](run.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ ## text
2
+
3
+ ## Syntax:
4
+ `text {name}`
5
+
6
+ ## Examples:
7
+ `text BigBox`
8
+
9
+ ## Description:
10
+ Declares a text variable. This will be attached to a rendered text object and used to pass commands to it. See also [ellipse](ellipse.md), [image](image.md) and [rectangle](rectangle.md).
11
+
12
+ Next: [attach](attach.md)
13
+ Prev: [set](set.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ # attribute
2
+
3
+ ## Syntax:
4
+ `attribute {key} of {element}`
5
+
6
+ ## Examples:
7
+ ``attribute `width` of BigBox` ``
8
+
9
+ ## Description:
10
+ Gets the named attribute of a graphic element.
11
+
12
+ Next: [window](window.md)
13
+ Prev: [window](window.md)
14
+
15
+ [Back](../../README.md)
@@ -0,0 +1,15 @@
1
+ # window
2
+
3
+ ## Syntax:
4
+ `[the] window left/top/width/height`
5
+
6
+ ## Examples:
7
+ `the window height`
8
+
9
+ ## Description:
10
+ Gets the specified attribute of the window.
11
+
12
+ Next: [attribute](attribute.md)
13
+ Prev: [attribute](attribute.md)
14
+
15
+ [Back](../../README.md)
@@ -10,4 +10,4 @@ from .ec_program import *
10
10
  from .ec_timestamp import *
11
11
  from .ec_value import *
12
12
 
13
- __version__ = "250105.1"
13
+ __version__ = "250106.2"
@@ -102,7 +102,7 @@ class Compiler:
102
102
 
103
103
  def showWarnings(self):
104
104
  for warning in self.warnings:
105
- print(f'Warning at line {self.getLino() + 1} from {warning}')
105
+ print(f'Warning at line {self.getLino() + 1} of {self.program.name}: {warning}')
106
106
 
107
107
  def getSymbolRecord(self):
108
108
  token = self.getToken()
@@ -1900,7 +1900,6 @@ class Core(Handler):
1900
1900
  return value
1901
1901
  return None
1902
1902
 
1903
- self.warning(f'Core.compileValue: Unknown token "{token}"')
1904
1903
  return None
1905
1904
 
1906
1905
  #############################################################################
@@ -9,6 +9,7 @@ class Graphics(Handler):
9
9
 
10
10
  def __init__(self, compiler):
11
11
  Handler.__init__(self, compiler)
12
+ self.windowCreated = False
12
13
 
13
14
  def getName(self):
14
15
  return 'graphics'
@@ -36,7 +37,7 @@ class Graphics(Handler):
36
37
  FatalError(self.program.compiler, f'There is no screen element with id \'{id}\'')
37
38
  return -1
38
39
  if element.getType() != keyword:
39
- FatalError(self.program.compiler, f'Mismatched element type ({element['type']} and {keyword})')
40
+ FatalError(self.program.compiler, f'Mismatched element type: \'{element['type']}\' and \'{keyword}\'')
40
41
  self.putSymbolValue(targetRecord, {'type': 'text', 'content': id})
41
42
  return self.nextPC()
42
43
 
@@ -65,11 +66,15 @@ class Graphics(Handler):
65
66
  r = self.compileConstant(255)
66
67
  g = self.compileConstant(255)
67
68
  b = self.compileConstant(255)
69
+ fullscreen = False
68
70
  while True:
69
71
  token = self.peek()
70
72
  if token == 'title':
71
73
  self.nextToken()
72
74
  t = self.nextValue()
75
+ elif token == 'fullscreen':
76
+ fullscreen = True
77
+ self.nextToken()
73
78
  elif token == 'at':
74
79
  self.nextToken()
75
80
  left = self.nextValue()
@@ -91,9 +96,10 @@ class Graphics(Handler):
91
96
  command['pos'] = (left, top)
92
97
  command['size'] = (width, height)
93
98
  command['fill'] = (r, g, b)
99
+ command['fullscreen'] = fullscreen
94
100
  self.add(command)
95
101
  return True
96
-
102
+
97
103
  elif self.isSymbol():
98
104
  record = self.getSymbolRecord()
99
105
  command['target'] = record['name']
@@ -113,7 +119,7 @@ class Graphics(Handler):
113
119
  self.add(command)
114
120
  record['elementID'] = command['id']
115
121
  return False
116
-
122
+
117
123
  def getElementData(self, type, command):
118
124
  width = None
119
125
  height = None
@@ -170,23 +176,28 @@ class Graphics(Handler):
170
176
  command['source'] = source
171
177
 
172
178
  def r_create(self, command):
179
+
173
180
  try:
174
181
  type = command['type']
175
182
  if type == 'window':
183
+ if self.windowCreated == True:
184
+ RuntimeError(self.program, 'A window has already been created')
176
185
  self.windowSpec = Object()
177
186
  self.windowSpec.title = command['title']['content']
187
+ self.windowSpec.fullscreen = command['fullscreen']
178
188
  self.windowSpec.flush = flush
179
189
  self.windowSpec.kill = self.program.kill
180
190
  self.windowSpec.pos = (self.getRuntimeValue(command['pos'][0]), self.getRuntimeValue(command['pos'][1]))
181
191
  self.windowSpec.size = (self.getRuntimeValue(command['size'][0]), self.getRuntimeValue(command['size'][1]))
182
192
  self.windowSpec.fill = (self.getRuntimeValue(command['fill'][0])/255, self.getRuntimeValue(command['fill'][1])/255, self.getRuntimeValue(command['fill'][2])/255)
193
+ self.windowCreated = True
183
194
  else:
184
195
  element = self.ui.createWidget(self.getWidgetSpec(command))
185
196
  print(element)
186
197
  except Exception as e:
187
198
  RuntimeError(self.program, e)
188
199
  return self.nextPC()
189
-
200
+
190
201
  def getWidgetSpec(self, command):
191
202
  spec = Object()
192
203
  spec.id = self.getRuntimeValue(command['id'])
@@ -301,13 +312,22 @@ class Graphics(Handler):
301
312
  # render {spec}
302
313
  def k_render(self, command):
303
314
  command['spec'] = self.nextValue()
315
+ command['parent'] = None
316
+ if self.peek() == 'in':
317
+ self.nextToken()
318
+ if self.nextIsSymbol():
319
+ command['parent'] = self.getSymbolRecord()['name']
304
320
  self.add(command)
305
321
  return True
306
322
 
307
323
  def r_render(self, command):
324
+ spec = self.getRuntimeValue(command['spec'])
325
+ parent = command['parent']
326
+ if parent !=None:
327
+ parent = self.getVariable(command['parent'])
308
328
  self.ui = self.renderer.getUI()
309
329
  try:
310
- ScreenSpec().render(self.getRuntimeValue(command['spec']), self.ui)
330
+ ScreenSpec().render(spec, parent, self.ui)
311
331
  except Exception as e:
312
332
  RuntimeError(self.program, e)
313
333
  return self.nextPC()
@@ -316,12 +336,6 @@ class Graphics(Handler):
316
336
  def k_run(self, command):
317
337
  if self.nextIs('graphics'):
318
338
  self.add(command)
319
- cmd = {}
320
- cmd['domain'] = 'graphics'
321
- cmd['lino'] = command['lino'] + 1
322
- cmd['keyword'] = 'getui'
323
- cmd['debug'] = False
324
- self.addCommand(cmd)
325
339
  return True
326
340
  return False
327
341
 
@@ -385,7 +399,7 @@ class Graphics(Handler):
385
399
  value['type'] = 'symbol'
386
400
  return value
387
401
  return None
388
-
402
+
389
403
  if self.tokenIs('the'):
390
404
  self.nextToken()
391
405
  kwd = self.getToken()
@@ -41,21 +41,21 @@ class Element():
41
41
  def setPos(self, pos):
42
42
  self.spec.realpos = pos
43
43
  self.spec.item.pos = pos
44
-
44
+
45
45
  # Called when the parent moves
46
46
  def repos(self):
47
47
  spec = self.spec
48
48
  spec.item.pos = Vector(spec.realpos) + spec.parent.realpos
49
-
49
+
50
50
  def getRealSize(self):
51
51
  return self.spec.realsize
52
-
52
+
53
53
  def getSize(self):
54
54
  return self.spec.size
55
55
 
56
56
  def setSize(self, size):
57
57
  self.spec.size = size
58
-
58
+
59
59
  def getChildren(self):
60
60
  return self.spec.children
61
61
 
@@ -68,7 +68,7 @@ class UI(Widget):
68
68
  if id in self.elements.keys():
69
69
  return self.elements[id]
70
70
  return None
71
-
71
+
72
72
  def addElement(self, id, spec):
73
73
  if id in self.elements.keys():
74
74
  raise(Exception(f'Element {id} already exists'))
@@ -133,7 +133,7 @@ class UI(Widget):
133
133
  item = AsyncImage(pos=pos, size=size, source=spec.source)
134
134
  spec.item = item
135
135
  self.addElement(spec.id, spec)
136
-
136
+
137
137
  def moveElementBy(self, id, dist):
138
138
  element = self.getElement(id)
139
139
  if element != None:
@@ -141,7 +141,7 @@ class UI(Widget):
141
141
  for id in element.getChildren():
142
142
  self.getElement(id).repos()
143
143
  return
144
-
144
+
145
145
  def moveElementTo(self, id, pos):
146
146
  element = self.getElement(id)
147
147
  if element != None:
@@ -172,7 +172,7 @@ class UI(Widget):
172
172
  if tp[0] >= pos[0] and tp[0] < pos[0] + size[0] and tp[1] >= pos[1] and tp[1] < pos[1] + size[1]:
173
173
  element.cb()
174
174
  break
175
-
175
+
176
176
  def setOnClick(self, id, callback):
177
177
  self.getElement(id).cb = callback
178
178
 
@@ -200,7 +200,7 @@ class UI(Widget):
200
200
  return spec.realsize[1]
201
201
  else:
202
202
  raise Exception(f'Unknown attribute: {attribute}')
203
-
203
+
204
204
  def setAttribute(self, id, attribute, value):
205
205
  spec = self.getElement(id).spec
206
206
  if attribute == 'left':
@@ -222,15 +222,15 @@ class Renderer(App):
222
222
 
223
223
  def getUI(self):
224
224
  return self.ui
225
-
225
+
226
226
  def request_close(self):
227
227
  print('close window')
228
228
  self.kill()
229
229
  Window.close()
230
-
230
+
231
231
  def flushQueue(self, dt):
232
232
  self.flush()
233
-
233
+
234
234
  def build(self):
235
235
  Clock.schedule_interval(self.flushQueue, 0.01)
236
236
  return self.ui
@@ -240,8 +240,11 @@ class Renderer(App):
240
240
  self.title = spec.title
241
241
  self.flush = spec.flush
242
242
  self.kill = spec.kill
243
- Window.size = spec.size
244
- Window.left = spec.pos[0]
245
- Window.top = spec.pos[1]
246
243
  Window.clearcolor = spec.fill
247
244
  Window.on_request_close=self.request_close
245
+ if spec.fullscreen:
246
+ Window.fullscreen = True
247
+ else:
248
+ Window.size = spec.size
249
+ Window.left = spec.pos[0]
250
+ Window.top = spec.pos[1]
@@ -61,17 +61,14 @@ class ScreenSpec():
61
61
  self.createWidget(spec[widgets], parent)
62
62
 
63
63
  # Render a graphic specification
64
- def render(self, spec, ui):
64
+ def render(self, spec, parent, ui):
65
65
  self.ui = ui
66
66
 
67
67
  # If it'a string, process it
68
68
  if isinstance(spec, str):
69
- self.renderSpec(loads(spec), None)
69
+ self.renderSpec(loads(spec), parent)
70
70
 
71
71
  # If it's a 'dict', extract the spec and the args
72
- elif isinstance(spec, dict):
73
- spec = loads(spec['spec'])
74
- self.renderSpec(spec, None)
75
-
76
72
  else:
77
- raise Exception('Spec is an unknown type')
73
+ self.renderSpec(spec, parent)
74
+
@@ -51,14 +51,14 @@ class Value:
51
51
  if item != None:
52
52
  return item
53
53
  self.compiler.rewindTo(mark)
54
- self.compiler.warning(f'I don\'t understand \'{token}\'')
54
+ # self.compiler.warning(f'I don\'t understand \'{token}\'')
55
55
  return None
56
56
 
57
57
  def compileValue(self):
58
58
  token = self.getToken()
59
59
  item = self.getItem()
60
60
  if item == None:
61
- FatalError(self.compiler, f'Cannot get the value of "{token}"')
61
+ self.compiler.warning(f'ec_value.compileValue: Cannot get the value of "{token}"')
62
62
  return None
63
63
 
64
64
  value = {}
@@ -97,7 +97,7 @@
97
97
  increment N
98
98
  end
99
99
 
100
- wait 2
100
+ wait 1
101
101
  ! Run the main animation
102
102
  while true
103
103
  begin
File without changes
File without changes