Esempio n. 1
0
    def _load_components(self, item, component):
        """Recursive convenience function for loading in components into
        a higher level component"""
        component_item = QtWidgets.QTreeWidgetItem([type(component).__name__])
        component_item.setData(0, QtCore.Qt.UserRole, component)
        item.addChild(component_item)
        parameters = typecheck(type(component))
        for parameter, ptype in parameters.items():
            # Parameter item
            para_item = QtWidgets.QTreeWidgetItem(
                ["%s : <%s>" % (parameter, str(ptype))])
            component_item.addChild(para_item)
            # Attempt to fill in the value
            value = valuecheck(component, parameter)
            if value is not None:
                self._load_parameter(para_item, ptype, value)
            else:
                para_item.addChild(QtWidgets.QTreeWidgetItem([""]))

            # Recover type if value is known
            if type(ptype) == UnknownType and value != None:
                para_item.takeChildren()
                derived_type = value_from_type(value)
                self._load_parameter(para_item, derived_type, value)
                para_item.setText(0,
                                  "%s : <%s>" % (parameter, str(derived_type)))
Esempio n. 2
0
    def load_context(self, point):
        """Helper function to load the proper context menu for a component"""
        components_table = self.parent.findChild(QtWidgets.QTreeWidget,
                                                 "componentList")
        global_point = components_table.mapToGlobal(point)
        item = components_table.itemAt(point)
        if item is not None:
            parent_data = None
            item_data = item.data(0, QtCore.Qt.UserRole)

            menu = QtWidgets.QMenu(self.parent)
            if item.parent():
                parent_data = item.parent().data(0, QtCore.Qt.UserRole)

            item_type = value_from_type(item_data)  # Bugged
            parent_type = value_from_type(parent_data)

            # Add context menu actions
            if isinstance(item_type, ListType):
                # Add to list
                action = QtWidgets.QAction(
                    "Add " + str(item_type.elemtype).title(), self.parent)
                action.setData((item_data, parent_data, item))
                menu.addAction(action)
            if isinstance(item_data, Move):
                # Top level widget
                action = QtWidgets.QAction("Add Component", self.parent)
                action.setData((item_data, parent_data, item))
                menu.addAction(action)
            if isinstance(parent_type, ListType) or \
                    isinstance(parent_data, Move):
                # Remove from a list
                action = QtWidgets.QAction("Remove", self.parent)
                action.setData((item_data, parent_data, item))
                menu.addAction(action)
            # Edge end cases and component lists
            if isinstance(item_type, (UnknownType, IntType, StrType,
                    FloatType, LambdaType)) and item_data is not None and \
                    not isinstance(item_data, Move):
                # Update value
                action = QtWidgets.QAction("Modify", self.parent)
                action.setData((item_data, parent_data, item))
                menu.addAction(action)

            if menu.actions():
                menu.triggered.connect(self.dispatch_component_action)
                menu.exec_(global_point)
Esempio n. 3
0
 def test_unknown(self):
     self.assertEqual(type(value_from_type(object())), UnknownType)
Esempio n. 4
0
 def test_list_simple(self):
     t = value_from_type([])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), UnknownType)
Esempio n. 5
0
 def test_attribute(self):
     self.assertEqual(type(value_from_type(Attribute("test"))), AttributeType)
Esempio n. 6
0
 def test_lambda_sig(self):
     t = value_from_type(lambda x: print(x))
     self.assertEqual(type(t), LambdaType)
     self.assertEqual(t.args, ("x",))
Esempio n. 7
0
 def test_list_complex_type(self):
     t = value_from_type([[1], [2], [3]])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), ListType)
     self.assertEqual(type(t.elemtype.elemtype), IntType)
Esempio n. 8
0
 def test_effect(self):
     self.assertEqual(
         type(value_from_type(Effect("test", 1.0))), EffectType)
Esempio n. 9
0
 def test_modifier(self):
     self.assertEqual(type(value_from_type(Modifier())), ModifierType)
Esempio n. 10
0
 def test_list_simple_typed(self):
     t = value_from_type([1, 2, 3])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), IntType)
Esempio n. 11
0
 def test_component(self):
     self.assertEqual(type(value_from_type(Component())), ComponentType)
Esempio n. 12
0
 def test_effect(self):
     self.assertEqual(type(value_from_type(Effect("test", 1.0))),
                      EffectType)
Esempio n. 13
0
 def test_list_complex_type(self):
     t = value_from_type([[1], [2], [3]])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), ListType)
     self.assertEqual(type(t.elemtype.elemtype), IntType)
