def __init__(self, parentWindow): data = getExtensionDefault(self.identifier, dict()) self.w = Sheet((470, 580), parentWindow=parentWindow) self.w.tabs = Tabs((10, 10, -10, -40), ["TTF AutoHint", "HTML Preview"]) self.w.tabs[0].settings = self.settings = TTFAutoHintGroup((0, 0, -0, -0)) self.settings.set(data) y = 10 self.w.tabs[1].htmlText = TextBox((10, y, 100, 22), "HTML preview:") y += 30 self.w.tabs[1].html = self.html = CodeEditor((10, y, -10, 250), getExtensionDefault("%s.htmlPreview" % settingsIdentifier, htmlPreviewDefault), lexer="html") self.html.showLineNumbers(False) y += 260 self.w.tabs[1].globalCssText = TextBox((10, y, 100, 22), "CSS Style:") y += 30 self.w.tabs[1].globalCss = self.globalCss = CodeEditor((10, y, -10, -10), getExtensionDefault("%s.globalCSSPreview" % settingsIdentifier, ""), lexer="css") self.globalCss.showLineNumbers(False) self.w.saveButton = Button((-100, -30, -10, 20), "Save settings", callback=self.saveCallback, sizeStyle="small") self.w.setDefaultButton(self.w.saveButton) self.w.closeButton = Button((-190, -30, -110, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(unichr(27), []) self.w.resetButton = Button((-280, -30, -200, 20), "Reset", callback=self.resetCallback, sizeStyle="small") self.w.open()
def __init__(self): self.w = FloatingWindow((220, 240), "2 Twitter") left = 100 y = 10 userName = getExtensionDefault("%s.%s" %(defaultKey, "userName"), "") password = getExtensionDefault("%s.%s" %(defaultKey, "password"), "") self.w.userNameText = TextBox((10, y, left, 22), "User name:") self.w.userName = EditText((left, y, -10, 22), userName) y += 30 self.w.passwordText = TextBox((10, y, left, 22), "Password:"******"Glyph View", "Space Center"] self.w.view = RadioGroup((10, y, -10, -40), self._viewNames) self.w.view.set(0) self.w.okButton = Button((-70, -30, -15, 20), "Post", callback=self.okCallback, sizeStyle="small") self.w.setDefaultButton(self.w.okButton) self.w.closeButton = Button((-140, -30, -80, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(unichr(27), []) self.w.open()
def load(self): self.onOff = getExtensionDefault(onOffKey, self._fallbackOnOff) self.lineWidth = getExtensionDefault(lineWidthKey, self._fallbackStrokeWidth) self.lineColor = getExtensionDefaultColor(lineColorKey, self._fallbackStrokeColor) self.fillColor = getExtensionDefaultColor(fillColorKey, self._fallbackFillColor) self.lineRGBA = getExtensionDefault(lineRGBA, self._fallbackStrokeRGBA) self.fillRGBA = getExtensionDefault(fillRGBA, self._fallbackFillRGBA)
def __init__(self, constructions, font, parentWindow): self.font = font self.constructions = constructions self.w = Sheet((300, 120), parentWindow=parentWindow) getExtensionDefault, setExtensionDefault, getExtensionDefaultColor, setExtensionDefaultColor y = 15 self.w.overWrite = CheckBox((15, y, 200, 22), "Overwrite Existing Glyphs", value=getExtensionDefault(self.overWriteKey, True)) y += 35 self.w.markGlyphs = CheckBox((15, y, 200, 22), "Mark Glyphs", value=getExtensionDefault(self.overWriteKey, True), callback=self.markGlyphsCallback) self.w.markGlyphColor = ColorWell((130, y-5, 50, 30), color=getExtensionDefaultColor(self.markColorKey, NSColor.redColor())) self.w.markGlyphColor.enable(getExtensionDefault(self.overWriteKey, True)) self.w.okButton = Button((-70, -30, -15, 20), "Build", callback=self.buildCallback, sizeStyle="small") self.w.setDefaultButton(self.w.okButton) self.w.closeButton = Button((-140, -30, -80, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(unichr(27), []) self.w.open()
def __init__(self): addObserver(self, "_curvePreview", "draw") addObserver(self, "_curvePreview", "drawInactive") addObserver(self, "_currentGlyphChanged", "currentGlyphChanged") self.methods = { 0: "fl", 4: "free", } self.methodNames = [ "Tension:" ] height = 80 self.w = vanilla.FloatingWindow((300, height), "Hobby's Spline") y = -200 self.w.hobbyMethodSelector = vanilla.RadioGroup((10, y, -10, 108), titles = "Circle", callback=self._changeMethod, sizeStyle="small" ) y = 10 self.w.HobbySlider = Slider((15, y, -15, 25), tickMarkCount=4, callback=self._changetension, minValue=0.5, maxValue=1.0, sizeStyle="small", continuous=True ) y = height - 32 self.w.hobbycurveButton = vanilla.Button((60, y , -60, 25), "transform selected curves", callback=self._hobbycurve, sizeStyle="small", ) self.w.hobbyMethodSelector.set(getExtensionDefault("%s.%s" %(extensionID, "method"), 0)) self.method = self.methods[self.w.hobbyMethodSelector.get()] self._checkSecondarySelectors() self.w.HobbySlider.set(getExtensionDefault("%s.%s" %(extensionID, "tension"), 0.5)) self.tension = self.w.HobbySlider.get() self.tmp_glyph = RGlyph() UpdateCurrentGlyphView() self.setUpBaseWindowBehavior() self.w.open()
def run(self, destDir, progress): progress.update("Converting...") paths = self.controller.get() report = Report() report.css = CSSWriter() report.html = HTMLWriter(cssFileName="font.css", style=getExtensionDefault("%s.globalCSSPreview" % settingsIdentifier, "")) report.writeTitle("Web Fonts:") report.newLine() saveOTF = self.save_otf.get() saveTTF = self.save_ttf.get() saveWOFF = self.save_woff.get() saveWOFFFormat = self.save_woff_format.get() saveWOFF2 = self.save_woff2.get() saveWOFF2Format = self.save_woff2_format.get() saveEOT = self.save_eot.get() saveSVG = self.save_svg.get() suffix = self.webSuffix.get() suffix = time.strftime(suffix) preserveTTFhints = self.preserveTTFhints.get() progress.setTickCount(len(paths)) for path in paths: txt = os.path.basename(path) progress.update(txt) report.writeTitle(os.path.basename(path), "-") report.write("source: %s" % path) report.newLine() try: self._convertPath(path, destDir=destDir, saveOTF=saveOTF, saveTTF=saveTTF, saveWOFF=saveWOFF, saveWOFFFormat=saveWOFFFormat, saveWOFF2=saveWOFF2, saveWOFF2Format=saveWOFF2Format, saveEOT=saveEOT, saveSVG=saveSVG, suffix=suffix, report=report, preserveTTFhints=preserveTTFhints) except: import traceback message = traceback.format_exc() report.write("Failed:") report.write(message) report.indent(0) report.newLine() report.newLine() report.writeTitle("TTFAutohint options:") autohintOptions = getExtensionDefault(settingsIdentifier, defaultOptions) report.writeDict(autohintOptions) reportPath = os.path.join(destDir, "WebFonts Report.txt") report.save(reportPath) if self.generateHTML.get(): cssPath = os.path.join(destDir, "font.css") report.css.save(cssPath) htmlPath = os.path.join(destDir, "preview.html") report.html.save(htmlPath)
def _end(self): removeObserver(getExtensionDefault(selfKey), event) removeObserver(getExtensionDefault(selfKey), "currentGlyphChanged") removeObserver(getExtensionDefault(selfKey), "drawPreview") removeObserver(getExtensionDefault(selfKey), "draw") # removeObserver(getExtensionDefault(selfKey), 'drawBackground') setExtensionDefault(selfKey, None) # this is optional if wasOn: self._restoreGlyphViewItems() # kill settings window self.settingsWindow(onOff=False)
def loadExtensions(self, checkForUpdates=False): progress = self.startProgress("Loading extensions...") wrappedItems = [] for urlStream in getExtensionDefault("com.mechanic.urlstreams"): clss = ExtensionRepository if urlStream == extensionStoreDataURL: clss = ExtensionStoreItem for data in getExtensionData(urlStream): try: item = MCExtensionListItem( clss(data, checkForUpdates=checkForUpdates)) wrappedItems.append(item) except Exception as e: logger.error( "Creating extension item '%s' from url '%s' failed." % (data.get("extensionName", "unknow"), urlStream)) logger.error(e) for singleExtension in getExtensionDefault( "com.mechanic.singleExtensionItems"): try: item = MCExtensionListItem( ExtensionYamlItem(singleExtension, checkForUpdates=checkForUpdates)) wrappedItems.append(item) except Exception as e: logger.error("Creating single extension item '%s' failed." % singleExtension.get("extensionName", "unknow")) logger.error(e) progress.update("Setting Extensions...") try: self.w.extensionList.set(wrappedItems) except Exception as e: logger.error("Cannot set items in mechanic list.") logger.error(e) if checkForUpdates: progress.update("Checking for updates...") progress.setTickCount(len(wrappedItems)) for item in wrappedItems: progress.update() item.extensionObject().extensionNeedsUpdate() progress.setTickCount(None) now = time.time() setExtensionDefault("com.mechanic.lastUpdateCheck", now) title = time.strftime("Checked at %H:%M", time.localtime(now)) self.w.checkForUpdates.setTitle(title) self._didCheckedForUpdates = True progress.close()
def __init__(self, parentWindow): data = getExtensionDefault(self.identifier, dict()) self.w = Sheet((470, 580), parentWindow=parentWindow) self.w.tabs = Tabs((10, 10, -10, -40), ["TTF AutoHint", "HTML Preview"]) self.w.tabs[0].settings = self.settings = TTFAutoHintGroup( (0, 0, -0, -0)) self.settings.set(data) y = 10 self.w.tabs[1].htmlText = TextBox((10, y, 100, 22), "HTML preview:") y += 30 self.w.tabs[1].html = self.html = CodeEditor( (10, y, -10, 250), getExtensionDefault("%s.htmlPreview" % settingsIdentifier, htmlPreviewDefault), lexer="html") self.html.showLineNumbers(False) y += 260 self.w.tabs[1].globalCssText = TextBox((10, y, 100, 22), "CSS Style:") y += 30 self.w.tabs[1].globalCss = self.globalCss = CodeEditor( (10, y, -10, -10), getExtensionDefault("%s.globalCSSPreview" % settingsIdentifier, ""), lexer="css") self.globalCss.showLineNumbers(False) self.w.saveButton = Button((-100, -30, -10, 20), "Save settings", callback=self.saveCallback, sizeStyle="small") self.w.setDefaultButton(self.w.saveButton) self.w.closeButton = Button((-190, -30, -110, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(chr(27), []) self.w.resetButton = Button((-280, -30, -200, 20), "Reset", callback=self.resetCallback, sizeStyle="small") self.w.open()
def applicationOpenFile(self, notification): path = notification["path"] ext = notification["ext"] fileHandler = notification["fileHandler"] if ext == ".%s" % fileExtension: singleItems = list(getExtensionDefault("com.mechanic.singleExtensionItems")) try: with open(path, "rb") as f: item = yaml.load(f.read()) except Exception as e: logger.error("Cannot read '%s' file" % path) logger.error(e) try: ExtensionYamlItem(item) if item not in singleItems: singleItems.append(item) setExtensionDefault("com.mechanic.singleExtensionItems", singleItems) title = "Opening Mechanic file." text = "Added '%s' to Mechanic" % path else: title = "Duplicate Mechanic file." text = "The extension '%s' was not added to Mechanic" % path except Exception as e: logger.error("Cannot parse the file '%s'" % path) logger.error(e) title = "Failed to read the file '%s'." % path text = "See the output window for a detailed traceback." message(title, text) fileHandler["opened"] = True
def glyphWindowWillClose(self, notification): start = time.time() self.roboCJKView.setglyphState(self.currentGlyph) self.openedGlyphName = "" if self.glyphInspectorWindow is not None: self.glyphInspectorWindow.closeWindow() self.glyphInspectorWindow = None try: posSize = CurrentGlyphWindow().window().getPosSize() setExtensionDefault(blackrobocjk_glyphwindowPosition, posSize) self.glyphWindowPosSize = getExtensionDefault( blackrobocjk_glyphwindowPosition) except: pass if self.currentGlyph.type != "atomicElement": self.window.removeGlyphEditorSubview(self.glyphView) self.drawer.refGlyph = None self.drawer.refGlyphPos = [0, 0] self.drawer.refGlyphScale = [1, 1] self.currentFont.fontLib.update(self.currentFont._RFont.lib.asDict()) self.currentFont._fullRFont.lib.update(self.currentFont._RFont.lib) if not self.mysql: self.currentFont.save() if self.currentGlyph is not None: self.currentFont.getGlyph(self.currentGlyph) self.currentFont.clearRFont() else: self.currentFont.saveGlyph(self.currentGlyph) self.currentFont.saveFontlib() self.currentFont.batchUnlockGlyphs([self.currentGlyph.name]) stop = time.time() print(stop - start, "to close %s" % self.currentGlyph.name)
def __init__(self, parentWindow): data = getExtensionDefault(self.identifier, dict()) updateWithDefaultValues(data, defaultOptions) width = 380 height = 1000 self.w = Sheet((width, height), parentWindow=parentWindow) y = 10 self.w.threaded = CheckBox((10, y, -10, 22), "Threaded", value=data["threaded"]) y += 30 self.w.exportInFolders = CheckBox((10, y, -10, 22), "Export in Sub Folders", value=data["exportInFolders"]) y += 30 self.w.keepFileNames = CheckBox((10, y, -10, 22), "Keep file names (otherwise use familyName-styleName)", value=data["keepFileNames"]) y += 35 self.w.saveButton = Button((-100, y, -10, 20), "Save settings", callback=self.saveCallback, sizeStyle="small") self.w.setDefaultButton(self.w.saveButton) self.w.closeButton = Button((-190, y, -110, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(unichr(27), []) self.w.resetButton = Button((-280, y, -200, 20), "Reset", callback=self.resetCallback, sizeStyle="small") y += 30 self.w.resize(width, y, False) self.w.open()
def __init__(self, posSize, controller, generateCallback): super(BinaryMerger, self).__init__(posSize) self.controller = controller self._generateCallback = generateCallback tableNames = getExtensionDefault(self.binaryMergerIdentifierKey, self.defaultTableNames) columnDescriptions = [ dict(title="", key="add", width=20, cell=CheckBoxListCell()), dict(title="Table Name", key="tableName", editable=True) ] self.tableList = List((0, 0, -0, -40), tableNames, columnDescriptions=columnDescriptions, editCallback=self.tableListEditCallback, ) segmentDescriptions = [dict(title="+"), dict(title="-")] self.addDel = SegmentedButton((12, -28, 60, 20), segmentDescriptions, selectionStyle="momentary", callback=self.addDelCallback) self.addDel.getNSSegmentedButton().setSegmentStyle_(NSSegmentStyleSmallSquare) self.generate = Button((-150, -30, -10, 22), "Generate & Merge", callback=self.generateCallback) self.height = 240
def openWindow(self, sender=None): """ Initialize the input window. """ presets = [ "case", "dnom", "fina", "hist", "init", "isol", "locl", "lnum", "medi", "numr", "onum", "ordn", "tnum", "pcap", "salt", "sinf", "smcp", "ss01", "ss02", "ss03", "ss04", "ss05", "ss06", "ss07", "ss08", "ss09", "ss10", "ss11", "ss12", "ss13", "ss14", "ss15", "ss16", "ss17", "ss18", "ss19", "ss20", "subs", "sups", "swsh", "titl", "zero" ] presetList = " ".join(presets) registerExtensionDefaults({"nl.typologic.suffixer.presetSuffixes" : presetList}) currentPresets = getExtensionDefault("nl.typologic.suffixer.presetSuffixes").split() self.f = CurrentFont() if self.f is None: print "Suffixer: No font open" return existingSuffixes = [] for g in self.f: suf = self._findSuffix(g.name) if suf != None and suf not in existingSuffixes: existingSuffixes.append(suf) existingSuffixes.sort() currentSuffix = "" if CurrentGlyph() is not None: currentSuffix = self._findSuffix(CurrentGlyph().name) elif self.f.selection is not None: for gn in self.f.selection: currentSuffix = self._findSuffix(gn) if currentSuffix != None: break self.w = FloatingWindow((300, 166), "Suffixer") p = 10 h = 20 y1, y2, y3, y4 = 15, 49, 82, 135 w1, x2 = 160, 180 self.w.labelTwo = TextBox((p, y1, w1, h), "Add suffix to glyph names:") self.w.dotTwo = TextBox((x2, y1, 15, h), ".") self.w.newSuffix = ComboBox((x2+p, y1, -p, h), currentPresets) self.w.replace = CheckBox((p+2, y2, w1, h), "Replace existing suffix:", callback=self.replaceCheckCallback) self.w.dotOne = TextBox((x2, y2, 15, h), ".") self.w.oldSuffix = PopUpButton((x2+p, y2, -p, h), existingSuffixes) if currentSuffix != "" and currentSuffix != None: self.w.oldSuffix.set(existingSuffixes.index(currentSuffix)) self.w.scope = RadioGroup((p, y3, -p, h*2), ["Target selected glyphs", "Replace all in current font"], isVertical=True) self.w.scope.set(0) currentState = 0 if currentSuffix == "" or currentSuffix == None else 1 self.w.replace.set(currentState) self.w.scope.enable(currentState) self.w.submit = Button((p, y4, -p, h), "Change suffixes", callback=self.replaceSuffixes) self.w.setDefaultButton(self.w.submit) self.w.open() self.w.makeKey()
def __init__(self): self.filters = PenBallFiltersManager() # self.filters.loadFiltersFromJSON('/'.join([LOCALPATH, JSONFILE])) filtersList = getExtensionDefault('{0}.filtersList'.format(PENBALLWIZARD_EXTENSIONKEY), []) self.filters.loadFiltersList(filtersList) self.glyphNames = [] self.observedGlyphs = [] self.currentFont = CurrentFont() self.initCachedFont() filtersList = self.filters.keys() if len(filtersList) > 0: self.currentFilterName = filtersList[0] else: self.currentFilterName = None self.fill = True self.observers = [ ('fontChanged', 'fontBecameCurrent'), ('fontChanged', 'fontDidOpen'), ('fontChanged', 'fontDidClose'), ] self.displaySettingsRecord = { 1: (u'✓ Fill', True), 2: (u'Stroke', False), 3: (u'Inverse', False), } self.w = Window((100, 100, 800, 500), 'PenBall Wizard v{0}'.format(__version__), minSize=(500, 400)) self.w.filtersPanel = Group((0, 0, 300, -0)) self.w.filtersPanel.filtersList = List((0, 0, -0, -80), filtersList, selectionCallback=self.filterSelectionChanged, doubleClickCallback=self.filterEdit, allowsMultipleSelection=False, allowsEmptySelection=False, rowHeight=22) self.w.filtersPanel.controls = Group((0, -80, -0, 0)) self.w.filtersPanel.addFilter = SquareButton((0, -80, 100, 40), 'Add filter', sizeStyle='small', callback=self.addFilter) self.w.filtersPanel.addFilterChain = SquareButton((100, -80, 100, 40), 'Add operations', sizeStyle='small', callback=self.addFilterChain) self.w.filtersPanel.removeFilter = SquareButton((-100, -80, 100, 40), 'Remove filter', sizeStyle='small', callback=self.removeFilter) self.w.textInput = EditText((300, 0, -75, 22), '', callback=self.stringInput) self.w.generate = SquareButton((0, -40, 300, -0), 'Generate', callback=self.buildGenerationSheet, sizeStyle='small') self.w.displaySettings = PopUpButton( (-70, 3, -10, 15), self.makeDisplaySettingsMenuItems(), sizeStyle='mini', callback=self.changeDisplaySettings) self.w.displaySettings.getNSPopUpButton().setPullsDown_(True) self.w.displaySettings.getNSPopUpButton().setBordered_(False) self.w.preview = MultiLineView((300, 22, -0, -0)) displayStates = self.w.preview.getDisplayStates() for key in ['Show Metrics','Upside Down','Stroke','Beam','Inverse','Water Fall','Multi Line']: displayStates[key] = False for key in ['Fill','Single Line']: displayStates[key] = True self.w.preview.setDisplayStates(displayStates) for callback, event in self.observers: addObserver(self, callback, event) self.updateControls() self.w.bind('close', self.end) self.launchWindow() self.w.open()
def __init__(self): self.draw = False self.swap = True self.radius = getExtensionDefault( "%s.%s" % (WurstSchreiberDefaultKey, "radius"), 60) color = NSColor.colorWithCalibratedRed_green_blue_alpha_(1, 0, 0, .5) colorValue = getExtensionDefaultColor( "%s.%s" % (WurstSchreiberDefaultKey, "color"), color) self.w = FloatingWindow((150, 170), "WurstSchreiber") x = 15 y = 15 self.w.preview = CheckBox( (x, y, -x, 20), "Preview", callback=self.previewChanged, value=True) y+=30 self.w.slider = SliderGroup( (x, y, -x, 22), 0, 100, self.radius, callback=self.sliderChanged) y+=35 self.w.color = ColorWell( (x, y, -x, 40), callback=self.colorChanged, color=colorValue) y+=55 self.w.button = Button( (x, y, -x, 20), "Trace!", callback=self.traceButton) addObserver(self, "drawWurst", "drawBackground") self.w.bind("close", self.closing) self.w.open()
def _getTempTTF(self, path, report=None, preserveTTFhints=False): if not hasattr(self, "_tempTTFPath"): _, ext = os.path.splitext(path) ext = ext.lower() self._tempTTFPath = tempfile.mkstemp(suffix=".ttf")[1] if ext == ".otf": report.write("Source is binary a OTF file. Convert to TTF.") report.indent() convertToTTF(path, self._tempTTFPath, report) report.dedent() elif ext == ".ttf": report.write("Source is binary a TTF file.") shutil.copyfile(path, self._tempTTFPath) if not preserveTTFhints: report.write("Auto hint the existing TTF file.") report.indent() tempDest = tempfile.mkstemp(suffix=".ttf")[1] autohintOptions = getExtensionDefault(settingsIdentifier, defaultOptions) result = TTFAutohint(self._tempTTFPath, tempDest, autohintOptions) report.writeItems(result) os.remove(self._tempTTFPath) self._tempTTFPath = tempDest report.dedent() else: if ext == ".ufo": report.write("Source is a UFO file. Generate TTF.") else: report.write("Source is a %s file. Import the file. Generate TTF." % (ext[1:])) report.indent() generateTTF(path, self._tempTTFPath, report) report.dedent() return self._tempTTFPath
def __init__(self, posSize, controller, generateCallback): super(BinaryMerger, self).__init__(posSize) self.controller = controller self._generateCallback = generateCallback tableNames = getExtensionDefault(self.binaryMergerIdentifierKey, self.defaultTableNames) columnDescriptions = [ dict(title="", key="add", width=20, cell=CheckBoxListCell()), dict(title="Table Name", key="tableName", editable=True) ] self.tableList = List( (0, 0, -0, -40), tableNames, columnDescriptions=columnDescriptions, editCallback=self.tableListEditCallback, ) segmentDescriptions = [dict(title="+"), dict(title="-")] self.addDel = SegmentedButton((12, -28, 60, 20), segmentDescriptions, selectionStyle="momentary", callback=self.addDelCallback) self.addDel.getNSSegmentedButton().setSegmentStyle_( NSSegmentStyleSmallSquare) self.generate = Button((-150, -30, -10, 22), "Generate & Merge", callback=self.generateCallback) self.height = 240
def makeObserverList(self): myList = [] self.obsFileNames = {} self.obsClass = {} for filePath in glob.glob(p + "*.py"): fileName = filePath.split("/")[-1] # no "_" if fileName.startswith("_"): continue uniqueObsCODE = "" for i in range(5): uniqueObsCODE += random.choice(list(string.ascii_uppercase)) # print(uniqueObsCODE) ob = imp.load_source(str(uniqueObsCODE), filePath) # print(ob) # reload(ob) listDiscriptionCopy = listDiscription.copy() listDiscriptionCopy['title'] = ob.title selfKey = "%sKey" % ob.title if getExtensionDefault(selfKey): listDiscriptionCopy['checkBox'] = True # myList.append(listDiscptionCopy) self.obsFileNames[ob.title] = fileName self.obsClass[ob.title] = ob myList.append(listDiscriptionCopy) newlist = sorted(myList, key=itemgetter('title')) return newlist
def __init__(self): self.snapToCloseDistance = 4 if getExtensionDefault(scriptStateKey, fallback=False): addObserver(self, "mouseDownCallback", "mouseDown") addObserver(self, "mouseUpCallback", "mouseUp")
def generate(self, saveDir): if not saveDir: return saveDir = saveDir[0] f = self.font.naked() glyphs = [g for g in f if not g.template] progress = ProgressWindow("Generating .png's", tickCount=len(glyphs), parentWindow=self.window) gridSize = int(getExtensionDefault(GRID_DEFAULTS_KEY, 50)) for g in glyphs: if g.unicode is not None: fileName = "%04X" %g.unicode else: fileName = glyphNameToFileName(g.name, f) path = os.path.join(saveDir, "%s.png" %fileName) image = g.getRepresentation("com.typemytype.pixelImageFactory", gridSize=gridSize) data = image.TIFFRepresentation() imageRep = NSBitmapImageRep.imageRepWithData_(data) pngData = imageRep.representationUsingType_properties_(NSPNGFileType, None) pngData.writeToFile_atomically_(path, False) progress.update() progress.close()
def checkOnUnicode(self, sender): if sender == self.w.latin_supp: myset = Latin_Supp_block if sender == self.w.latin_A: myset = Latin_Ext_A_block if sender == self.w.latin_B: myset = Latin_Ext_B_block if sender == self.w.latin_add: myset = Latin_Ext_A_block myset = Latin_Ext_additional_block g = CurrentGlyph() defaults = getExtensionDefault(defaultKey, dict()) # print Latin_Supp_block # print # print defaults # print for glyphName in myset: if glyphName == g.name: # g.name for anchorName in myset[glyphName]: # top for accent in myset[glyphName][anchorName]: # grave for listItem in self.w.list.get(): for pijl in pijlen.items(): if listItem["anchor"] == pijl[1]: anchor = pijl[0] if anchor == anchorName and accent == listItem[ 'accent']: listItem['checkBox'] = True
def __init__(self): self.fullMetadata = getExtensionDefault("%s.scriptMetadata" % KEYPREFIX, fallback={}) if not len(self.fullMetadata.keys()): # "Restart" window self.w = vanilla.Window((500, 160), "Andy’s RoboFont Hacks") self.w.hr = vanilla.HorizontalLine((10, -50, -10, 1)) self.w.restartText = vanilla.TextBox( (20, 20, -20, -45), text_Bold( "Installed and updated.\nRestart RoboFont to refresh the list of my RoboFont hacks.\n\n — Andy Clymer" )) self.w.okButton = vanilla.Button((-120, -35, 100, 20), "OK", callback=self.cancelCallback) self.w.open() else: # Full window self.w = vanilla.Window((750, 300), "Andy’s RoboFont Hacks") columnDescriptions = [{ "title": "state", "width": 20, "cell": vanilla.CheckBoxListCell() }, { "title": "longName" }] self.w.scriptList = vanilla.List( (10, 10, 300, -60), [], allowsMultipleSelection=False, showColumnTitles=False, selectionCallback=self.listSelectionChanged, columnDescriptions=columnDescriptions) self.defaultTitle = "Andy’s RoboFont Hacks" self.defaultText = "A selection of extras that make RoboFont work the way I like it. \n\nEverything is optional, click on one of the names on the left for a description of what the add-on does. Select as many as you like by checking the box to the left of the name, and restart RoboFont to activate.\n\n — Andy Clymer" self.w.descriptionBox = vanilla.Box((320, 10, -10, -60)) self.w.descriptionBox.title = vanilla.TextBox((5, 5, -10, 25), self.defaultTitle) self.w.descriptionBox.text = vanilla.TextBox((5, 38, -10, -10), self.defaultText) #self.w.webView = WebView.alloc().initWithFrame_(((0, 0), (320, 1000))) #self.w.scroll = vanilla.ScrollView((320, 10, -10, -60), self.w.webView, hasHorizontalScroller=False, hasVerticalScroller=False) #self.w.webView.setMainFrameURL_(self.htmlPath) self.w.hr = vanilla.HorizontalLine((10, -50, -10, 1)) self.w.changeNote = vanilla.TextBox( (20, -32, -230, 25), text_SmallGray("Any change will require restarting RoboFont."), sizeStyle="small") self.w.cancelButton = vanilla.Button((-230, -35, 100, 20), "Cancel", callback=self.cancelCallback) self.w.applyButton = vanilla.Button((-120, -35, 100, 20), "Apply", callback=self.applyCallback) self.populateList() self.w.open()
def readThemePrefs(self): if self.debug: print("readThemePrefs") # Use getExtensionDefault() to read out all of the saved themes savedThemes = getExtensionDefault(DEFAULTSKEY) if savedThemes: # Copy each theme into the self.themes dictionary for theme in savedThemes: self.themes += [theme]
def openFile(self, notification): if getExtensionDefault("com.drawBot.openPyFileDirectly", False): fileHandler = notification["fileHandler"] path = notification["path"] _, ext = os.path.splitext(path) if ext.lower() == ".py": DrawBotController().open(path) fileHandler["opened"] = True
def __init__(self): self.w = Window((250, 45), "DrawBot Settings") self.w.openPythonFilesInDrawBot = CheckBox((10, 10, -10, 22), "Open .py files directly in DrawBot.", value=getExtensionDefault("com.drawBot.openPyFileDirectly", False), callback=self.openPythonFilesInDrawBotCallback) self.w.open()
def _loadDefaults(self): self._positions = {} positions = extensions.getExtensionDefault(defaultStub + "positions") for position, name in positions.items(): position = tuple(position.split(" ")) self._positions[position] = name self._margin = extensions.getExtensionDefault(defaultStub + "margin") self._inactiveOpacity = extensions.getExtensionDefault( defaultStub + "inactiveOpacity") r, g, b, a = extensions.getExtensionDefault(defaultStub + "foregroundColor") self._foregroundColor = NSColor.colorWithCalibratedRed_green_blue_alpha_( r, g, b, a) r, g, b, a = extensions.getExtensionDefault(defaultStub + "backgroundColor") self._backgroundColor = NSColor.colorWithCalibratedRed_green_blue_alpha_( r, g, b, a)
def __init__(self, constructions, font, parentWindow): self.font = font self.constructions = constructions self.w = Sheet((300, 170), parentWindow=parentWindow) getExtensionDefault, setExtensionDefault, getExtensionDefaultColor, setExtensionDefaultColor y = 15 self.w.overWrite = CheckBox( (15, y, 200, 22), "Overwrite Existing Glyphs", value=getExtensionDefault(self.overWriteKey, True)) y += 35 self.w.autoUnicodes = CheckBox((15, y, 200, 22), "Auto Unicodes", value=True) y += 35 self.w.markGlyphs = CheckBox( (15, y, 200, 22), "Mark Glyphs", value=getExtensionDefault(self.overWriteKey, True), callback=self.markGlyphsCallback) self.w.markGlyphColor = ColorWell( (130, y - 5, 50, 30), color=getExtensionDefaultColor(self.markColorKey, NSColor.redColor())) self.w.markGlyphColor.enable( getExtensionDefault(self.overWriteKey, True)) self.w.okButton = Button((-70, -30, -15, 20), "Build", callback=self.buildCallback, sizeStyle="small") self.w.setDefaultButton(self.w.okButton) self.w.closeButton = Button((-140, -30, -80, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(unichr(27), []) self.w.open()
def get_defaults(self): otf_1 = getExtensionDefault('%s.otf_1' % self.extension_key, None) otf_2 = getExtensionDefault('%s.otf_2' % self.extension_key, None) folder = getExtensionDefault('%s.folder' % self.extension_key, None) if otf_1 is not None and os.path.exists(otf_1): self.otf_1 = otf_1 self.w.otf_1_status.set('%s' % unichr(10003)) if otf_2 is not None and os.path.exists(otf_2): self.otf_2 = otf_2 self.w.otf_2_status.set('%s' % unichr(10003)) if folder is not None and os.path.exists(folder): self.folder = folder self.w.folder_status.set('%s' % unichr(10003))
def searchGlyphListCallback(self, sender): """ 2020/02/25 modified by Cho If there is saved file in directory, load groupDict, else go through matrix, topology process to get groupDict & save it. and then print it on the lineView. """ file = getExtensionDefault(DefaultKey + ".file") jsonFilePath = getExtensionDefault(DefaultKey + ".jsonFilePath") jsonFileName1 = getExtensionDefault(DefaultKey + ".jsonFileName1") jsonFileName2 = getExtensionDefault(DefaultKey + ".jsonFileName2") font = getExtensionDefault(DefaultKey + ".font") groupDict = getExtensionDefault(DefaultKey + ".groupDict") KoreanCheck = getExtensionDefault(DefaultKey + ".korean") standardGlyph = self.searchGlyph setExtensionDefault(DefaultKey + ".standardGlyph", standardGlyph) contourIndex = int(self.w.contourIndex.slider.get()) standardContour = standardGlyph.contours[contourIndex] setExtensionDefault(DefaultKey + ".standardContour", standardContour) if KoreanCheck == True: print("korean") tMC.handleSearchGlyphList(standardGlyph, contourIndex, groupDict) else: print("chinese") ctMC.cHandleSearchGlyphList(standardGlyph, contourIndex, groupDict) return
def _load_settings(self): for settings_key, setting in self.settings.iteritems(): self.settings[settings_key].value = getExtensionDefault( "%s.%s" % ( self._extension_id, settings_key ), setting.default_value )
def replaceSuffixes(self, sender): """ Handle replacing/appending of suffixes. """ mode = "replace" if self.w.replace.get() == 1 else "append" oldSuffix = self.w.oldSuffix.getItems()[self.w.oldSuffix.get()] enteredSuffix = self.w.newSuffix.get() suffixes_in = [oldSuffix, enteredSuffix] suffixes = [] # build proper suffixes list for s in suffixes_in: if s is not None and len(s) > 0: if s[0] == ".": s = s[1:] # handle suffixes without periods suffixes.append(s) if mode == "replace" and suffixes[0] == suffixes[1]: Message( u"Cannot replace a suffix with itself.\nI mean I could, but there seems to be little point :)" ) elif mode == "append" and suffixes[1] == "": Message( u"Cannot append an empty suffix.\n(Or you could just pretend I've already done it.)" ) else: scope = self.f.keys() if self.w.scope.get( ) == 1 else self.f.selection if mode == "replace": for gname in scope: if gname.endswith(suffixes[0]): sufLen = len(suffixes[0]) if len(suffixes[1]) > 0: newName = gname[:-sufLen] + suffixes[1] else: sufLenWithPeriod = sufLen + 1 newName = gname[:-sufLenWithPeriod] self._changeGlyphname(gname, newName) elif mode == "append": for gname in scope: newName = gname + "." + suffixes[1] self._changeGlyphname(gname, newName) self.f.update() # store new values as defaults savedPresets = getExtensionDefault( "nl.typologic.suffixer.presetSuffixes") if enteredSuffix != "" and enteredSuffix not in savedPresets: savedPresetsList = savedPresets.split() savedPresetsList.append(enteredSuffix) savedPresetsList.sort() newPresets = " ".join(savedPresetsList) setExtensionDefault("nl.typologic.suffixer.presetSuffixes", newPresets) self.w.close()
def mouseDown(self, info): self.f = CurrentFont() self.x = info["point"].x self.y = info["point"].y self.italAngle = getItalAngle(self.f) addObserver(self, "draw", "draw") addObserver(self, "mouseDragged", "mouseDragged") if getExtensionDefault(defaultKeyObserverVisibility) == False: removeObserver(self, "mouseDragged") removeObserver(self, "draw")
def __init__(self): self.w = Window((250, 45), "DrawBot Settings") self.w.openPythonFilesInDrawBot = CheckBox( (10, 10, -10, 22), "Open .py files directly in DrawBot.", value=getExtensionDefault("com.drawBot.openPyFileDirectly", False), callback=self.openPythonFilesInDrawBotCallback) self.w.open()
def _end(self): removeObserver(getExtensionDefault(selfKey), event) # See _activate() setExtensionDefault(selfKey, None) # this is optional if wasOn: self.restoreGlyphViewItems() # kill settings window self.settingsWindow(onOff=False)
def __init__(self, posSize, controller): super(WebFormats, self).__init__(posSize) self.controller = controller y = 10 for setting in self.webSettings: key = setting.replace(" ", "_").lower() checkBox = CheckBox((10, y, -10, 22), setting, value=getExtensionDefault("%s.%s" % (settingsIdentifier, key), True), callback=self.saveDefaults) setattr(self, key, checkBox) if "Woff" in setting: formatOption = BatchRadioGroup((120, y, 85, 22), ["OTF", "TTF"], value=getExtensionDefault("%s.format_%s" % (settingsIdentifier, key), True), callback=self.saveDefaults, isVertical=False, sizeStyle="mini") setattr(self, "%s_format" % key, formatOption) y += 30 self.save_svg.enable(hasUfo2svg) y += 5 self.preserveTTFhints = CheckBox((10, y, -10, 18), "Preserve TTF hints", value=getExtensionDefault("%s.preserveTTFhints" % settingsIdentifier, False), sizeStyle="small") y += 30 self.generateHTML = CheckBox((10, y, -10, 18), "Generate HTML", value=getExtensionDefault("%s.generateHTML" % settingsIdentifier, True), sizeStyle="small") y += 30 middle = 45 self.suffixText = TextBox((10, y + 2, middle, 22), "Suffix:", alignment="right") self.webSuffix = EditText((middle + 10, y, 100, 22), getExtensionDefault("%s.webSuffix" % settingsIdentifier, "_web"), callback=self.saveDefaults) y += 30 self.convert = Button((-100, -30, -10, 22), "Generate", callback=self.convertCallback) self.settings = ImageButton((-130, -28, 20, 20), bordered=False, imageNamed=NSImageNameSmartBadgeTemplate, callback=self.settingsCallback) self.height = y
def __init__(self, posSize, controller): super(BatchGenerate, self).__init__(posSize) self.controller = controller y = 10 for setting in self.generateSettings: key = setting.replace(" ", "_").lower() checkbox = CheckBox( (10, y, -10, 22), setting, value=getExtensionDefault("%s.%s" % (settingsIdentifier, key), True), sizeStyle="small", callback=self.saveDefaults) setattr(self, key, checkbox) y += 25 y += 10 for format in doodleSupportedExportFileTypes: checkbox = CheckBox((10, y, -10, 22), format.upper(), value=getExtensionDefault( "%s.%s" % (settingsIdentifier, format), format != "pfa"), callback=self.saveDefaults) setattr(self, format, checkbox) y += 30 middle = 45 self.suffixText = TextBox((10, y + 2, middle, 22), "Suffix:", alignment="right") self.generateSuffix = EditText( (middle + 10, y, 100, 22), getExtensionDefault("%s.generateSuffix" % settingsIdentifier, ""), callback=self.saveDefaults) y += 30 self.generate = Button((-100, -30, -10, 22), "Generate", callback=self.generateCallback) self.height = y
def loadSettings(self): # loading settings zero_settings = self.items settings = getExtensionDefault(self.key, fallback=self.items) if settings: for name in settings: self.items[name] = settings[name] else: self.items = zero_settings else: self.items = zero_settings
def __init__(self): self.prefKey = 'com.okaytype.addOverlap' initialDefaults = {self.pref: '-30'} registerExtensionDefaults(initialDefaults) self.toolValue = getExtensionDefault(self.pref) addObserver(self, "addOverlapToolbarItem", "glyphWindowWillShowToolbarItems") addObserver(self, "addOverlapValueUI", "glyphWindowWillOpen") addObserver(self, 'updateSelfWindow', 'currentGlyphChanged')
def mainFunction(self, info): if not getExtensionDefault(settingsWindow): self.settingsWindow(onOff=True) save() stroke(0.01, 0.68, 0.5, 1) strokeWidth(1) fill(None) rect(self.xmin[0], self.ymin[0], self.xmax[0] - self.xmin[0], self.ymax[0] - self.ymin[0]) restore()
def applicationDidFinishLaunching(self, notification): shouldCheckForUpdates = getExtensionDefault("com.mechanic.checkForUpdate") if not shouldCheckForUpdates: return lastCheck = getExtensionDefault("com.mechanic.lastUpdateCheck") oneDay = 60 * 60 * 24 now = time.time() if lastCheck + oneDay < now: messageText = "Mechanic would like to check for updates." informativeText = "Updating might take some time, you can check for updates later by opening the Mechanic extension." alert = BaseMessageDialog.alloc().initWithMessageText_informativeText_alertStyle_buttonTitlesValues_window_resultCallback_( messageText=messageText, informativeText=informativeText, buttonTitlesValues=[("Now", 1), ("Later", 0)] ) if alert._value: MechanicController(checkForUpdates=True) setExtensionDefault("com.mechanic.lastUpdateCheck", now)
def __init__(self, parentWindow): data = getExtensionDefault(self.identifier, dict()) updateWithDefaultValues(data, defaultOptions) data["debug"] = getDefault("Batch.Debug", False) width = 380 height = 1000 self.w = Sheet((width, height), parentWindow=parentWindow) y = 10 self.w.threaded = CheckBox((10, y, -10, 22), "Threaded", value=data["threaded"]) y += 30 self.w.exportInFolders = CheckBox((10, y, -10, 22), "Export in Sub Folders", value=data["exportInFolders"]) y += 30 self.w.keepFileNames = CheckBox( (10, y, -10, 22), "Keep file names (otherwise use familyName-styleName)", value=data["keepFileNames"]) y += 30 self.w.debug = CheckBox((10, y, -10, 22), "Debug", value=data["debug"]) y += 35 self.w.saveButton = Button((-100, y, -10, 20), "Save settings", callback=self.saveCallback, sizeStyle="small") self.w.setDefaultButton(self.w.saveButton) self.w.closeButton = Button((-190, y, -110, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(chr(27), []) self.w.resetButton = Button((-280, y, -200, 20), "Reset", callback=self.resetCallback, sizeStyle="small") y += 30 self.w.resize(width, y, False) self.w.open()
def restore_state(self): # Restore saved state # If we come in from an older version, the selected method index # may be out of range method = getExtensionDefault("%s.%s" % (extensionID, "method"), 0) if method < 0 or method >= len(self.methods): method = 0 self.paletteView.group.eqMethodSelector.set(method) self.method = self.methods[method] # default curvature for slider self.paletteView.group.eqCurvatureSlider.set( getExtensionDefault("%s.%s" % (extensionID, "curvatureFree"), 0.5)) self.curvatureFree = self.paletteView.group.eqCurvatureSlider.get() # default curvature for Hobby's spline tension slider self.paletteView.group.eqHobbyTensionSlider.set( getExtensionDefault("%s.%s" % (extensionID, "tension"), 0.5)) self.tension = self.paletteView.group.eqHobbyTensionSlider.get() # load preview options self.alwaysPreviewCurves = getExtensionDefault( "%s.%s" % (extensionID, "previewCurves"), False) self.alwaysPreviewHandles = getExtensionDefault( "%s.%s" % (extensionID, "previewHandles"), False) self._setPreviewOptions() self.drawGeometry = getExtensionDefault( "%s.%s" % (extensionID, "drawGeometry"), False)
def becomeActive(self): """ Boot up the dialog. """ self.fillColor = getExtensionDefaultColor(self.DEFAULTKEY_FILLCOLOR, self.FALLBACK_FILLCOLOR) self.strokeColor = getExtensionDefaultColor(self.DEFAULTKEY_STROKECOLOR, self.FALLBACK_STROKECOLOR) self.w = FloatingWindow((260, 130), "Bounding Options", minSize=(100, 100), closable=False) self.w.viewOptions = RadioGroup((10, 10, 150, 20), ['Selection', 'Glyph'], callback=self.selectionCallback, isVertical=False, sizeStyle="small") self.w.viewOptions.set(getExtensionDefault(self.DEFAULTKEY_SELECTION, 0)) self.w.useItalic = CheckBox((165, 10, 100, 20), "Use Italic", value=getExtensionDefault(self.DEFAULTKEY_USEITALIC, True), sizeStyle="small", callback=self.useItalicCallback) self.w.xLabel = TextBox((10, 40, 70, 20), "Divisions: X", sizeStyle="small") self.w.divisionsRadioX = Slider((80, 40, 70, 20), value=getExtensionDefault(self.DEFAULTKEY_DIVISIONSX, 1), minValue=1, maxValue=4, tickMarkCount=4, stopOnTickMarks=True, continuous=True, sizeStyle="small", callback=self.divisionsXCallback) self.w.yLabel = TextBox((160, 40, 70, 20), "Y", sizeStyle="small") self.w.divisionsRadioY = Slider((175, 40, 70, 20), value=getExtensionDefault(self.DEFAULTKEY_DIVISIONSY, 1), minValue=1, maxValue=4, tickMarkCount=4, stopOnTickMarks=True, continuous=True, sizeStyle="small", callback=self.divisionsYCallback) self.w.drawGuidesButton = Button((10, 100, 90, 20), 'Div Guides', callback=self.drawDivGuides, sizeStyle="small") self.w.drawBoxGuidesButton = Button((120, 100, 90, 20), 'Box Guides', callback=self.drawBoxGuides, sizeStyle="small",) x = 10 y = 70 self.w.showCoordinates = CheckBox((x, y, 90, 20), "Coordinates", value=getExtensionDefault(self.DEFAULTKEY_SHOWCOORDINATES, True), sizeStyle="small", callback=self.showCoordinatesCallback) x += 90 self.w.showDimensions = CheckBox((x, y, 90, 20), "Dimensions", value=getExtensionDefault(self.DEFAULTKEY_SHOWDIMENSIONS, True), sizeStyle="small", callback=self.showDimensionsCallback) x += 90 color = getExtensionDefaultColor(self.DEFAULTKEY_FILLCOLOR, self.FALLBACK_FILLCOLOR) self.w.color = ColorWell((x, y, 30, 22), color=color, callback=self.colorCallback) self.setUpBaseWindowBehavior() self.w.open()
def loadExtensions(self): self._wrappedItems = [] self._canLoadSingleExtensions = True self._progress = self.startProgress("Loading extensions...") streams = getExtensionDefault("com.mechanic.urlstreams") for urlStream in streams: parsedExtensionStoreDataURL = urlparse(extensionStoreDataURL) parsedUrlStream = urlparse(urlStream) if parsedUrlStream.hostname == parsedExtensionStoreDataURL.hostname: DefaultURLReader.fetch(urlStream, self._makeExtensionStoreItems) else: DefaultURLReader.fetch(urlStream, self._makeExtensionRepositories)
def __init__(self): self.w = FloatingWindow((220, 240), "2 Twitter") left = 100 y = 10 userName = getExtensionDefault("%s.%s" % (defaultKey, "userName"), "") password = getExtensionDefault("%s.%s" % (defaultKey, "password"), "") self.w.userNameText = TextBox((10, y, left, 22), "User name:") self.w.userName = EditText((left, y, -10, 22), userName) y += 30 self.w.passwordText = TextBox((10, y, left, 22), "Password:"******"Glyph View", "Space Center"] self.w.view = RadioGroup((10, y, -10, -40), self._viewNames) self.w.view.set(0) self.w.okButton = Button((-70, -30, -15, 20), "Post", callback=self.okCallback, sizeStyle="small") self.w.setDefaultButton(self.w.okButton) self.w.closeButton = Button((-140, -30, -80, 20), "Cancel", callback=self.closeCallback, sizeStyle="small") self.w.closeButton.bind(".", ["command"]) self.w.closeButton.bind(unichr(27), []) self.w.open()
def replaceSuffixes(self, sender): """ Handle replacing/appending of suffixes. """ mode = "replace" if self.w.replace.get() == 1 else "append" oldSuffix = self.w.oldSuffix.getItems()[self.w.oldSuffix.get()] enteredSuffix = self.w.newSuffix.get() suffixes_in = [oldSuffix, enteredSuffix] suffixes = [] # build proper suffixes list for s in suffixes_in: if s is not None and len(s) > 0: if s[0] == ".": s = s[1:] # handle suffixes without periods suffixes.append(s) if mode == "replace" and suffixes[0] == suffixes[1]: Message(u"Cannot replace a suffix with itself.\nI mean I could, but there seems to be little point :)") elif mode == "append" and suffixes[1] == "": Message(u"Cannot append an empty suffix.\n(Or you could just pretend I've already done it.)") else: scope = self.f.keys() if self.w.scope.get() == 1 else self.f.selection if mode == "replace": for gname in scope: if gname.endswith(suffixes[0]): sufLen = len(suffixes[0]) if len(suffixes[1]) > 0: newName = gname[:-sufLen] + suffixes[1] else: sufLenWithPeriod = sufLen+1 newName = gname[:-sufLenWithPeriod] self._changeGlyphname(gname, newName) elif mode == "append": for gname in scope: newName = gname + "." + suffixes[1] self._changeGlyphname(gname, newName) self.f.autoUnicodes() self.f.update() # store new values as defaults savedPresets = getExtensionDefault("nl.typologic.suffixer.presetSuffixes") if enteredSuffix != "" and enteredSuffix not in savedPresets: savedPresetsList = savedPresets.split() savedPresetsList.append(enteredSuffix) savedPresetsList.sort() newPresets = " ".join(savedPresetsList) setExtensionDefault("nl.typologic.suffixer.presetSuffixes", newPresets) self.w.close()
def __init__(self, posSize, controller): super(BatchVariableFontGenerate, self).__init__(posSize) self.controller = controller y = 10 for setting in self.generateSettings: key = setting.replace(" ", "_").lower() checkbox = CheckBox((10, y, -10, 22), setting, value=getExtensionDefault("%s.%s" % (settingsIdentifier, key), True), sizeStyle="small", callback=self.saveDefaults) setattr(self, key, checkbox) y += 25 y += 10 self.generate = Button((-100, -30, -10, 22), "Generate", callback=self.generateCallback) self.height = y
def generateTTF(ufoPath, dest, report): tempDest = tempfile.mkstemp(suffix=".ttf")[1] font = RFont(ufoPath, document=False, showInterface=False) font.lib[shouldAddPointsInSplineConversionLibKey] = 1 result = font.generate(path=tempDest, format="ttf", decompose=False, checkOutlines=True, autohint=False, releaseMode=True, glyphOrder=font.glyphOrder) if not font.hasInterface(): font.close() report.write(result) autohintOptions = getExtensionDefault(settingsIdentifier, defaultOptions) result = TTFAutohint(tempDest, dest, autohintOptions) report.writeItems(result) os.remove(tempDest)
def toggle_panels(): '''Show/hide all floating windows in the current workspace.''' # get panels windows = NSApp.windows() panels = [ window for window in windows if isinstance(window, NSPanel) ] # get state show_panels = getExtensionDefault('com.hipertipo.showHidePanels', fallback=True) # hide panels if show_panels: for panel in panels: panel.orderOut_(None) setExtensionDefault('com.hipertipo.showHidePanels', False) # show panels if show_panels is False: for panel in panels: if str(type(panel)) != '<objective-c class NSColorPanel at 0x7fff750fad60>': panel.orderBack_(None) setExtensionDefault('com.hipertipo.showHidePanels', True)
def __init__(self): width = 300 height = 400 y=7 self.w = FloatingWindow((width, height), "PDF Settings") # file name self.w.fileNameText = TextBox((10,y,-10,22), "File name", sizeStyle='small') self.w.fileNameEdit = EditText((10,y+22,-10,25), text=getExtensionDefault(_PDFFileNameKey), callback=self._warning, continuous=False) y+=60 self.w.txt = TextBox((10,y,-10,100), extra, sizeStyle='small') self.w.line0 = HorizontalLine((10,y+55,-10,1)) y+=70 # time stamp self.w.timeStampOnOff = CheckBox((10, y, -10, 25), "Add timestamp:", value=getExtensionDefault(_PDFTimeStampOnOffKey), callback=self._warning, sizeStyle='small') self.w.timeStamp = EditText((125,y, -10, 25), text=getExtensionDefault(_PDFTimeStampKey), continuous=False, callback=self._warning) self.w.timestampInfo = Button((125,y+28,-10,20),"timestamp syntax docs", callback=self.timeStampInfoCallback, sizeStyle='small') self.w.line1 = HorizontalLine((10,y+60,-10,1)) y+=70 self.w.limitText = TextBox((10,y+5, -10,25), "Limit %text characters:", sizeStyle='small') self.w.limitEdit = EditText((170,y,-10,25), "5", placeholder="int") self.w.lineLimit = HorizontalLine((10,y+35,-10,1)) y+=50 # folder self.w.folderText = TextBox((10,y,-10,25), "Folder", sizeStyle='small') self.w.folder = RadioGroup((10,y+10,-100,35), ["UFO folder","Other"], callback=self._warning, sizeStyle='small', isVertical = False) self.w.folder.set(getExtensionDefault(_PDFFolderKey)) self.w.folderPath = EditText((10,y+40,-10,25), getExtensionDefault(_PDFFolderPathKey), readOnly=True) self.w.folderChange = Button((-100,y+14,-10,25), "Change folder", callback=self.changeFolderPath, sizeStyle='small') self.w.line2 = HorizontalLine((10,y+80,-10,1)) y += 90 # open PDF self.w.openPDF = CheckBox((10, y, -10, 25), "Open PDF immediately", value=getExtensionDefault(_PDFOpenPDFKey), callback=self._warning, sizeStyle='small') # status self.w.statusBar = StatusBar((0, -20, 0, 0)) self.w.bind("close",self._close) self.w.open()
def _writeHTMLPreview(self, htmlWriter, cssWriter, fileName, familyName, styleName, saveTTF, saveWOFF, saveWOFF2, saveEOT, saveSVG): # css if self.controller.exportInFolders(): cssFileName = "%s/%s/%s" % (familyName.replace(" ", ""), styleName.replace(" ", ""), fileName) else: cssFileName = fileName cssWriter.write("@font-face {") cssWriter.indent() cssWriter.write("font-family: '%s_%s';" % (familyName, styleName)) cssSources = [] if saveEOT: cssWriter.write("src: url('%s.eot');" % cssFileName) cssSources.append("url('%s.eot?#iefix') format('embedded-opentype')" % cssFileName) if saveWOFF: cssSources.append("url('%s.woff') format('woff')" % cssFileName) if saveWOFF2: cssSources.append("url('%s.woff2') format('woff2')" % cssFileName) if saveTTF: cssSources.append("url('%s.ttf') format('truetype')" % cssFileName) if saveSVG: cssSources.append("url('%s.svg#svgFontName') format('svg')" % cssFileName) cssWriter.write("src: %s;" % (",\n ".join(cssSources))) cssWriter.write("font-weight: normal;") cssWriter.write("font-style: normal;") cssWriter.dedent() cssWriter.write("}") cssWriter.newLine() # html htmlWriter.write("<div style='font-family: \"%s_%s\", \"AdobeBlank\";'>" % (familyName, styleName)) html = getExtensionDefault("%s.htmlPreview" % settingsIdentifier, htmlPreviewDefault) html = _percentageRe.sub("%", html) html = html % dict(familyName=familyName, styleName=styleName) htmlWriter.write(html.encode("ascii", 'xmlcharrefreplace').decode("utf-8")) htmlWriter.write("</div>")
def convertToTTF(otfPath, dest, report): temp = tempfile.mkstemp(suffix=".ttf")[1] tempDest = tempfile.mkstemp(suffix=".ttf")[1] font = RFont(otfPath, document=False, showInterface=False) font.lib[shouldAddPointsInSplineConversionLibKey] = 1 font.kerning.clear() for attr in font.info.asDict().keys(): if attr not in defaultFontInfoAttributes: setattr(font.info, attr, None) result = font.generate(path=temp, format="ttf", decompose=False, checkOutlines=False, autohint=False, releaseMode=True, glyphOrder=font.glyphOrder) if not font.hasInterface(): font.close() report.write(result) sourceFont = TTFont(temp) sourceFontWithTables = TTFont(otfPath) for table in ["loca", "OS/2", "cmap", "name", "GSUB", "GPOS", "GDEF", "kern"]: if table in sourceFontWithTables: sourceFont[table] = sourceFontWithTables[table] fixMetrics(sourceFont) sourceFont.save(tempDest) sourceFont.close() del sourceFont sourceFontWithTables.close() del sourceFontWithTables autohintOptions = getExtensionDefault(settingsIdentifier, defaultOptions) result = TTFAutohint(tempDest, dest, autohintOptions) report.writeItems(result) os.remove(temp) os.remove(tempDest)
def __init__(self): self.w = FloatingWindow((300, 510), "Outline Palette") y = 5 middle = 135 textMiddle = middle - 27 y += 10 self.w._tickness = TextBox((0, y-3, textMiddle, 17), 'Thickness:', alignment="right") ticknessValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "thickness"), 10) self.w.tickness = Slider((middle, y, -50, 15), minValue=1, maxValue=200, callback=self.parametersChanged, value=ticknessValue) self.w.ticknessText = EditText((-40, y, -10, 17), ticknessValue, callback=self.parametersTextChanged, sizeStyle="small") y += 33 self.w._contrast = TextBox((0, y-3, textMiddle, 17), 'Contrast:', alignment="right") contrastValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "contrast"), 0) self.w.contrast = Slider((middle, y, -50, 15), minValue=0, maxValue=200, callback=self.parametersChanged, value=contrastValue) self.w.contrastText = EditText((-40, y, -10, 17), contrastValue, callback=self.parametersTextChanged, sizeStyle="small") y += 33 self.w._contrastAngle = TextBox((0, y-3, textMiddle, 17), 'Contrast Angle:', alignment="right") contrastAngleValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "contrastAngle"), 0) self.w.contrastAngle = Slider((middle, y-10, 30, 30), minValue=0, maxValue=360, callback=self.contrastAngleCallback, value=contrastValue) self.w.contrastAngle.getNSSlider().cell().setSliderType_(NSCircularSlider) self.w.contrastAngleText = EditText((-40, y, -10, 17), contrastAngleValue, callback=self.parametersTextChanged, sizeStyle="small") y += 33 self.w._miterLimit = TextBox((0, y-3, textMiddle, 17), 'MiterLimit:', alignment="right") connectmiterLimitValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "connectmiterLimit"), True) self.w.connectmiterLimit = CheckBox((middle-22, y-3, 20, 17), "", callback=self.connectmiterLimit, value=connectmiterLimitValue) miterLimitValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "miterLimit"), 10) self.w.miterLimit = Slider((middle, y, -50, 15), minValue=1, maxValue=200, callback=self.parametersChanged, value=miterLimitValue) self.w.miterLimitText = EditText((-40, y, -10, 17), miterLimitValue, callback=self.parametersTextChanged, sizeStyle="small") self.w.miterLimit.enable(not connectmiterLimitValue) self.w.miterLimitText.enable(not connectmiterLimitValue) y += 30 cornerAndCap = ["Square", "Round", "Butt"] self.w._corner = TextBox((0, y, textMiddle, 17), 'Corner:', alignment="right") self.w.corner = PopUpButton((middle-2, y-2, -48, 22), cornerAndCap, callback=self.parametersTextChanged) y += 30 self.w._cap = TextBox((0, y, textMiddle, 17), 'Cap:', alignment="right") useCapValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "closeOpenPath"), False) self.w.useCap = CheckBox((middle-22, y, 20, 17), "", callback=self.useCapCallback, value=useCapValue) self.w.cap = PopUpButton((middle-2, y-2, -48, 22), cornerAndCap, callback=self.parametersTextChanged) self.w.cap.enable(useCapValue) cornerValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "corner"), "Square") if cornerValue in cornerAndCap: self.w.corner.set(cornerAndCap.index(cornerValue)) capValue = getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "cap"), "Square") if capValue in cornerAndCap: self.w.cap.set(cornerAndCap.index(capValue)) y += 33 self.w.keepBounds = CheckBox((middle-3, y, middle, 22), "Keep Bounds", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "keepBounds"), False), callback=self.parametersTextChanged) y += 30 self.w.optimizeCurve = CheckBox((middle-3, y, middle, 22), "Optimize Curve", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "optimizeCurve"), False), callback=self.parametersTextChanged) y += 30 self.w.addOriginal = CheckBox((middle-3, y, middle, 22), "Add Source", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "addOriginal"), False), callback=self.parametersTextChanged) y += 30 self.w.addInner = CheckBox((middle-3, y, middle, 22), "Add Left", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "addLeft"), True), callback=self.parametersTextChanged) y += 30 self.w.addOuter = CheckBox((middle-3, y, middle, 22), "Add Right", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "addRight"), True), callback=self.parametersTextChanged) y += 35 self.w.preview = CheckBox((middle-3, y, middle, 22), "Preview", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "preview"), True), callback=self.previewCallback) y += 30 self.w.fill = CheckBox((middle-3+10, y, middle, 22), "Fill", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "fill"), False), callback=self.fillCallback, sizeStyle="small") y += 25 self.w.stroke = CheckBox((middle-3+10, y, middle, 22), "Stroke", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "stroke"), True), callback=self.strokeCallback, sizeStyle="small") color = NSColor.colorWithCalibratedRed_green_blue_alpha_(0, 1, 1, .8) self.w.color = ColorWell(((middle-5)*1.7, y-33, -10, 60), color=getExtensionDefaultColor("%s.%s" % (outlinePaletteDefaultKey, "color"), color), callback=self.colorCallback) self.previewCallback(self.w.preview) self.w.apply = Button((-70, -55, -10, 22), "Expand", self.expand, sizeStyle="small") self.w.applyNewFont = Button((-190, -55, -80, 22), "Expand Selection", self.expandSelection, sizeStyle="small") self.w.applySelection = Button((-290, -55, -200, 22), "Expand Font", self.expandFont, sizeStyle="small") self.w.preserveComponents = CheckBox((10, -25, -10, 22), "Preserve Components", sizeStyle="small", value=getExtensionDefault("%s.%s" % (outlinePaletteDefaultKey, "preserveComponents"), False), callback=self.parametersTextChanged) self.setUpBaseWindowBehavior() addObserver(self, "drawOutline", "drawBackground") self.parametersTextChanged self.w.open()
def load(self): self.fillColor = getExtensionDefaultColor(_fillColorDefaultKey, self._fallBackFillColor) self.strokeColor = getExtensionDefaultColor(_strokeColorDefaultKey, self._fallBackStrokeColor) self.showPreview = getExtensionDefault(_showPreviewDefaultKey, self._fallbackShowPreview) self.data = getExtensionDefault(_dataDefaultKey, self._fallbackData)
def __init__(self): # Preferences self._drawing = getExtensionDefault(self.DEFAULTKEY_DRAW, True) self._fill = getExtensionDefault(self.DEFAULTKEY_FILL, True) self._stroke = getExtensionDefault(self.DEFAULTKEY_STROKE, True) self._points = getExtensionDefault(self.DEFAULTKEY_POINTS, True) self._fillColor = getExtensionDefaultColor(self.DEFAULTKEY_FILLCOLOR, self.FALLBACK_FILLCOLOR) self._strokeColor = getExtensionDefaultColor(self.DEFAULTKEY_STROKECOLOR, self.FALLBACK_STROKECOLOR) self._pointsColor = getExtensionDefaultColor(self.DEFAULTKEY_POINTSCOLOR, self.FALLBACK_POINTSCOLOR) self._alignment = getExtensionDefault(self.DEFAULTKEY_ALIGNMENT, 0) self._kerning = getExtensionDefault(self.DEFAULTKEY_KERNING, 1) self._floating = getExtensionDefault(self.DEFAULTKEY_FLOATING, 1) # User preferences self._onCurvePointsSize = getDefault("glyphViewOncurvePointsSize") # typo, should be: OnCurve self._offCurvePointsSize = getDefault("glyphViewOffCurvePointsSize") self._strokeWidth = getDefault("glyphViewStrokeWidth") w, h = 400, 195 x = y = 10 self.initAllFonts() self.w = FloatingWindow((w, h), "Overlay UFOs") self.w.draw = CheckBox((x, y, 95, 18), "Draw", callback=self.drawCallback, value=self._drawing, sizeStyle="small") x += 60 self.w.fill = CheckBox((x, y, 95, 18), "Fill", callback=self.fillCallback, value=self._fill, sizeStyle="small") x += 40 self.w.fillColor = ColorWell((x, y, 45, 20), callback=self.fillColorCallback, color=self._fillColor) x += 60 self.w.stroke = CheckBox((x, y, 95, 18), "Stroke", callback=self.strokeCallback, value=self._stroke, sizeStyle="small") x += 60 self.w.strokeColor = ColorWell((x, y, 45, 20), callback=self.strokeColorCallback, color=self._strokeColor) x += 60 self.w.points = CheckBox((x, y, 95, 18), "Points", callback=self.pointsCallback, value=self._points, sizeStyle="small") x += 60 self.w.pointsColor = ColorWell((x, y, 45, 20), callback=self.pointsColorCallback, color=self._pointsColor) x, y = 10, 40 self.w.alignText = TextBox((x, y, 250, 15), "Alignment:", sizeStyle="small") y += 18 self.w.alignment = RadioGroup((x, y, 80, 55), ['Left', 'Center', 'Right'], isVertical=True, callback=self.alignmentCallback, sizeStyle="small") self.w.alignment.set(self._alignment) y += 62 self.w.kerning = CheckBox((x, y, 100, 10), "Show kerning", callback=self.kerningCallback, value=self._kerning, sizeStyle="mini") y += 18 self.w.floating = CheckBox((x, y, 100, 10), "Floating Window", callback=self.floatingCallback, value=self._floating, sizeStyle="mini") y += 25 self.w.resetDefaults = Button((x, y, 85, 14), "Reset settings", callback=self.resetSettingsCallback, sizeStyle="mini") x, y = 110, 40 self.w.fontList = List((x, y, 240, 55), self.getFontItems(), columnDescriptions=self.getListDescriptor(), showColumnTitles=False, selectionCallback=None, doubleClickCallback=self.fontListCallback, allowsMultipleSelection=True, allowsEmptySelection=True, drawVerticalLines=False, drawHorizontalLines=True, drawFocusRing=False, rowHeight=16 ) y += 55 self.w.hiddenFontList = List((x, y, 240, 55), self.getHiddenFontItems(), columnDescriptions=self.getListDescriptor(), showColumnTitles=False, selectionCallback=None, doubleClickCallback=self.hiddenFontListCallback, allowsMultipleSelection=True, allowsEmptySelection=True, drawVerticalLines=False, drawHorizontalLines=True, drawFocusRing=False, rowHeight=16 ) self._selectionChanging = False self.w.fontList.setSelection([]) # unselect y += 65 self.w.contextLeft = EditText((x, y, 90, 20), callback=self.contextCallback, continuous=True, placeholder="Left", sizeStyle="small") self.w.contextCurrent = EditText((x+95, y, 50, 20), callback=self.contextCallback, continuous=True, placeholder="?", sizeStyle="small") self.w.contextRight = EditText((x+150, y, 90, 20), callback=self.contextCallback, continuous=True, placeholder="Right", sizeStyle="small") x, y = 360, 100 self.w.addFonts = Button((x, y, 30, 20), "+", callback=self.addHiddenFontsCallback, sizeStyle="regular") y += 25 self.w.removeFonts = Button((x, y, 30, 20), unichr(8722), callback=self.removeHiddenFontsCallback, sizeStyle="regular") # Observers addObserver(self, "fontDidOpen", "fontDidOpen") addObserver(self, "fontWillClose", "fontWillClose") # fontDidClose? addObserver(self, "draw", "drawInactive") addObserver(self, "draw", "draw") # Prepare and open window self.setWindowLevel() self.setUpBaseWindowBehavior() self.w.open()
def __init__(self): self.w = FloatingWindow((270, 340), "Outline Palette") y = 5 middle = 110 textMiddle = middle - 27 y += 10 self.w._tickness = TextBox((0, y-3, textMiddle, 17), 'Thickness:', alignment="right") ticknessValue = getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "thickness"), 10) self.w.tickness = Slider((middle, y, -50, 15), minValue=1, maxValue=200, callback=self.parametersChanged, value=ticknessValue) self.w.ticknessText = EditText((-40, y, -10, 17), ticknessValue, callback=self.parametersTextChanged, sizeStyle="small") y += 33 self.w._miterLimit = TextBox((0, y-3, textMiddle, 17), 'MiterLimit:', alignment="right") connectmiterLimitValue = getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "connectmiterLimit"), True) self.w.connectmiterLimit = CheckBox((middle-22, y-3, 20, 17), "", callback=self.connectmiterLimit, value=connectmiterLimitValue) miterLimitValue = getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "miterLimit"), 10) self.w.miterLimit = Slider((middle, y, -50, 15), minValue=1, maxValue=200, callback=self.parametersChanged, value=miterLimitValue) self.w.miterLimitText = EditText((-40, y, -10, 17), miterLimitValue, callback=self.parametersTextChanged, sizeStyle="small") self.w.miterLimit.enable(not connectmiterLimitValue) self.w.miterLimitText.enable(not connectmiterLimitValue) y += 30 cornerAndCap = ["Square", "Round", "Butt"] self.w._corner = TextBox((0, y, textMiddle, 17), 'Corner:', alignment="right") self.w.corner = PopUpButton((middle-2, y-2, -48, 22), cornerAndCap, callback=self.parametersTextChanged) y += 30 self.w._cap = TextBox((0, y, textMiddle, 17), 'Cap:', alignment="right") useCapValue = getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "closeOpenPath"), False) self.w.useCap = CheckBox((middle-22, y, 20, 17), "", callback=self.useCapCallback, value=useCapValue) self.w.cap = PopUpButton((middle-2, y-2, -48, 22), cornerAndCap, callback=self.parametersTextChanged) self.w.cap.enable(useCapValue) cornerValue = getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "corner"), "Square") if cornerValue in cornerAndCap: self.w.corner.set(cornerAndCap.index(cornerValue)) capValue = getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "cap"), "Square") if capValue in cornerAndCap: self.w.cap.set(cornerAndCap.index(capValue)) y += 33 self.w.addOriginal = CheckBox((middle-3, y, middle, 22), "Add Source", value=getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "addOriginal"), False), callback=self.parametersTextChanged) y += 30 self.w.addInner = CheckBox((middle-3, y, middle, 22), "Add Left", value=getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "addLeft"), True), callback=self.parametersTextChanged) y += 30 self.w.addOuter = CheckBox((middle-3, y, middle, 22), "Add Right", value=getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "addRight"), True), callback=self.parametersTextChanged) y += 35 self.w.fill = CheckBox((middle-3, y, middle, 22), "Fill", value=getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "fill"), False), callback=self.fillCallback) y += 30 self.w.stroke = CheckBox((middle-3, y, middle, 22), "Stroke", value=getExtensionDefault("%s.%s" %(outlinePaletteDefaultKey, "stroke"), True), callback=self.strokeCallback) color = NSColor.colorWithCalibratedRed_green_blue_alpha_(0, 1, 1, .8) self.w.color = ColorWell(((middle-5)*1.7, y-33, -10, 60), color=getExtensionDefaultColor("%s.%s" %(outlinePaletteDefaultKey, "color"), color), callback=self.colorCallback) self.w.apply = Button((-100, -30, -10, 22), "Expand", self.expand) self.w.applyAll = Button((-220, -30, -110, 22), "Expand Font", self.expandFont) self.setUpBaseWindowBehavior() addObserver(self, "drawOutline", "drawBackground") self.parametersTextChanged self.w.open()