def __init__(self, items, keysColumn=None, buttonsColumn=None): if keysColumn is None: keysColumn = [] if buttonsColumn is None: buttonsColumn = [] Widget.__init__(self) for (hotkey, title, action) in items: if isinstance(title, (str, unicode)): button = Button(title, action=action) else: button = ValueButton(ref=title, action=action, width=200) button.anchor = self.anchor label = Label(hotkey, width=75, margin=button.margin) label.anchor = "wh" label.height = button.height keysColumn.append(label) buttonsColumn.append(button) self.buttons = list(buttonsColumn) buttonsColumn = Column(buttonsColumn) buttonsColumn.anchor = self.anchor keysColumn = Column(keysColumn) commandRow = Row((keysColumn, buttonsColumn)) self.add(commandRow) self.shrink_wrap()
def __init__(self, tool): Panel.__init__(self) self.tool = tool self.player_UUID = {} self.level = tool.editor.level if hasattr(self.level, 'players'): players = self.level.players or ["[No players]"] if not self.level.oldPlayerFolderFormat: for player in players: if player != "Player" and player != "[No players]": self.player_UUID[version_utils.getPlayerNameFromUUID(player)] = player if "Player" in players: self.player_UUID["Player"] = "Player" if "[No players]" not in players: players = sorted(self.player_UUID.keys(), key=lambda x: False if x == "Player" else x.lower()) else: players = ["Player"] self.players = players max_height = self.tool.editor.mainViewport.height - self.tool.editor.netherPanel.height - self.tool.editor.subwidgets[0].height - self.margin - 2 addButton = Button("Add Player", action=self.tool.addPlayer) removeButton = Button("Remove Player", action=self.tool.removePlayer) gotoButton = Button("Goto Player", action=self.tool.gotoPlayer) gotoCameraButton = Button("Goto Player's View", action=self.tool.gotoPlayerCamera) moveButton = Button("Move Player", action=self.tool.movePlayer) moveToCameraButton = Button("Align Player to Camera", action=self.tool.movePlayerToCamera) reloadSkin = Button("Reload Skins", action=self.tool.reloadSkins, tooltipText="This pulls skins from the online server, so this may take a while") print max_height max_height -= sum((a.height for a in (addButton, removeButton, gotoButton, gotoCameraButton, moveButton, moveToCameraButton, reloadSkin))) print max_height tableview = TableView(columns=[ TableColumn("Player Name(s):", 200), ], height=max_height) tableview.index = 0 tableview.num_rows = lambda: len(players) tableview.row_data = lambda i: (players[i],) tableview.row_is_selected = lambda x: x == tableview.index tableview.zebra_color = (0, 0, 0, 48) def selectTableRow(i, evt): tableview.index = i tableview.click_row = selectTableRow self.table = tableview col = [self.table] col.extend([addButton, removeButton, gotoButton, gotoCameraButton, moveButton, moveToCameraButton, reloadSkin]) col = Column(col, margin=0, spacing=2) col.shrink_wrap() self.add(col) self.shrink_wrap()
def __init__(self, items, keysColumn=None, buttonsColumn=None, item_spacing=None): warn(self) if keysColumn is None: keysColumn = [] if buttonsColumn is None: buttonsColumn = [] labels = [] Widget.__init__(self) for t in items: if len(t) == 3: (hotkey, title, action) = t tooltipText = None else: (hotkey, title, action, tooltipText) = t if isinstance(title, (str, unicode)): button = Button(title, action=action) else: button = ValueButton(ref=title, action=action, width=200) button.anchor = self.anchor label = Label(hotkey, width=100, margin=button.margin) label.anchor = "wh" label.height = button.height labels.append(label) if tooltipText: button.tooltipText = tooltipText keysColumn.append(label) buttonsColumn.append(button) self.buttons = list(buttonsColumn) #.# if item_spacing == None: buttonsColumn = Column(buttonsColumn) else: buttonsColumn = Column(buttonsColumn, spacing=item_spacing) #.# buttonsColumn.anchor = self.anchor #.# if item_spacing == None: keysColumn = Column(keysColumn) else: keysColumn = Column(keysColumn, spacing=item_spacing) commandRow = Row((keysColumn, buttonsColumn)) self.labels = labels self.add(commandRow) self.shrink_wrap()
def editNBTData(self): player = self.selectedPlayer if player == 'Player (Single Player)': alert("Not yet implemented.\nUse the NBT Explorer to edit this player.") elif player == '[No players]': return else: player = self.level.getPlayerTag(self.selectedPlayer) if player is not None: self.pages.remove_page(self.nbtpage) def close(): self.pages.show_page(self.col) self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject=player, fileName=None, savePolicy=-1, dataKeyName=None, height=self.max_height, no_header=True, close_text="Go Back", close_action=close, load_text=None, copy_data=False) self.nbtpage = Column([self.nbttree,]) self.nbtpage.shrink_wrap() self.pages.add_page("NBT Data", self.nbtpage) self.pages.show_page(self.nbtpage) else: alert(_("Unable to load player %s" % self.selectedPlayer()))
def editNBTData(self): player = self.selectedPlayer if player == 'Player (Single Player)': alert("Not yet implemented.\nUse the NBT Explorer to edit this player.") elif player == '[No players]': return else: path = os.path.join(os.path.split(self.level.filename)[0], 'playerdata') if not os.path.exists(path): path = os.path.join(os.path.split(self.level.filename)[0], 'players') if player + '.dat' in os.listdir(path): fName = os.path.join(path, player + '.dat') nbtObject, dataKeyName, dontSaveRootTag, fn = loadFile(fName) self.pages.remove_page(self.nbtpage) def close(): self.pages.show_page(self.col) self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject=nbtObject, fileName=fName, dontSaveRootTag=dontSaveRootTag, dataKeyName=dataKeyName, height=self.max_height, no_header=True, close_text="Go Back", close_action=close, load_text=None) self.nbtpage = Column([self.nbttree,]) self.nbtpage.shrink_wrap() self.pages.add_page("NBT Data", self.nbtpage) self.pages.show_page(self.nbtpage) #elif self.selectedPlayer.isNew: else: alert(_("Error while getting player file.\n%s not found.")%(player + '.dat'), doNotTranslate=True)
def update_side_panel(self, item): if item == self.displayed_item: return self.displayed_item = item if self.side_panel: self.side_panel.set_parent(None) items = [a for a in item[1]] rows = [] if config.nbtTreeSettings.showAllTags.get(): meth = None else: meth = getattr(self, "build_%s" % item[3].lower(), None) col = True if meth and len(items) == 1: rows = meth(items) else: height = 0 for itm in items: t = itm.__class__.__name__ rows.append(Row([Label("Data Type:"), Label(t)], margin=1)) fields = self.build_field(itm) for field in fields: if type(field) == TextFieldWrapped: field.set_size_for_text(self.side_panel_width) row = Row([field], margin=1) rows.append(row) height += row.height if height > self.displayRow.height: col = False if rows: if col: col = Column(rows, align="l", spacing=0, height=self.displayRow.height) else: col = ScrollPanel( rows=rows, align="l", spacing=0, height=self.displayRow.height, draw_zebra=False, inner_width=self.side_panel_width - scroll_button_size, ) col.set_parent(self.displayRow) col.top = self.displayRow.top col.left = self.displayRow.subwidgets[0].right col.bottom = self.displayRow.subwidgets[0].bottom col.shrink_wrap() self.side_panel = col
def __init__(self, tool): Panel.__init__(self, name='Panel.PlayerPositionPanel') self.tool = tool self.player_UUID = {"UUID": [], "Name": []} self.level = tool.editor.level self.playercache = PlayerCache() # Add this instance to PlayerCache 'targets'. PlayerCache generated processes will call # this instance 'update_player' method when they have finished their execution. self.playercache.add_target(self.update_player) if hasattr(self.level, 'players'): players = self.level.players or ["[No players]"] if not self.level.oldPlayerFolderFormat: for player in players: if player != "Player" and player != "[No players]": if len(player) > 4 and player[4] == "-": os.rename(os.path.join(self.level.worldFolder.getFolderPath("playerdata"), player+".dat"), os.path.join(self.level.worldFolder.getFolderPath("playerdata"), player.replace("-", "", 1)+".dat")) player = player.replace("-", "", 1) # print 5 data = self.playercache.getPlayerInfo(player, use_old_data=True) #self.player_UUID[data[0]] = data[1] self.player_UUID["UUID"].append(data[0]) self.player_UUID["Name"].append(data[1]) #self.player_UUID[player] = data if "Player" in players: #self.player_UUID["Player (Single Player)"] = "Player" self.player_UUID["UUID"].append("Player") self.player_UUID["Name"].append("Player (Single Player)") if "[No players]" not in players: self.player_names = sorted(self.player_UUID.values(), key=lambda x: False if x == "Player (Single Player)" else x) else: self.player_UUID["UUID"].append("[No players]") self.player_UUID["Name"].append("[No players]") else: players = ["Player (Single Player)"] self.players = players if 'Player' in self.player_UUID['UUID'] and 'Player (Single Player)' in self.player_UUID['Name']: self.player_UUID['UUID'].insert(0, self.player_UUID['UUID'].pop(self.player_UUID['UUID'].index('Player'))) self.player_UUID['Name'].insert(0, self.player_UUID['Name'].pop(self.player_UUID['Name'].index('Player (Single Player)'))) self.pages = TabPanel() tab_height = self.pages.tab_height max_height = tab_height + self.tool.editor.mainViewport.height - self.tool.editor.toolbar.height - self.tool.editor.subwidgets[0].height - self.pages.margin * 2 #-# Uncomment the following line to have a maximum height for this panel. # max_height = min(max_height, 500) self.editNBTDataButton = Button("Edit NBT", action=self.editNBTData, tooltipText="Open the NBT Explorer to edit player's attributes and inventory") addButton = Button("Add", action=self.tool.addPlayer) removeButton = Button("Remove", action=self.tool.removePlayer) gotoButton = Button("Goto", action=self.tool.gotoPlayer) gotoCameraButton = Button("Goto View", action=self.tool.gotoPlayerCamera) moveButton = Button("Move", action=self.tool.movePlayer) moveToCameraButton = Button("Align to Camera", action=self.tool.movePlayerToCamera) reloadSkin = Button("Reload Skins", action=self.tool.reloadSkins, tooltipText="This pulls skins from the online server, so this may take a while") btns = [self.editNBTDataButton] if not isinstance(self.level, pymclevel.leveldbpocket.PocketLeveldbWorld): btns.extend([addButton, removeButton]) btns.extend([gotoButton, gotoCameraButton, moveButton, moveToCameraButton, reloadSkin]) btns = Column(btns, margin=0, spacing=2) h = max_height - btns.height - self.pages.margin * 2 - 2 - self.font.get_linesize() * 2 col = Label('') def close(): self.pages.show_page(col) self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject={}, height=max_height, \ close_text="Go Back", no_header=True, close_action=close, load_text=None) self.nbttree.shrink_wrap() self.nbtpage = Column([self.nbttree]) self.nbtpage.shrink_wrap() self.pages.add_page("NBT Data", self.nbtpage) self.pages.set_rect(map(lambda x:x+self.margin, self.nbttree._rect)) tableview = TableView(nrows=(h - (self.font.get_linesize() * 2.5)) / self.font.get_linesize(), header_height=self.font.get_linesize(), columns=[TableColumn("Player Name(s):", (self.nbttree.width - (self.margin * 3)) / 3), TableColumn("Player UUID(s):", (self.nbttree.width - (self.margin * 3)))], ) tableview.index = 0 tableview.num_rows = lambda: len(self.player_UUID["UUID"]) tableview.row_data = lambda i: (self.player_UUID["Name"][i],self.player_UUID["UUID"][i]) tableview.row_is_selected = lambda x: x == tableview.index tableview.zebra_color = (0, 0, 0, 48) def selectTableRow(i, evt): tableview.index = i tableview.click_row = selectTableRow def mouse_down(e): if e.button == 1 and e.num_clicks > 1: self.editNBTData() TableRowView.mouse_down(tableview.rows, e) tableview.rows.mouse_down = mouse_down tableview.rows.tooltipText = "Double-click or use the button below to edit the NBT Data." self.table = tableview col.set_parent(None) self.col = col = Column([tableview, btns], spacing=2) self.pages.add_page("Players", col, 0) self.pages.shrink_wrap() self.pages.show_page(col) self.add(self.pages) self.shrink_wrap() self.max_height = max_height
def GeneratorPanel(): panel = Widget() panel.chunkHeight = 64 panel.grass = True panel.simulate = False panel.snapshot = False jarStorage = MCServerChunkGenerator.getDefaultJarStorage() if jarStorage: jarStorage.reloadVersions() generatorChoice = ChoiceButton(["Minecraft Server", "Flatland"]) panel.generatorChoice = generatorChoice col = [Row((Label("Generator:"), generatorChoice))] noVersionsRow = Label("Will automatically download and use the latest version") versionContainer = Widget() heightinput = IntInputRow("Height: ", ref=AttrRef(panel, "chunkHeight"), min=0, max=255) grassinput = CheckBoxLabel("Grass", ref=AttrRef(panel, "grass")) flatPanel = Column([heightinput, grassinput], align="l") def generatorChoiceChanged(): serverPanel.visible = generatorChoice.selectedChoice == "Minecraft Server" flatPanel.visible = not serverPanel.visible generatorChoice.choose = generatorChoiceChanged versionChoice = None if len(jarStorage.versions): def checkForUpdates(): def _check(): yield jarStorage.downloadCurrentServer(panel.snapshot) yield showProgress("Checking for server updates...", _check()) versionChoice.choices = sorted(jarStorage.versions, reverse=True) versionChoice.choiceIndex = 0 versionChoice = ChoiceButton(sorted(jarStorage.versions, reverse=True)) versionChoice.set_size_for_text(200) versionChoiceRow = (Row(( Label("Server version:"), versionChoice, Label("or"), Button("Check for Updates", action=checkForUpdates)))) panel.versionChoice = versionChoice versionContainer.add(versionChoiceRow) else: versionContainer.add(noVersionsRow) versionContainer.shrink_wrap() menu = Menu("Advanced", [ ("Open Server Storage", "revealStorage"), ("Reveal World Cache", "revealCache"), ("Delete World Cache", "clearCache") ]) def presentMenu(): i = menu.present(advancedButton.parent, advancedButton.topleft) if i != -1: (revealStorage, revealCache, clearCache)[i]() advancedButton = Button("Advanced...", presentMenu) @alertException def revealStorage(): mcplatform.platform_open(jarStorage.cacheDir) @alertException def revealCache(): mcplatform.platform_open(MCServerChunkGenerator.worldCacheDir) # revealCacheRow = Row((Label("Minecraft Server Storage: "), Button("Open Folder", action=revealCache, tooltipText="Click me to install your own minecraft_server.jar if you have any."))) @alertException def clearCache(): MCServerChunkGenerator.clearWorldCache() simRow = CheckBoxLabel("Simulate world", ref=AttrRef(panel, "simulate"), tooltipText="Simulate the world for a few seconds after generating it. Reduces the save file size by processing all of the TileTicks.") useSnapshotServer = CheckBoxLabel("Use snapshot versions", ref=AttrRef(panel, "snapshot"), tooltipText="Uses the Latest Snapshot Terrain Generation") simRow = Row((simRow, advancedButton), anchor="lrh") #deleteCacheRow = Row((Label("Delete Temporary World File Cache?"), Button("Delete Cache!", action=clearCache, tooltipText="Click me if you think your chunks are stale."))) serverPanel = Column([useSnapshotServer, versionContainer, simRow], align="l") col.append(serverPanel) col = Column(col, align="l") col.add(flatPanel) flatPanel.topleft = serverPanel.topleft flatPanel.visible = False panel.add(col) panel.shrink_wrap() def generate(level, arg, useWorldType="DEFAULT"): useServer = generatorChoice.selectedChoice == "Minecraft Server" if useServer: def _createChunks(): if versionChoice: version = versionChoice.selectedChoice else: version = None gen = MCServerChunkGenerator(version=version) if isinstance(arg, pymclevel.BoundingBox): for i in gen.createLevelIter(level, arg, simulate=panel.simulate, worldType=useWorldType): yield i else: for i in gen.generateChunksInLevelIter(level, arg, simulate=panel.simulate): yield i else: def _createChunks(): height = panel.chunkHeight grass = panel.grass and pymclevel.alphaMaterials.Grass.ID or pymclevel.alphaMaterials.Dirt.ID if isinstance(arg, pymclevel.BoundingBox): chunks = list(arg.chunkPositions) else: chunks = arg if level.dimNo in (-1, 1): maxskylight = 0 else: maxskylight = 15 for i, (cx, cz) in enumerate(chunks): yield i, len(chunks) #surface = blockInput.blockInfo #for cx, cz in : try: level.createChunk(cx, cz) except ValueError, e: # chunk already present print e continue else: ch = level.getChunk(cx, cz) if height > 0: stoneHeight = max(0, height - 5) grassHeight = max(0, height - 1) ch.Blocks[:, :, grassHeight] = grass ch.Blocks[:, :, stoneHeight:grassHeight] = pymclevel.alphaMaterials.Dirt.ID ch.Blocks[:, :, :stoneHeight] = pymclevel.alphaMaterials.Stone.ID ch.Blocks[:, :, 0] = pymclevel.alphaMaterials.Bedrock.ID ch.SkyLight[:, :, height:] = maxskylight if maxskylight: ch.HeightMap[:] = height else: ch.SkyLight[:] = maxskylight ch.needsLighting = False ch.dirty = True return _createChunks()
def __init__(self, tool): Panel.__init__(self) self.tool = tool self.player_UUID = {} self.level = tool.editor.level if hasattr(self.level, 'players'): players = self.level.players or ["[No players]"] if not self.level.oldPlayerFolderFormat: for player in players: if player != "Player" and player != "[No players]": if len(player) > 4 and player[4] == "-": os.rename(os.path.join(self.level.worldFolder.getFolderPath("playerdata"), player+".dat"), os.path.join(self.level.worldFolder.getFolderPath("playerdata"), player.replace("-", "", 1)+".dat")) player = player.replace("-", "", 1) data = version_utils.playercache.getPlayerInfo(player) if isinstance(data, tuple): self.player_UUID[data[1]] = data[0] else: self.player_UUID[player] = data if "Player" in players: self.player_UUID["Player (Single Player)"] = "Player" if "[No players]" not in players: players = sorted(self.player_UUID.keys(), key=lambda x: False if x == "Player (Single Player)" else x) else: players = ["Player (Single Player)"] self.players = players self.pages = TabPanel() tab_height = self.pages.tab_height max_height = tab_height + self.tool.editor.mainViewport.height - self.tool.editor.toolbar.height - self.tool.editor.subwidgets[0].height - self.pages.margin * 2 #-# Uncomment the following line to have a maximum height for this panel. # max_height = min(max_height, 500) self.editNBTDataButton = Button("Edit NBT", action=self.editNBTData, tooltipText="Open the NBT Explorer to edit player's attributes and inventory") addButton = Button("Add", action=self.tool.addPlayer) removeButton = Button("Remove", action=self.tool.removePlayer) gotoButton = Button("Goto", action=self.tool.gotoPlayer) gotoCameraButton = Button("Goto View", action=self.tool.gotoPlayerCamera) moveButton = Button("Move", action=self.tool.movePlayer) moveToCameraButton = Button("Align to Camera", action=self.tool.movePlayerToCamera) reloadSkin = Button("Reload Skins", action=self.tool.reloadSkins, tooltipText="This pulls skins from the online server, so this may take a while") btns = Column([self.editNBTDataButton, addButton, removeButton, gotoButton, gotoCameraButton, moveButton, moveToCameraButton, reloadSkin], margin=0, spacing=2) h = max_height - btns.height - self.pages.margin * 2 - 2 - self.font.get_linesize() * 2 col = Label('') def close(): self.pages.show_page(col) self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject={}, height=max_height, \ close_text="Go Back", no_header=True, close_action=close, load_text=None) self.nbttree.shrink_wrap() self.nbtpage = Column([self.nbttree,]) self.nbtpage.shrink_wrap() self.pages.add_page("NBT Data", self.nbtpage) self.pages.set_rect(map(lambda x:x+self.margin, self.nbttree._rect)) tableview = TableView(nrows=(h - (self.font.get_linesize() * 2.5)) / self.font.get_linesize(), header_height=self.font.get_linesize(), columns=[TableColumn("Player Name(s):", self.nbttree.width - (self.margin * 3)),], ) tableview.index = 0 tableview.num_rows = lambda: len(players) tableview.row_data = lambda i: (players[i],) tableview.row_is_selected = lambda x: x == tableview.index tableview.zebra_color = (0, 0, 0, 48) def selectTableRow(i, evt): tableview.index = i tableview.click_row = selectTableRow def mouse_down(e): if e.button == 1 and e.num_clicks > 1: self.editNBTData() TableRowView.mouse_down(tableview.rows, e) tableview.rows.mouse_down = mouse_down tableview.rows.tooltipText = "Double-click or use the button below to edit the NBT Data." self.table = tableview col.set_parent(None) self.col = col = Column([tableview, btns], spacing=2) self.pages.add_page("Players", col, 0) self.pages.shrink_wrap() self.pages.show_page(col) self.add(self.pages) self.shrink_wrap() self.max_height = max_height
def __init__old(self, blockInfo, materials, *a, **kw): self.root = get_root() self.allowWildcards = False Dialog.__init__(self, *a, **kw) panelWidth = 518 self.click_outside_response = 0 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 = TextFieldWrapped(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 = "{name}".format(name=block.name) if block.aka: r += " [{0}]".format(block.aka) return r def formatBlockID(x): block = self.matchingBlocks[x] ident = "({id}:{data})".format(id=block.ID, data=block.blockData) return ident tableview = TableView(columns=[TableColumn(" ", 24, "l", lambda x: ""), TableColumn("Name", 415, "l", formatBlockName), TableColumn("ID", 45, "l", formatBlockID) ]) 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
def bind_key(self, message=None): panel = Panel(name='Panel.FilterToolPanel.bind_key') panel.bg_color = (0.5, 0.5, 0.6, 1.0) if not message: message = _("Press a key to assign to the filter \"{0}\"\n\n" "Press ESC to cancel.").format(self.selectedName) label = albow.Label(message) unbind_button = Button("Press to unbind", action=self.unbind_key) column = Column((label, unbind_button)) panel.add(column) panel.shrink_wrap() def panelKeyUp(evt): _key_name = self.root.getKey(evt) panel.dismiss(_key_name) def panelMouseUp(evt): button = keys.remapMouseButton(evt.button) _key_name = None if button == 3: _key_name = "Button 3" elif button == 4: _key_name = "Scroll Up" elif button == 5: _key_name = "Scroll Down" elif button == 6: _key_name = "Button 4" elif button == 7: _key_name = "Button 5" if 2 < button < 8: panel.dismiss(_key_name) panel.key_up = panelKeyUp panel.mouse_up = panelMouseUp self.keys_panel = panel key_name = panel.present() if isinstance(key_name, bool): return True if key_name != "Escape": if key_name in ["Alt-F4", "F1", "F2", "F3", "F4", "F5", "1", "2", "3", "4", "5", "6", "7", "8", "9", "Ctrl-Alt-F9", "Ctrl-Alt-F10"]: self.bind_key(_("You can't use the key {0}.\n" "Press a key to assign to the filter \"{1}\"\n\n" "" "Press ESC to cancel.").format(_(key_name), self.selectedName)) return True keysUsed = [(j, i) for (j, i) in config.config.items("Keys") if i == key_name] if keysUsed: self.bind_key(_("Can't bind. {0} is already used by {1}.\n" "Press a key to assign to the filter \"{2}\"\n\n" "" "Press ESC to cancel.").format(_(key_name), keysUsed[0][0], self.selectedName)) return True filter_keys = [i for (i, j) in config.config.items("Filter Keys") if j == key_name] if filter_keys: self.bind_key(_("Can't bind. {0} is already used by the \"{1}\" filter.\n" "Press a new key.\n\n" "" "Press ESC to cancel.").format(_(key_name), filter_keys[0])) return True config.config.set("Filter Keys", self.selectedName.lower(), key_name) config.save() self.reload()
def makeTabPage(self, tool, inputs, trn=None, **kwargs): page = Widget(**kwargs) page.is_gl_container = True rows = [] cols = [] max_height = tool.editor.mainViewport.height - tool.editor.toolbar.height - tool.editor.subwidgets[0].height -\ self._parent.filterSelectRow.height - self._parent.confirmButton.height - self.pages.tab_height page.optionDict = {} page.tool = tool title = "Tab" for optionSpec in inputs: optionName = optionSpec[0] optionType = optionSpec[1] if trn is not None: n = trn._(optionName) else: n = optionName if n == optionName: oName = _(optionName) else: oName = n if isinstance(optionType, tuple): if isinstance(optionType[0], (int, long, float)): if len(optionType) == 3: val, min, max = optionType increment = 0.1 elif len(optionType) == 2: min, max = optionType val = min increment = 0.1 else: val, min, max, increment = optionType rows.append(addNumField(page, optionName, oName, val, min, max, increment)) if isinstance(optionType[0], (str, unicode)): isChoiceButton = False if optionType[0] == "string": kwds = [] wid = None val = None for keyword in optionType: if isinstance(keyword, (str, unicode)) and keyword != "string": kwds.append(keyword) for keyword in kwds: splitWord = keyword.split('=') if len(splitWord) > 1: v = None try: v = int(splitWord[1]) except ValueError: pass key = splitWord[0] if v is not None: if key == "width": wid = v else: if key == "value": val = "=".join(splitWord[1:]) if val is None: val = "" if wid is None: wid = 200 field = TextFieldWrapped(value=val, width=wid) page.optionDict[optionName] = AttrRef(field, 'value') row = Row((Label(oName, doNotTranslate=True), field)) rows.append(row) elif optionType[0] == "block": blockButton = BlockButton(tool.editor.level.materials) try: blockButton.blockInfo = tool.editor.level.materials[optionType[1]] except AttributeError: blockButton.blockInfo = tool.editor.level.materials[0] except KeyError: if tool.editor.level.materials == pymclevel.pocketMaterials: blockButton.blockInfo = pymclevel.alphaMaterials[optionType[1]] else: raise row = Column((Label(oName, doNotTranslate=True), blockButton)) page.optionDict[optionName] = AttrRef(blockButton, 'blockInfo') rows.append(row) elif optionType[0] == "file-save": if len(optionType) == 2: file_chooser = SingleFileChooser(file_types=optionType[1], operation=SingleFileChooser.SAVE_FILE) else: file_chooser = SingleFileChooser(operation=SingleFileChooser.SAVE_FILE) row = Row((Label(oName, doNotTranslate=True), file_chooser)) page.optionDict[optionName] = AttrRef(file_chooser, 'file_path') rows.append(row) elif optionType[0] == "file-open": if len(optionType) == 2: file_chooser = SingleFileChooser(file_types=optionType[1], operation=SingleFileChooser.OPEN_FILE) else: file_chooser = SingleFileChooser(operation=SingleFileChooser.OPEN_FILE) row = Row((Label(oName, doNotTranslate=True), file_chooser)) page.optionDict[optionName] = AttrRef(file_chooser, 'file_path') rows.append(row) else: isChoiceButton = True if isChoiceButton: if trn is not None: __ = trn._ else: __ = _ choices = [__("%s" % a) for a in optionType] choiceButton = ChoiceButton(choices, doNotTranslate=True) page.optionDict[optionName] = AttrRef(choiceButton, 'selectedChoice') rows.append(Row((Label(oName, doNotTranslate=True), choiceButton))) elif isinstance(optionType, bool): cbox = CheckBox(value=optionType) page.optionDict[optionName] = AttrRef(cbox, 'value') row = Row((Label(oName, doNotTranslate=True), cbox)) rows.append(row) elif isinstance(optionType, (int, float)): rows.append(addNumField(self, optionName, oName, optionType)) elif optionType == "blocktype" or isinstance(optionType, pymclevel.materials.Block): blockButton = BlockButton(tool.editor.level.materials) if isinstance(optionType, pymclevel.materials.Block): blockButton.blockInfo = optionType row = Column((Label(oName, doNotTranslate=True), blockButton)) page.optionDict[optionName] = AttrRef(blockButton, 'blockInfo') rows.append(row) elif optionType == "label": rows.append(wrapped_label(oName, 50, doNotTranslate=True)) elif optionType == "string": inp = None # not sure how to pull values from filters, # but leaves it open for the future. Use this variable to set field width. if inp is not None: size = inp else: size = 200 field = TextFieldWrapped(value="") row = TextInputRow(oName, ref=AttrRef(field, 'value'), width=size, doNotTranslate=True) page.optionDict[optionName] = AttrRef(field, 'value') rows.append(row) elif optionType == "title": title = oName elif optionType == "file-save": file_chooser = SingleFileChooser(operation=SingleFileChooser.SAVE_FILE) row = Row((Label(oName, doNotTranslate=True), file_chooser)) page.optionDict[optionName] = AttrRef(file_chooser, 'file_path') rows.append(row) elif optionType == "file-open": file_chooser = SingleFileChooser(operation=SingleFileChooser.OPEN_FILE) row = Row((Label(oName, doNotTranslate=True), file_chooser)) page.optionDict[optionName] = AttrRef(file_chooser, 'file_path') rows.append(row) elif isinstance(optionType, list) and optionType[0].lower() == "nbttree": kw = {'close_text': None, 'load_text': None} if len(optionType) >= 3: def close(): self.pages.show_page(self.pages.pages[optionType[2]]) kw['close_action'] = close kw['close_text'] = "Go Back" if len(optionType) >= 4: if optionType[3]: kw['load_text'] = optionType[3] if hasattr(self.module, 'nbt_ok_action'): kw['ok_action'] = getattr(self.module, 'nbt_ok_action') self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject=optionType[1], height=max_height, no_header=True, copy_data=False, **kw) self.module.set_tree(self.nbttree.tree) for meth_name in dir(self.module): if meth_name.startswith('nbttree_'): setattr(self.nbttree.tree.treeRow, meth_name.split('nbttree_')[-1], getattr(self.module, meth_name)) # elif meth_name.startswith('nbt_'): # setattr(self.nbttree, meth_name.split('nbt_')[-1], getattr(self.module, meth_name)) page.optionDict[optionName] = AttrRef(self, 'rebuildTabPage') rows.append(self.nbttree) self.nbttree.page = len(self.pgs) else: raise ValueError(("Unknown option type", optionType)) height = sum(r.height for r in rows) + (len(rows) - 1) * self.spacing if height > max_height: h = 0 for i, r in enumerate(rows): h += r.height if h > height / 2: if rows[:i]: cols.append(Column(rows[:i], spacing=0)) rows = rows[i:] break if len(rows): cols.append(Column(rows, spacing=0)) if len(cols): page.add(Row(cols, spacing=0)) page.shrink_wrap() return title, page, page._rect
def __init__(self, tool): Panel.__init__(self) self.tool = tool rotateRow = Row(( Label(config.config.get("Keys", "Rotate").upper()), Button("Rotate", width=80, action=tool.rotate, enable=self.transformEnable), )) rollRow = Row(( Label(config.config.get("Keys", "Roll").upper()), Button("Roll", width=80, action=tool.roll, enable=self.transformEnable), )) flipRow = Row(( Label(config.config.get("Keys", "Flip").upper()), Button("Flip", width=80, action=tool.flip, enable=self.transformEnable), )) mirrorRow = Row(( Label(config.config.get("Keys", "Mirror").upper()), Button("Mirror", width=80, action=tool.mirror, enable=self.transformEnable), )) alignRow = Row((CheckBox(ref=AttrRef(self.tool, 'chunkAlign')), Label("Chunk Align"))) # headerLabel = Label("Clone Offset") if self.useOffsetInput: self.offsetInput = CoordsInput() self.offsetInput.coordsChanged = tool.offsetChanged self.offsetInput.nudgeButton.bg_color = tool.color self.offsetInput.nudge = tool.nudge else: self.nudgeButton = NudgeButton() self.nudgeButton.bg_color = tool.color self.nudgeButton.nudge = tool.nudge repeatField = IntField(ref=AttrRef(tool, 'repeatCount')) repeatField.min = 1 repeatField.max = 50 repeatRow = Row((Label("Repeat"), repeatField)) self.repeatField = repeatField scaleField = FloatField(ref=AttrRef(tool, 'scaleFactor')) scaleField.min = 0.125 scaleField.max = 8 dv = scaleField.decrease_value iv = scaleField.increase_value def scaleFieldDecrease(): if scaleField.value > 1 / 8.0 and scaleField.value <= 1.0: scaleField.value *= 0.5 else: dv() def scaleFieldIncrease(): if scaleField.value < 1.0: scaleField.value *= 2.0 else: iv() scaleField.decrease_value = scaleFieldDecrease scaleField.increase_value = scaleFieldIncrease scaleRow = Row((Label("Scale Factor"), scaleField)) self.scaleField = scaleField self.copyAirCheckBox = CheckBox(ref=AttrRef(self.tool, "copyAir")) self.copyAirLabel = Label("Copy Air") self.copyAirLabel.mouse_down = self.copyAirCheckBox.mouse_down self.copyAirLabel.tooltipText = "Shortcut: ALT-1" self.copyAirCheckBox.tooltipText = self.copyAirLabel.tooltipText copyAirRow = Row((self.copyAirCheckBox, self.copyAirLabel)) self.copyWaterCheckBox = CheckBox(ref=AttrRef(self.tool, "copyWater")) self.copyWaterLabel = Label("Copy Water") self.copyWaterLabel.mouse_down = self.copyWaterCheckBox.mouse_down self.copyWaterLabel.tooltipText = "Shortcut: ALT-2" self.copyWaterCheckBox.tooltipText = self.copyWaterLabel.tooltipText copyWaterRow = Row((self.copyWaterCheckBox, self.copyWaterLabel)) self.copyBiomesCheckBox = CheckBox( ref=AttrRef(self.tool, "copyBiomes")) self.copyBiomesLabel = Label("Copy Biomes") self.copyBiomesLabel.mouse_down = self.copyBiomesCheckBox.mouse_down self.copyBiomesLabel.tooltipText = "Shortcut: ALT-3" self.copyBiomesCheckBox.tooltipText = self.copyBiomesLabel.tooltipText copyBiomesRow = Row((self.copyBiomesCheckBox, self.copyBiomesLabel)) self.staticCommandsCheckBox = CheckBox( ref=AttrRef(self.tool, "staticCommands")) self.staticCommandsLabel = Label("Change Coordinates") self.staticCommandsLabel.mouse_down = self.staticCommandsCheckBox.mouse_down self.staticCommandsLabel.tooltipText = "Check to automatically change command block static coordinates when moved.\nShortcut: ALT-4" self.staticCommandsCheckBox.tooltipText = self.staticCommandsLabel.tooltipText staticCommandsRow = Row( (self.staticCommandsCheckBox, self.staticCommandsLabel)) self.performButton = Button("Clone", width=100, align="c") self.performButton.tooltipText = "Shortcut: ENTER" self.performButton.action = tool.confirm self.performButton.enable = lambda: (tool.destPoint is not None) if self.useOffsetInput: col = Column((rotateRow, rollRow, flipRow, mirrorRow, alignRow, self.offsetInput, repeatRow, scaleRow, copyAirRow, copyWaterRow, copyBiomesRow, staticCommandsRow, self.performButton)) else: col = Column( (rotateRow, rollRow, flipRow, mirrorRow, alignRow, self.nudgeButton, copyAirRow, copyWaterRow, copyBiomesRow, staticCommandsRow, self.performButton)) self.add(col) self.anchor = "lwh" self.shrink_wrap()
def GeneratorPanel(): panel = Widget() panel.chunkHeight = 64 panel.grass = True panel.simulate = False panel.snapshot = False jarStorage = MCServerChunkGenerator.getDefaultJarStorage() if jarStorage: jarStorage.reloadVersions() generatorChoice = ChoiceButton(["Minecraft Server", "Flatland"]) panel.generatorChoice = generatorChoice col = [Row((Label("Generator:"), generatorChoice))] noVersionsRow = Label( "Will automatically download and use the latest version") versionContainer = Widget() heightinput = IntInputRow("Height: ", ref=AttrRef(panel, "chunkHeight"), min=0, max=255) grassinput = CheckBoxLabel("Grass", ref=AttrRef(panel, "grass")) flatPanel = Column([heightinput, grassinput], align="l") def generatorChoiceChanged(): serverPanel.visible = generatorChoice.selectedChoice == "Minecraft Server" flatPanel.visible = not serverPanel.visible generatorChoice.choose = generatorChoiceChanged versionChoice = None if len(jarStorage.versions): def checkForUpdates(): def _check(): yield jarStorage.downloadCurrentServer(panel.snapshot) yield showProgress("Checking for server updates...", _check()) versionChoice.choices = sorted(jarStorage.versions, reverse=True) versionChoice.choiceIndex = 0 versionChoice = ChoiceButton(sorted(jarStorage.versions, reverse=True)) versionChoice.set_size_for_text(200) versionChoiceRow = (Row( (Label("Server version:"), versionChoice, Label("or"), Button("Check for Updates", action=checkForUpdates)))) panel.versionChoice = versionChoice versionContainer.add(versionChoiceRow) else: versionContainer.add(noVersionsRow) versionContainer.shrink_wrap() menu = Menu("Advanced", [("Open Server Storage", "revealStorage"), ("Reveal World Cache", "revealCache"), ("Delete World Cache", "clearCache")]) def presentMenu(): i = menu.present(advancedButton.parent, advancedButton.topleft) if i != -1: (revealStorage, revealCache, clearCache)[i]() advancedButton = Button("Advanced...", presentMenu) @alertException def revealStorage(): mcplatform.platform_open(jarStorage.cacheDir) @alertException def revealCache(): mcplatform.platform_open(MCServerChunkGenerator.worldCacheDir) # revealCacheRow = Row((Label("Minecraft Server Storage: "), Button("Open Folder", action=revealCache, tooltipText="Click me to install your own minecraft_server.jar if you have any."))) @alertException def clearCache(): MCServerChunkGenerator.clearWorldCache() simRow = CheckBoxLabel( "Simulate world", ref=AttrRef(panel, "simulate"), tooltipText= "Simulate the world for a few seconds after generating it. Reduces the save file size by processing all of the TileTicks." ) useSnapshotServer = CheckBoxLabel( "Use snapshot versions", ref=AttrRef(panel, "snapshot"), tooltipText="Uses the Latest Snapshot Terrain Generation") simRow = Row((simRow, advancedButton), anchor="lrh") #deleteCacheRow = Row((Label("Delete Temporary World File Cache?"), Button("Delete Cache!", action=clearCache, tooltipText="Click me if you think your chunks are stale."))) serverPanel = Column([useSnapshotServer, versionContainer, simRow], align="l") col.append(serverPanel) col = Column(col, align="l") col.add(flatPanel) flatPanel.topleft = serverPanel.topleft flatPanel.visible = False panel.add(col) panel.shrink_wrap() def generate(level, arg): useServer = generatorChoice.selectedChoice == "Minecraft Server" if useServer: def _createChunks(): if versionChoice: version = versionChoice.selectedChoice else: version = None gen = MCServerChunkGenerator(version=version) if isinstance(arg, pymclevel.BoundingBox): for i in gen.createLevelIter(level, arg, simulate=panel.simulate): yield i else: for i in gen.generateChunksInLevelIter( level, arg, simulate=panel.simulate): yield i else: def _createChunks(): height = panel.chunkHeight grass = panel.grass and pymclevel.alphaMaterials.Grass.ID or pymclevel.alphaMaterials.Dirt.ID if isinstance(arg, pymclevel.BoundingBox): chunks = list(arg.chunkPositions) else: chunks = arg if level.dimNo in (-1, 1): maxskylight = 0 else: maxskylight = 15 for i, (cx, cz) in enumerate(chunks): yield i, len(chunks) #surface = blockInput.blockInfo #for cx, cz in : try: level.createChunk(cx, cz) except ValueError, e: # chunk already present print e continue else: ch = level.getChunk(cx, cz) if height > 0: stoneHeight = max(0, height - 5) grassHeight = max(0, height - 1) ch.Blocks[:, :, grassHeight] = grass ch.Blocks[:, :, stoneHeight: grassHeight] = pymclevel.alphaMaterials.Dirt.ID ch.Blocks[:, :, : stoneHeight] = pymclevel.alphaMaterials.Stone.ID ch.Blocks[:, :, 0] = pymclevel.alphaMaterials.Bedrock.ID ch.SkyLight[:, :, height:] = maxskylight if maxskylight: ch.HeightMap[:] = height else: ch.SkyLight[:] = maxskylight ch.needsLighting = False ch.dirty = True return _createChunks()
def __init__(self, tool, *a, **kw): Panel.__init__(self, *a, **kw) self.tool = tool self.anchor = "whl" chunkToolLabel = Label("Selected Chunks:") self.chunksLabel = ValueDisplay(ref=AttrRef(self, 'chunkSizeText'), width=115) self.chunksLabel.align = "c" self.chunksLabel.tooltipText = "..." extractButton = Button("Extract") extractButton.tooltipText = "Extract these chunks to individual chunk files" extractButton.action = tool.extractChunks extractButton.highlight_color = (255, 255, 255) deselectButton = Button( "Deselect", tooltipText=None, action=tool.editor.deselect, ) createButton = Button("Create") createButton.tooltipText = "Create new chunks within the selection." createButton.action = tool.createChunks createButton.highlight_color = (0, 255, 0) destroyButton = Button("Delete") destroyButton.tooltipText = "Delete the selected chunks from disk. Minecraft will recreate them the next time you are near." destroyButton.action = tool.destroyChunks pruneButton = Button("Prune") pruneButton.tooltipText = "Prune the world, leaving only the selected chunks. Any chunks outside of the selection will be removed, and empty region files will be deleted from disk" pruneButton.action = tool.pruneChunks relightButton = Button("Relight") relightButton.tooltipText = "Recalculate light values across the selected chunks" relightButton.action = tool.relightChunks relightButton.highlight_color = (255, 255, 255) repopButton = Button("Repop") repopButton.tooltipText = "Mark the selected chunks for repopulation. The next time you play Minecraft, the chunks will have trees, ores, and other features regenerated." repopButton.action = tool.repopChunks repopButton.highlight_color = (255, 200, 155) dontRepopButton = Button("Don't Repop") dontRepopButton.tooltipText = "Unmark the selected chunks. They will not repopulate the next time you play the game." dontRepopButton.action = tool.dontRepopChunks dontRepopButton.highlight_color = (255, 255, 255) col = Column((chunkToolLabel, self.chunksLabel, deselectButton, createButton, destroyButton, pruneButton, relightButton, extractButton, repopButton, dontRepopButton)) # col.right = self.width - 10; self.width = col.width self.height = col.height #self.width = 120 self.add(col)
def __init__(self, tool): Panel.__init__(self) self.tool = tool replacing = tool.replacing self.blockButton = BlockButton(tool.editor.level.materials) self.blockButton.blockInfo = tool.blockInfo self.blockButton.action = self.pickFillBlock self.fillWithLabel = Label("Fill with:", width=self.blockButton.width, align="c") self.fillButton = Button("Fill", action=tool.confirm, width=self.blockButton.width) self.fillButton.tooltipText = "Shortcut: ENTER" rollkey = config.config.get("Keys", "Roll").upper() self.replaceLabel = replaceLabel = Label("Replace", width=self.blockButton.width) replaceLabel.mouse_down = lambda a: self.tool.toggleReplacing() replaceLabel.fg_color = (177, 177, 255, 255) # replaceLabelRow = Row( (Label(rollkey), replaceLabel) ) replaceLabel.tooltipText = "Shortcut: {0}".format(rollkey) replaceLabel.align = "c" col = ( self.fillWithLabel, self.blockButton, # swapRow, replaceLabel, # self.replaceBlockButton, self.fillButton) if replacing: self.fillWithLabel = Label("Find:", width=self.blockButton.width, align="c") self.replaceBlockButton = BlockButton(tool.editor.level.materials) self.replaceBlockButton.blockInfo = tool.replaceBlockInfo self.replaceBlockButton.action = self.pickReplaceBlock self.replaceLabel.text = "Replace with:" self.swapButton = Button("Swap", action=self.swapBlockTypes, width=self.blockButton.width) self.swapButton.fg_color = (255, 255, 255, 255) self.swapButton.highlight_color = (60, 255, 60, 255) swapkey = config.config.get("Keys", "Swap").upper() self.swapButton.tooltipText = "Shortcut: {0}".format(swapkey) self.fillButton = Button("Replace", action=tool.confirm, width=self.blockButton.width) self.fillButton.tooltipText = "Shortcut: ENTER" col = (self.fillWithLabel, self.blockButton, replaceLabel, self.replaceBlockButton, self.swapButton, self.fillButton) col = Column(col) self.add(col) self.shrink_wrap()
class PlayerPositionPanel(Panel): def __init__(self, tool): Panel.__init__(self) self.tool = tool self.player_UUID = {} self.level = tool.editor.level if hasattr(self.level, 'players'): players = self.level.players or ["[No players]"] if not self.level.oldPlayerFolderFormat: for player in players: if player != "Player" and player != "[No players]": if len(player) > 4 and player[4] == "-": os.rename(os.path.join(self.level.worldFolder.getFolderPath("playerdata"), player+".dat"), os.path.join(self.level.worldFolder.getFolderPath("playerdata"), player.replace("-", "", 1)+".dat")) player = player.replace("-", "", 1) data = version_utils.playercache.getPlayerInfo(player) if isinstance(data, tuple): self.player_UUID[data[1]] = data[0] else: self.player_UUID[player] = data if "Player" in players: self.player_UUID["Player (Single Player)"] = "Player" if "[No players]" not in players: players = sorted(self.player_UUID.keys(), key=lambda x: False if x == "Player (Single Player)" else x) else: players = ["Player (Single Player)"] self.players = players self.pages = TabPanel() tab_height = self.pages.tab_height max_height = tab_height + self.tool.editor.mainViewport.height - self.tool.editor.toolbar.height - self.tool.editor.subwidgets[0].height - self.pages.margin * 2 #-# Uncomment the following line to have a maximum height for this panel. # max_height = min(max_height, 500) self.editNBTDataButton = Button("Edit NBT", action=self.editNBTData, tooltipText="Open the NBT Explorer to edit player's attributes and inventory") addButton = Button("Add", action=self.tool.addPlayer) removeButton = Button("Remove", action=self.tool.removePlayer) gotoButton = Button("Goto", action=self.tool.gotoPlayer) gotoCameraButton = Button("Goto View", action=self.tool.gotoPlayerCamera) moveButton = Button("Move", action=self.tool.movePlayer) moveToCameraButton = Button("Align to Camera", action=self.tool.movePlayerToCamera) reloadSkin = Button("Reload Skins", action=self.tool.reloadSkins, tooltipText="This pulls skins from the online server, so this may take a while") btns = Column([self.editNBTDataButton, addButton, removeButton, gotoButton, gotoCameraButton, moveButton, moveToCameraButton, reloadSkin], margin=0, spacing=2) h = max_height - btns.height - self.pages.margin * 2 - 2 - self.font.get_linesize() * 2 col = Label('') def close(): self.pages.show_page(col) self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject={}, height=max_height, \ close_text="Go Back", no_header=True, close_action=close, load_text=None) self.nbttree.shrink_wrap() self.nbtpage = Column([self.nbttree,]) self.nbtpage.shrink_wrap() self.pages.add_page("NBT Data", self.nbtpage) self.pages.set_rect(map(lambda x:x+self.margin, self.nbttree._rect)) tableview = TableView(nrows=(h - (self.font.get_linesize() * 2.5)) / self.font.get_linesize(), header_height=self.font.get_linesize(), columns=[TableColumn("Player Name(s):", self.nbttree.width - (self.margin * 3)),], ) tableview.index = 0 tableview.num_rows = lambda: len(players) tableview.row_data = lambda i: (players[i],) tableview.row_is_selected = lambda x: x == tableview.index tableview.zebra_color = (0, 0, 0, 48) def selectTableRow(i, evt): tableview.index = i tableview.click_row = selectTableRow def mouse_down(e): if e.button == 1 and e.num_clicks > 1: self.editNBTData() TableRowView.mouse_down(tableview.rows, e) tableview.rows.mouse_down = mouse_down tableview.rows.tooltipText = "Double-click or use the button below to edit the NBT Data." self.table = tableview col.set_parent(None) self.col = col = Column([tableview, btns], spacing=2) self.pages.add_page("Players", col, 0) self.pages.shrink_wrap() self.pages.show_page(col) self.add(self.pages) self.shrink_wrap() self.max_height = max_height def editNBTData(self): player = self.selectedPlayer if player == 'Player (Single Player)': alert("Not yet implemented.\nUse the NBT Explorer to edit this player.") elif player == '[No players]': return else: path = os.path.join(os.path.split(self.level.filename)[0], 'playerdata') if not os.path.exists(path): path = os.path.join(os.path.split(self.level.filename)[0], 'players') if player + '.dat' in os.listdir(path): fName = os.path.join(path, player + '.dat') nbtObject, dataKeyName, dontSaveRootTag, fn = loadFile(fName) self.pages.remove_page(self.nbtpage) def close(): self.pages.show_page(self.col) self.nbttree = NBTExplorerToolPanel(self.tool.editor, nbtObject=nbtObject, fileName=fName, dontSaveRootTag=dontSaveRootTag, dataKeyName=dataKeyName, height=self.max_height, no_header=True, close_text="Go Back", close_action=close, load_text=None) self.nbtpage = Column([self.nbttree,]) self.nbtpage.shrink_wrap() self.pages.add_page("NBT Data", self.nbtpage) self.pages.show_page(self.nbtpage) #elif self.selectedPlayer.isNew: else: alert(_("Error while getting player file.\n%s not found.")%(player + '.dat'), doNotTranslate=True) @property def selectedPlayer(self): if not self.level.oldPlayerFolderFormat: player = self.players[self.table.index] if player != "Player (Single Player)" and player != "[No players]": return self.player_UUID[player] else: return player else: return self.players[self.table.index] def key_down(self, evt): self.dispatch_key('key_down', evt) def dispatch_key(self, name, evt): if not hasattr(evt, 'key'): return if name == "key_down": keyname = self.root.getKey(evt) if self.pages.current_page == self.col: if keyname == "Up" and self.table.index > 0: self.table.index -= 1 self.table.rows.scroll_to_item(self.table.index) elif keyname == "Down" and self.table.index < len(self.players) - 1: self.table.index += 1 self.table.rows.scroll_to_item(self.table.index) elif keyname == 'Page down': self.table.index = min(len(self.players) - 1, self.table.index + self.table.rows.num_rows()) elif keyname == 'Page up': self.table.index = max(0, self.table.index - self.table.rows.num_rows()) elif keyname == 'Return': if self.selectedPlayer != None: self.editNBTData() if self.table.rows.cell_to_item_no(0, 0) + self.table.rows.num_rows() -1 > self.table.index or self.table.rows.cell_to_item_no(0, 0) + self.table.rows.num_rows() -1 < self.table.index: self.table.rows.scroll_to_item(self.table.index) elif self.pages.current_page == self.nbtpage: self.nbttree.dispatch_key(name, evt)
def __init__(self, tool, editor, _parent=None): Panel.__init__(self) self.tool = tool rotaterollRow = Row(( Label(config.keys.rotateClone.get()), Button("Rotate", width=80, action=tool.rotate, enable=self.transformEnable), Label(config.keys.rollClone.get()), Button("Roll", width=80, action=tool.roll, enable=self.transformEnable), )) flipmirrorRow = Row(( Label(config.keys.flip.get()), Button("Flip", width=80, action=tool.flip, enable=self.transformEnable), Label(config.keys.mirror.get()), Button("Mirror", width=80, action=tool.mirror, enable=self.transformEnable), )) self.alignCheckBox = CheckBox(ref=AttrRef(self.tool, 'chunkAlign')) self.alignLabel = Label("Chunk Align") self.alignLabel.mouse_down = self.alignCheckBox.mouse_down alignRow = Row((self.alignCheckBox, self.alignLabel)) # headerLabel = Label("Clone Offset") if self.useOffsetInput: self.offsetInput = CoordsInput(editor) self.offsetInput.coordsChanged = tool.offsetChanged self.offsetInput.nudgeButton.bg_color = tool.color self.offsetInput.nudge = tool.nudge else: self.nudgeButton = NudgeButton(editor) self.nudgeButton.bg_color = tool.color self.nudgeButton.nudge = tool.nudge repeatField = IntField(ref=AttrRef(tool, 'repeatCount')) repeatField.min = 1 repeatField.max = 1000 repeatRow = Row((Label("Repeat"), repeatField)) self.repeatField = repeatField scaleField = FloatField(ref=AttrRef(tool, 'scaleFactor')) scaleField.min = 0.1 scaleField.max = 8 if self.transformEnable(): scaleRow = Row((Label("Scale Factor"), scaleField)) else: scaleRow = Row((Label("Scale Factor: 1.0"), )) self.scaleField = scaleField self.copyAirCheckBox = CheckBox(ref=AttrRef(self.tool, "copyAir")) self.copyAirLabel = Label("Copy Air") self.copyAirLabel.mouse_down = self.copyAirCheckBox.mouse_down self.copyAirLabel.tooltipText = "Shortcut: Alt-1" self.copyAirCheckBox.tooltipText = self.copyAirLabel.tooltipText copyAirRow = Row((self.copyAirCheckBox, self.copyAirLabel)) self.copyWaterCheckBox = CheckBox(ref=AttrRef(self.tool, "copyWater")) self.copyWaterLabel = Label("Copy Water") self.copyWaterLabel.mouse_down = self.copyWaterCheckBox.mouse_down self.copyWaterLabel.tooltipText = "Shortcut: Alt-2" self.copyWaterCheckBox.tooltipText = self.copyWaterLabel.tooltipText copyWaterRow = Row((self.copyWaterCheckBox, self.copyWaterLabel)) self.copyBiomesCheckBox = CheckBox( ref=AttrRef(self.tool, "copyBiomes")) self.copyBiomesLabel = Label("Copy Biome(s)") self.copyBiomesLabel.mouse_down = self.copyBiomesCheckBox.mouse_down self.copyBiomesLabel.tooltipText = "Shortcut: Alt-3" self.copyBiomesCheckBox.tooltipText = self.copyBiomesLabel.tooltipText copyBiomesRow = Row((self.copyBiomesCheckBox, self.copyBiomesLabel)) self.staticCommandsCheckBox = CheckBox( ref=AttrRef(self.tool, "staticCommands")) self.staticCommandsLabel = Label("Update Command Block Coords") self.staticCommandsLabel.mouse_down = self.staticCommandsCheckBox.mouse_down self.staticCommandsLabel.tooltipText = "When a command block is moved, and it contains a command, automatically update static coordinates (x y z) within that command.\nShortcut: Alt-4" self.staticCommandsCheckBox.tooltipText = self.staticCommandsLabel.tooltipText staticCommandsRow = Row( (self.staticCommandsCheckBox, self.staticCommandsLabel)) self.moveSpawnerPosCheckBox = CheckBox( ref=AttrRef(self.tool, "moveSpawnerPos")) self.moveSpawnerPosLabel = Label("Update Spawner Coords") self.moveSpawnerPosLabel.mouse_down = self.moveSpawnerPosCheckBox.mouse_down self.moveSpawnerPosLabel.tooltipText = "When a spawner is moved, automatically update its spawning coordinates.\nShortcut: Alt-5" self.moveSpawnerPosCheckBox.tooltipText = self.moveSpawnerPosLabel.tooltipText moveSpawnerPosRow = Row( (self.moveSpawnerPosCheckBox, self.moveSpawnerPosLabel)) self.regenerateUUIDCheckBox = CheckBox( ref=AttrRef(self.tool, "regenerateUUID")) self.regenerateUUIDLabel = Label("Regenerate Entity UUID") self.regenerateUUIDLabel.mouse_down = self.regenerateUUIDCheckBox.mouse_down self.regenerateUUIDLabel.tooltipText = "Automatically generate new UUIDs for every entity copied. [RECOMMENDED]\nShortcut: Alt-6" self.regenerateUUIDCheckBox.tooltipText = self.regenerateUUIDLabel.tooltipText regenerateUUIDRow = Row( (self.regenerateUUIDCheckBox, self.regenerateUUIDLabel)) self.performButton = Button("Clone", width=100, align="c") self.performButton.tooltipText = "Shortcut: Enter" self.performButton.action = tool.confirm self.performButton.enable = lambda: (tool.destPoint is not None) max_height = self.tool.editor.mainViewport.height - self.tool.editor.toolbar.height - self.tool.editor.subwidgets[ 0].height # - self.performButton.height - 2 def buildPage(*items): height = 0 cls = [] idx = 0 for i, r in enumerate(items): r.margin = 0 r.shrink_wrap() height += r.height if height > max_height: cls.append(Column(items[idx:i], spacing=2, margin=0)) idx = i height = 0 cls.append(Column(items[idx:], spacing=2, margin=0)) return cls if self.useOffsetInput: cols = buildPage(rotaterollRow, flipmirrorRow, alignRow, self.offsetInput, repeatRow, scaleRow, copyAirRow, copyWaterRow, copyBiomesRow, staticCommandsRow, moveSpawnerPosRow, regenerateUUIDRow) else: cols = buildPage(rotaterollRow, flipmirrorRow, alignRow, self.nudgeButton, scaleRow, copyAirRow, copyWaterRow, copyBiomesRow, staticCommandsRow, moveSpawnerPosRow, regenerateUUIDRow) row = Row(cols, spacing=0, margin=2) row.shrink_wrap() col = Column((row, self.performButton), spacing=2) self.add(col) self.anchor = "lwh" self.shrink_wrap()
def reload(self): for i in list(self.subwidgets): self.remove(i) tool = self.tool # Display "No filter modules found" if there are no filters if len(tool.filterModules) is 0: self.add(Label("No filter modules found!")) self.shrink_wrap() return names_list = sorted([n for n in tool.filterNames if not n.startswith("[")]) # We get a list of names like ["[foo] bar", "[test] thing"] # The to sort on is created by splitting on "[": "[foo", " bar" and then # removing the first char: "foo", "bar" subfolder_names_list = sorted([n for n in tool.filterNames if n.startswith("[")], key=lambda x: x.split("]")[0][1:]) names_list.extend(subfolder_names_list) names_list.extend([macro for macro in self.filter_json["Macros"].keys()]) if self.selectedName is None or self.selectedName not in names_list: self.selectedName = names_list[0] # Remove any keybindings that don't have a filter for (i, j) in config.config.items("Filter Keys"): if i == "__name__": continue if not any([i == m.lower() for m in names_list]): config.config.remove_option("Filter Keys", i) self.filterSelect.choices = names_list name = self.selectedName.lower() names = [k for (k, v) in config.config.items("Filter Keys")] btn_name = config.config.get("Filter Keys", name) if name in names else "*" self.binding_button.set_text(btn_name) self.filterOptionsPanel = None while self.filterOptionsPanel is None: module = self.tool.filterModules.get(self.selectedName, None) if module is not None: try: self.filterOptionsPanel = FilterModuleOptions(self.tool, module, _parent=self) except Exception as e: alert(_("Error creating filter inputs for {0}: {1}").format(module, e)) traceback.print_exc() self.tool.filterModules.pop(self.selectedName) self.selectedName = tool.filterNames[0] if len(tool.filterNames) == 0: raise ValueError("No filters loaded!") if not self._recording: self.confirmButton.set_text("Filter") else: # We verified it was an existing macro already macro_data = self.filter_json["Macros"][self.selectedName] self.filterOptionsPanel = MacroModuleOptions(macro_data) self.confirmButton.set_text("Run Macro") # This has to be recreated every time in case a macro has a longer name then everything else. self.filterSelect = ChoiceButton(names_list, choose=self.filterChanged, doNotTranslate=True) self.filterSelect.selectedChoice = self.selectedName self.filterSelectRow = Row((self.filterLabel, self.filterSelect, self.macro_button, self.binding_button)) self.add(Column((self.filterSelectRow, self.filterOptionsPanel, self.confirmButton))) self.shrink_wrap() if self.parent: height = self.parent.mainViewport.height - self.parent.toolbar.height self.centery = height / 2 + self.parent.subwidgets[0].height if self.selectedName in self.tool.savedOptions: self.filterOptionsPanel.options = self.tool.savedOptions[self.selectedName]