Exemplo n.º 1
0
	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)
Exemplo n.º 2
0
	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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
 def class_name(self):
     idx = self.name.rindex('.')
     return escape(self.name[idx + 1:] if idx >= 0 else self.name)
Exemplo n.º 8
0
	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)