def generate_creators(self, registry, parent, closure, ident_n = 1): r = [] ident = "\t" * ident_n if not self.prototype: for name in self.signals: r.append("%s%s.%s = _globals.core.createSignal('%s').bind(%s)" %(ident, parent, name, name, parent)) for prop in self.properties: for name, default_value in prop.properties: args = [parent, "'%s'" %prop.type, "'%s'" %name] if lang.value_is_trivial(default_value): args.append(default_value) r.append("\tcore.addProperty(%s)" %(", ".join(args))) for name, prop in self.enums.iteritems(): raise Exception('adding enums in runtime is unsupported, consider putting this property (%s) in prototype' %name) for idx, gen in enumerate(self.children): var = "%s$child%d" %(escape(parent), idx) component = registry.find_component(self.package, gen.component.name) r.append("%svar %s = new _globals.%s(%s)" %(ident, var, component, parent)) r.append("%s%s.%s = %s" %(ident, closure, var, var)) code = self.call_create(registry, ident_n, var, gen, closure) r.append(code) for target, value in self.assignments.iteritems(): if target == "id": if "." in value: raise Exception("expected identifier, not expression") r.append("%s%s._setId('%s')" %(ident, parent, value)) elif target.endswith(".id"): raise Exception("setting id of the remote object is prohibited") else: self.check_target_property(registry, target) if isinstance(value, component_generator): if target != "delegate": var = "%s$%s" %(escape(parent), escape(target)) r.append("//creating component %s" %value.name) r.append("%svar %s = new _globals.%s(%s)" %(ident, var, registry.find_component(value.package, value.component.name), parent)) r.append("%s%s.%s = %s" %(ident, closure, var, var)) code = self.call_create(registry, ident_n, var, value, closure) r.append(code) r.append('%s%s.%s = %s' %(ident, parent, target, var)) else: code = "%svar delegate = new _globals.%s(%s, true)\n" %(ident, registry.find_component(value.package, value.component.name), parent) code += "%svar __closure = { delegate: delegate }\n" %(ident) code += self.call_create(registry, ident_n + 1, 'delegate', value, '__closure') + '\n' code += self.call_setup(registry, ident_n + 1, 'delegate', value, '__closure') + '\n' r.append("%s%s.%s = (function() {\n%s\n%sreturn delegate\n}).bind(%s)" %(ident, parent, target, code, ident, parent)) for name, target in self.aliases.iteritems(): get, pname = generate_accessors(target) r.append("%score.addAliasProperty(%s, '%s', (function() { return %s; }).bind(%s), '%s')" \ %(ident, parent, name, get, parent, pname)) return "\n".join(r)
def generate_animations(self, registry, parent): r = [] for name, animation in self.animations.items(): var = "behavior_%s_on_%s" %(escape(parent), escape(name)) r.append("\tvar %s = new %s(%s)" %(var, registry.find_component(self.package, animation.component.name, mangle = True), parent)) r.append("\tvar %s$c = { %s: %s }" %(var, var, var)) r.append(self.call_create(registry, 1, var, animation, var + '$c')) r.append(self.call_setup(registry, 1, var, animation, var + '$c')) target_parent, target = split_name(name) if not target_parent: target_parent = parent else: target_parent = self.get_rvalue(registry, parent, target_parent) r.append("\t%s.setAnimation('%s', %s);\n" %(target_parent, target, var)) return "\n".join(r)
def add_component(self, name, component, declaration): if name in self.components: raise Exception("duplicate component " + name) package, component_name = split_name(name) package = escape_package(package) if not declaration: name = "%s.Ui%s" % (package, component_name[0].upper() + escape(component_name[1:])) self.used_components.add(name) self.used_packages.add(package) self.startup.append("\tcontext.start(new qml.%s(context))" % name) self.startup.append("\tcontext.run()") else: name = package + '.' + component_name if package not in self.packages: self.packages[package] = set() self.packages[package].add(component_name) gen = component_generator(self.ns, name, component, True) self.components[name] = gen
def generate_setup_code(self, registry, parent, closure, ident_n=1): r = [] ident = "\t" * ident_n for target, value in self.assignments.iteritems(): if target == "id": continue t = type(value) #print self.name, target, value target_owner, target_lvalue, target_prop = self.get_lvalue( registry, parent, target) if t is str: value = replace_enums(value, self, registry) r.append('//assigning %s to %s' % (target, value)) value, deps = parse_deps( parent, value, partial(self.transform_root, registry)) if deps: var = "update$%s$%s" % (escape(parent), escape(target)) r.append("%svar %s = function() { %s = %s; }" % (ident, var, target_lvalue, value)) undep = [] for idx, _dep in enumerate(deps): path, dep = _dep undep.append("[%s, '%s']" % (path, dep)) r.append("%s%s._replaceUpdater('%s', %s, [%s])" % (ident, target_owner, target_prop, var, ",".join(undep))) else: r.append("%s%s._removeUpdater('%s'); %s = %s;" % (ident, target_owner, target_prop, target_lvalue, value)) elif t is component_generator: if target == "delegate": continue var = "%s$%s" % (escape(parent), escape(target)) r.append( self.call_setup(registry, ident_n, var, value, closure)) else: raise Exception("skip assignment %s = %s" % (target, value)) def put_in_instance(handler): path, name = handler return path or not self.prototype code_index = 0 def next_codevar(lines, code, index): var = "$code$%d" % index code = '%svar %s = %s' % (ident, var, code) lines.append(code) return var if not self.prototype: for code, methods in self.transform_handlers( registry, self.methods): if len(methods) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(methods): path = path_or_parent( path, parent, partial(self.transform_root, registry)) r.append("%s%s.%s = %s.bind(%s)" % (ident, path, name, code, path)) for code, handlers in self.transform_handlers(registry, self.signal_handlers): handlers = filter( lambda h: put_in_instance(h) or h[1] == 'completed', handlers) if not handlers: continue if len(handlers) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(handlers): path = path_or_parent(path, parent, partial(self.transform_root, registry)) if name != "completed": r.append("%s%s.on('%s', %s.bind(%s))" % (ident, path, name, code, path)) else: r.append("%s%s._context._onCompleted(%s, %s)" % (ident, path, path, code)) for code, handlers in self.transform_handlers(registry, self.changed_handlers): handlers = filter(put_in_instance, handlers) if not handlers: continue if len(handlers) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(handlers): path = path_or_parent(path, parent, partial(self.transform_root, registry)) r.append("%s%s.onChanged('%s', %s.bind(%s))" % (ident, path, name, code, path)) for code, handlers in self.transform_handlers(registry, self.key_handlers): handlers = filter(put_in_instance, handlers) if not handlers: continue if len(handlers) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(handlers): path = path_or_parent(path, parent, partial(self.transform_root, registry)) r.append("%s%s.onPressed('%s', %s.bind(%s))" % (ident, path, name, code, path)) for idx, value in enumerate(self.children): var = '%s$child%d' % (escape(parent), idx) r.append(self.call_setup(registry, ident_n, var, value, closure)) if self.elements: r.append("\t%s.assign(%s)" % (parent, json.dumps(self.elements, sort_keys=True))) r.append(self.generate_animations(registry, parent)) return "\n".join(r)
def generate_creators(self, registry, parent, closure, ident_n=1): r = [] ident = "\t" * ident_n if not self.prototype: for name in self.signals: r.append( "%s%s.%s = _globals.core.createSignal('%s').bind(%s)" % (ident, parent, name, name, parent)) for prop in self.properties: for name, default_value in prop.properties: if prop.lazy: gen = self.lazy_properties[name] r.append( self.generate_lazy_property( registry, parent, prop.type, name, gen, ident_n)) elif prop.const: r.append( self.generate_const_property( registry, parent, name, self.const_properties[name])) else: args = [parent, "'%s'" % prop.type, "'%s'" % name] if lang.value_is_trivial(default_value): default_value, deps = parse_deps( '@error', default_value, partial(self.transform_root, registry)) if deps: raise Exception( 'trivial value emits dependencies') args.append(default_value) r.append("\tcore.addProperty(%s)" % (", ".join(args))) for name, prop in self.enums.iteritems(): raise Exception( 'adding enums in runtime is unsupported, consider putting this property (%s) in prototype' % name) for idx, gen in enumerate(self.children): var = "%s$child%d" % (escape(parent), idx) component = registry.find_component(self.package, gen.component.name) r.append("%svar %s = new _globals.%s(%s)" % (ident, var, component, parent)) r.append("%s%s.%s = %s" % (ident, closure, var, var)) code = self.call_create(registry, ident_n, var, gen, closure) r.append(code) r.append("%s%s.addChild(%s)" % (ident, parent, var)) for target, value in self.assignments.iteritems(): if target == "id": if "." in value: raise Exception("expected identifier, not expression") r.append("%s%s._setId('%s')" % (ident, parent, value)) elif target.endswith(".id"): raise Exception( "setting id of the remote object is prohibited") else: self.check_target_property(registry, target) if isinstance(value, component_generator): if target != "delegate": var = "%s$%s" % (escape(parent), escape(target)) r.append("//creating component %s" % value.name) r.append( "%svar %s = new _globals.%s(%s)" % (ident, var, registry.find_component( value.package, value.component.name), parent)) r.append("%s%s.%s = %s" % (ident, closure, var, var)) code = self.call_create(registry, ident_n, var, value, closure) r.append(code) r.append('%s%s.%s = %s' % (ident, parent, target, var)) else: code = self.generate_creator_function( registry, 'delegate', value, ident_n) r.append("%s%s.%s = %s" % (ident, parent, target, code)) for name, target in self.aliases.iteritems(): get, pname = generate_accessors( parent, target, partial(self.transform_root, registry)) r.append("%score.addAliasProperty(%s, '%s', function() { return %s }, '%s')" \ %(ident, parent, name, get, pname)) return "\n".join(r)
def generate_setup_code(self, registry, parent, closure, ident_n=1): r = [] ident = "\t" * ident_n for target, value in self.assignments.items(): if target == "id": continue t = type(value) #print self.name, target, value target_owner, target_lvalue, target_prop = self.get_lvalue( registry, parent, target) if isinstance(value, (str, basestring)): value = replace_enums(value, self, registry) r.append('//assigning %s to %s' % (target, value)) value, deps = parse_deps( parent, value, partial(self.transform_root, registry, None)) if deps: undep = [] for idx, _dep in enumerate(deps): path, dep = _dep undep.append(path) undep.append("'%s'" % dep) r.append( "%s%s._replaceUpdater('%s', function() { %s = %s }, [%s])" % (ident, target_owner, target_prop, target_lvalue, value, ",".join(undep))) else: r.append("%s%s._removeUpdater('%s'); %s = %s;" % (ident, target_owner, target_prop, target_lvalue, value)) elif t is component_generator: if target == "delegate": continue var = "%s$%s" % (escape(parent), escape(target)) r.append( self.call_setup(registry, ident_n, var, value, closure)) else: raise Exception("skip assignment %s = %s" % (target, value)) def put_in_instance(handler): path, name = handler return path or not self.prototype code_index = 0 def next_codevar(lines, code, index): var = "$code$%d" % index code = '%svar %s = %s' % (ident, var, code) lines.append(code) return var if not self.prototype: for code, methods in self.transform_handlers( registry, self.methods): if len(methods) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(methods): path = path_or_parent( path, parent, partial(self.transform_root, registry, None)) code = code.replace( '@super.', self.get_base_type(registry, mangle=True) + '.prototype.') r.append("%s%s.%s = %s.bind(%s)" % (ident, path, name, code, parent)) for code, handlers in self.transform_handlers(registry, self.signal_handlers): handlers = list(filter(put_in_instance, handlers)) if not handlers: continue if len(handlers) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(handlers): has_path = bool(path) path = path_or_parent( path, parent, partial(self.transform_root, registry, parent)) if has_path: r.append("%sif (%s) %s.on('%s', %s.bind(%s))" % (ident, path, path, name, code, parent)) #fixme: remove me? else: r.append("%s%s.on('%s', %s.bind(%s))" % (ident, path, name, code, parent)) for code, handlers in self.transform_handlers(registry, self.changed_handlers): handlers = list(filter(put_in_instance, handlers)) if not handlers: continue if len(handlers) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(handlers): has_path = bool(path) path = path_or_parent( path, parent, partial(self.transform_root, registry, parent)) if has_path: r.append("%sif (%s) %s.onChanged('%s', %s.bind(%s))" % (ident, path, path, name, code, parent)) #fixme: remove me? else: r.append("%s%s.onChanged('%s', %s.bind(%s))" % (ident, path, name, code, parent)) for code, handlers in self.transform_handlers(registry, self.key_handlers): handlers = list(filter(put_in_instance, handlers)) if not handlers: continue if len(handlers) > 1: code = next_codevar(r, code, code_index) code_index += 1 for path, name in sorted(handlers): path = path_or_parent( path, parent, partial(self.transform_root, registry, parent)) r.append("%s%s.onPressed('%s', %s.bind(%s))" % (ident, path, name, code, parent)) for idx, value in enumerate(self.children): var = '%s$child%d' % (escape(parent), idx) r.append(self.call_setup(registry, ident_n, var, value, closure)) if self.elements: r.append( "%s%s.assign(%s)" % (ident, parent, json.dumps(self.elements, sort_keys=True))) # put all implicit assignment r.append("%s%s._implicit=[%s]" % (ident, parent, ', '.join( ["'" + x + "'" for x in self.implicit_assignments]))) r.append(self.generate_animations(registry, parent)) r.append('%s%s.completed()' % (ident, parent)) return "\n".join(r)
def class_name(self): idx = self.name.rindex('.') return escape(self.name[idx + 1:] if idx >= 0 else self.name)
def generate_setup_code(self, registry, parent, closure, ident_n = 1): r = [] ident = "\t" * ident_n for target, value in self.assignments.iteritems(): if target == "id": continue t = type(value) #print self.name, target, value target_lvalue = self.get_lvalue(parent, target) if t is str: value = replace_enums(value, self, registry) deps = parse_deps(parent, value) if deps: var = "update$%s$%s" %(escape(parent), escape(target)) r.append('//assigning %s to %s' %(target, value)) r.append("%svar %s = (function() { %s = (%s); }).bind(%s)" %(ident, var, target_lvalue, value, parent)) undep = [] for idx, _dep in enumerate(deps): path, dep = _dep depvar = "dep$%s$%s$%d" %(escape(parent), escape(target), idx) r.append('%svar %s = %s' %(ident, depvar, path)) r.append("%s%s.connectOnChanged(%s, '%s', %s)" %(ident, parent, depvar, dep, var)) undep.append("[%s, '%s', %s]" %(depvar, dep, var)) r.append("%s%s._removeUpdater('%s', [%s])" %(ident, parent, target, ",".join(undep))) r.append("%s%s();" %(ident, var)) else: r.append('//assigning %s to %s' %(target, value)) r.append("%s%s._removeUpdater('%s'); %s = (%s);" %(ident, parent, target, target_lvalue, value)) elif t is component_generator: if target == "delegate": continue var = "%s$%s" %(escape(parent), escape(target)) r.append(self.call_setup(registry, ident_n, var, value, closure)) else: raise Exception("skip assignment %s = %s" %(target, value)) if not self.prototype: for _name, argscode in self.methods.iteritems(): path, name = _name args, code = argscode path = path_or_parent(path, parent) code = process(code, self, registry) r.append("%s%s.%s = (function(%s) %s ).bind(%s)" %(ident, path, name, ",".join(args), code, path)) for _name, argscode in self.signal_handlers.iteritems(): path, name = _name if not path and self.prototype and name != 'completed': #sync with condition above continue args, code = argscode code = process(code, self, registry) path = path_or_parent(path, parent) if name != "completed": r.append("%s%s.on('%s', (function(%s) %s ).bind(%s))" %(ident, path, name, ",".join(args), code, path)) else: r.append("%s%s._context._onCompleted((function() %s ).bind(%s))" %(ident, path, code, path)) for _name, code in self.changed_handlers.iteritems(): path, name = _name if not path and self.prototype: #sync with condition above continue code = process(code, self, registry) path = path_or_parent(path, parent) r.append("%s%s.onChanged('%s', (function(value) %s ).bind(%s))" %(ident, path, name, code, path)) for _name, code in self.key_handlers.iteritems(): path, name = _name if not path and self.prototype: #sync with condition above continue code = process(code, self, registry) path = path_or_parent(path, parent) r.append("%s%s.onPressed('%s', (function(key, event) %s ).bind(%s))" %(ident, path, name, code, path)) r.append(self.generate_animations(registry, parent)) for idx, value in enumerate(self.children): var = '%s$child%d' %(escape(parent), idx) r.append(self.call_setup(registry, ident_n, var, value, closure)) r.append("%s%s.addChild(%s)" %(ident, parent, var)); if self.elements: r.append("\t%s.assign(%s)" %(parent, json.dumps(self.elements))) return "\n".join(r)