Skip to content

Instantly share code, notes, and snippets.

@ryanbugden
Last active January 9, 2024 02:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryanbugden/568bf3797ac69511f029ea9f07d59811 to your computer and use it in GitHub Desktop.
Save ryanbugden/568bf3797ac69511f029ea9f07d59811 to your computer and use it in GitHub Desktop.
# 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