Inventory editor now allows items to be dragged from the item list
This commit is contained in:
parent
0775308066
commit
bfeb5c7e94
@ -36,7 +36,7 @@ class LibrarySchematicsTreeModel(QtGui.QFileSystemModel):
|
||||
mimeData.setUrls([QtCore.QUrl.fromLocalFile(self.filePath(index)) for index in indices])
|
||||
return mimeData
|
||||
|
||||
def mimeTypes(self, indices):
|
||||
def mimeTypes(self):
|
||||
return ["text/uri-list"]
|
||||
|
||||
class LibraryWidget(QtGui.QWidget):
|
||||
|
@ -7,4 +7,5 @@ import logging
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class MimeFormats(object):
|
||||
MapItem = "application/x-mcedit-mapitem"
|
||||
MapItem = "application/x-mcedit-mapitem"
|
||||
ItemType = "application/x-mcedit-itemtype"
|
@ -3,24 +3,24 @@
|
||||
"""
|
||||
from __future__ import absolute_import, division, print_function
|
||||
import contextlib
|
||||
import json
|
||||
import logging
|
||||
from mcedit2.command import SimpleRevisionCommand
|
||||
from mceditlib import nbt
|
||||
from mcedit2.util.mimeformats import MimeFormats
|
||||
|
||||
from PySide import QtGui, QtCore
|
||||
from PySide.QtCore import Qt
|
||||
import itertools
|
||||
|
||||
from mcedit2.widgets.itemtype_list import ItemTypeListModel, ItemTypeIcon, ICON_SIZE
|
||||
from mcedit2.widgets.layout import Row, Column
|
||||
from mcedit2.widgets.nbttree.nbteditor import NBTEditorWidget
|
||||
from mceditlib.blocktypes import VERSION_1_7, VERSION_1_8
|
||||
from mceditlib.blocktypes import VERSION_1_7
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class InventoryItemModel(QtCore.QAbstractItemModel):
|
||||
class InventoryItemModel(QtCore.QAbstractListModel):
|
||||
ItemIDRole = Qt.UserRole
|
||||
ItemRawIDRole = ItemIDRole + 1
|
||||
ItemIconRole = ItemRawIDRole + 1
|
||||
@ -79,14 +79,20 @@ class InventoryItemModel(QtCore.QAbstractItemModel):
|
||||
|
||||
return None
|
||||
|
||||
def createSlot(self, slot):
|
||||
if self.itemListRef.getItemInSlot(slot):
|
||||
return
|
||||
return self.itemListRef.createItemInSlot(slot)
|
||||
|
||||
def setData(self, index, value, role):
|
||||
if not index.isValid():
|
||||
return 0
|
||||
|
||||
slot = index.row()
|
||||
log.info("Setting ItemStack %d role %s value %s", slot, role, value)
|
||||
itemStack = self.itemListRef.getItemInSlot(slot)
|
||||
if itemStack is None:
|
||||
return
|
||||
itemStack = self.createSlot(slot)
|
||||
|
||||
if role == self.ItemIDRole:
|
||||
itemStack.id = value
|
||||
@ -122,6 +128,7 @@ class InventoryItemWidget(QtGui.QPushButton):
|
||||
self.setIcon(InventoryItemWidget.BLANK)
|
||||
|
||||
self.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
|
||||
self.setAcceptDrops(True)
|
||||
|
||||
def setCount(self, val):
|
||||
if val == 1:
|
||||
@ -158,6 +165,26 @@ class InventoryItemWidget(QtGui.QPushButton):
|
||||
# painter.strokePath(path, outlinePen)
|
||||
#painter.fillPath(path, fillBrush)
|
||||
|
||||
def dragEnterEvent(self, event):
|
||||
if event.mimeData().hasFormat(MimeFormats.ItemType):
|
||||
event.acceptProposedAction()
|
||||
|
||||
def dropEvent(self, event):
|
||||
if event.mimeData().hasFormat(MimeFormats.ItemType):
|
||||
itemTypesData = str(event.mimeData().data(MimeFormats.ItemType))
|
||||
itemTypes = json.loads(itemTypesData)
|
||||
if len(itemTypes):
|
||||
ID, damage = itemTypes[0]
|
||||
log.info("Dropped item: (%s, %s)", ID, damage)
|
||||
model = self.inventoryView.model
|
||||
if model is not None:
|
||||
index = model.index(self.slotNumber)
|
||||
model.setData(index, ID, InventoryItemModel.ItemIDRole)
|
||||
if damage is not None:
|
||||
model.setData(index, damage, InventoryItemModel.ItemDamageRole)
|
||||
else:
|
||||
log.info("No model")
|
||||
|
||||
|
||||
class InventoryView(QtGui.QWidget):
|
||||
def __init__(self, slotLayout, rows=None, columns=None):
|
||||
@ -266,6 +293,9 @@ class InventoryEditor(QtGui.QWidget):
|
||||
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()
|
||||
@ -499,7 +529,7 @@ class InventoryEditor(QtGui.QWidget):
|
||||
|
||||
def dataWasChanged(self, topLeft, bottomRight):
|
||||
slot = topLeft.row()
|
||||
if slot == self.currentIndex.row():
|
||||
if self.currentIndex and slot == self.currentIndex.row():
|
||||
self.updateFields()
|
||||
|
||||
class InventoryEditCommand(SimpleRevisionCommand):
|
||||
|
@ -2,9 +2,11 @@
|
||||
itemtype_list
|
||||
"""
|
||||
from __future__ import absolute_import, division, print_function
|
||||
import json
|
||||
from PySide import QtCore, QtGui
|
||||
import logging
|
||||
from PySide.QtCore import Qt
|
||||
from mcedit2.util.mimeformats import MimeFormats
|
||||
from mcedit2.widgets.blocktype_list import BlockTypePixmap
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -43,6 +45,23 @@ class ItemTypeListModel(QtCore.QAbstractListModel):
|
||||
if role == self.DamageRole:
|
||||
return itemType.meta
|
||||
|
||||
def flags(self, index):
|
||||
if not index.isValid():
|
||||
return Qt.NoItemFlags
|
||||
return super(ItemTypeListModel, self).flags(index) | Qt.ItemIsDragEnabled
|
||||
|
||||
def mimeTypes(self):
|
||||
return [MimeFormats.ItemType]
|
||||
|
||||
def mimeData(self, indexes):
|
||||
mimeData = QtCore.QMimeData()
|
||||
itemData = [(index.data(self.InternalNameRole), index.data(self.DamageRole))
|
||||
for index in indexes]
|
||||
mapItemData = json.dumps(itemData)
|
||||
mimeData.setData(MimeFormats.ItemType,
|
||||
mapItemData)
|
||||
|
||||
return mimeData
|
||||
|
||||
def ItemTypeIcon(itemType, editorSession, itemStack=None):
|
||||
textureName = itemType.texture
|
||||
|
Reference in New Issue
Block a user