def __init__(self, slotLayout, rows=None, columns=None): """ slotLayout should be a list of (x, y, slotNumber) tuples. rows and columns are optional. Pass them if you need the grid to be larger than the slotLayout. :param slotLayout: :type slotLayout: list[tuple(int, int, int)] :type rows: int | None :type columns: int | None :return: :rtype: """ super(InventoryEditor, self).__init__() self.inventoryView = InventoryView(slotLayout, rows, columns) self.inventoryView.slotClicked.connect(self.slotWasClicked) self.itemList = QtGui.QListView() self.itemList.setMinimumWidth(200) self.itemList.clicked.connect(self.itemTypeChanged) self.itemList.setDragEnabled(True) self.itemList.setDragDropMode(QtGui.QAbstractItemView.DragOnly) self.itemListModel = None self.itemListSearchBox = QtGui.QComboBox() self.itemListSearchBox.editTextChanged.connect(self.searchTextChanged) self.itemListSearchBox.setEditable(True) self.inventoryModel = None self.internalNameField = QtGui.QLineEdit() self.internalNameField.textChanged.connect(self.internalNameChanged) self.rawIDInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.rawIDInput.setMaximumWidth(100) self.rawIDInput.valueChanged.connect(self.rawIDChanged) self.damageInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.damageInput.valueChanged.connect(self.damageChanged) self.countInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.countInput.valueChanged.connect(self.countChanged) self.rawIDCheckbox = QtGui.QCheckBox("Edit raw ID") self.rawIDCheckbox.toggled.connect(self.rawIDInput.setEnabled) self.itemNBTEditor = NBTEditorWidget() self.itemNBTEditor.tagValueChanged.connect(self.tagValueDidChange) self.currentIndex = None self.itemNameLabel = QtGui.QLabel() self.setLayout(Column(Row(self.inventoryView, Column(self.itemListSearchBox, self.itemList)), Row(QtGui.QLabel("Selected item:"), self.itemNameLabel, None), Row(QtGui.QLabel("Internal Name"), self.internalNameField, self.rawIDCheckbox, self.rawIDInput, QtGui.QLabel("Damage"), self.damageInput, QtGui.QLabel("Count"), self.countInput), (self.itemNBTEditor, 1))) self.enableFields(False)
def __init__(self, slotLayout, rows=None, columns=None): """ slotLayout should be a list of (x, y, slotNumber) tuples. rows and columns are optional. Pass them if you need the grid to be larger than the slotLayout. :param slotLayout: :type slotLayout: list[tuple(int, int, int)] :type rows: int | None :type columns: int | None :return: :rtype: """ super(InventoryEditor, self).__init__() self.inventoryView = InventoryView(slotLayout, rows, columns) self.inventoryView.slotClicked.connect(self.slotWasClicked) self.itemList = QtGui.QListView() self.itemList.setMinimumWidth(200) self.itemList.clicked.connect(self.itemTypeChanged) self.itemList.setDragEnabled(True) self.itemList.setDragDropMode(QtGui.QAbstractItemView.DragOnly) self.itemListModel = None self.itemListSearchBox = QtGui.QComboBox() self.itemListSearchBox.editTextChanged.connect(self.searchTextChanged) self.itemListSearchBox.setEditable(True) self.inventoryModel = None self.internalNameField = QtGui.QLineEdit() self.internalNameField.textChanged.connect(self.internalNameChanged) self.rawIDInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.rawIDInput.setMaximumWidth(100) self.rawIDInput.valueChanged.connect(self.rawIDChanged) self.damageInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.damageInput.valueChanged.connect(self.damageChanged) self.countInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.countInput.valueChanged.connect(self.countChanged) self.rawIDCheckbox = QtGui.QCheckBox("Edit raw ID") self.rawIDCheckbox.toggled.connect(self.rawIDInput.setEnabled) self.itemNBTEditor = NBTEditorWidget() self.itemNBTEditor.tagValueChanged.connect(self.tagValueDidChange) self.currentIndex = None self.itemNameLabel = QtGui.QLabel() self.setLayout( Column( Row(self.inventoryView, Column(self.itemListSearchBox, self.itemList)), Row(QtGui.QLabel("Selected item:"), self.itemNameLabel, None), Row(QtGui.QLabel("Internal Name"), self.internalNameField, self.rawIDCheckbox, self.rawIDInput, QtGui.QLabel("Damage"), self.damageInput, QtGui.QLabel("Count"), self.countInput), (self.itemNBTEditor, 1))) self.enableFields(False)
class InventoryEditor(QtGui.QWidget): def __init__(self, slotLayout, rows=None, columns=None): """ slotLayout should be a list of (x, y, slotNumber) tuples. rows and columns are optional. Pass them if you need the grid to be larger than the slotLayout. :param slotLayout: :type slotLayout: list[tuple(int, int, int)] :type rows: int | None :type columns: int | None :return: :rtype: """ super(InventoryEditor, self).__init__() self.inventoryView = InventoryView(slotLayout, rows, columns) self.inventoryView.slotClicked.connect(self.slotWasClicked) self.itemList = QtGui.QListView() self.itemList.setMinimumWidth(200) self.itemList.clicked.connect(self.itemTypeChanged) self.itemList.setDragEnabled(True) self.itemList.setDragDropMode(QtGui.QAbstractItemView.DragOnly) self.itemListModel = None self.itemListSearchBox = QtGui.QComboBox() self.itemListSearchBox.editTextChanged.connect(self.searchTextChanged) self.itemListSearchBox.setEditable(True) self.inventoryModel = None self.internalNameField = QtGui.QLineEdit() self.internalNameField.textChanged.connect(self.internalNameChanged) self.rawIDInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.rawIDInput.setMaximumWidth(100) self.rawIDInput.valueChanged.connect(self.rawIDChanged) self.damageInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.damageInput.valueChanged.connect(self.damageChanged) self.countInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.countInput.valueChanged.connect(self.countChanged) self.rawIDCheckbox = QtGui.QCheckBox("Edit raw ID") self.rawIDCheckbox.toggled.connect(self.rawIDInput.setEnabled) self.itemNBTEditor = NBTEditorWidget() self.itemNBTEditor.tagValueChanged.connect(self.tagValueDidChange) self.currentIndex = None self.itemNameLabel = QtGui.QLabel() self.setLayout(Column(Row(self.inventoryView, Column(self.itemListSearchBox, self.itemList)), Row(QtGui.QLabel("Selected item:"), self.itemNameLabel, None), Row(QtGui.QLabel("Internal Name"), self.internalNameField, self.rawIDCheckbox, self.rawIDInput, QtGui.QLabel("Damage"), self.damageInput, QtGui.QLabel("Count"), self.countInput), (self.itemNBTEditor, 1))) self.enableFields(False) def enableFields(self, enabled): enabled = enabled and not self.editorSession.readonly self.internalNameField.setEnabled(enabled) self.rawIDInput.setEnabled(enabled) self.rawIDCheckbox.setEnabled(enabled) self.damageInput.setEnabled(enabled) self.countInput.setEnabled(enabled) self.itemNBTEditor.setEnabled(enabled) def showFieldsForVersion(self, version): oneSeven = version == VERSION_1_7 self.rawIDCheckbox.setVisible(oneSeven) self.rawIDInput.setVisible(oneSeven) editsDisabled = False @contextlib.contextmanager def disableEdits(self): self.editsDisabled = True yield self.editsDisabled = False def slotWasClicked(self, slotNumber): self.currentIndex = self.inventoryModel.index(slotNumber) self.updateFields() def tagValueDidChange(self, tagPath): self.updateFields() def updateFields(self): with self.disableEdits(): self._updateFields() def _updateFields(self): index = self.currentIndex version = self._itemListRef.blockTypes.itemStackVersion self.showFieldsForVersion(version) internalName = index.data(InventoryItemModel.ItemIDRole) if internalName is None: self.enableFields(False) self.internalNameField.setText("") self.rawIDInput.setValue(0) self.damageInput.setValue(0) self.countInput.setValue(0) return else: self.enableFields(True) if isinstance(internalName, basestring): self.internalNameField.setText(internalName) else: self.internalNameField.setText("") self.rawIDCheckbox.setChecked(True) if self.inventoryRef.blockTypes.itemStackVersion == VERSION_1_7: rawID = index.data(InventoryItemModel.ItemRawIDRole) self.rawIDCheckbox.setEnabled(True) self.rawIDInput.setEnabled(self.rawIDCheckbox.isChecked()) self.rawIDInput.setValue(rawID) else: self.rawIDCheckbox.setEnabled(False) self.rawIDInput.setEnabled(False) damage = index.data(InventoryItemModel.ItemDamageRole) self.damageInput.setValue(damage) count = index.data(InventoryItemModel.ItemCountRole) self.countInput.setValue(count) tagRef = self._itemListRef.getItemInSlot(index.row()) self.itemNBTEditor.setRootTagRef(tagRef) displayName = index.data(InventoryItemModel.ItemDisplayNameRole) self.itemNameLabel.setText(displayName) def searchTextChanged(self, value): self.proxyModel = QtGui.QSortFilterProxyModel() self.proxyModel.setSourceModel(self.itemListModel) self.proxyModel.setFilterFixedString(value) self.proxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.itemList.setModel(self.proxyModel) def itemTypeChanged(self, index): if self.currentIndex is None or self.itemListModel is None: return if self.editsDisabled or self.editorSession.readonly: return internalName = index.data(ItemTypeListModel.InternalNameRole) damage = index.data(ItemTypeListModel.DamageRole) command = InventoryEditCommand(self.editorSession, self.tr("Change item type")) with command.begin(): self.inventoryModel.setData(self.currentIndex, internalName, InventoryItemModel.ItemIDRole) if damage is not None: self.inventoryModel.setData(self.currentIndex, damage, InventoryItemModel.ItemDamageRole) self.editorSession.pushCommand(command) def internalNameChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return if self.inventoryRef.blockTypes.itemStackVersion == VERSION_1_7: try: itemType = self.editorSession.worldEditor.blocktypes.itemTypes[value] except KeyError: return command = InventoryEditCommand(self.editorSession, self.tr("Change item type")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemIDRole) self.editorSession.pushCommand(command) def rawIDChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return command = InventoryEditCommand(self.editorSession, self.tr("Change item's raw ID")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemRawIDRole) self.editorSession.pushCommand(command) def damageChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return command = InventoryEditCommand(self.editorSession, self.tr("Change item damage")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemDamageRole) self.editorSession.pushCommand(command) def countChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return command = InventoryEditCommand(self.editorSession, self.tr("Change item count")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemCountRole) self.editorSession.pushCommand(command) _editorSession = None @property def editorSession(self): return self._editorSession @editorSession.setter def editorSession(self, value): self._editorSession = value self.updateModels() _itemListRef = None @property def inventoryRef(self): return self._itemListRef @inventoryRef.setter def inventoryRef(self, value): self._itemListRef = value self.updateModels() def updateModels(self): if self._editorSession is None or self._itemListRef is None: return self.currentIndex = None self.enableFields(False) self.inventoryModel = InventoryItemModel(self._itemListRef, self._editorSession) self.inventoryView.setModel(self.inventoryModel) self.inventoryModel.dataChanged.connect(self.dataWasChanged) self.itemListModel = ItemTypeListModel(self._editorSession) self.itemList.setModel(self.itemListModel) self.itemNBTEditor.editorSession = self._editorSession def dataWasChanged(self, topLeft, bottomRight): slot = topLeft.row() if self.currentIndex and slot == self.currentIndex.row(): self.updateFields()
class InventoryEditor(QtGui.QWidget): def __init__(self, slotLayout, rows=None, columns=None): """ slotLayout should be a list of (x, y, slotNumber) tuples. rows and columns are optional. Pass them if you need the grid to be larger than the slotLayout. :param slotLayout: :type slotLayout: list[tuple(int, int, int)] :type rows: int | None :type columns: int | None :return: :rtype: """ super(InventoryEditor, self).__init__() self.inventoryView = InventoryView(slotLayout, rows, columns) self.inventoryView.slotClicked.connect(self.slotWasClicked) self.itemList = QtGui.QListView() self.itemList.setMinimumWidth(200) self.itemList.clicked.connect(self.itemTypeChanged) self.itemList.setDragEnabled(True) self.itemList.setDragDropMode(QtGui.QAbstractItemView.DragOnly) self.itemListModel = None self.itemListSearchBox = QtGui.QComboBox() self.itemListSearchBox.editTextChanged.connect(self.searchTextChanged) self.itemListSearchBox.setEditable(True) self.inventoryModel = None self.internalNameField = QtGui.QLineEdit() self.internalNameField.textChanged.connect(self.internalNameChanged) self.rawIDInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.rawIDInput.setMaximumWidth(100) self.rawIDInput.valueChanged.connect(self.rawIDChanged) self.damageInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.damageInput.valueChanged.connect(self.damageChanged) self.countInput = QtGui.QSpinBox(minimum=-32768, maximum=32767) self.countInput.valueChanged.connect(self.countChanged) self.rawIDCheckbox = QtGui.QCheckBox("Edit raw ID") self.rawIDCheckbox.toggled.connect(self.rawIDInput.setEnabled) self.itemNBTEditor = NBTEditorWidget() self.itemNBTEditor.tagValueChanged.connect(self.tagValueDidChange) self.currentIndex = None self.itemNameLabel = QtGui.QLabel() self.setLayout( Column( Row(self.inventoryView, Column(self.itemListSearchBox, self.itemList)), Row(QtGui.QLabel("Selected item:"), self.itemNameLabel, None), Row(QtGui.QLabel("Internal Name"), self.internalNameField, self.rawIDCheckbox, self.rawIDInput, QtGui.QLabel("Damage"), self.damageInput, QtGui.QLabel("Count"), self.countInput), (self.itemNBTEditor, 1))) self.enableFields(False) def enableFields(self, enabled): self.internalNameField.setEnabled(enabled) self.rawIDInput.setEnabled(enabled) self.rawIDCheckbox.setEnabled(enabled) self.damageInput.setEnabled(enabled) self.countInput.setEnabled(enabled) self.itemNBTEditor.setEnabled(enabled) def showFieldsForVersion(self, version): oneSeven = version == VERSION_1_7 self.rawIDCheckbox.setVisible(oneSeven) self.rawIDInput.setVisible(oneSeven) editsDisabled = False @contextlib.contextmanager def disableEdits(self): self.editsDisabled = True yield self.editsDisabled = False def slotWasClicked(self, slotNumber): self.currentIndex = self.inventoryModel.index(slotNumber) self.updateFields() def tagValueDidChange(self, tagPath): self.updateFields() def updateFields(self): with self.disableEdits(): self._updateFields() def _updateFields(self): index = self.currentIndex version = self._itemListRef.blockTypes.itemStackVersion self.showFieldsForVersion(version) internalName = index.data(InventoryItemModel.ItemIDRole) if internalName is None: self.enableFields(False) self.internalNameField.setText("") self.rawIDInput.setValue(0) self.damageInput.setValue(0) self.countInput.setValue(0) return else: self.enableFields(True) if isinstance(internalName, basestring): self.internalNameField.setText(internalName) else: self.internalNameField.setText("") self.rawIDCheckbox.setChecked(True) if self.inventoryRef.blockTypes.itemStackVersion == VERSION_1_7: rawID = index.data(InventoryItemModel.ItemRawIDRole) self.rawIDCheckbox.setEnabled(True) self.rawIDInput.setEnabled(self.rawIDCheckbox.isChecked()) self.rawIDInput.setValue(rawID) else: self.rawIDCheckbox.setEnabled(False) self.rawIDInput.setEnabled(False) damage = index.data(InventoryItemModel.ItemDamageRole) self.damageInput.setValue(damage) count = index.data(InventoryItemModel.ItemCountRole) self.countInput.setValue(count) tagRef = self._itemListRef.getItemInSlot(index.row()) self.itemNBTEditor.setRootTagRef(tagRef) displayName = index.data(InventoryItemModel.ItemDisplayNameRole) self.itemNameLabel.setText(displayName) def searchTextChanged(self, value): self.proxyModel = QtGui.QSortFilterProxyModel() self.proxyModel.setSourceModel(self.itemListModel) self.proxyModel.setFilterFixedString(value) self.proxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive) self.itemList.setModel(self.proxyModel) def itemTypeChanged(self, index): if self.currentIndex is None or self.itemListModel is None: return if self.editsDisabled: return internalName = index.data(ItemTypeListModel.InternalNameRole) damage = index.data(ItemTypeListModel.DamageRole) command = InventoryEditCommand(self.editorSession, self.tr("Change item type")) with command.begin(): self.inventoryModel.setData(self.currentIndex, internalName, InventoryItemModel.ItemIDRole) if damage is not None: self.inventoryModel.setData(self.currentIndex, damage, InventoryItemModel.ItemDamageRole) self.editorSession.pushCommand(command) def internalNameChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return if self.inventoryRef.blockTypes.itemStackVersion == VERSION_1_7: try: itemType = self.editorSession.worldEditor.blocktypes.itemTypes[ value] except KeyError: return command = InventoryEditCommand(self.editorSession, self.tr("Change item type")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemIDRole) self.editorSession.pushCommand(command) def rawIDChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return command = InventoryEditCommand(self.editorSession, self.tr("Change item's raw ID")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemRawIDRole) self.editorSession.pushCommand(command) def damageChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return command = InventoryEditCommand(self.editorSession, self.tr("Change item damage")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemDamageRole) self.editorSession.pushCommand(command) def countChanged(self, value): if self.currentIndex is None: return if self.editsDisabled: return command = InventoryEditCommand(self.editorSession, self.tr("Change item count")) with command.begin(): self.inventoryModel.setData(self.currentIndex, value, InventoryItemModel.ItemCountRole) self.editorSession.pushCommand(command) _editorSession = None @property def editorSession(self): return self._editorSession @editorSession.setter def editorSession(self, value): self._editorSession = value self.updateModels() _itemListRef = None @property def inventoryRef(self): return self._itemListRef @inventoryRef.setter def inventoryRef(self, value): self._itemListRef = value self.updateModels() def updateModels(self): if self._editorSession is None or self._itemListRef is None: return self.currentIndex = None self.enableFields(False) self.inventoryModel = InventoryItemModel(self._itemListRef, self._editorSession) self.inventoryView.setModel(self.inventoryModel) self.inventoryModel.dataChanged.connect(self.dataWasChanged) self.itemListModel = ItemTypeListModel(self._editorSession) self.itemList.setModel(self.itemListModel) self.itemNBTEditor.editorSession = self._editorSession def dataWasChanged(self, topLeft, bottomRight): slot = topLeft.row() if self.currentIndex and slot == self.currentIndex.row(): self.updateFields()