Source code for editortools.blockview

from OpenGL import GL

from numpy import array
from albow import ButtonBase, ValueDisplay, AttrRef, Row
from albow.openglwidgets import GLOrtho
import thumbview
import blockpicker
from glbackground import Panel, GLBackground
from glutils import DisplayList

#&# Prototype for blocks/items names
import mclangres
#&#

[docs]class BlockView(GLOrtho): def __init__(self, materials, blockInfo=None): GLOrtho.__init__(self) self.list = DisplayList(self._gl_draw) self.blockInfo = blockInfo or materials.Air self.materials = materials listBlockInfo = None
[docs] def gl_draw(self): if self.listBlockInfo != self.blockInfo: self.list.invalidate() self.listBlockInfo = self.blockInfo self.list.call()
def _gl_draw(self): blockInfo = self.blockInfo if blockInfo.ID is 0: return GL.glColor(1.0, 1.0, 1.0, 1.0) GL.glEnable(GL.GL_TEXTURE_2D) GL.glEnable(GL.GL_ALPHA_TEST) self.materials.terrainTexture.bind() pixelScale = 0.5 if self.materials.name in ("Pocket", "Alpha") else 1.0 texSize = 16 * pixelScale GL.glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY) GL.glVertexPointer(2, GL.GL_FLOAT, 0, array([-1, -1, - 1, 1, 1, 1, 1, -1, ], dtype='float32')) # hack to get end rod to render properly # we really should use json models? if blockInfo.ID == 198: texOrigin = array([17*16, 20*16]) else: texOrigin = array(self.materials.blockTextures[blockInfo.ID, blockInfo.blockData, 0]) texOrigin = texOrigin.astype(float) * pixelScale GL.glTexCoordPointer(2, GL.GL_FLOAT, 0, array([texOrigin[0], texOrigin[1] + texSize, texOrigin[0], texOrigin[1], texOrigin[0] + texSize, texOrigin[1], texOrigin[0] + texSize, texOrigin[1] + texSize], dtype='float32')) GL.glDrawArrays(GL.GL_QUADS, 0, 4) GL.glDisableClientState(GL.GL_TEXTURE_COORD_ARRAY) GL.glDisable(GL.GL_ALPHA_TEST) GL.glDisable(GL.GL_TEXTURE_2D) @property def tooltipText(self): #&# Prototype for blocks/items names #return str(self.blockInfo.name) return mclangres.translate(self.blockInfo.name) #&#
[docs]class BlockButton(ButtonBase, Panel): _ref = None def __init__(self, materials, blockInfo=None, ref=None, recentBlocks=None, *a, **kw): self.allowWildcards = False if 'name' not in kw.keys(): kw['name'] = 'Panel.BlockButton' Panel.__init__(self, *a, **kw) self.bg_color = (1, 1, 1, 0.25) self._ref = ref if blockInfo is None and ref is not None: blockInfo = ref.get() blockInfo = blockInfo or materials["Air"] if recentBlocks is not None: self.recentBlocks = recentBlocks else: self.recentBlocks = [] self.blockView = thumbview.BlockThumbView(materials, blockInfo, size=(48, 48)) self.blockLabel = ValueDisplay(ref=AttrRef(self, 'labelText'), width=180, align="l") row = Row((self.blockView, self.blockLabel), align="b") # col = Column( (self.blockButton, self.blockNameLabel) ) self.add(row) self.shrink_wrap() # self.blockLabel.bottom = self.blockButton.bottom # self.blockLabel.centerx = self.blockButton.centerx # self.add(self.blockLabel) self.materials = materials self.blockInfo = blockInfo # self._ref = ref self.updateRecentBlockView() recentBlockLimit = 7 @property def blockInfo(self): if self._ref: return self._ref.get() else: return self._blockInfo @blockInfo.setter def blockInfo(self, bi): if self._ref: self._ref.set(bi) else: self._blockInfo = bi self.blockView.blockInfo = bi if bi not in self.recentBlocks: self.recentBlocks.append(bi) if len(self.recentBlocks) > self.recentBlockLimit: self.recentBlocks.pop(0) self.updateRecentBlockView() @property def labelText(self): #&# Prototype for blocks/items names #labelText = self.blockInfo.name labelText = mclangres.translate(self.blockInfo.name) #&# if len(labelText) > 24: labelText = labelText[:23] + "..." return labelText # self.blockNameLabel.text =
[docs] def createRecentBlockView(self): def makeBlockView(bi): bv = BlockView(self.materials, bi) bv.size = (16, 16) def action(evt): self.blockInfo = bi bv.mouse_up = action return bv row = [makeBlockView(bi) for bi in self.recentBlocks] row = Row(row) widget = GLBackground() widget.bg_color = (0.8, 0.8, 0.8, 0.8) widget.add(row) widget.shrink_wrap() widget.anchor = "whtr" return widget
[docs] def updateRecentBlockView(self): if self.recentBlockView: self.recentBlockView.set_parent(None) self.recentBlockView = self.createRecentBlockView() self.recentBlockView.right = self.width self.add(self.recentBlockView) # print self.rect, self.recentBlockView.rect
recentBlockView = None @property def tooltipText(self): #&# Prototype for blocks/items names #return str(self.blockInfo.name) return mclangres.translate(self.blockInfo.name) #&#
[docs] def action(self): blockPicker = blockpicker.BlockPicker(self.blockInfo, self.materials, allowWildcards=self.allowWildcards) if blockPicker.present(): self.blockInfo = blockPicker.blockInfo
[docs] def draw_all(self, s): #-# Looks like a bad stuf... Be aware of the 'spacing' member of the widgets parent. Panel.gl_draw_all(self, self.get_root(), (self.local_to_global_offset()[0], self.local_to_global_offset()[1] - self.height + self.parent.spacing))