Instantly share code, notes, and snippets.
Last active
January 9, 2024 02:03
-
Save ryanbugden/568bf3797ac69511f029ea9f07d59811 to your computer and use it in GitHub Desktop.
This file contains 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
# menuTitle: Delete Glyphs from Layer - Contextual Menu | |
import ezui | |
from mojo.subscriber import Subscriber, registerFontOverviewSubscriber | |
from mojo.UI import CurrentFontWindow | |
''' | |
(Start-up script) | |
A contextual menu in the Font Overview. Right click selected glyphs | |
to delete them from a specified layer. | |
Ryan Bugden | |
2023.06.07 | |
''' | |
class DGLayerSheet(ezui.WindowController): | |
def build(self, parent): | |
window = parent.w | |
self.f = RFont(parent._font) | |
layers = [l.name for l in self.f.layers] | |
self.glyphs_to_delete = self.f.templateSelectedGlyphNames | |
content = """ | |
Delete selected glyph from: @label | |
|-----| @table | |
| | | |
|-----| | |
====================== | |
(Cancel) @cancelButton | |
(Delete Glyph) @deleteButton | |
""" | |
button_width = 110 | |
descriptionData=dict( | |
table=dict( | |
items=layers | |
), | |
cancelButton=dict( | |
keyEquivalent=chr(27), | |
width=button_width, | |
), | |
deleteButton=dict( | |
keyEquivalent=chr(13), | |
width=button_width, | |
), | |
) | |
self.w = ezui.EZSheet( | |
content=content, | |
descriptionData=descriptionData, | |
controller=self, | |
size=('auto', 275), | |
parent=window | |
) | |
if len(self.glyphs_to_delete) > 1: | |
self.w.getItem('deleteButton').setTitle("Delete Glyphs") | |
self.w.getItem('label').set("Delete selected glyphs from:") | |
if len(layers) > 1: | |
# Set the selection to be the second layer by default. | |
self.w.getItem('table').setSelectedItems([layers[1]]) | |
def started(self): | |
self.w.open() | |
def cancelButtonCallback(self, sender): | |
self.w.close() | |
def deleteButtonCallback(self, sender): | |
choice = self.w.getItem("table").getSelectedItems() | |
chosen_layers_amount = len(choice) | |
total_layers_amount = len(self.w.getItem("table").get()) | |
glyph_order = list(self.f.templateGlyphOrder) | |
for layer_name in choice: | |
layer = self.f.getLayer(layer_name) | |
for g_name in self.glyphs_to_delete: | |
try: | |
layer.removeGlyph(g_name) | |
if chosen_layers_amount == total_layers_amount: | |
glyph_order.remove(g_name) | |
except: | |
pass | |
self.f.templateGlyphOrder = glyph_order | |
print(f"Deleted the following glyphs from following layers:\n\tGlyphs: {self.glyphs_to_delete}\n\tLayers: {choice}") | |
self.w.close() | |
self.f.changed() | |
class DeleteGlyphsFromLayer(Subscriber): | |
def fontOverviewWantsContextualMenuItems(self, info): | |
self.f = info['glyph'].font | |
self.fo = info['fontOverview'] | |
if len(self.f.templateSelectedGlyphNames) > 1: | |
message = "Delete Glyphs from Layer..." | |
else: | |
message = "Delete Glyph from Layer..." | |
my_menu_items = [ | |
(message, self.deleteGlyphsCallback) | |
] | |
info['itemDescriptions'].extend(my_menu_items) | |
def deleteGlyphsCallback(self, sender): | |
parent = CurrentFontWindow() | |
DGLayerSheet(parent) | |
#=================== | |
if __name__ == "__main__": | |
registerFontOverviewSubscriber(DeleteGlyphsFromLayer) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment