Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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()