def showThisGlyphInSC_CB(self, sender): if CurrentSpaceCenter() is None: spaceCenter = OpenSpaceCenter(self.glyph.font) spaceCenter.set([self.glyphBelowName]) else: scGlyphs = CurrentSpaceCenter().get() spaceCenter = OpenSpaceCenter(self.glyph.font) spaceCenter.set(scGlyphs + [self.glyphBelowName])
def OpenRoboFontProject(path): root = os.path.dirname(path) project = readPlist(path) documentController = NSDocumentController.sharedDocumentController() delegate = NSApp().delegate() openFileNames = [window.representedFilename() for window in NSApp().windows()] for fileName, data in project["documents"].items(): isUntitled = fileName == "untitled" if not isUntitled: if not os.path.exists(fileName): fileName = os.path.abspath(os.path.join(root, fileName)) if not os.path.exists(fileName): continue if fileName in openFileNames: continue data.sort(key=lambda item: item.get("name") != "FontWindow") for windowData in data: name = windowData["windowName"] x, y, w, h = windowData["frame"] if isUntitled: if name == "FontWindow": RFont() elif name == "ScriptingWindow": delegate.scriptingWindow_(None) elif name == "FeatureWindow": delegate.newFeature_(None) else: url = NSURL.fileURLWithPath_(fileName) doc, error = documentController.openDocumentWithContentsOfURL_display_error_(url, True, None) if error: delegate.application_openFile_(NSApp(), fileName) window = NSApp().mainWindow() vanillaWrapper = None if hasattr(window.delegate(), "vanillaWrapper"): vanillaWrapper = window.delegate().vanillaWrapper() if vanillaWrapper: font = CurrentFont() if name == "GlyphWindow": window = OpenGlyphWindow(font[windowData["glyphName"]], newWindow=True) window.w.getNSWindow().setFrame_display_animate_(((x, y), (w, h)), True, False) continue elif name == "SpaceCenter": spaceCenter = OpenSpaceCenter(font) spaceCenter.setPointSize(windowData["pointSize"]) spaceCenter.setPre(windowData["pre"]) spaceCenter.setAfter(windowData["after"]) spaceCenter.set(windowData["input"]) window = CurrentSpaceCenterWindow() window.w.getNSWindow().setFrame_display_animate_(((x, y), (w, h)), True, False) continue window.setFrame_display_animate_(((x, y), (w, h)), True, False) for windowData in project["toolWindows"]: name = windowData["windowName"] x, y, w, h = windowData["frame"] if name == "DebugWindow": window = OutputWindow() window.show() window.w.getNSWindow().setFrame_display_animate_(((x, y), (w, h)), True, False) elif name == "InspectorWindow": try: # a little bit hacky # will move to mojo.UI in the upcoming releases window = delegate._inspectorWindow.w.getNSWindow() except: window = None if window is None: delegate.openInspector_(None) window = delegate._inspectorWindow.w.getNSWindow() window.setFrame_display_animate_(((x, y), (w, h)), True, False) if "execute" in project: try: ScriptRunner(text=project["execute"]) except: import traceback print traceback.format_exc(5)
class SpaceCenterKerning(object): """class for SpaceCenterKerning""" def __init__(self): self.font = CurrentFont() self.spaceCenter = None if self.font: addObserver(self, 'SpaceCenterObserver', 'spaceCenterDidOpen') self.spaceCenter = OpenSpaceCenter(self.font, newWindow=True) # addObserver(self, None, 'spaceCenterDraw') addObserver(self, 'pressedKey', 'spaceCenterKeyDown') addObserver(self, 'closeSpaceCenter', 'spaceCenterWillClose') # get kerning from CurrentFont and build text list self.pairsTextCheck = [] self.kKeys = self.getKerningPairsRef(self.font) # get reference pairs for flipping self.refPairs = [pair[0] for pair in self.kKeys] for key, gkey in self.kKeys: self.pairsTextCheck.append(self.returnPattern(key)) # index of text self.i = 0 self.maxi = len(self.kKeys) self.spaceCenter.set(self.pairsTextCheck[self.i]) else: message('You need to open a font first!') def SpaceCenterObserver(self, info): if self.spaceCenter: self.spaceCenter.set(self.pairsTextCheck[self.i]) self.updateSpaceCenter() def pressedKey(self, info): event = info['event'] pair = self.kKeys[self.i][1] keyCode = event.keyCode() # modifier key? alt, shift, None if event.modifierFlags() == 11010336: kIncrement = 1 elif event.modifierFlags() == 10617090: kIncrement = 5 else: kIncrement = 10 # down, up, left, right keyCodes if keyCode == 125: self.i += 1 elif keyCode == 126: self.i -= 1 elif keyCode == 123: self.font.kerning[pair] -= kIncrement elif keyCode == 124: self.font.kerning[pair] += kIncrement # flip pair: command-shift-f elif event.modifierFlags() == 1179914 and keyCode == 3: # print 'command-shift-f hit!' refPair = self.kKeys[self.i][0] flippedPair = refPair[1], refPair[0] if flippedPair in self.refPairs: self.i = self.refPairs.index(flippedPair) else: print 'Flipped pair (%s, %s) has no kern value' % refPair # reset if self.i is out of range if self.i == self.maxi or self.i == -self.maxi: self.i = 0 self.spaceCenter.set(self.pairsTextCheck[self.i]) def getKerningPairsRef(self, font): """use only the main glyph from kerning group and keep the reference""" kerningRef = font.kerning.keys()[:] for k in kerningRef: left, right = k if left in font.groups: groupGlyphs = font.groups[left] groupGlyphs.sort() # get first glyphname in the group leftRef = groupGlyphs[0] else: leftRef = left if right in font.groups: groupGlyphs = font.groups[right] groupGlyphs.sort() # get first glyphname in the group rightRef = groupGlyphs[0] else: rightRef = right i = kerningRef.index(k) kerningRef[i] = (leftRef, rightRef), (left, right) kerningRef.sort() return kerningRef def returnPattern(self, pair): """returns the pattern for each kerning pair for its use in the SpaceCenter""" left, right = pair pattern = 'H/O/H/%s/%s/H/O/H/\\n/H/H/H/%s/%s/H/H/H/\\n/O/O/O/%s/%s/o/o/o/\\n/X/H/X/%s/%s/x/o/x' % ( left, right, left, right, left, right, left, right,) return pattern def closeSpaceCenter(self, info): """remove Observers when closing the custom SpaceCenter""" removeObserver(self, 'spaceCenterDidOpen') # removeObserver(self, 'spaceCenterDraw') removeObserver(self, 'spaceCenterWillClose') removeObserver(self, 'spaceCenterKeyDown')
def openClusterInSpaceCenterCallback(self, sender): spaceCenter = OpenSpaceCenter(self.glyph.font) spaceCenter.set([glyph.glyph.name for glyph in self.glyphList])