diff --git a/src/mcedit2/widgets/blockpicker.py b/src/mcedit2/widgets/blockpicker.py index 4feac5e..9e30f6c 100644 --- a/src/mcedit2/widgets/blockpicker.py +++ b/src/mcedit2/widgets/blockpicker.py @@ -56,11 +56,30 @@ log = logging.getLogger(__name__) class BlockTypeIcon(QtGui.QLabel): - def __init__(self, block, textureAtlas, *args, **kwargs): + def __init__(self, block=None, textureAtlas=None, *args, **kwargs): super(BlockTypeIcon, self).__init__(*args, **kwargs) - pixmap = BlockTypePixmap(block, textureAtlas) self.setMinimumSize(32, 32) - self.setPixmap(pixmap) + self.setBlock(block) + self.setTextureAtlas(textureAtlas) + + _block = None + _textureAtlas = None + + def setBlock(self, block): + self._block = block + self.updatePixmap() + + def setTextureAtlas(self, textureAtlas): + self._textureAtlas = textureAtlas + self.updatePixmap() + + def updatePixmap(self): + log.info("Updating BlockTypeIcon with %s\t%s", self._block, self._textureAtlas) + if self._textureAtlas is not None and self._block is not None: + pixmap = BlockTypePixmap(self._block, self._textureAtlas) + self.setPixmap(pixmap) + else: + self.setPixmap(None) @registerCustomWidget @@ -68,10 +87,63 @@ class BlockTypesItemWidget(QtGui.QWidget): def __init__(self, parent=None, blocks=None, textureAtlas=None): super(BlockTypesItemWidget, self).__init__(parent) self.childWidgets = [] - self.mainLayout = None + self.mainLayout = QtGui.QStackedLayout() self.blocks = blocks self.textureAtlas = textureAtlas - self.setLayout(Column()) + self.setLayout(self.mainLayout) + + # Empty layout + self.emptyWidget = QtGui.QFrame() + + # Single-block layout + self.singleBlockIcon = BlockTypeIcon(textureAtlas=textureAtlas) + + self.singleNameLabel = QtGui.QLabel("") + + self.singleInternalNameLabel = QtGui.QLabel("", enabled=False) + + self.singleParentTypeLabel = QtGui.QLabel("") + + labelsColumn = Column(Row(self.singleNameLabel, None, + self.singleParentTypeLabel), + self.singleInternalNameLabel) + + self.singleBlockLayout = Row(self.singleBlockIcon, (labelsColumn, 1)) + self.singleBlockWidget = QtGui.QFrame() + self.singleBlockWidget.setLayout(self.singleBlockLayout) + + # Multi-block layout + multiBlockIcon = QtGui.QFrame() + vSpace = 4 + frameHeight = 64 + multiBlockIcon.setMinimumSize(64, frameHeight) + self.iconLimit = int((frameHeight - 32) / vSpace) + 1 + + self.multiBlockSubIcons = icons = [BlockTypeIcon(textureAtlas=textureAtlas) + for _ in range(self.iconLimit)] + x = 0 + y = 0 + for i, icon in enumerate(icons): + # icon.setMinimumSize(32, 32) + icon.setParent(multiBlockIcon) + icon.setGeometry(x, y, 32, 32) + icon.setFrameStyle(icon.Box) + icon.setLineWidth(1) + x += 18 + if i % 2: + x -= 32 + y += vSpace + + self.multiNameLabel = QtGui.QLabel("", wordWrap=True) + + self.multiBlockLayout = Row(multiBlockIcon, (Column(self.multiNameLabel, None), 1)) + self.multiBlockWidget = QtGui.QFrame() + self.multiBlockWidget.setLayout(self.multiBlockLayout) + + #self.mainLayout.addWidget(self.emptyWidget) + #self.mainLayout.addWidget(self.singleBlockWidget) + #self.mainLayout.addWidget(self.multiBlockWidget) + self.updateContents() def setBlocks(self, blocks): @@ -88,74 +160,44 @@ class BlockTypesItemWidget(QtGui.QWidget): if self.blocks is None or self.textureAtlas is None: return - for child in self.childWidgets: - child.setParent(None) - self.childWidgets = [] - if self.mainLayout: - self.layout().takeAt(0) blocks = self.blocks - textureAtlas = self.textureAtlas - + if self.mainLayout.count(): + self.mainLayout.takeAt(0) if len(blocks) == 0: + self.mainLayout.addWidget(self.emptyWidget) return if len(blocks) == 1: + self.mainLayout.addWidget(self.singleBlockWidget) + block = blocks[0] - blockIcon = BlockTypeIcon(block, textureAtlas) - self.childWidgets.append(blockIcon) - - nameLabel = QtGui.QLabel(block.displayName) - self.childWidgets.append(nameLabel) - + self.singleBlockIcon.setBlock(block) + self.singleBlockIcon.setTextureAtlas(self.textureAtlas) + self.singleNameLabel.setText(block.displayName) + internalNameLimit = 60 internalName = block.internalName + block.blockState if len(internalName) > internalNameLimit: internalName = internalName[:internalNameLimit-3]+"..." - - internalNameLabel = QtGui.QLabel("(%d:%d) %s" % (block.ID, block.meta, internalName), enabled=False) - self.childWidgets.append(internalNameLabel) - - parentTypeLabel = QtGui.QLabel("") - self.childWidgets.append(parentTypeLabel) + self.singleInternalNameLabel.setText("(%d:%d) %s" % (block.ID, block.meta, internalName)) if block.meta != 0: try: parentBlock = block.blocktypeSet[block.internalName] if parentBlock.displayName != block.displayName: - parentTypeLabel.setText("%s" % parentBlock.displayName) + self.singleParentTypeLabel.setText("%s" % parentBlock.displayName) except KeyError: # no parent block; parent block is not meta=0; block was ID:meta typed in pass - - labelsColumn = Column(Row(nameLabel, None, parentTypeLabel), - internalNameLabel) - - self.mainLayout = Row(blockIcon, (labelsColumn, 1)) - self.layout().addLayout(self.mainLayout) - # row.setSizeConstraint(QtGui.QLayout.SetFixedSize) else: - frame = QtGui.QFrame() - self.childWidgets.append(frame) - vSpace = 4 - frameHeight = 64 - frame.setMinimumSize(64, frameHeight) - iconLimit = int((frameHeight - 32) / vSpace) + 1 + self.mainLayout.addWidget(self.multiBlockWidget) - blocksToIcon = blocks[:iconLimit] - icons = [BlockTypeIcon(b, textureAtlas) for b in blocksToIcon] - self.childWidgets.extend(icons) - x = 0 - y = 0 - for i, icon in enumerate(icons): - # icon.setMinimumSize(32, 32) - icon.setParent(frame) - icon.setGeometry(x, y, 32, 32) - icon.setFrameStyle(icon.Box) - icon.setLineWidth(1) - x += 18 - if i % 2: - x -= 32 - y += vSpace + for i in range(self.iconLimit): + icon = self.multiBlockSubIcons[i] + if i < len(blocks): + icon.setBlock(blocks[i]) + else: + icon.setBlock(None) nameLimit = 6 remaining = len(blocks) - nameLimit @@ -163,14 +205,9 @@ class BlockTypesItemWidget(QtGui.QWidget): iconNames = ", ".join(b.displayName for b in blocksToName) if remaining > 0: iconNames += " and %d more..." % remaining + self.multiNameLabel.setText(iconNames) - namesLabel = QtGui.QLabel(iconNames, wordWrap=True) - self.childWidgets.append(namesLabel) - - self.mainLayout = Row(frame, (Column(namesLabel, None), 1)) - self.layout().addLayout(self.mainLayout) - - self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + #self.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) class BlockTypeListFilterModel(QtGui.QSortFilterProxyModel):