Last active
October 17, 2025 13:50
-
-
Save connordavenport/b0136eb1afdbb0f17f5dfcc112cae038 to your computer and use it in GitHub Desktop.
custom manager for opening new fonts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import ezui | |
from mojo.UI import getDefault | |
from mojo.subscriber import * | |
import AppKit | |
from lib.fontObjects.doodleFont import DoodleFont | |
CHARACTER_SETS = getDefault("charsets") | |
WIDTH, HEIGHT = 400, 400 | |
#fontDocumentWillOpenNew | |
class NewFontManager(ezui.WindowController): | |
def build(self, font:RFont | DoodleFont): | |
self.character_set = list(CHARACTER_SETS.values())[0] | |
self.familyName = self.styleName = None | |
self.font = font | |
content = """ | |
* HorizontalStack @headerStack | |
> * Image @headerImage | |
* HorizontalStack | |
!§ Font Info: | |
Family Name: [_______] @familyNameTextField | |
Style Name: [_______] @styleNameTextField | |
----------- | |
x-Height: [_______] @xHeightTextField | |
Cap Height: [_______] @capHeightTextField | |
Ascender: [_______] @ascenderTextField | |
Descender: [_______] @descenderTextField | |
UPM: [_______] @unitsPerEmTextField | |
------------ | |
!§ Character Set: | |
(ABC ...) @characterSetSelection | |
[[_____]] @characterSetEditor | |
( Save Updated Char Set ) @updateSetButton | |
--- | |
=== | |
* HorizontalStack @footerStack | |
({xmark.circle}) @closeButton | |
({checkmark.circle}) @applyButton | |
""" | |
self.newDocumentCreateDefaultset = getDefault("newDocumentCreateDefaultset",0) | |
char = getDefault("newDocumentCharset",None) | |
try: | |
self.newDocumentCharsetIndex = list(CHARACTER_SETS.keys()).index(char) | |
except IndexError: | |
self.newDocumentCharsetIndex = 0 | |
descriptionData = dict( | |
headerStack=dict( | |
distribution="equalSpacing", | |
), | |
headerImage=dict( | |
image=ezui.makeImage( | |
symbolName="document.badge.plus", | |
template=True, | |
symbolConfiguration=dict( | |
style="largeTitle", | |
scale="large", | |
weight="regular", | |
renderingMode="hierarchical", | |
#colors=[AppKit.NSColor.greenColor(), AppKit.NSColor.brownColor()] | |
), | |
), | |
), | |
familyNameTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
valueType="string" | |
), | |
styleNameTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
valueType="string" | |
), | |
xHeightTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
value=500, | |
valueType="integer" | |
), | |
capHeightTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
value=700, | |
valueType="integer" | |
), | |
ascenderTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
value=750, | |
valueType="integer" | |
), | |
descenderTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
value=-250, | |
valueType="integer" | |
), | |
unitsPerEmTextField=dict( | |
leadingTextWidth=int(WIDTH/3), | |
value=1000, | |
valueType="integer" | |
), | |
characterSetSelection=dict( | |
items=list(CHARACTER_SETS.keys()), | |
selected=self.newDocumentCharsetIndex, | |
), | |
characterSetEditor=dict( | |
height=200, | |
value=" ".join(list(CHARACTER_SETS.values())[self.newDocumentCharsetIndex]), | |
fontDescription=dict( | |
name="system-monospaced", | |
designStyle="monospaced" | |
), | |
), | |
footerStack=dict( | |
distribution="equalSpacing", | |
), | |
applyButton=dict( | |
height=50, | |
symbolConfiguration=dict( | |
style="largeTitle", | |
scale="large", | |
weight="light", | |
renderingMode="hierarchical", | |
colors=[AppKit.NSColor.greenColor()] | |
), | |
), | |
closeButton=dict( | |
height=50, | |
symbolConfiguration=dict( | |
style="largeTitle", | |
scale="large", | |
weight="light", | |
renderingMode="hierarchical", | |
colors=[AppKit.NSColor.redColor()] | |
), | |
), | |
) | |
self.w = ezui.EZModalWindow( | |
title="New Font Manager", | |
content=content, | |
size=(WIDTH, HEIGHT), | |
descriptionData=descriptionData, | |
controller=self | |
) | |
self.w.getItem("applyButton").enable(False) | |
self.w.getItem("updateSetButton").enable(False) | |
self.w._window.setTitlebarAppearsTransparent_(True) | |
def started(self): | |
self.w.open() | |
def familyNameTextFieldCallback(self, sender): | |
self.familyName = sender.get() | |
val = False | |
if self.familyName and self.styleName: | |
val = True | |
self.w.getItem("applyButton").enable(val) | |
def styleNameTextFieldCallback(self, sender): | |
self.styleName = sender.get() | |
val = False | |
if self.familyName and self.styleName: | |
val = True | |
self.w.getItem("applyButton").enable(val) | |
def characterSetSelectionCallback(self, sender): | |
character_set_index = sender.get() | |
character_set = list(CHARACTER_SETS.values())[character_set_index] | |
self.w.getItem("characterSetEditor").set(" ".join(character_set)) | |
self.character_set = character_set | |
def characterSetEditorCallback(self, sender): | |
self.character_set = [a for a in sender.get().split(" ") if a != " "] | |
def closeButtonCallback(self, sender): | |
if self.newDocumentCreateDefaultset: | |
self.font.lib["public.glyphOrder"] = list(list(CHARACTER_SETS.values())[self.newDocumentCharsetIndex]) | |
self.w.close() | |
def applyButtonCallback(self, sender): | |
for item, value in self.w.content.get().items(): | |
if item.endswith("TextField"): | |
fontInfoVal = item.split("TextField")[0] | |
setattr(self.font.info, fontInfoVal, value) | |
self.font.lib["public.glyphOrder"] = list(self.character_set) | |
self.w.close() | |
class NewFontListener(Subscriber): | |
def fontDocumentWillOpenNew(self, info): | |
font = info.get("lowLevelEvents", list(dict()))[0].get("font") | |
if font is not None: | |
NewFontManager(font) | |
if __name__ == "__main__": | |
registerRoboFontSubscriber(NewFontListener) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment