From 73447bee690abee2b00ba691e10f99c769b2abec Mon Sep 17 00:00:00 2001 From: David Vierra Date: Sat, 22 Aug 2015 13:27:24 -1000 Subject: [PATCH] Add custom editor widget for TAG_Long tags in NBT Editor. Should hopefully solve OverflowError caused by coercing a TAG_Long's value to int. --- src/mcedit2/widgets/nbttree/nbteditor.py | 43 +++++++++++++++++++++ src/mcedit2/widgets/nbttree/nbttreemodel.py | 3 ++ 2 files changed, 46 insertions(+) diff --git a/src/mcedit2/widgets/nbttree/nbteditor.py b/src/mcedit2/widgets/nbttree/nbteditor.py index 0cbde61..4e0d696 100644 --- a/src/mcedit2/widgets/nbttree/nbteditor.py +++ b/src/mcedit2/widgets/nbttree/nbteditor.py @@ -3,6 +3,8 @@ """ from __future__ import absolute_import, division, print_function, unicode_literals import logging +from mceditlib import nbt +import re from PySide import QtGui, QtCore from PySide.QtCore import Qt @@ -16,6 +18,46 @@ from mcedit2.widgets.layout import Column log = logging.getLogger(__name__) +longlongPattern = re.compile("^-?\d+$") # only digits with optional leading minus sign + +class LongLongValidator(QtGui.QValidator): + def validate(self, input, pos): + matches = longlongPattern.match(input) + if matches is not None: + return QtGui.QValidator.Acceptable + return QtGui.QValidator.Invalid + +class LongLongLineEdit(QtGui.QLineEdit): + def __init__(self, *a, **kw): + super(LongLongLineEdit, self).__init__(*a, **kw) + self.setValidator(LongLongValidator()) + + def getValue(self): + return long(self.text()) + + def setValue(self, val): + self.setText(str(val)) + + value = QtCore.Property(long, getValue, setValue, user=True) + +class NBTEditorItemDelegate(QtGui.QStyledItemDelegate): + def createEditor(self, parent, option, index): + if index.data(NBTTreeModel.NBTTagTypeRole) == nbt.ID_LONG: + return LongLongLineEdit(parent) + + return super(NBTEditorItemDelegate, self).createEditor(parent, option, index) + + def setEditorData(self, editor, index): + if index.data(NBTTreeModel.NBTTagTypeRole) == nbt.ID_LONG: + editor.setValue(index.data(QtCore.Qt.EditRole)) + else: + super(NBTEditorItemDelegate, self).setEditorData(editor, index) + + def setModelData(self, editor, model, index): + if index.data(NBTTreeModel.NBTTagTypeRole) == nbt.ID_LONG: + model.setData(index, editor.getValue(), QtCore.Qt.EditRole) + else: + super(NBTEditorItemDelegate, self).setModelData(editor, model, index) class NBTDataChangeCommand(SimpleRevisionCommand): pass @@ -52,6 +94,7 @@ class NBTEditorWidget(QtGui.QWidget): self.nbtTypesMenu.addAction(NBTIcon(11), self.tr("Int Array"), self.addIntArray) # self.nbtTypesMenu.addAction(NBTIcon(12), self.tr("Short Array"), self.addShortArray) + self.treeView.setItemDelegate(NBTEditorItemDelegate()) def setRootTagRef(self, rootTagRef, keepExpanded=False): if rootTagRef is self.rootTagRef: diff --git a/src/mcedit2/widgets/nbttree/nbttreemodel.py b/src/mcedit2/widgets/nbttree/nbttreemodel.py index 68e8041..75f65d4 100644 --- a/src/mcedit2/widgets/nbttree/nbttreemodel.py +++ b/src/mcedit2/widgets/nbttree/nbttreemodel.py @@ -276,6 +276,7 @@ class NBTTreeItem(object): class NBTTreeModel(QtCore.QAbstractItemModel): NBTPathRole = QtCore.Qt.UserRole + 1 + NBTTagTypeRole = NBTPathRole + 1 def __init__(self, rootTag, parent=None): super(NBTTreeModel, self).__init__(parent) @@ -326,6 +327,8 @@ class NBTTreeModel(QtCore.QAbstractItemModel): if role == self.NBTPathRole: return item.nbtPath() + if role == self.NBTTagTypeRole: + return item.tag.tagID # --- Structure ---