Skip to content

Instantly share code, notes, and snippets.

@connordavenport
Last active October 17, 2025 13:50
Show Gist options
  • Save connordavenport/b0136eb1afdbb0f17f5dfcc112cae038 to your computer and use it in GitHub Desktop.
Save connordavenport/b0136eb1afdbb0f17f5dfcc112cae038 to your computer and use it in GitHub Desktop.
custom manager for opening new fonts
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