Skip to content

Commit b32305e

Browse files
committed
v241230.1
1 parent b294a14 commit b32305e

File tree

6 files changed

+112
-56
lines changed

6 files changed

+112
-56
lines changed
Binary file not shown.

easycoder/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
from .ec_timestamp import *
1111
from .ec_value import *
1212

13-
__version__ = "241227.1"
13+
__version__ = "241230.1"

easycoder/ec_program.py

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -200,44 +200,60 @@ def decode(self, value):
200200

201201
# Tokenise the script
202202
def tokenise(self, script):
203-
index = 0
204-
lino = 0
205-
for line in script.lines:
203+
token = ''
204+
literal = False
205+
for lino in range(0, len(script.lines)):
206+
line = script.lines[lino]
206207
length = len(line)
207-
token = ''
208-
inSpace = True
208+
if length == 0:
209+
continue
210+
# Look for the first non-space
209211
n = 0
210-
while n < length:
212+
while n < length and line[n].isspace():
213+
n += 1
214+
# The whole line may be empty
215+
if n == length:
216+
if literal:
217+
token += '\n'
218+
continue
219+
# If in an unfinished literal, the first char must be a backtick to continue adding to it
220+
if literal:
221+
if line[n] != '`':
222+
# Close the current token
223+
if len(token) > 0:
224+
script.tokens.append(Token(lino, token))
225+
token = ''
226+
literal = False
227+
n += 1
228+
for n in range(n, length):
211229
c = line[n]
212-
if len(c.strip()) == 0:
213-
if (inSpace):
214-
n += 1
230+
# Test if we are in a literal
231+
if not literal:
232+
if c.isspace():
233+
if len(token) > 0:
234+
script.tokens.append(Token(lino, token))
235+
token = ''
215236
continue
216-
script.tokens.append(Token(lino, token))
217-
index += 1
218-
token = ''
219-
inSpace = True
220-
n += 1
221-
continue
222-
inSpace = False
237+
elif c == '!':
238+
break
239+
# Test for the start or end of a literal
223240
if c == '`':
224-
m = n
225-
n += 1
226-
while n < len(line) - 1:
227-
if line[n] == '`':
228-
break
229-
n += 1
230-
# n += 1
231-
token = line[m:n+1]
232-
elif c == '!':
233-
break
241+
if literal:
242+
token += c
243+
literal = False
244+
else:
245+
token += c
246+
literal = True
247+
m = n
248+
continue
234249
else:
235250
token += c
236-
n += 1
237251
if len(token) > 0:
238-
script.tokens.append(Token(lino, token))
239-
index += 1
240-
lino += 1
252+
if literal:
253+
token += '\n'
254+
else:
255+
script.tokens.append(Token(lino, token))
256+
token = ''
241257
return
242258

243259
def finish(self):

easycoder/ec_renderer.py

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ def getType(self):
2424
def getID(self):
2525
return self.spec.id
2626

27+
def getRealPos(self):
28+
spec = self.spec
29+
pos = spec.realpos
30+
if spec.parent != None:
31+
pos = Vector(pos) + spec.parent.realpos
32+
return pos
33+
2734
def getPos(self):
2835
spec = self.spec
2936
pos = spec.pos
@@ -32,13 +39,16 @@ def getPos(self):
3239
return pos
3340

3441
def setPos(self, pos):
35-
self.spec.pos = pos
42+
self.spec.realpos = pos
3643
self.spec.item.pos = pos
3744

3845
# Called when the parent moves
3946
def repos(self):
4047
spec = self.spec
41-
spec.item.pos = Vector(spec.pos) + spec.parent.pos
48+
spec.item.pos = Vector(spec.realpos) + spec.parent.realpos
49+
50+
def getRealSize(self):
51+
return self.spec.realsize
4252

4353
def getSize(self):
4454
return self.spec.size
@@ -68,6 +78,25 @@ def addElement(self, id, spec):
6878
self.zlist.append(element)
6979

