Skip to content

Commit db7b7ae

Browse files
committed
v250117.2
1 parent 1e5054d commit db7b7ae

File tree

8 files changed

+338
-60
lines changed

8 files changed

+338
-60
lines changed
-30.8 KB
Binary file not shown.
31.2 KB
Binary file not shown.
Binary file not shown.

easycoder/__init__.py

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

12-
__version__ = "250116.4"
12+
__version__ = "250117.2"

easycoder/ec_core.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,7 +1427,6 @@ def k_system(self, command):
14271427

14281428
def r_system(self, command):
14291429
value = self.getRuntimeValue(command['value'])
1430-
background = command['background']
14311430
if value != None:
14321431
if command['background']:
14331432
subprocess.Popen(["sh",value,"&"])
@@ -1735,6 +1734,9 @@ def compileValue(self):
17351734
if symbolRecord['valueHolder']:
17361735
value['target'] = symbolRecord['name']
17371736
return value
1737+
else:
1738+
value['value'] = self.getValue()
1739+
return value
17381740
self.warning(f'Core.compileValue: Token \'{self.getToken()}\' does not hold a value')
17391741
return None
17401742

@@ -1900,6 +1902,10 @@ def compileValue(self):
19001902
return value
19011903
return None
19021904

1905+
if token == 'system':
1906+
value['command'] = self.nextValue()
1907+
return value
1908+
19031909
return None
19041910

19051911
#############################################################################
@@ -2199,13 +2205,16 @@ def v_position(self, v):
21992205

22002206
def v_property(self, v):
22012207
propertyValue = self.getRuntimeValue(v['name'])
2202-
targetName = v['target']
2203-
target = self.getVariable(targetName)
2204-
targetValue = self.getRuntimeValue(target)
2208+
if 'target' in v:
2209+
targetName = v['target']
2210+
target = self.getVariable(targetName)
2211+
targetValue = self.getRuntimeValue(target)
2212+
else:
2213+
targetValue = self.getRuntimeValue(v['value'])
22052214
try:
22062215
val = targetValue[propertyValue]
22072216
except:
2208-
RuntimeError(self.program, f'{targetName} does not have the property \'{propertyValue}\'')
2217+
RuntimeError(self.program, f'This value does not have the property \'{propertyValue}\'')
22092218
return None
22102219
value = {}
22112220
value['content'] = val
@@ -2247,13 +2256,19 @@ def v_stringify(self, v):
22472256

22482257
# This is used by the expression evaluator to get the value of a symbol
22492258
def v_symbol(self, symbolRecord):
2250-
result = {}
22512259
if symbolRecord['keyword'] == 'variable':
2252-
symbolValue = self.getSymbolValue(symbolRecord)
2253-
return symbolValue
2260+
return self.getSymbolValue(symbolRecord)
22542261
else:
22552262
return None
22562263

2264+
def v_system(self, v):
2265+
command = self.getRuntimeValue(v['command'])
2266+
result = os.popen(command).read()
2267+
value = {}
2268+
value['type'] = 'text'
2269+
value['content'] = result
2270+
return value
2271+
22572272
def v_tab(self, v):
22582273
value = {}
22592274
value['type'] = 'text'

easycoder/ec_graphics.py

Lines changed: 83 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ class Graphics(Handler):
99
def __init__(self, compiler):
1010
Handler.__init__(self, compiler)
1111
self.utils = GUtils()
12-
self.eventHandlers = {}
1312

1413
def getName(self):
1514
return 'graphics'
@@ -18,22 +17,27 @@ def getName(self):
1817
# Keyword handlers
1918