Esempio n. 14
0
 def test_list_custom_typed(self):
     t = value_from_type([Component()])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), ComponentType)
Esempio n. 15
0
 def test_list_simple_typed(self):
     t = value_from_type([1, 2, 3])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), IntType)
Esempio n. 16
0
 def test_str(self):
     self.assertEqual(type(value_from_type("Hello")), StrType)
Esempio n. 17
0
 def test_attribute(self):
     self.assertEqual(type(value_from_type(Attribute("test"))),
                      AttributeType)
Esempio n. 18
0
 def test_list_simple(self):
     t = value_from_type([])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), UnknownType)
Esempio n. 19
0
 def test_lambda_simple(self):
     self.assertEqual(type(value_from_type(lambda: print("hello"))),
                      LambdaType)
Esempio n. 20
0
 def test_list_custom_typed(self):
     t = value_from_type([Component()])
     self.assertEqual(type(t), ListType)
     self.assertEqual(type(t.elemtype), ComponentType)
Esempio n. 21
0
 def test_lambda_sig(self):
     t = value_from_type(lambda x: print(x))
     self.assertEqual(type(t), LambdaType)
     self.assertEqual(t.args, ("x", ))
Esempio n. 22
0
 def test_component(self):
     self.assertEqual(type(value_from_type(Component())), ComponentType)
Esempio n. 23
0
 def test_lambda_multi_sig(self):
     t = value_from_type(lambda x, y, z: print(x, y, z))
     self.assertEqual(type(t), LambdaType)
     self.assertEqual(t.args, ("x", "y", "z"))
Esempio n. 24
0
 def test_modifier(self):
     self.assertEqual(type(value_from_type(Modifier())), ModifierType)
Esempio n. 25
0
 def test_unknown(self):
     self.assertEqual(type(value_from_type(object())), UnknownType)
Esempio n. 26
0
 def test_lambda_simple(self):
     self.assertEqual(type(value_from_type(lambda : print("hello"))),
         LambdaType)
