Skip to content

Commit 5b40ff6

Browse files
committed
Update mobie detect
1 parent 673d168 commit 5b40ff6

File tree

7 files changed

+138
-59
lines changed

7 files changed

+138
-59
lines changed

dist/easycoder.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6415,7 +6415,8 @@ const EasyCoder_Browser = {
64156415
return {
64166416
domain: `browser`,
64176417
type: `boolean`,
6418-
content: (typeof window.orientation !== `undefined`) || (navigator.userAgent.indexOf(`IEMobile`) !== -1)
6418+
// content: (typeof window.orientation !== `undefined`) || (navigator.userAgent.indexOf(`IEMobile`) !== -1)
6419+
content: (/Android|iPhone/i.test(navigator.userAgent))
64196420
};
64206421
case `portrait`:
64216422
return {

js/easycoder/Browser.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3119,7 +3119,8 @@ const EasyCoder_Browser = {
31193119
return {
31203120
domain: `browser`,
31213121
type: `boolean`,
3122-
content: (typeof window.orientation !== `undefined`) || (navigator.userAgent.indexOf(`IEMobile`) !== -1)
3122+
// content: (typeof window.orientation !== `undefined`) || (navigator.userAgent.indexOf(`IEMobile`) !== -1)
3123+
content: (/Android|iPhone/i.test(navigator.userAgent))
31233124
};
31243125
case `portrait`:
31253126
return {

py/ec_core.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,19 +1460,21 @@ def v_position(self, v):
14601460

14611461
def v_property(self, v):
14621462
name = self.getRuntimeValue(v['name'])
1463-
target = self.getVariable(v['target'])
1464-
target = self.getSymbolValue(target)
1465-
content = target['content']
1463+
targetName = v['target']
1464+
target = self.getVariable(targetName)
1465+
targetValue = self.getSymbolValue(target)
1466+
content = targetValue['content']
1467+
value = {}
14661468
try:
1467-
val = content.get(name)
1469+
val = content[name]
1470+
value['content'] = val
1471+
if isinstance(v, numbers.Number):
1472+
value['type'] = 'int'
1473+
else:
1474+
value['type'] = 'text'
14681475
except:
1469-
FatalError(self.program.compiler, f'"{name}" does not have any properties')
1470-
return None
1471-
value = {}
1472-
value['content'] = val
1473-
if isinstance(v, numbers.Number):
1474-
value['type'] = 'int'
1475-
else:
1476+
# RuntimeError(self.program, f'"{targetName}" does not have any properties')
1477+
value['content'] = ''
14761478
value['type'] = 'text'
14771479
return value
14781480

py/ec_graphics.py

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from ec_classes import FatalError, RuntimeError
22
from ec_handler import Handler
3-
from graphson import *
3+
from pyctures import *
44

55
class Graphics(Handler):
66

@@ -154,7 +154,7 @@ def r_rectangle(self, command):
154154
return self.nextPC()
155155

156156
def k_render(self, command):
157-
if self.nextIsSymbol():
157+
if self.nextIsSymbol():
158158
record = self.getSymbolRecord()
159159
name = record['name']
160160
type = record['keyword']
@@ -191,6 +191,60 @@ def r_render(self, command):
191191
RuntimeError(command['program'], f'Rendering error: {result}')
192192
return self.nextPC()
193193

194+
def k_set(self, command):
195+
if self.peek() == 'the':
196+
self.nextToken()
197+
token = self.peek()
198+
if token == 'text':
199+
self.nextToken()
200+
command['variant'] = 'setText'
201+
if self.peek() == 'of':
202+
self.nextToken()
203+
if self.nextIsSymbol():
204+
record = self.getSymbolRecord()
205+
command['name'] = record['name']
206+
if record['keyword'] != 'text':
207+
RuntimeError(command['program'], f'Symbol type is not \'text\'')
208+
if self.peek() == 'to':
209+
self.nextToken()
210+
command['value'] = self.nextValue()
211+
self.add(command)
212+
return True
213+
return False
214+
elif token == 'background':
215+
self.nextToken()
216+
command['variant'] = 'setBackground'
217+
if self.peek() == 'color':
218+
self.nextToken()
219+
if self.peek() == 'of':
220+
self.nextToken()
221+
if self.nextIsSymbol():
222+
record = self.getSymbolRecord()
223+
command['name'] = record['name']
224+
if not record['keyword'] in ['rectangle', 'ellipse']:
225+
RuntimeError(command['program'], f'Symbol type is not \'rectangle\' or \'ellipse\'')
226+
if self.peek() == 'to':
227+
self.nextToken()
228+
command['value'] = self.nextValue()
229+
self.add(command)
230+
return True
231+
return False
232+
return False
233+
234+
def r_set(self, command):
235+
variant = command['variant']
236+
if variant == 'setText':
237+
variable = self.getVariable(command['name'])
238+
element = self.getSymbolValue(variable)
239+
value = self.getRuntimeValue(command['value'])
240+
setText(element['content'], value)
241+
elif variant == 'setBackground':
242+
variable = self.getVariable(command['name'])
243+
element = self.getSymbolValue(variable)
244+
value = self.getRuntimeValue(command['value'])
245+
setBackground(element['content'], value)
246+
return self.nextPC()
247+
194248
def k_show(self, command):
195249
if self.nextIs('screen'):
196250
command['name'] = None
@@ -213,22 +267,6 @@ def k_text(self, command):
213267

214268
def r_text(self, command):
215269
return self.nextPC()
216-
217-
def k_update(self, command):
218-
if self.nextIsSymbol():
219-
record = self.getSymbolRecord()
220-
if record['isValueHolder']:
221-
command['widget'] = record['name']
222-
self.add(command)
223-
return True
224-
else:
225-
name = record['name']
226-
FatalError(self.program.compiler, f'{name} is not a graphic object')
227-
return False
228-
229-
def r_update(self, command):
230-
RuntimeError(command['program'], f'Runtime code not completed')
231-
return self.nextPC()
232270

233271
#############################################################################
234272
# Compile a value in this domain
@@ -244,7 +282,7 @@ def compileValue(self):
244282
value['type'] = 'module'
245283
return value
246284

247-
if symbolRecord['isValueHolder'] is True or keyword is 'dictionary':
285+
if symbolRecord['isValueHolder'] == True or keyword == 'dictionary':
248286
value['type'] = 'symbol'
249287
return value
250288
return None

py/ec_handler.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import json
2+
13
class Handler:
24

35
def __init__(self, compiler):
@@ -58,4 +60,11 @@ def valueHandler(self, name):
5860

5961
# Get a condition handler
6062
def conditionHandler(self, name):
61-
return getattr(self, f'c_{name}')
63+
return getattr(self, f'c_{name}')
64+
65+
def isJson(value):
66+
try:
67+
json.loads(value)
68+
except ValueError as e:
69+
return False
70+
return True

py/ec_program.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,10 @@ def variableDoesNotHoldAValueError(self, name):
221221
raise FatalError(self.compiler, f'Variable "{name}" does not hold a value')
222222

223223
def compare(self, value1, value2):
224+
# print(f'Compare {value1} with {value2}')
224225
val1 = self.evaluate(value1)
225226
val2 = self.evaluate(value2)
227+
# print(f'Compare {val1} with {val2}')
226228
v1 = val1['content']
227229
v2 = val2['content']
228230
if v1 != None and val1['type'] == 'int':

py/graphson.py renamed to py/pyctures.py

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,57 @@
1+
# Pyctures.py
2+
3+
import sys, json
14
import tkinter as tk
25
from PIL import Image, ImageTk
3-
import json
46

57
elements = {}
68
zlist = []
79
images = {}
810
onTick = None
911

12+
# Get the canvas
13+
def setCanvas(c):
14+
global canvas
15+
canvas = c
16+
17+
# Get the canvas
18+
def getCanvas():
19+
global canvas
20+
return canvas
21+
1022
def createScreen(values):
1123
global screen, canvas, screenLeft, screenTop, running
1224
running = True
1325
screen = tk.Tk()
26+
screen.title('RBR Simulator')
1427
# screen.attributes('-fullscreen', True)
1528

16-
screen.overrideredirect(True)
17-
screenLeft = values['left']['content'] if 'left' in values else 0
18-
screenTop = values['top']['content'] if 'top' in values else 0
29+
# screen.overrideredirect(True)
1930
width = values['width']['content'] if 'width' in values else 600
2031
height = values['height']['content'] if 'height' in values else 800
32+
screenLeft = int((screen.winfo_screenwidth() - width) / 2)
33+
screenTop = int((screen.winfo_screenheight() - height) / 2)
34+
if 'left' in values:
35+
screenLeft = values['left']['content']
36+
if 'top' in values:
37+
screenTop = values['top']['content']
2138

22-
# screenLeft = int(screen.winfo_screenwidth() - width)
23-
# screenTop = int((screen.winfo_screenheight() / 2) - (height / 2))
2439
geometry = str(width) + 'x' + str(height) + '+' + str(screenLeft) + '+' + str(screenTop)
2540
screen.geometry(geometry)
2641

2742
# Handle a click in the screen
2843
def onClick(event):
2944
global screenLeft, screenTop, zlist
30-
x = event.x_root
31-
y = event.y_root
45+
x = event.x
46+
y = event.y
3247
# print('Clicked at : '+ str(x) +","+ str(y))
3348
for i in range(1, len(zlist) + 1):
3449
element = zlist[-i]
3550
id = list(element)[0]
3651
values = element[id]
37-
x1 = screenLeft + values['left']
52+
x1 = values['left']
3853
x2 = x1 + values['width']
39-
y1 = screenTop + values['top']
54+
y1 = values['top']
4055
y2 = y1 + values['height']
4156
if x >= x1 and x < x2 and y >= y1 and y < y2:
4257
if id in elements:
@@ -45,21 +60,22 @@ def onClick(event):
4560
element['cb']()
4661
break
4762
else:
48-
RuntimeError(command['program'], f'Element \'{id}\' does not exist')
63+
RuntimeError(None, f'Element \'{id}\' does not exist')
4964

5065
screen.bind('<Button-1>', onClick)
5166

5267
fill = values['fill']['content'] if 'fill' in values else 'white'
5368
canvas = tk.Canvas(master=screen, width=width, height=height, bg=fill)
5469
canvas.place(x=0, y=0)
70+
setCanvas(canvas)
5571

5672
# Set up a click handler in an element
5773
def setOnClick(id, cb):
5874
global elements
5975
if id in elements:
6076
elements[id]['cb'] = cb
6177
else:
62-
RuntimeError(command['program'], f'Element \'{id}\' does not exist')
78+
RuntimeError(None, f'Element \'{id}\' does not exist')
6379
return
6480

6581
# Set up the tick handler
@@ -76,11 +92,11 @@ def afterCB(screen):
7692
screen.after(100, lambda: afterCB(screen))
7793
screen.after(1000, lambda: afterCB(screen))
7894
screen.mainloop()
79-
return
95+
sys.exit()
8096

8197
# Render a graphic specification
8298
def render(spec, parent):
83-
global canvas, elements
99+
global elements
84100

85101
def getValue(args, item):
86102
if item in args:
@@ -90,7 +106,7 @@ def getValue(args, item):
90106
return item
91107

92108
def renderIntoRectangle(widgetType, values, offset, args):
93-
global canvas, zlist
109+
global zlist
94110
left = getValue(args, values['left']) if 'left' in values else 10
95111
top = getValue(args, values['top']) if 'top' in values else 10
96112
left = offset['dx'] + left
@@ -106,9 +122,9 @@ def renderIntoRectangle(widgetType, values, offset, args):
106122
else:
107123
outlineWidth = 0
108124
if widgetType == 'rect':
109-
widgetId = canvas.create_rectangle(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
125+
widgetId = getCanvas().create_rectangle(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
110126
elif widgetType == 'ellipse':
111-
widgetId = canvas.create_oval(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
127+
widgetId = getCanvas().create_oval(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
112128
else:
113129
return f'Unknown widget type \'{widgetType}\''
114130
if 'id' in values:
@@ -141,7 +157,6 @@ def renderIntoRectangle(widgetType, values, offset, args):
141157
return None
142158

143159
def renderText(values, offset, args):
144-
global canvas
145160
left = getValue(args, values['left']) if 'left' in values else 10
146161
top = getValue(args, values['top']) if 'top' in values else 10
147162
left = offset['dx'] + left
@@ -177,25 +192,26 @@ def renderText(values, offset, args):
177192
if xoff < 3:
178193
xoff = 3
179194
if shape == 'ellipse':
180-
containerId = canvas.create_oval(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
195+
containerId = getCanvas().create_oval(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
181196
else:
182-
containerId = canvas.create_rectangle(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
197+
containerId = getCanvas().create_rectangle(left, top, right, bottom, fill=fill, outline=outline, width=outlineWidth)
198+
textId = canvas.create_text(left + xoff, fontTop + adjust, fill=color, font=f'"{fontFace}" {fontSize} {fontWeight}', text=text, anchor=anchor)
183199
if 'id' in values:
184200
id = getValue(args, values['id'])
185201
widgetSpec = {
186-
"id": containerId,
202+
"id": textId,
203+
"containerId": containerId,
187204
"left": left,
188205
"top": top,
189206
"width": width,
190207
"height": height
191208
}
192209
elements[id] = widgetSpec
193210
zlist.append({id: widgetSpec})
194-
canvas.create_text(left + xoff, fontTop + adjust, fill=color, font=f'"{fontFace}" {fontSize} {fontWeight}', text=text, anchor=anchor)
195211
return None
196212

197213
def renderImage(values, offset, args):
198-
global canvas, images
214+
global images
199215
left = getValue(args, values['left']) if 'left' in values else 10
200216
top = getValue(args, values['top']) if 'top' in values else 10
201217
left = offset['dx'] + left
@@ -205,7 +221,7 @@ def renderImage(values, offset, args):
205221
right = left + width
206222
bottom = top + height
207223
src = getValue(args, values['src']) if 'src' in values else None
208-
containerId = canvas.create_rectangle(left, top, right, bottom, width=0)
224+
containerId = getCanvas().create_rectangle(left, top, right, bottom, width=0)
209225
if 'id' in values:
210226
id = values['id']
211227
widgetSpec = {
@@ -222,7 +238,7 @@ def renderImage(values, offset, args):
222238
img = (Image.open(src))
223239
resized_image= img.resize((width, height), Image.ANTIALIAS)
224240
new_image= ImageTk.PhotoImage(resized_image)
225-
imageid = canvas.create_image(left, top, anchor='nw', image=new_image)
241+
imageid = getCanvas().create_image(left, top, anchor='nw', image=new_image)
226242
images[containerId] = {'id': imageid, "image": new_image}
227243
return None
228244

@@ -270,4 +286,14 @@ def getElement(name):
270286
if name in elements:
271287
return elements[name]
272288
else:
273-
RuntimeError(None, f'Element \'{name}\' does not exist')
289+
RuntimeError(None, f'Element \'{name}\' does not exist')
290+
291+
# Set the content of a text widget
292+
def setText(name, value):
293+
getCanvas().itemconfig(getElement(name)['id'], text=value)
294+
295+
# Set the background of a rectangle or ellipse widget
296+
def setBackground(name, value):
297+
id = getElement(name)['id']
298+
getCanvas().itemconfig(getElement(name)['id'], fill=value)
299+

0 commit comments

Comments
 (0)