From bfeb5c7e949a30f480eed4bf04bebaa33099ec3f Mon Sep 17 00:00:00 2001 From: David Vierra Date: Wed, 16 Sep 2015 20:53:02 -1000 Subject: [PATCH] Inventory editor now allows items to be dragged from the item list --- src/mcedit2/library.py | 2 +- src/mcedit2/util/mimeformats.py | 3 +- src/mcedit2/widgets/inventory.py | 42 ++++++++++++++++++++++++---- src/mcedit2/widgets/itemtype_list.py | 19 +++++++++++++ 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/mcedit2/library.py b/src/mcedit2/library.py index d0ada71..c39854d 100644 --- a/src/mcedit2/library.py +++ b/src/mcedit2/library.py @@ -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): diff --git a/src/mcedit2/util/mimeformats.py b/src/mcedit2/util/mimeformats.py index 4fc5e36..583abdd 100644 --- a/src/mcedit2/util/mimeformats.py +++ b/src/mcedit2/util/mimeformats.py @@ -7,4 +7,5 @@ import logging log = logging.getLogger(__name__) class MimeFormats(object): - MapItem = "application/x-mcedit-mapitem" \ No newline at end of file + MapItem = "application/x-mcedit-mapitem" + ItemType = "application/x-mcedit-itemtype" \ No newline at end of file diff --git a/src/mcedit2/widgets/inventory.py b/src/mcedit2/widgets/inventory.py index 2dbb47d..e4f2fba 100644 --- a/src/mcedit2/widgets/inventory.py +++ b/src/mcedit2/widgets/inventory.py @@ -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): diff --git a/src/mcedit2/widgets/itemtype_list.py b/src/mcedit2/widgets/itemtype_list.py index 16ca7d2..2aa5737 100644 --- a/src/mcedit2/widgets/itemtype_list.py +++ b/src/mcedit2/widgets/itemtype_list.py @@ -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