7080
def createElement(self, spec):
81+
def recalc(val):
82+
if isinstance(val, str):
83+
c = val[-1]
84+
if c in ['w', 'h']:
85+
val = int(val[0:len(val)-1])
86+
if spec.parent == None:
87+
if c == 'w':
88+
n = Window.width
89+
else:
90+
n = Window.height
91+
else:
92+
if c == 'w':
93+
n = spec.parent.realsize[0]
94+
else:
95+
n = spec.parent.realsize[1]
96+
return val * n / 100
97+
return val
98+
99+
print(spec.id)
71100
with self.canvas:
72101
if hasattr(spec, 'fill'):
73102
c = spec.fill
@@ -76,13 +105,16 @@ def createElement(self, spec):
76105
Color(c[0], c[1], c[2])
77106
else:
78107
Color(c[0]/255, c[1]/255, c[2]/255)
79-
pos = spec.pos
108+
pos = (recalc(spec.pos[0]), recalc(spec.pos[1]))
109+
spec.realpos = pos
110+
size = (recalc(spec.size[0]), recalc(spec.size[1]))
111+
spec.realsize = size
80112
if spec.parent != None:
81-
pos = Vector(pos) + spec.parent.pos
113+
pos = Vector(pos) + spec.parent.realpos
82114
if spec.type == 'ellipse':
83-
item = Ellipse(pos=pos, size=spec.size)
115+
item = Ellipse(pos=pos, size=size)
84116
elif spec.type == 'rectangle':
85-
item = Rectangle(pos=pos, size=spec.size)
117+
item = Rectangle(pos=pos, size=size)
86118
elif spec.type == 'text':
87119
if hasattr(spec, 'color'):
88120
c = spec.color
@@ -96,24 +128,24 @@ def createElement(self, spec):
96128
label = CoreLabel(text=spec.text, font_size=1000, halign='center', valign='center')
97129
label.refresh()
98130
text = label.texture
99-
item = Rectangle(pos=spec.pos, size=spec.size, texture=text)
131+
item = Rectangle(pos=pos, size=size, texture=text)
100132
elif spec.type == 'image':
101-
item = AsyncImage(pos=spec.pos, size=spec.size, source=spec.source)
133+
item = AsyncImage(pos=pos, size=size, source=spec.source)
102134
spec.item = item
103135
self.addElement(spec.id, spec)
104136

105137
def moveElementBy(self, id, dist):
106138
element = self.getElement(id)
107139
if element != None:
108-
element.setPos(Vector(element.getPos()) + dist)
140+
element.setPos(Vector(element.getRealPos()) + dist)
109141
for id in element.getChildren():
110142
self.getElement(id).repos()
111143
return
112144

113145
def moveElementTo(self, id, pos):
114146
element = self.getElement(id)
115147
if element != None:
116-
self.moveElementBy(id, Vector(pos) - element.getPos())
148+
self.moveElementBy(id, Vector(pos) - element.getRealPos())
117149
return
118150

119151
def on_touch_down(self, touch):
@@ -123,9 +155,9 @@ def on_touch_down(self, touch):
123155
for element in reversed(self.zlist):
124156
if element.cb != None:
125157
spec = element.spec
126-
pos = spec.pos
158+
pos = self.getRealPos()
127159
if spec.parent != None:
128-
pos = Vector(pos) + spec.parent.pos
160+
pos = Vector(pos) + spec.parent.getRealPos()
129161
size = spec.size
130162
if spec.type == 'ellipse':
131163
a = size[0]/2
@@ -147,16 +179,25 @@ def setOnClick(self, id, callback):
147179
def getAttribute(self, id, attribute):
148180
spec = self.getElement(id).spec
149181
if attribute == 'left':
150-
return spec.pos[0]
182+
return spec.realpos[0]
151183
elif attribute == 'bottom':
152-
return spec.pos[1]
184+
return spec.realpos[1]
153185
elif attribute == 'width':
154-
return spec.size[0]
186+
return spec.realsize[0]
155187
elif attribute == 'height':
156-
return spec.size[1]
188+
return spec.realsize[1]
157189
else:
158190
raise Exception(f'Unknown attribute: {attribute}')
159191

192+
def getWindowAttribute(self, attribute):
193+
if attribute == 'left':
194+
return Window.left
195+
elif attribute == 'top':
196+
return Window.top
197+
elif attribute == 'width':
198+
return Window.size[0]
199+
elif attribute == 'height':
200+
return Window.size[1]
160201

161202
class Renderer(App):
162203

json/graphics-demo.json

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
{
22
"#": [
3-
43
"BlackText",
54
"Photo",
65
"BlueRect",
76
"RedEllipse"
87
],
98
"BlueRect": {
109
"type": "rectangle",
11-
"left": 100,
12-
"bottom": 100,
13-
"width": 100,
14-
"height": 100,
10+
"left": "30w",
11+
"bottom": "15h",
12+
"width": "20w",
13+
"height": "40h",
1514
"fill": "blue",
1615
"id": "bluerect",
1716
"#": [
1817
"GreenCircle"
1918
],
2019
"GreenCircle": {
2120
"type": "ellipse",
22-
"left": 20,
23-
"bottom": 20,
24-
"width": 60,
25-
"height": 60,
21+
"left": "10w",
22+
"bottom": "10h",
23+
"width": "80w",
24+
"height": "80h",
2625
"fill": "green",
2726
"id": "greencircle"
2827
}

0 commit comments

Comments
 (0)