This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
mcedit/editortools/blockpicker.py

211 lines
6.6 KiB
Python

from albow import Label, TextField, Row, TableView, TableColumn, Column, Widget, Button, AttrRef
from albow.dialogs import Dialog
from editortools import thumbview
from editortools import blockview
from glbackground import GLBackground
from mceutils import CheckBoxLabel
from pymclevel import materials
from pymclevel.materials import Block
def anySubtype(self):
bl = Block(self.materials, self.ID, self.blockData)
bl.wildcard = True
return bl
Block.anySubtype = anySubtype
Block.wildcard = False # True if
class BlockPicker(Dialog):
is_gl_container = True
def __init__(self, blockInfo, materials, *a, **kw):
self.allowWildcards = False
Dialog.__init__(self, *a, **kw)
panelWidth = 350
self.materials = materials
self.anySubtype = blockInfo.wildcard
self.matchingBlocks = materials.allBlocks
try:
self.selectedBlockIndex = self.matchingBlocks.index(blockInfo)
except ValueError:
self.selectedBlockIndex = 0
for i, b in enumerate(self.matchingBlocks):
if blockInfo.ID == b.ID and blockInfo.blockData == b.blockData:
self.selectedBlockIndex = i
break
lbl = Label("Search")
# lbl.rect.topleft = (0,0)
fld = TextField(300)
# fld.rect.topleft = (100, 10)
# fld.centery = lbl.centery
# fld.left = lbl.right
fld.change_action = self.textEntered
fld.enter_action = self.ok
fld.escape_action = self.cancel
self.awesomeField = fld
searchRow = Row((lbl, fld))
def formatBlockName(x):
block = self.matchingBlocks[x]
r = "({id}:{data}) {name}".format(name=block.name, id=block.ID, data=block.blockData)
if block.aka:
r += " [{0}]".format(block.aka)
return r
tableview = TableView(columns=[TableColumn(" ", 24, "l", lambda x: ""), TableColumn("(ID) Name [Aliases]", 276, "l", formatBlockName)])
tableicons = [blockview.BlockView(materials) for i in range(tableview.rows.num_rows())]
for t in tableicons:
t.size = (16, 16)
t.margin = 0
icons = Column(tableicons, spacing=2)
# tableview.margin = 5
tableview.num_rows = lambda: len(self.matchingBlocks)
tableview.row_data = lambda x: (self.matchingBlocks[x], x, x)
tableview.row_is_selected = lambda x: x == self.selectedBlockIndex
tableview.click_row = self.selectTableRow
draw_table_cell = tableview.draw_table_cell
def draw_block_table_cell(surf, i, data, cell_rect, column):
if isinstance(data, Block):
tableicons[i - tableview.rows.scroll].blockInfo = data
else:
draw_table_cell(surf, i, data, cell_rect, column)
tableview.draw_table_cell = draw_block_table_cell
tableview.width = panelWidth
tableview.anchor = "lrbt"
# self.add(tableview)
self.tableview = tableview
tableWidget = Widget()
tableWidget.add(tableview)
tableWidget.shrink_wrap()
def wdraw(*args):
for t in tableicons:
t.blockInfo = materials.Air
tableWidget.draw = wdraw
self.blockButton = blockView = thumbview.BlockThumbView(materials, self.blockInfo)
blockView.centerx = self.centerx
blockView.top = tableview.bottom
# self.add(blockview)
but = Button("OK")
but.action = self.ok
but.top = blockView.bottom
but.centerx = self.centerx
but.align = "c"
but.height = 30
if self.allowWildcards:
# self.add(but)
anyRow = CheckBoxLabel("Any Subtype", ref=AttrRef(self, 'anySubtype'), tooltipText="Replace blocks with any data value. Only useful for Replace operations.")
col = Column((searchRow, tableWidget, anyRow, blockView, but))
else:
col = Column((searchRow, tableWidget, blockView, but))
col.anchor = "wh"
self.anchor = "wh"
panel = GLBackground()
panel.bg_color = [i / 255. for i in self.bg_color]
panel.anchor = "tlbr"
self.add(panel)
self.add(col)
self.add(icons)
icons.topleft = tableWidget.topleft
icons.top += tableWidget.margin + 30
icons.left += tableWidget.margin + 4
self.shrink_wrap()
panel.size = self.size
try:
self.tableview.rows.scroll_to_item(self.selectedBlockIndex)
except:
pass
@property
def blockInfo(self):
if len(self.matchingBlocks):
bl = self.matchingBlocks[self.selectedBlockIndex]
if self.anySubtype:
return bl.anySubtype()
else:
return bl
else:
return self.materials.Air
def selectTableRow(self, i, e):
oldIndex = self.selectedBlockIndex
self.selectedBlockIndex = i
self.blockButton.blockInfo = self.blockInfo
if e.num_clicks > 1 and oldIndex == i:
self.ok()
def textEntered(self):
text = self.awesomeField.text
blockData = 0
try:
if ":" in text:
text, num = text.split(":", 1)
blockData = int(num) & 0xf
blockID = int(text) % materials.id_limit
else:
blockID = int(text) % materials.id_limit
block = self.materials.blockWithID(blockID, blockData)
self.matchingBlocks = [block]
self.selectedBlockIndex = 0
self.tableview.rows.scroll_to_item(self.selectedBlockIndex)
self.blockButton.blockInfo = self.blockInfo
return
except ValueError:
pass
except Exception, e:
print repr(e)
blocks = self.materials.allBlocks
matches = blocks
oldBlock = self.materials.Air
if len(self.matchingBlocks):
oldBlock = self.matchingBlocks[self.selectedBlockIndex]
if len(text):
matches = self.materials.blocksMatching(text)
if blockData:
ids = set(b.ID for b in matches)
matches = sorted([self.materials.blockWithID(id, blockData) for id in ids])
self.matchingBlocks = matches
else:
self.matchingBlocks = blocks
if oldBlock in self.matchingBlocks:
self.selectedBlockIndex = self.matchingBlocks.index(oldBlock)
else:
self.selectedBlockIndex = 0
self.tableview.rows.scroll_to_item(self.selectedBlockIndex)
self.blockButton.blockInfo = self.blockInfo