Esempio n. 27
0
    def dispatch_component_action(self, action):
        item_data, parent_data, item = action.data()
        if action.text() == "Remove":
            if isinstance(parent_data, Move):
                # Remove component from list
                if item.parent().text(0) == "<Components>":
                    parent_data.components.remove(item_data)
                elif item.parent().text(0) == "<MissComponents>":
                    parent_data.miss_components.remove(item_data)
                elif item.parent().text(0) == "<CritComponents>":
                    parent_data.crit_components.remove(item_data)
                item.parent().removeChild(item)
            else:
                parent_data.remove(item_data)
                item.parent().removeChild(item)
        elif action.text() == "Modify":
            match = re.match(r"(\w+) : <(.+)>", item.text(0))
            if match:
                parameter = match.group(1)
                type_hint = match.group(2)
                if type_hint == "float":
                    itype = FloatType()
                elif type_hint == "int":
                    itype = IntType()
                elif type_hint == "str":
                    itype = StrType()
                else:
                    itype = value_from_type(item_data)

                if isinstance(itype, UnknownType):
                    code, ok = QtWidgets.QInputDialog.getText(
                        self.parent, 'Modify', 'Python code:')
                    if ok:
                        try:
                            value = eval(code)
                            assign_value(parent_data, parameter, value)
                        except:
                            QtWidgets.QMessageBox.warning(
                                self.parent, "Python Error",
                                traceback.format_exc())
                        item.child(0).setText(0, str(value))
                elif isinstance(itype, IntType):
                    value, ok = QtWidgets.QInputDialog.getInt(
                        self.parent, 'Modify', ' Integer:')
                    if ok:
                        assign_value(parent_data, parameter, value)
                        item.child(0).setText(0, str(value))
                elif isinstance(itype, FloatType):
                    value, ok = QtWidgets.QInputDialog.getDouble(
                        self.parent, 'Modify', ' Float:')
                    if ok:
                        assign_value(parent_data, parameter, value)
                        item.child(0).setText(0, str(value))
                elif isinstance(itype, StrType):
                    value, ok = QtWidgets.QInputDialog.getText(
                        self.parent, 'Modify', ' String:')
                    if ok:
                        assign_value(parent_data, parameter, value)
                        item.child(0).setText(0, str(value))
                elif isinstance(itype, LambdaType):
                    code, ok = QtWidgets.QInputDialog.getText(
                        self.parent, 'Modify', 'Python code:')
                    if ok:
                        try:
                            value = eval(code)
                            assign_value(parent_data, parameter, value)
                        except:
                            QtWidgets.QMessageBox.warning(
                                self.parent, "Python Error",
                                traceback.format_exc())
        else:
            if isinstance(item_data, Move):
                # Add component to list
                if item.text(0) == "<Components>":
                    prompt = ClassPrompt(
                        self.parent, assets.moves.components, Component,
                        partial(self._add_standard_component, item))
                    prompt.show()
                elif item.text(0) == "<MissComponents>":
                    prompt = ClassPrompt(
                        self.parent, assets.moves.components, Component,
                        partial(self._add_miss_component, item))
                    prompt.show()
                elif item.text(0) == "<CritComponents>":
                    prompt = ClassPrompt(
                        self.parent, assets.moves.components, Component,
                        partial(self._add_crit_component, item))
                    prompt.show()
            else:
                # Adding to component list
                match = re.match(r"(\w+) : <(.+)>", item.text(0))
                itype = ListType(UnknownType())
                if match:
                    itype = get_type(match.group(2))
                etype = itype.elemtype

                if isinstance(etype, IntType):
                    value, ok = QtWidgets.QInputDialog.getInt(
                        self.parent, 'Modify', ' Integer:')
                    if ok:
                        item_data.append(value)
                        self._load_parameter(item, etype, value)
                elif isinstance(etype, FloatType):
                    value, ok = QtWidgets.QInputDialog.getDouble(
                        self.parent, 'Modify', ' Float:')
                    if ok:
                        item_data.append(value)
                        self._load_parameter(item, etype, value)
                elif isinstance(etype, StrType):
                    value, ok = QtWidgets.QInputDialog.getText(
                        self.parent, 'Modify', ' String:')
                    if ok:
                        item_data.append(value)
                        self._load_parameter(item, etype, value)
                elif isinstance(etype, LambdaType):
                    code, ok = QtWidgets.QInputDialog.getText(
                        self.parent, 'Modify', 'Python code:')
                    if ok:
                        try:
                            value = eval(code)
                            item_data.append(value)
                            self._load_parameter(item, etype, value)
                        except:
                            QtWidgets.QMessageBox.warning(
                                self.parent, "Python Error",
                                traceback.format_exc())
                elif isinstance(etype, ListType):
                    prompt = editor.core.prompt.list_prompt.ListPrompt(
                        self, etype.elemtype, item_data,
                        partial(self._add_standard_component, item))
                    prompt.show()
                elif isinstance(etype, ComponentType):
                    prompt = ClassPrompt(
                        self.parent, assets.moves.components, Component,
                        partial(self._add_standard_component, item))
                    prompt.show()
                elif isinstance(etype, AttributeType):
                    prompt = ClassPrompt(self.parent, assets.attributes,
                                         Attribute,
                                         partial(self.add_to_list, item_data))
                    prompt.show()
                elif isinstance(etype, EffectType):
                    prompt = ClassPrompt(self.parent, assets.effects, Effect,
                                         partial(self.add_to_list, item_data))
                    prompt.show()
                elif isinstance(etype, ModifierType):
                    prompt = ClassPrompt(self.parent, assets.moves.modifiers,
                                         Modifier,
                                         partial(self.add_to_list, item_data))
                    prompt.show()
                elif isinstance(etype, UnknownType):
                    code, ok = QtWidgets.QInputDialog.getText(
                        self.parent, 'Modify', 'Python code:')
                    if ok:
                        try:
                            value = eval(code)
                            assign_value(parent_data, parameter, value)
                        except:
                            QtWidgets.QMessageBox.warning(
                                self.parent, "Python Error",
                                traceback.format_exc())
                        item_data.append(value)
                        self._load_parameter(item, etype, value)
Esempio n. 28
0
 def test_lambda_multi_sig(self):
     t = value_from_type(lambda x, y, z: print(x, y, z))
     self.assertEqual(type(t), LambdaType)
     self.assertEqual(t.args, ("x", "y", "z"))
Esempio n. 29
0
 def test_float(self):
     self.assertEqual(type(value_from_type(1.0)), FloatType)
Esempio n. 30
0
 def test_int(self):
     self.assertEqual(type(value_from_type(1)), IntType)
Esempio n. 31
0
 def test_str(self):
     self.assertEqual(type(value_from_type("Hello")), StrType)
Esempio n. 32
0
 def test_float(self):
     self.assertEqual(type(value_from_type(1.0)), FloatType)
Esempio n. 33
0
 def test_int(self):
     self.assertEqual(type(value_from_type(1)), IntType)