2019
def k_add(self, command):
21-
elements = []
2220
token = self.nextToken()
2321
if self.isSymbol():
2422
symbolRecord = self.getSymbolRecord()
2523
name = symbolRecord['name']
26-
if symbolRecord['keyword'] == 'layout':
27-
elements.append(name)
24+
keyword = symbolRecord['keyword']
25+
if keyword == 'layout':
2826
command['args'] = name
29-
else: FatalError(self.compiler.program, f'\'{name}\' is not a layout')
27+
elif keyword in ['column', 'frame', 'tab']:
28+
command['name'] = name
29+
command['type'] = token
30+
if self.peek() == 'to':
31+
command['args'] = []
32+
else:
33+
command['args'] = self.utils.getArgs(self)
3034
else:
3135
command['type'] = token
3236
command['args'] = self.utils.getArgs(self)
3337
if self.nextIs('to'):
3438
if self.nextIsSymbol():
3539
symbolRecord = self.getSymbolRecord()
36-
if symbolRecord['keyword'] == 'layout':
40+
if symbolRecord['keyword'] in ['column', 'frame', 'layout', 'tab']:
3741
command['target'] = symbolRecord['name']
3842
self.addCommand(command)
3943
return True
@@ -43,14 +47,19 @@ def r_add(self, command):
4347
target = self.getVariable(command['target'])
4448
type = command['type']
4549
args = command['args']
50+
param= None
4651
if not 'layout' in target:
4752
target['layout'] = []
4853
if args[0] == '{':
54+
if type in ['Column', 'Frame', 'Tab']:
55+
record = self.getVariable(command['name'])
56+
param = record['layout']
4957
layout = json.loads(self.getRuntimeValue(json.loads(args)))
5058
default = self.utils.getDefaultArgs(type)
5159
for n in range(0, len(layout)):
5260
args = self.utils.decode(default, layout[n])
53-
target['layout'].append(self.utils.createElement(type, args))
61+
item = self.utils.createElement(type, param, args)
62+
target['layout'].append(item)
5463
else:
5564
v = self.getVariable(args)
5665
target['layout'].append(v['layout'])
@@ -85,6 +94,12 @@ def r_close(self, command):
8594
target['window'].close()
8695
return self.nextPC()
8796

97+
def k_column(self, command):
98+
return self.compileVariable(command)
99+
100+
def r_column(self, command):
101+
return self.nextPC()
102+
88103
# create {window} layout {layout}
89104
# create {element} {args...}
90105
def k_create(self, command):
@@ -110,14 +125,30 @@ def r_create(self, command):
110125
if type == 'window':
111126
layout = self.getVariable(command['layout'])
112127
title = self.getRuntimeValue(command['title'])
113-
self.program.window = psg.Window(title, layout['layout'], finalize=True)
128+
record['window'] = psg.Window(title, layout['layout'], finalize=True)
129+
record['eventHandlers'] = {}
130+
self.program.windowRecord = record
114131
self.program.run(self.nextPC())
115132
self.mainLoop()
116-
self.program.kill()
133+
# self.program.kill()
117134
return 0
118135
else:
119136
RuntimeError(self.program, 'Variable is not a window or an element')
120137

138+
def k_init(self, command):
139+
if self.nextIsSymbol():
140+
symbolRecord = self.getSymbolRecord()
141+
if symbolRecord['keyword'] in ['column', 'frame', 'layout', 'tab']:
142+
command['target'] = symbolRecord['name']
143+
self.add(command)
144+
return True
145+
return False
146+
147+
def r_init(self, command):
148+
target = self.getVariable(command['target'])
149+
target['layout'] = []
150+
return self.nextPC()
151+
121152
def k_layout(self, command):
122153
return self.compileVariable(command)
123154

@@ -128,33 +159,38 @@ def k_on(self, command):
128159
token = self.nextToken()
129160
if token == 'event':
130161
command['key'] = self.nextValue()
131-
command['goto'] = self.getPC() + 2
132-
self.add(command)
133-
self.nextToken()
134-
pcNext = self.getPC()
135-
cmd = {}
136-
cmd['domain'] = 'core'
137-
cmd['lino'] = command['lino']
138-
cmd['keyword'] = 'gotoPC'
139-
cmd['goto'] = 0
140-
cmd['debug'] = False
141-
self.addCommand(cmd)
142-
self.compileOne()
143-
cmd = {}
144-
cmd['domain'] = 'core'
145-
cmd['lino'] = command['lino']
146-
cmd['keyword'] = 'stop'
147-
cmd['debug'] = False
148-
self.addCommand(cmd)
149-
# Fixup the link
150-
self.getCommandAt(pcNext)['goto'] = self.getPC()
151-
return True
162+
if self.nextIs('in'):
163+
if self.nextIsSymbol():
164+
record = self.getSymbolRecord()
165+
if record['keyword'] == 'window':
166+
command['window'] = record['name']
167+
command['goto'] = self.getPC() + 2
168+
self.add(command)
169+
self.nextToken()
170+
pcNext = self.getPC()
171+
cmd = {}
172+
cmd['domain'] = 'core'
173+
cmd['lino'] = command['lino']
174+
cmd['keyword'] = 'gotoPC'
175+
cmd['goto'] = 0
176+
cmd['debug'] = False
177+
self.addCommand(cmd)
178+
self.compileOne()
179+
cmd = {}
180+
cmd['domain'] = 'core'
181+
cmd['lino'] = command['lino']
182+
cmd['keyword'] = 'stop'
183+
cmd['debug'] = False
184+
self.addCommand(cmd)
185+
# Fixup the link
186+
self.getCommandAt(pcNext)['goto'] = self.getPC()
187+
return True
152188
return False
153189

