easycoder 250106.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-250106.1 → easycoder-250106.2}/PKG-INFO +2 -2
  2. {easycoder-250106.1 → easycoder-250106.2}/easycoder/__init__.py +1 -1
  3. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_graphics.py +15 -4
  4. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_renderer.py +18 -15
  5. {easycoder-250106.1 → easycoder-250106.2}/LICENSE +0 -0
  6. {easycoder-250106.1 → easycoder-250106.2}/README.md +0 -0
  7. {easycoder-250106.1 → easycoder-250106.2}/doc/README.md +0 -0
  8. {easycoder-250106.1 → easycoder-250106.2}/doc/core/README.md +0 -0
  9. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/boolean.md +0 -0
  10. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/empty.md +0 -0
  11. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/ends.md +0 -0
  12. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/even.md +0 -0
  13. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/exists.md +0 -0
  14. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/greater.md +0 -0
  15. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/hasProperty.md +0 -0
  16. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/includes.md +0 -0
  17. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/is.md +0 -0
  18. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/less.md +0 -0
  19. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/list.md +0 -0
  20. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/none.md +0 -0
  21. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/not.md +0 -0
  22. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/numeric.md +0 -0
  23. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/object.md +0 -0
  24. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/odd.md +0 -0
  25. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/starts.md +0 -0
  26. {easycoder-250106.1 → easycoder-250106.2}/doc/core/conditions/string.md +0 -0
  27. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/add.md +0 -0
  28. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/append.md +0 -0
  29. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/assert.md +0 -0
  30. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/begin.md +0 -0
  31. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/clear.md +0 -0
  32. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/close.md +0 -0
  33. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/create.md +0 -0
  34. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/debug.md +0 -0
  35. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/decrement.md +0 -0
  36. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/delete.md +0 -0
  37. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/divide.md +0 -0
  38. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/exit.md +0 -0
  39. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/file.md +0 -0
  40. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/fork.md +0 -0
  41. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/get.md +0 -0
  42. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/go.md +0 -0
  43. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/gosub.md +0 -0
  44. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/if.md +0 -0
  45. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/import.md +0 -0
  46. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/increment.md +0 -0
  47. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/index.md +0 -0
  48. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/init.md +0 -0
  49. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/input.md +0 -0
  50. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/load.md +0 -0
  51. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/lock.md +0 -0
  52. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/module.md +0 -0
  53. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/multiply.md +0 -0
  54. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/negate.md +0 -0
  55. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/open.md +0 -0
  56. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/pop.md +0 -0
  57. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/post.md +0 -0
  58. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/print.md +0 -0
  59. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/push.md +0 -0
  60. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/put.md +0 -0
  61. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/read.md +0 -0
  62. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/release.md +0 -0
  63. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/replace.md +0 -0
  64. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/return.md +0 -0
  65. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/run.md +0 -0
  66. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/save.md +0 -0
  67. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/script.md +0 -0
  68. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/set.md +0 -0
  69. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/split.md +0 -0
  70. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/stack.md +0 -0
  71. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/stop.md +0 -0
  72. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/system.md +0 -0
  73. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/take.md +0 -0
  74. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/toggle.md +0 -0
  75. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/truncate.md +0 -0
  76. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/unlock.md +0 -0
  77. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/variable.md +0 -0
  78. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/wait.md +0 -0
  79. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/while.md +0 -0
  80. {easycoder-250106.1 → easycoder-250106.2}/doc/core/keywords/write.md +0 -0
  81. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/arg.md +0 -0
  82. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/args.md +0 -0
  83. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/cos.md +0 -0
  84. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/datime.md +0 -0
  85. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/decode.md +0 -0
  86. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/element.md +0 -0
  87. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/elements.md +0 -0
  88. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/empty.md +0 -0
  89. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/encode.md +0 -0
  90. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/error.md +0 -0
  91. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/files.md +0 -0
  92. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/float.md +0 -0
  93. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/from.md +0 -0
  94. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/hash.md +0 -0
  95. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/index.md +0 -0
  96. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/integer.md +0 -0
  97. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/json.md +0 -0
  98. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/keys.md +0 -0
  99. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/left.md +0 -0
  100. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/length.md +0 -0
  101. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/lowercase.md +0 -0
  102. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/memory.md +0 -0
  103. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/modification.md +0 -0
  104. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/modulo.md +0 -0
  105. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/newline.md +0 -0
  106. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/now.md +0 -0
  107. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/position.md +0 -0
  108. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/property.md +0 -0
  109. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/random.md +0 -0
  110. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/right.md +0 -0
  111. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/sin.md +0 -0
  112. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/stringify.md +0 -0
  113. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/tab.md +0 -0
  114. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/tan.md +0 -0
  115. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/timestamp.md +0 -0
  116. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/today.md +0 -0
  117. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/trim.md +0 -0
  118. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/type.md +0 -0
  119. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/uppercase.md +0 -0
  120. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/value.md +0 -0
  121. {easycoder-250106.1 → easycoder-250106.2}/doc/core/values/weekday.md +0 -0
  122. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/README.md +0 -0
  123. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/attach.md +0 -0
  124. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/close.md +0 -0
  125. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/create.md +0 -0
  126. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/ellipse.md +0 -0
  127. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/image.md +0 -0
  128. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/move.md +0 -0
  129. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/on.md +0 -0
  130. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/rectangle.md +0 -0
  131. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/render.md +0 -0
  132. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/run.md +0 -0
  133. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/set.md +0 -0
  134. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/keywords/text.md +0 -0
  135. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/values/attribute.md +0 -0
  136. {easycoder-250106.1 → easycoder-250106.2}/doc/graphics/values/window.md +0 -0
  137. {easycoder-250106.1 → easycoder-250106.2}/easycoder/README.md +0 -0
  138. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec.py +0 -0
  139. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_classes.py +0 -0
  140. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_compiler.py +0 -0
  141. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_condition.py +0 -0
  142. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_core.py +0 -0
  143. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_handler.py +0 -0
  144. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_program.py +0 -0
  145. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_screenspec.py +0 -0
  146. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_timestamp.py +0 -0
  147. {easycoder-250106.1 → easycoder-250106.2}/easycoder/ec_value.py +0 -0
  148. {easycoder-250106.1 → easycoder-250106.2}/images/Semoigo Dawn.jpg +0 -0
  149. {easycoder-250106.1 → easycoder-250106.2}/json/graphics-demo.json +0 -0
  150. {easycoder-250106.1 → easycoder-250106.2}/plugins/ec_p100.py +0 -0
  151. {easycoder-250106.1 → easycoder-250106.2}/plugins/example.py +0 -0
  152. {easycoder-250106.1 → easycoder-250106.2}/pyproject.toml +0 -0
  153. {easycoder-250106.1 → easycoder-250106.2}/scripts/README.md +0 -0
  154. {easycoder-250106.1 → easycoder-250106.2}/scripts/benchmark.ecs +0 -0
  155. {easycoder-250106.1 → easycoder-250106.2}/scripts/fizzbuzz.ecs +0 -0
  156. {easycoder-250106.1 → easycoder-250106.2}/scripts/graphics-demo.ecg +0 -0
  157. {easycoder-250106.1 → easycoder-250106.2}/scripts/hello.ecs +0 -0
  158. {easycoder-250106.1 → easycoder-250106.2}/scripts/points.ecs +0 -0
  159. {easycoder-250106.1 → easycoder-250106.2}/scripts/tests.ecs +0 -0
  160. {easycoder-250106.1 → easycoder-250106.2}/scripts/wave.ecg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.1
2
2
  Name: easycoder
3
- Version: 250106.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>
@@ -10,4 +10,4 @@ from .ec_program import *
10
10
  from .ec_timestamp import *
11
11
  from .ec_value import *
12
12
 
13
- __version__ = "250106.1"
13
+ __version__ = "250106.2"
@@ -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'
@@ -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'])
@@ -388,7 +399,7 @@ class Graphics(Handler):
388
399
  value['type'] = 'symbol'
389
400
  return value
390
401
  return None
391
-
402
+
392
403
  if self.tokenIs('the'):
393
404
  self.nextToken()
394
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]
File without changes
File without changes
File without changes