#!/usr/bin/env python3 # -------------------- # # Palette + Subscriber # # -------------------- # # -- Modules -- # import ezui from mojo.subscriber import Subscriber, WindowController, getRegisteredSubscriberEvents from mojo.subscriber import registerGlyphEditorSubscriber, unregisterGlyphEditorSubscriber from mojo.roboFont import OpenWindow from mojo.events import postEvent from mojo.subscriber import registerSubscriberEvent DEFAULT_KEY = 'com.developerName.SomeTool' class ToolPalette(WindowController): debug = True thickness = 5 def build(self): content = """ ----X---- 123 @slider """ descriptionData = dict( slider=dict( minValue=0, value=self.thickness, maxValue=25, stopOnTickMarks=True, tickMarks=6, continuous=False ) ) self.w = ezui.EZWindow( title="Tool", size=(200, "auto"), content=content, descriptionData=descriptionData, controller=self ) def started(self): self.w.open() Tool.controller = self registerGlyphEditorSubscriber(Tool) def destroy(self): unregisterGlyphEditorSubscriber(Tool) Tool.controller = None def sliderCallback(self, sender): self.thickness = sender.get() postEvent(f"{DEFAULT_KEY}.changed") class Tool(Subscriber): """ Tool can only ask for information to the palette """ debug = True controller = None def build(self): glyphEditor = self.getGlyphEditor() container = glyphEditor.extensionContainer(identifier=DEFAULT_KEY, location='background', clear=True) self.path = container.appendPathSublayer( fillColor=(0, 0, 0, 0), strokeColor=(1, 0, 0, 1), strokeWidth=self.controller.thickness if self.controller else 0, ) glyph = self.getGlyphEditor().getGlyph() self.path.setPath(glyph.getRepresentation("merz.CGPath")) def destroy(self): glyphEditor = self.getGlyphEditor() container = glyphEditor.extensionContainer(DEFAULT_KEY, location='background') container.clearSublayers() def glyphEditorGlyphDidChangeOutline(self, info): self.path.setPath(info['glyph'].getRepresentation("merz.CGPath")) def paletteDidChange(self, info): self.path.setStrokeWidth(self.controller.thickness) # -- Instructions -- # if __name__ == '__main__': eventName = f"{DEFAULT_KEY}.changed" # we register the subscriber event only if necessary if eventName not in getRegisteredSubscriberEvents(): registerSubscriberEvent( subscriberEventName=eventName, methodName="paletteDidChange", lowLevelEventNames=[eventName], dispatcher="roboFont", documentation="Send when the tool palette did change parameters.", delay=0, debug=True ) OpenWindow(ToolPalette)