154190
def r_on(self, command):
155191
key = self.getRuntimeValue(command['key'])
156-
pc = command['goto']
157-
self.eventHandlers[key] = lambda: self.run(pc)
192+
window = self.getVariable(command['window'])
193+
window['eventHandlers'][key] = lambda: self.run(command['goto'])
158194
return self.nextPC()
159195

160196
def k_popup(self, command):
@@ -221,13 +257,14 @@ def compileValue(self):
221257
return value
222258
return None
223259

260+
if self.getToken() == 'the':
261+
self.nextToken()
262+
263+
token = self.getToken()
224264
value['type'] = token
225265

226-
if token == 'test':
227-
value = {}
228-
value['type'] = 'text'
229-
value['content'] = 'test'
230-
return value
266+
if token == 'event':
267+
return value
231268

232269
return None
233270

@@ -246,7 +283,9 @@ def v_symbol(self, symbolRecord):
246283
else:
247284
return None
248285

249-
def v_test(self, v):
286+
def v_event(self, v):
287+
v['type'] = 'text'
288+
v['content'] = self.eventValues
250289
return v
251290

252291
#############################################################################
@@ -261,13 +300,15 @@ def compileCondition(self):
261300
#############################################################################
262301
# The main loop
263302
def mainLoop(self):
303+
windowRecord = self.program.windowRecord
304+
window = windowRecord['window']
305+
eventHandlers = windowRecord['eventHandlers']
264306
while True:
265-
event, values = self.program.window.Read(timeout=100)
307+
event, values = window.Read(timeout=100)
266308
if event == psg.WINDOW_CLOSED or event == "EXIT":
267309
break
268310
if event == '__TIMEOUT__': self.program.flushCB()
269311
else:
270-
if event in self.eventHandlers:
312+
if event in eventHandlers:
271313
self.eventValues = values
272-
self.eventHandlers[event]()
273-
314+
eventHandlers[event]()

easycoder/ec_gutils.py

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,28 @@ def getArgs(self, handler):
2121
# Get the default args for a graphic element
2222
def getDefaultArgs(self, type):
2323
args = {}
24-
if type == 'Text':
25-
args['text'] = '(empty)'
24+
if type == 'Button':
25+
args['button_text'] = '(empty)'
26+
args['size'] = (None, None)
27+
if type == 'Checkbox':
28+
args['text'] = ''
29+
args['key'] = None
30+
args['size'] = (None, None)
31+
args['expand_x'] = False
32+
elif type == 'Column':
2633
args['expand_x'] = False
34+
args['pad'] = (0, 0)
2735
elif type == 'Input':
2836
args['key'] = None
2937
args['size'] = (None, None)
30-
elif type == 'Button':
31-
args['button_text'] = '(empty)'
38+
elif type == 'Multiline':
39+
args['default_text'] = ''
40+
args['key'] = None
41+
args['size'] = (None, None)
42+
elif type == 'Text':
43+
args['text'] = '(empty)'
44+
args['size'] = (None, None)
45+
args['expand_x'] = False
3246
return args
3347

3448
# Decode an argument at runtime
@@ -42,11 +56,29 @@ def decode(self, args, text):
4256
return None
4357

4458
# Create an element
45-
def createElement(self, type, args):
46-
if type == 'Text': return psg.Text(text=args['text'], expand_x=args['expand_x'])
59+
def createElement(self, type, param, args):
60+
if type == 'Button':
61+
size = self.getSize(args)
62+
return psg.Button(button_text=args['button_text'], size=size)
63+
if type == 'Checkbox':
64+
size = self.getSize(args)
65+
return psg.Checkbox(args['text'], key=args['key'], expand_x=args['expand_x'], size=size)
66+
if type == 'Column':
67+
return psg.Column(param, expand_x=args['expand_x'], pad=args['pad'])
4768
elif type == 'Input':
48-
size = args['size'].split()
49-
size = (size[0], size[1])
69+
size = self.getSize(args)
5070
return psg.Input(key=args['key'], size=size)
51-
elif type == 'Button': return psg.Button(button_text=args['button_text'])
71+
elif type == 'Multiline':
72+
size = self.getSize(args)
73+
return psg.Multiline(default_text=args['default_text'], key=args['key'], size=size)
74+
elif type == 'Text':
75+
size = self.getSize(args)
76+
return psg.Text(text=args['text'], size=size, expand_x=args['expand_x'])
5277
else: return None
78+
79+
def getSize(self, args):
80+
size = args['size']
81+
if size == (None, None):
82+
return size
83+
size = size.split()
84+
return (size[0], size[1])

0 commit comments

Comments
 (0)