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)))
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)
def test_unknown(self): self.assertEqual(type(value_from_type(object())), UnknownType)
def test_list_simple(self): t = value_from_type([]) self.assertEqual(type(t), ListType) self.assertEqual(type(t.elemtype), UnknownType)
def test_attribute(self): self.assertEqual(type(value_from_type(Attribute("test"))), AttributeType)
def test_lambda_sig(self): t = value_from_type(lambda x: print(x)) self.assertEqual(type(t), LambdaType) self.assertEqual(t.args, ("x",))
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)
def test_effect(self): self.assertEqual( type(value_from_type(Effect("test", 1.0))), EffectType)
def test_modifier(self): self.assertEqual(type(value_from_type(Modifier())), ModifierType)
def test_list_simple_typed(self): t = value_from_type([1, 2, 3]) self.assertEqual(type(t), ListType) self.assertEqual(type(t.elemtype), IntType)
def test_component(self): self.assertEqual(type(value_from_type(Component())), ComponentType)
def test_effect(self): self.assertEqual(type(value_from_type(Effect("test", 1.0))), EffectType)
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)
def test_list_custom_typed(self): t = value_from_type([Component()]) self.assertEqual(type(t), ListType) self.assertEqual(type(t.elemtype), ComponentType)
def test_list_simple_typed(self): t = value_from_type([1, 2, 3]) self.assertEqual(type(t), ListType) self.assertEqual(type(t.elemtype), IntType)
def test_str(self): self.assertEqual(type(value_from_type("Hello")), StrType)
def test_attribute(self): self.assertEqual(type(value_from_type(Attribute("test"))), AttributeType)
def test_list_simple(self): t = value_from_type([]) self.assertEqual(type(t), ListType) self.assertEqual(type(t.elemtype), UnknownType)
def test_lambda_simple(self): self.assertEqual(type(value_from_type(lambda: print("hello"))), LambdaType)
def test_list_custom_typed(self): t = value_from_type([Component()]) self.assertEqual(type(t), ListType) self.assertEqual(type(t.elemtype), ComponentType)
def test_lambda_sig(self): t = value_from_type(lambda x: print(x)) self.assertEqual(type(t), LambdaType) self.assertEqual(t.args, ("x", ))
def test_component(self): self.assertEqual(type(value_from_type(Component())), ComponentType)
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"))
def test_modifier(self): self.assertEqual(type(value_from_type(Modifier())), ModifierType)
def test_unknown(self): self.assertEqual(type(value_from_type(object())), UnknownType)
def test_lambda_simple(self): self.assertEqual(type(value_from_type(lambda : print("hello"))), LambdaType)
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)
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"))
def test_float(self): self.assertEqual(type(value_from_type(1.0)), FloatType)
def test_int(self): self.assertEqual(type(value_from_type(1)), IntType)
def test_str(self): self.assertEqual(type(value_from_type("Hello")), StrType)
def test_float(self): self.assertEqual(type(value_from_type(1.0)), FloatType)
def test_int(self): self.assertEqual(type(value_from_type(1)), IntType)