def updateFilters(self): totalFilters = 0 updatedFilters = 0 try: os.mkdir(mcplatform.filtersDir + "/updates") except OSError: pass for module in self.filterModules.values(): totalFilters = totalFilters + 1 if hasattr(module, "UPDATE_URL") and hasattr(module, "VERSION"): if isinstance(module.UPDATE_URL, (str, unicode)) and isinstance(module.VERSION, (str, unicode)): versionJSON = json.loads(urllib2.urlopen(module.UPDATE_URL).read()) if module.VERSION != versionJSON["Version"]: urllib.urlretrieve(versionJSON["Download-URL"], mcplatform.filtersDir + "/updates/" + versionJSON["Name"]) updatedFilters = updatedFilters + 1 for f in os.listdir(mcplatform.filtersDir + "/updates"): shutil.copy(mcplatform.filtersDir + "/updates/" + f, mcplatform.filtersDir) shutil.rmtree(mcplatform.filtersDir + "/updates/") self.finishedUpdatingWidget = Widget() lbl = Label("Updated " + str(updatedFilters) + " filter(s) out of " + str(totalFilters)) closeBTN = Button("Close this message", action=self.closeFinishedUpdatingWidget) col = Column((lbl, closeBTN)) self.finishedUpdatingWidget.bg_color = (0.0, 0.0, 0.6) self.finishedUpdatingWidget.add(col) self.finishedUpdatingWidget.shrink_wrap() self.finishedUpdatingWidget.present()
def __init__(self, tool, module, *args, **kw): Widget.__init__(self, *args, **kw) self.tool = tool pages = TabPanel() pages.is_gl_container = True self.pages = pages self.optionDict = {} pageTabContents = [] self.giveEditorObject(module) print "Creating options for ", module if hasattr(module, "inputs"): if isinstance(module.inputs, list): for tabData in module.inputs: title, page, pageRect = self.makeTabPage(self.tool, tabData) pages.add_page(title, page) pages.set_rect(pageRect.union(pages._rect)) elif isinstance(module.inputs, tuple): title, page, pageRect = self.makeTabPage(self.tool, module.inputs) pages.add_page(title, page) pages.set_rect(pageRect) else: self.size = (0, 0) pages.shrink_wrap() self.add(pages) self.shrink_wrap() if len(pages.pages): if (pages.current_page != None): pages.show_page(pages.current_page) else: pages.show_page(pages.pages[0]) for eachPage in pages.pages: self.optionDict = dict(self.optionDict.items() + eachPage.optionDict.items())
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, 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 updateFilters(self): totalFilters = 0 updatedFilters = 0 filtersDir = directories.getFiltersDir() try: os.mkdir(os.path.join(filtersDir, "updates")) except OSError: pass for module in self.filterModules.values(): totalFilters += 1 if hasattr(module, "UPDATE_URL") and hasattr(module, "VERSION"): if isinstance(module.UPDATE_URL, (str, unicode)) and isinstance( module.VERSION, (str, unicode)): versionJSON = json.loads( urllib2.urlopen(module.UPDATE_URL).read()) if module.VERSION != versionJSON["Version"]: urllib.urlretrieve( versionJSON["Download-URL"], os.path.join(filtersDir, "updates", versionJSON["Name"])) updatedFilters += 1 for f in os.listdir(os.path.join(filtersDir, "updates")): shutil.copy(os.path.join(filtersDir, "updates", f), filtersDir) shutil.rmtree(os.path.join(filtersDir, "updates")) finishedUpdatingWidget = Widget() lbl = Label("Updated %s filter(s) out of %s" % (updatedFilters, totalFilters)) closeBTN = Button("Close this message", action=finishedUpdatingWidget.dismiss) col = Column((lbl, closeBTN)) finishedUpdatingWidget.bg_color = (0.0, 0.0, 0.6) finishedUpdatingWidget.add(col) finishedUpdatingWidget.shrink_wrap() finishedUpdatingWidget.present()
def updateFilters(self): totalFilters = 0 updatedFilters = 0 filtersDir = directories.getFiltersDir() try: os.mkdir(os.path.join(filtersDir, "updates")) except OSError: pass for module in self.filterModules.values(): totalFilters += 1 if hasattr(module, "UPDATE_URL") and hasattr(module, "VERSION"): if isinstance(module.UPDATE_URL, (str, unicode)) and isinstance(module.VERSION, (str, unicode)): versionJSON = json.loads(urllib2.urlopen(module.UPDATE_URL).read()) if module.VERSION != versionJSON["Version"]: urllib.urlretrieve(versionJSON["Download-URL"], os.path.join(filtersDir, "updates", versionJSON["Name"])) updatedFilters += 1 for f in os.listdir(os.path.join(filtersDir, "updates")): shutil.copy(os.path.join(filtersDir, "updates", f), filtersDir) shutil.rmtree(os.path.join(filtersDir, "updates")) finishedUpdatingWidget = Widget() lbl = Label("Updated %s filter(s) out of %s" % (updatedFilters, totalFilters)) closeBTN = Button("Close this message", action=finishedUpdatingWidget.dismiss) col = Column((lbl, closeBTN)) finishedUpdatingWidget.bg_color = (0.0, 0.0, 0.6) finishedUpdatingWidget.add(col) finishedUpdatingWidget.shrink_wrap() finishedUpdatingWidget.present()
def __init__(self, tool, module, *args, **kw): self._parent = None self.nbttree = None self.module = module if '_parent' in kw.keys(): self._parent = kw.pop('_parent') Widget.__init__(self, *args, **kw) self.spacing = 2 self.tool = tool self.pages = pages = TabPanel() pages.is_gl_container = True self.optionDict = {} self.giveEditorObject(module) log.info("Creating options for " + str(module)) if hasattr(module, "inputs"): trn = getattr(module, "trn", None) self.trn = trn if isinstance(module.inputs, list): self.pgs = [] for tabData in module.inputs: title, page, pageRect = self.makeTabPage(self.tool, tabData, trn=trn) self.pgs.append((title, page)) pages.set_parent(None) self.pages = pages = TabPanel(self.pgs) elif isinstance(module.inputs, tuple): title, page, pageRect = self.makeTabPage(self.tool, module.inputs, trn=trn) pages.add_page(title, page) pages.set_rect(pageRect) else: self.size = (0, 0) pages.shrink_wrap() self.add(pages) self.shrink_wrap() if len(pages.pages): if pages.current_page is not None: pages.show_page(pages.current_page) else: pages.show_page(pages.pages[0]) for eachPage in pages.pages: self.optionDict = dict(self.optionDict.items() + eachPage.optionDict.items())
def __init__(self, macro_data, *args, **kw): self._parent = None self._macro_data = macro_data if '_parent' in kw.keys(): self._parent = kw.pop('_parent') Widget.__init__(self, *args, **kw) infoColList = [] stepsLabel = wrapped_label("Number of steps: %s" % macro_data["Number of steps"], 300) infoColList.append(stepsLabel) for step in sorted(macro_data.keys()): if step != "Number of steps": infoColList.append(wrapped_label("Step %s: %s" % (int(step) + 1, macro_data[step]["Name"]), 300)) self.add(Column(infoColList)) self.shrink_wrap()
def draw(self, surface): if self.root is None: self.root = self.get_root() Widget.draw(self, surface) frameStart = datetime.now() frameInterval = timedelta(0, 1, 0) / 2 amount = None try: while datetime.now() < frameStart + frameInterval: amount = progressIterator.next() if self.firstDraw is False: self.firstDraw = True break except StopIteration: self.dismiss() infoText = "" if amount is not None: if isinstance(amount, tuple): if len(amount) > 2: infoText = ": " + amount[2] amount, max = amount[:2] else: max = amount maxwidth = (self.width - self.margin * 2) if amount is None: self.progressBar.width = maxwidth self.progressBar.bg_color = (255, 255, 25, 255) elif isinstance(amount, basestring): self.statusText = amount else: self.progressAmount = amount if isinstance(amount, (int, float)): self.progressFraction = float(amount) / (float(max) or 1) self.progressBar.width = maxwidth * self.progressFraction self.statusText = str("{0} / {1}".format(amount, max)) else: self.statusText = str(amount) if infoText: self.statusText += infoText
def __init__(self, file_types=None, operation=0, **kwds): Widget.__init__(self, **kwds) if file_types is None: self.file_types = ["*.*",] else: self.file_types = file_types self.file_path = None self._button = None if operation == self.OPEN_FILE: self._button = Button("Choose a file", action=self._open_file) elif operation == self.SAVE_FILE: self._button = Button("Save a file", action=self._save_file) self.add(self._button) self.shrink_wrap()
def __init__(self, editor): Widget.__init__(self) self.nudgeButton = NudgeButton(editor) self.nudgeButton.nudge = self._nudge self.xField = IntField(value=0) self.yField = IntField(value=0) self.zField = IntField(value=0) for field in (self.xField, self.yField, self.zField): field.change_action = self._coordsChanged field.enter_passes = False offsetCol = Column((self.xField, self.yField, self.zField)) nudgeOffsetRow = Row((offsetCol, self.nudgeButton)) self.add(nudgeOffsetRow) self.shrink_wrap()
def perform(level, box, options): op = options["Operation"] #print dir(level.scoreboard.Objectives) #print level.init_scoreboard().PlayerScores["Chevalerie94"] print "Test Filter Ran" if op == "Yes/No Dialog": choice = editor.YesNoWidget("Place a sponge block here?") if choice: yesFunc(level, box) raise Exception("Response was Yes") else: raise Exception("Response was No") elif op == "Custom Dialog (Hi Button)": widget = Widget() widget.bg_color = (0.0, 0.0, 0.6) lbl = Label("Test Message from a External Widget") btn = Button("Hi", action=hiAction) widget.add(lbl) widget.add(btn) widget.shrink_wrap() editor.addExternalWidget(widget) elif op == "Scoreboard Editing (Objective)": scoreboard = level.init_scoreboard() test_objective = TAG_Compound() test_objective["Name"] = TAG_String("FilterObjective") test_objective["DisplayName"] = TAG_String("FilterObjective") test_objective["CriteriaName"] = TAG_String("dummy") test_objective["RenderType"] = TAG_String("integer") scoreboard["data"]["Objectives"].append(test_objective) level.save_scoreboard(scorebaord) for objective in score.Objectives: print "Objective Name: " + str(objective["Name"].value) elif op == "Scoreboard Editing (Team)": if level.scoreboard != None: for team in level.scoreboard.Teams: print "Team Name: " + str(team.DisplayName) elif op == "Player Data": players = level.init_player_data() for p in players: print p.name for item in p.inventory: print item["id"].value print "===" p.save()
def perform(level, box, options): op = options["Operation"] #print dir(level.scoreboard.Objectives) print "Test Filter Ran" if op == "Yes/No Dialog": choice = editor.YesNoWidget("Place a sponge block here?") if choice: yesFunc(level, box) raise Exception("Response was Yes") else: raise Exception("Response was No") elif op == "Custom Dialog (Hi Button)": widget = Widget() widget.bg_color = (0.0, 0.0, 0.6) lbl = Label("Test Message from a External Widget") btn = Button("Hi", action=hiAction) widget.add(lbl) widget.add(btn) widget.shrink_wrap() editor.addExternalWidget(widget) elif op == "Scoreboard Editing (Objective)": if level.scoreboard != None: test_objective = TAG_Compound() test_objective["Name"] = TAG_String("FilterObjective") test_objective["DisplayName"] = TAG_String("FilterObjective") test_objective["CriteriaName"] = TAG_String("dummy") test_objective["RenderType"] = TAG_String("integer") test_objective = scoreboard.Objective(test_objective) level.scoreboard.Objectives.append(test_objective) level.scoreboard.save(level) for objective in level.scoreboard.Objectives: print "Objective Name: " + str(objective.Name) elif op == "Scoreboard Editing (Team)": if level.scoreboard != None: for team in level.scoreboard.Teams: print "Team Name: " + str(team.DisplayName)
def makeTabPage(self, tool, inputs): page = Widget() page.is_gl_container = True rows = [] cols = [] height = 0 max_height = 550 page.optionDict = {} page.tool = tool title = "Tab" for optionName, optionType in inputs: if isinstance(optionType, tuple): if isinstance(optionType[0], (int, long, float)): if len(optionType) > 2: val, min, max = optionType elif len(optionType) == 2: min, max = optionType val = min rows.append(addNumField(page, optionName, val, min, max)) 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 key = None try: v = int(splitWord[1]) except: pass key = splitWord[0] if v is not None: if key == "lines": lin = v elif key == "width": wid = v else: if key == "value": val = splitWord[1] if val is None: val = "" if wid is None: wid = 200 field = TextField(value=val, width=wid) page.optionDict[optionName] = AttrRef(field, 'value') row = Row((Label(optionName), field)) rows.append(row) else: isChoiceButton = True if isChoiceButton: choiceButton = ChoiceButton(map(str, optionType)) page.optionDict[optionName] = AttrRef(choiceButton, 'selectedChoice') rows.append(Row((Label(optionName), choiceButton))) elif isinstance(optionType, bool): cbox = CheckBox(value=optionType) page.optionDict[optionName] = AttrRef(cbox, 'value') row = Row((Label(optionName), cbox)) rows.append(row) elif isinstance(optionType, (int, float)): rows.append(addNumField(self, optionName, 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(optionName), blockButton)) page.optionDict[optionName] = AttrRef(blockButton, 'blockInfo') rows.append(row) elif optionType == "label": rows.append(wrapped_label(optionName, 50)) elif optionType == "string": input = None # not sure how to pull values from filters, but leaves it open for the future. Use this variable to set field width. if input != None: size = input else: size = 200 field = TextField(value="") row = TextInputRow(optionName, ref=AttrRef(field, 'value'), width=size) page.optionDict[optionName] = AttrRef(field, 'value') rows.append(row) elif optionType == "title": title = optionName else: raise ValueError(("Unknown option type", optionType)) height = sum(r.height for r in rows) if height > max_height: h = 0 for i, r in enumerate(rows): h += r.height if h > height / 2: break cols.append(Column(rows[:i])) rows = rows[i:] # cols.append(Column(rows)) if len(rows): cols.append(Column(rows)) if len(cols): page.add(Row(cols)) page.shrink_wrap() return (title, page, page._rect)
def __init__(self, value=None): Widget.__init__(self) self.choiceButton = ChoiceButton(self.choices) self.add(self.choiceButton) 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, 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 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) 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 type(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 showProgress(progressText, progressIterator, cancel=False): """Show the progress for a long-running synchronous operation. progressIterator should be a generator-like object that can return either None, for an indeterminate indicator, A float value between 0.0 and 1.0 for a determinate indicator, A string, to update the progress info label or a tuple of (float value, string) to set the progress and update the label""" class ProgressWidget(Dialog): progressFraction = 0.0 firstDraw = False def draw(self, surface): Widget.draw(self, surface) frameStart = datetime.now() frameInterval = timedelta(0, 1, 0) / 2 amount = None try: while datetime.now() < frameStart + frameInterval: amount = progressIterator.next() if self.firstDraw is False: self.firstDraw = True break except StopIteration: self.dismiss() infoText = "" if amount is not None: if isinstance(amount, tuple): if len(amount) > 2: infoText = ": " + amount[2] amount, max = amount[:2] else: max = amount maxwidth = (self.width - self.margin * 2) if amount is None: self.progressBar.width = maxwidth self.progressBar.bg_color = (255, 255, 25, 255) elif isinstance(amount, basestring): self.statusText = amount else: self.progressAmount = amount if isinstance(amount, (int, float)): self.progressFraction = float(amount) / (float(max) or 1) self.progressBar.width = maxwidth * self.progressFraction self.statusText = str("{0} / {1}".format(amount, max)) else: self.statusText = str(amount) if infoText: self.statusText += infoText @property def estimateText(self): delta = ((datetime.now() - self.startTime)) progressPercent = (int(self.progressFraction * 10000)) left = delta * (10000 - progressPercent) / (progressPercent or 1) return "Time left: {0}".format(left) def cancel(self): if cancel: self.dismiss(False) def idleevent(self, evt): self.invalidate() widget = ProgressWidget() widget.progressText = progressText widget.statusText = "" widget.progressAmount = 0.0 progressLabel = ValueDisplay(ref=AttrRef(widget, 'progressText'), width=550) statusLabel = ValueDisplay(ref=AttrRef(widget, 'statusText'), width=550) estimateLabel = ValueDisplay(ref=AttrRef(widget, 'estimateText'), width=550) progressBar = Widget(size=(550, 20), bg_color=(150, 150, 150, 255)) widget.progressBar = progressBar col = (progressLabel, statusLabel, estimateLabel, progressBar) if cancel: cancelButton = Button("Cancel", action=widget.cancel, fg_color=(255, 0, 0, 255)) col += (Column((cancelButton, ), align="r"), ) widget.add(Column(col)) widget.shrink_wrap() widget.startTime = datetime.now() if widget.present(): return widget.progressAmount else: return "Canceled"
class FilterTool(EditorTool): tooltipText = "Filter" toolIconName = "filter" def __init__(self, editor): EditorTool.__init__(self, editor) self.filterModules = {} self.savedOptions = {} self.updatePanel = Panel() updateButton = Button("Update Filters", action=self.updateFilters) self.updatePanel.add(updateButton) self.updatePanel.shrink_wrap() self.updatePanel.bottomleft = self.editor.viewportContainer.bottomleft @property def statusText(self): return "Choose a filter, then click Filter or press Enter to apply it." def toolEnabled(self): return not (self.selectionBox() is None) def toolSelected(self): self.showPanel() @alertException def showPanel(self): self.panel = FilterToolPanel(self) self.updatePanel.bottomleft = self.editor.viewportContainer.bottomleft self.editor.add(self.updatePanel) self.reloadFilters() self.panel.reload() height = self.editor.mainViewport.height - self.editor.toolbar.height self.panel.centery = height / 2 + self.editor.subwidgets[0].height self.panel.left = self.editor.left self.editor.add(self.panel) def hidePanel(self): if self.panel is None: return self.panel.close() if self.panel.parent: self.panel.parent.remove(self.panel) self.updatePanel.parent.remove(self.updatePanel) self.panel = None def updateFilters(self): totalFilters = 0 updatedFilters = 0 filtersDir = directories.getFiltersDir() try: os.mkdir(os.path.join(filtersDir, "updates")) except OSError: pass for module in self.filterModules.values(): totalFilters += 1 if hasattr(module, "UPDATE_URL") and hasattr(module, "VERSION"): if isinstance(module.UPDATE_URL, (str, unicode)) and isinstance(module.VERSION, (str, unicode)): # Pass on URL or network errors. # This is a basic error hadling, need more refinement to sort errors... update = True try: versionJSON = json.loads(urllib2.urlopen(module.UPDATE_URL).read()) except Exception, e: update = False log.warn(" Could not fetch source for %s. System said: %s"%(module.displayName, e)) if update and module.VERSION != versionJSON["Version"]: urllib.urlretrieve(versionJSON["Download-URL"], os.path.join(filtersDir, "updates", versionJSON["Name"])) updatedFilters += 1 for f in os.listdir(os.path.join(filtersDir, "updates")): shutil.copy(os.path.join(filtersDir, "updates", f), filtersDir) shutil.rmtree(os.path.join(filtersDir, "updates")) finishedUpdatingWidget = Widget() lbl = Label("Updated %s filter(s) out of %s" % (updatedFilters, totalFilters)) closeBTN = Button("Close this message", action=finishedUpdatingWidget.dismiss) col = Column((lbl, closeBTN)) finishedUpdatingWidget.bg_color = (0.0, 0.0, 0.6) finishedUpdatingWidget.add(col) finishedUpdatingWidget.shrink_wrap() finishedUpdatingWidget.present()
def __init__(self, materials, blockInfo=None, **kw): Widget.__init__(self, **kw) self.materials = materials self.blockInfo = blockInfo
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
class FilterTool(EditorTool): tooltipText = "Filter" toolIconName = "filter" def __init__(self, editor): EditorTool.__init__(self, editor) self.filterModules = {} self.panel = FilterToolPanel(self) @property def statusText(self): return "Choose a filter, then click Filter or press ENTER to apply it." def toolEnabled(self): return not (self.selectionBox() is None) def toolSelected(self): self.showPanel() @alertException def showPanel(self): if self.panel.parent: self.editor.remove(self.panel) self.reloadFilters() # self.panel = FilterToolPanel(self) self.panel.reload() self.panel.midleft = self.editor.midleft self.editor.add(self.panel) self.updatePanel = Panel() updateButton = Button("Update Filters", action=self.updateFilters) self.updatePanel.add(updateButton) self.updatePanel.shrink_wrap() self.updatePanel.bottomleft = self.editor.viewportContainer.bottomleft self.editor.add(self.updatePanel) def hidePanel(self): self.panel.saveOptions() if self.panel.parent: self.panel.parent.remove(self.panel) self.updatePanel.parent.remove(self.updatePanel) def updateFilters(self): totalFilters = 0 updatedFilters = 0 try: os.mkdir(mcplatform.filtersDir + "/updates") except OSError: pass for module in self.filterModules.values(): totalFilters = totalFilters + 1 if hasattr(module, "UPDATE_URL") and hasattr(module, "VERSION"): if isinstance(module.UPDATE_URL, (str, unicode)) and isinstance(module.VERSION, (str, unicode)): versionJSON = json.loads(urllib2.urlopen(module.UPDATE_URL).read()) if module.VERSION != versionJSON["Version"]: urllib.urlretrieve(versionJSON["Download-URL"], mcplatform.filtersDir + "/updates/" + versionJSON["Name"]) updatedFilters = updatedFilters + 1 for f in os.listdir(mcplatform.filtersDir + "/updates"): shutil.copy(mcplatform.filtersDir + "/updates/" + f, mcplatform.filtersDir) shutil.rmtree(mcplatform.filtersDir + "/updates/") self.finishedUpdatingWidget = Widget() lbl = Label("Updated " + str(updatedFilters) + " filter(s) out of " + str(totalFilters)) closeBTN = Button("Close this message", action=self.closeFinishedUpdatingWidget) col = Column((lbl, closeBTN)) self.finishedUpdatingWidget.bg_color = (0.0, 0.0, 0.6) self.finishedUpdatingWidget.add(col) self.finishedUpdatingWidget.shrink_wrap() self.finishedUpdatingWidget.present() def closeFinishedUpdatingWidget(self): self.finishedUpdatingWidget.dismiss() def reloadFilters(self): filterDir = mcplatform.filtersDir filterFiles = os.listdir(filterDir) filterPyfiles = filter(lambda x: x.endswith(".py"), filterFiles) def tryImport(name): try: return __import__(name) except Exception, e: print traceback.format_exc() alert(_(u"Exception while importing filter module {}. See console for details.\n\n{}").format(name, e)) return object() filterModules = (tryImport(x[:-3]) for x in filterPyfiles) filterModules = filter(lambda module: hasattr(module, "perform"), filterModules) self.filterModules = collections.OrderedDict(sorted((self.moduleDisplayName(x), x) for x in filterModules)) for m in self.filterModules.itervalues(): try: reload(m) except Exception, e: print traceback.format_exc() alert( _(u"Exception while reloading filter module {}. Using previously loaded module. See console for details.\n\n{}").format( m.__file__, e))
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__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 xrange(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 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) 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 type( 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 makeTabPage(self, tool, inputs): page = Widget() page.is_gl_container = True rows = [] cols = [] height = 0 max_height = 550 page.optionDict = {} page.tool = tool title = "Tab" for optionName, optionType in inputs: if isinstance(optionType, tuple): if isinstance(optionType[0], (int, long, float)): if len(optionType) > 2: val, min, max = optionType elif len(optionType) == 2: min, max = optionType val = min rows.append(addNumField(page, optionName, val, min, max)) if isinstance(optionType[0], (str, unicode)): isChoiceButton = False if len(optionType) == 3: a,b,c = optionType if a == "strValSize": field = TextField(value=b, width=c) page.optionDict[optionName] = AttrRef(field, 'value') row = Row((Label(optionName), field)) rows.append(row) else: isChoiceButton = True elif len(optionType) == 2: a,b = optionType if a == "strVal": field = TextField(value=b, width=200) page.optionDict[optionName] = AttrRef(field, 'value') row = Row((Label(optionName), field)) rows.append(row) elif a == "strSize": field = TextField(value="Input String Here", width=b) page.optionDict[optionName] = AttrRef(field, 'value') row = Row((Label(optionName), field)) rows.append(row) else: isChoiceButton = True else: isChoiceButton = True if isChoiceButton: choiceButton = ChoiceButton(map(str, optionType)) page.optionDict[optionName] = AttrRef(choiceButton, 'selectedChoice') rows.append(Row((Label(optionName), choiceButton))) elif isinstance(optionType, bool): cbox = CheckBox(value=optionType) page.optionDict[optionName] = AttrRef(cbox, 'value') row = Row((Label(optionName), cbox)) rows.append(row) elif isinstance(optionType, (int, float)): rows.append(addNumField(self, optionName, 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(optionName), blockButton)) page.optionDict[optionName] = AttrRef(blockButton, 'blockInfo') rows.append(row) elif optionType == "label": rows.append(wrapped_label(optionName, 50)) elif optionType == "string": field = TextField(value="Input String Here", width=200) page.optionDict[optionName] = AttrRef(field, 'value') row = Row((Label(optionName), field)) rows.append(row) elif optionType == "title": title = optionName else: raise ValueError(("Unknown option type", optionType)) height = sum(r.height for r in rows) if height > max_height: h = 0 for i, r in enumerate(rows): h += r.height if h > height / 2: break cols.append(Column(rows[:i])) rows = rows[i:] #cols.append(Column(rows)) if len(rows): cols.append(Column(rows)) if len(cols): page.add(Row(cols)) page.shrink_wrap() return (title, page, page._rect)