def apply_callback(self, sender): f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) if len(glyph_names) > 0: # get parameters old = self.w._old_name_value.get() new = self.w._new_name_value.get() boolstring = (False, True) # print info print 'renaming anchors in glyphs...\n' print '\told name: %s' % old print '\tnew name: %s' % new print print '\t', # change anchors names for glyph_name in glyph_names: print glyph_name, # rename anchor f[glyph_name].prepareUndo('rename anchor') has_name = rename_anchor(f[glyph_name], old, new) f[glyph_name].performUndo() f[glyph_name].update() # done f.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def _clear_callback(self, sender): font = CurrentFont() if font is not None: for glyph_name in get_glyphs(font): font[glyph_name].prepareUndo('clear mask') mask_layer = font[glyph_name].getLayer(self.background_layer) mask_layer.clear() font[glyph_name].performUndo() # RF 2.0 if version[0] == '2': font[glyph_name].changed() # RF 1.8.X else: font[glyph_name].update() # RF 2.0 if version[0] == '2': font.changed() # RF 1.8.X else: font.update() else: print no_font_open
def _rasterize_callback(self, sender): font = CurrentFont() if font is not None: glyph_names = get_glyphs(font) if len(glyph_names) > 0: gridsize = int(self.w.spinner.value.get()) res = (gridsize, gridsize) self.w.bar.start() print "rasterizing glyphs...\n" for glyph_name in glyph_names: glyph = font[glyph_name] print '\tscanning %s...' % glyph_name glyph.prepareUndo('rasterize glyph') R = RasterGlyph(glyph) R.rasterize(res=res) glyph.update() glyph.performUndo() # done font.update() self.w.bar.stop() print "\n...done.\n" # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def _mirror_glyphs(self, xxx_todo_changeme2): (scale_x, scale_y) = xxx_todo_changeme2 f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) if len(glyph_names): print('reflecting selected glyphs...\n') print('\t', end=' ') for glyph_name in glyph_names: print(glyph_name, end=' ') # mirror all layers if self.layers: for layer_name in f.layerOrder: _g = f[glyph_name].getLayer(layer_name) self._mirror_glyph(_g, (scale_x, scale_y)) # mirror active layer only else: self._mirror_glyph(f[glyph_name], (scale_x, scale_y)) # done with glyph f[glyph_name].update() # done with font f.update() print() print('\n...done.\n') # no glyph selected else: print(no_glyph_selected) # no font open else: print(no_font_open)
def _flip_callback(self, sender): font = CurrentFont() if font is not None: glyph_names = get_glyphs(font) # get foreground anchors anchors_dict = get_anchors(font, glyph_names) for glyph_name in glyph_names: # flip layers (including anchors) font[glyph_name].prepareUndo('flip mask') font[glyph_name].flipLayers('foreground', self.mask_layer) # keep anchors from source layer in foreground if not self.w.flip_anchors.get(): if anchors_dict.has_key(glyph_name): for anchor in anchors_dict[glyph_name]: anchor_name, anchor_pos = anchor font[glyph_name].appendAnchor(anchor_name, anchor_pos) font[glyph_name].update() # remove anchors from dest layer dest_glyph = font[glyph_name].getLayer(self.mask_layer) dest_glyph.clearAnchors() # done with glyph font[glyph_name].performUndo() # done with font font.update() else: print no_font_open
def _flip_callback(self, sender): font = CurrentFont() if font is not None: glyph_names = get_glyphs(font) # get foreground anchors anchors_dict = get_anchors(font, glyph_names) for glyph_name in glyph_names: # flip layers (including anchors) font[glyph_name].prepareUndo('flip mask') font[glyph_name].flipLayers('foreground', self.mask_layer) # keep anchors from source layer in foreground if not self.w.flip_anchors.get(): if glyph_name in anchors_dict: for anchor in anchors_dict[glyph_name]: anchor_name, anchor_pos = anchor font[glyph_name].appendAnchor(anchor_name, anchor_pos) font[glyph_name].update() # remove anchors from dest layer dest_glyph = font[glyph_name].getLayer(self.mask_layer) dest_glyph.clearAnchors() # done with glyph font[glyph_name].performUndo() # done with font font.update() else: print(no_font_open)
def apply_callback(self, sender): f = CurrentFont() if f is not None: boolstring = [ 'False', 'True' ] # get parameters _left = self.w.left_checkbox.get() _left_mode = self.w.left_mode.get() _right = self.w.right_checkbox.get() _right_mode = self.w.right_mode.get() # iterate over glyphs glyph_names = get_glyphs(f) if len(glyph_names) > 0: # print info print 'setting margins for selected glyphs...\n' print '\tleft: %s %s [%s]' % (self._modes[_left_mode], self._left_value, boolstring[_left]) print '\tright: %s %s [%s]' % (self._modes[_right_mode], self._right_value, boolstring[_right]) print print '\t\t', # set margins for glyph_name in glyph_names: print glyph_name, self.set_margins(f[glyph_name], (_left, self._left_value, _left_mode), (_right, self._right_value, _right_mode)) f.update() print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def apply_callback(self, sender): f = CurrentFont() if f is not None: # get layer name layer_name_option = self.w.layer_name.get() # mask layer if not layer_name_option: layer_name = 'background' # font name else: layer_name = os.path.split(self.ufo_path)[1] # import layer print 'importing .ufo...\n' print '\ttarget layer: %s\n' % layer_name ufo = RFont(self.ufo_path, showUI=False) for glyph_name in f.keys(): if ufo.has_key(glyph_name): layer_glyph = f[glyph_name].getLayer(layer_name) pen = layer_glyph.getPointPen() ufo[glyph_name].drawPoints(pen) f[glyph_name].update() f.update() print '...done.\n' # no font open else: print no_font_open
def apply_callback(self, sender): f = CurrentFont() if f is not None: if len(f.selection) > 0: # get parameters _old = self.w._old_name_value.get() _new = self.w._new_name_value.get() boolstring = (False, True) # print info print 'renaming anchors in glyphs...\n' print '\told name: %s' % _old print '\tnew name: %s' % _new print print '\t', # batch change anchors names glyph_names = get_glyphs(f) for glyph_name in glyph_names: print glyph_name, # rename anchor f[glyph_name].prepareUndo('rename anchor') has_name = rename_anchor(f[glyph_name], _old, _new) f[glyph_name].performUndo() f[glyph_name].update() # done f.update() print print '\n...done.\n' # no glyph selected else: print 'please select one or more glyphs before running the script.\n' # no glyph selected else: print 'please open a font first.\n'
def apply_callback(self, sender): # get font font = CurrentFont() if font is not None: # get glyphs glyph_names = font.selection if len(glyph_names) > 0: # get values esize = get_esize(font) self.rand_min = self.w.spinner_min.value.get() self.rand_max = self.w.spinner_max.value.get() # randomize elements for glyph_name in glyph_names: w = font[glyph_name].width g = RasterGlyph(font[glyph_name]) g.rasterize() randomize_elements(font[glyph_name], esize, (self.rand_min, self.rand_max)) font[glyph_name].width = w font.update() # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def apply_callback(self, sender): f = CurrentFont() if f is not None: # get layer name layer_name_option = self.w.layer_name.get() # mask layer if not layer_name_option: layer_name = 'background' # font name else: layer_name = os.path.split(self.ufo_path)[1] # import layer print('importing .ufo...\n') print('\ttarget layer: %s\n' % layer_name) ufo = RFont(self.ufo_path, showUI=False) for glyph_name in list(f.keys()): if glyph_name in ufo: layer_glyph = f[glyph_name].getLayer(layer_name) pen = layer_glyph.getPointPen() ufo[glyph_name].drawPoints(pen) f[glyph_name].update() f.update() print('...done.\n') # no font open else: print(no_font_open)
def apply_callback(self, sender): f = CurrentFont() if f is not None: # iterate over glyphs glyph_names = get_glyphs(f) if len(glyph_names) > 0: # get parameters width = int(self.w.spinner.value.get()) center = self.w.center_checkbox.get() split = self.w.split_checkbox.get() split_relative = self.w.split_relative_checkbox.get() boolstring = (False, True) # set sidebearings mode if center: w_mode = 'center' elif split: w_mode = 'split difference' elif split_relative: w_mode = 'split relative' else: w_mode = 'default' # print info print 'setting character widths...\n' print '\t%s %s' % (self._modes[self._mode], width) print '\tmode: %s' % w_mode print print '\t', for glyph_name in glyph_names: print glyph_name, self.set_width(f[glyph_name], width, w_mode) # RF 2.0 if version[0] == '2': f.changed() # RF 1.8.X else: f.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def _copy_callback(self, sender): font = CurrentFont() if font is not None: for glyph_name in get_glyphs(font): font[glyph_name].prepareUndo('copy to mask') font[glyph_name].copyToLayer(self.mask_layer, clear=False) font[glyph_name].performUndo() font.update() else: print no_font_open
def _flip_callback(self, sender): font = CurrentFont() if font is not None: for glyph_name in get_glyphs(font): font[glyph_name].prepareUndo('flip mask') font[glyph_name].flipLayers('foreground', self.mask_layer) font[glyph_name].performUndo() font.update() else: print no_font_open
def _print_callback(self, sender): f = CurrentFont() glyph_names = get_glyphs(f) if len(glyph_names) > 0: print "printing glyphs...\n" for glyph_name in glyph_names: g = RasterGlyph(f[glyph_name]) g._print(res=self._gridsize) f.update() print "...done.\n"
def apply_callback(self, sender): font = CurrentFont() _layer_name = self.w._layer_name.get() if _layer_name in font.layerOrder: print 'deleting layer %s...' % _layer_name font.removeLayer(_layer_name) print '...done.\n' font.update() else: print 'font does not have layer %s.' % _layer_name
def _clear_callback(self, sender): font = CurrentFont() if font is not None: for glyph_name in get_glyphs(font): font[glyph_name].prepareUndo('clear mask') clear_mask = font[glyph_name].getLayer(self.mask_layer, clear=True) font[glyph_name].update() font[glyph_name].performUndo() font.update() else: print no_font_open
def _clear_callback(self, sender): font = CurrentFont() if font is not None: for glyph_name in get_glyphs(font): font[glyph_name].prepareUndo('clear mask') clear_mask = font[glyph_name].getLayer(self.mask_layer, clear=True) font[glyph_name].update() font[glyph_name].performUndo() font.update() else: print(no_font_open)
def apply_callback(self, sender): boolstring = [ False, True ] f = CurrentFont() if f is not None: if len(f.selection) > 0: # print info print 'changing glyph name suffixes...\n' print '\told suffix: %s' % self._old_suffix print '\tnew suffix: %s' % self._new_suffix print '\toverwrite: %s' % boolstring[self._overwrite] print # batch change glyph names for glyph_name in get_glyphs(f): g = f[glyph_name] # get glyphs with matching suffix if has_suffix(g, self._old_suffix): # make new name if len(self._new_suffix) > 0: _new_name = change_suffix(g, self._old_suffix, self._new_suffix) else: _new_name = change_suffix(g, self._old_suffix, None) # if new name not in font, rename if not f.has_key(_new_name): print '\trenaming %s to %s...' % (glyph_name, _new_name) g.name = _new_name # new name in font else: # overwrite existing if self._overwrite: print "\toverwriting '%s' with '%s'" % (_new_name, glyph_name) f.removeGlyph(_new_name) f.update() g.name = _new_name g.update() # do not overwrite else: print "\t'%s' already exists in font, skipping '%s'" % (_new_name, glyph_name) # glyph name does not have suffix else: pass # done glyph # done font f.update() print print '...done.\n' # no glyph selected else: print 'please select one or more glyphs before running the script.\n' # no glyph selected else: print 'please open a font first.\n' pass
def paste_callback(self, sender): print 'pasting data from glyph %s:\n' % self.source_glyph.name bool_string = ( False, True ) foreground = self.w.foreground.get() layers = self.w.layers.get() metrics = self.w.metrics.get() anchors = self.w.anchors.get() color = self.w.color.get() print '\tforeground: %s' % bool_string[foreground] print '\tlayers: %s' % bool_string[layers] print '\tmetrics: %s' % bool_string[metrics] print '\tanchors: %s' % bool_string[anchors] print '\tcolor: %s' % bool_string[color] print print '\tpasting in', f = CurrentFont() glyph_names = get_glyphs(f) if len(glyph_names) > 0: for glyph_name in glyph_names: print glyph_name, # prepare undo f[glyph_name].prepareUndo('paste from glyph') # copy outlines in foreground layer if foreground: target_layer = f[glyph_name].getLayer('foreground') pen = target_layer.getPointPen() self.source_glyph.drawPoints(pen) # copy all other layers if layers: for layer_name in self.source_font.layerOrder: source_layer = self.source_glyph.getLayer(layer_name) target_layer = f[glyph_name].getLayer(layer_name) pen = target_layer.getPointPen() source_layer.drawPoints(pen) # copy glyph width if metrics: f[glyph_name].width = self.source_glyph.width # copy anchors if anchors: transfer_anchors(self.source_glyph, f[glyph_name]) # copy mark color if color: f[glyph_name].mark = self.source_glyph.mark # activate undo f[glyph_name].performUndo() # done with glyph f[glyph_name].update() # done f.update() print print '\n...done.\n'
def move_glyphs(self, xxx_todo_changeme): (x, y) = xxx_todo_changeme f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) # transform glyphs if len(glyph_names) > 0: # get options foreground = self.w.foreground.get() layers = self.w.layers.get() if (layers and foreground) is not False: boolstring = [False, True] # print info if self.verbose: print('moving selected glyphs...\n') print('\tx: %s' % x) print('\ty: %s' % y) print('\tlayers: %s' % boolstring[layers]) print() print('\t', end=' ') # move glyphs for glyph_name in glyph_names: if self.verbose: print(glyph_name, end=' ') f[glyph_name].prepareUndo('move') # all layers if layers: for layer_name in f.layerOrder: glyph = f[glyph_name].getLayer(layer_name) glyph.move((x, y)) # active layer if foreground: f[glyph_name].move((x, y)) # done glyph f[glyph_name].performUndo() f[glyph_name].update() # done font f.update() if self.verbose: print() print('\n...done.\n') # no layer selected else: print(no_layer_selected) # no glyph selected else: print(no_glyph_selected) # no font open else: print(no_font_open)
def apply_callback(self, sender): f = CurrentFont() if f is not None: # get parameters _width = int(self.w.width_value.get()) _center = self.w.center_checkbox.get() _split = self.w.split_checkbox.get() _split_relative = self.w.split_relative_checkbox.get() _gNames = f.selection boolstring = ( False, True ) # set sidebearings mode if _center: _w_mode = 'center' elif _split: _w_mode = 'split difference' elif _split_relative: _w_mode = 'split relative' else: _w_mode = None # print info print 'setting character widths...\n' print '\t%s %s' % (self._modes[self._mode], _width) print '\tmode: %s' % _w_mode print print '\t', # current glyph glyph = CurrentGlyph() if glyph is not None: print glyph.name, self.set_width(glyph, _width, _w_mode) f.update() print print '\n...done.\n' # selected glyphs else: glyph_names = f.selection if len(glyph_names) > 0: for glyph_name in glyph_names: print glyph_name, self.set_width(f[glyph_name], _width, _w_mode) f.update() print print '\n...done.\n' # no glyph selected else: print 'please select one or more glyphs first.\n' # no font open else: print 'please open a font first.\n'
def apply_callback(self, sender): f = CurrentFont() if f is not None: # iterate over glyphs glyph_names = get_glyphs(f) if len(glyph_names) > 0: # get parameters width = int(self.w.spinner.value.get()) center = self.w.center_checkbox.get() split = self.w.split_checkbox.get() split_relative = self.w.split_relative_checkbox.get() boolstring = (False, True) # set sidebearings mode if center: w_mode = 'center' elif split: w_mode = 'split difference' elif split_relative: w_mode = 'split relative' else: w_mode = None # print info print 'setting character widths...\n' print '\t%s %s' % (self._modes[self._mode], width) print '\tmode: %s' % w_mode print print '\t', for glyph_name in glyph_names: print glyph_name, self.set_width(f[glyph_name], width, w_mode) f.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def apply_callback(self, sender): f = CurrentFont() if f is not None: print 'importing .ufo into layer...' ufo = RFont(self.ufo_path, showUI=False) layer_name = os.path.split(self.ufo_path)[1] for glyph_name in f.keys(): if ufo.has_key(glyph_name): layer_glyph = f[glyph_name].getLayer(layer_name) pen = layer_glyph.getPointPen() ufo[glyph_name].drawPoints(pen) f[glyph_name].update() f.update() print '...done.\n' else: print 'please open a font first.\n'
def _rasterize_callback(self, sender): f = CurrentFont() glyph_names = get_glyphs(f) if len(glyph_names) > 0: self.w.bar.start() print "rasterizing glyphs..." for glyph_name in glyph_names: print '\tscanning %s...' % glyph_name f[glyph_name].prepareUndo('rasterize glyph') g = RasterGlyph(f[glyph_name]) g.rasterize(res=self._gridsize) f[glyph_name].update() f[glyph_name].performUndo() f.update() self.w.bar.stop() print "...done.\n"
def apply_callback(self, sender): f = CurrentFont() if f is not None: _top = self.w.top.get() _bottom = self.w.bottom.get() _top_pos = int(self.w.spinner_top.value.get()) _bottom_pos = int(self.w.spinner_bottom.value.get()) _accent = self.w.accent.get() _clear = self.w.clear.get() print _top_delta, type(_top_delta) print _bottom_delta, type(_bottom_delta) glyph_names = get_glyphs(f) if len(glyph_names) > 0: if _clear: print 'removing anchors...\n' clear_anchors(f, glyph_names) print '...done.\n' print 'creating anchors in glyphs...\n' print '\t', for glyph_name in glyph_names: print glyph_name, f[glyph_name].prepareUndo('create anchors') create_anchors(f[glyph_name], top=_top, bottom=_bottom, accent=_accent, top_pos=_top_pos, bottom_pos=_bottom_pos) f[glyph_name].performUndo() f.update() print print "\n...done.\n" else: print no_glyph_selected else: print no_font_open
def _scan_callback(self, sender): font = CurrentFont() if font is not None: glyph_names = get_glyphs(font) if len(glyph_names) > 0: # get resolution gridsize = int(self.w.spinner.value.get()) res = (gridsize, gridsize) print "scanning glyphs...\n" for glyph_name in glyph_names: glyph = font[glyph_name] R = RasterGlyph(glyph) R.scan(res=res) # done font.update() print "...done.\n" # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
def move_anchors(self, xxx_todo_changeme): (x, y) = xxx_todo_changeme f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) if len(glyph_names) > 0: self.get_parameters() print('moving anchors in glyphs...\n') print('\tanchors: %s' % self.anchor_names) print('\tmove: %s, %s' % (x, y)) print() print('\t', end=' ') for glyph_name in glyph_names: print(glyph_name, end=' ') if self.anchors_layers: for layer_name in f.layerOrder: layer_glyph = f[glyph_name].getLayer(layer_name) layer_glyph.prepareUndo('move anchors') move_anchors(layer_glyph, self.anchor_names, (x, y)) layer_glyph.performUndo() layer_glyph.update() # f[glyph_name].update() else: f[glyph_name].prepareUndo('move anchors') move_anchors(f[glyph_name], self.anchor_names, (x, y)) f[glyph_name].performUndo() # done glyph f[glyph_name].update() f.update() print() print('\n...done.\n') # no glyph selected else: print(no_glyph_selected) # no font open else: print(no_font_open)
def apply_callback(self, sender): f = CurrentFont() if f is not None: boolstring = ['False', 'True'] # get parameters left = self.w.left_checkbox.get() left_mode = self.w.left_mode.get() left_value = int(self.w.spinner_left.value.get()) right = self.w.right_checkbox.get() right_mode = self.w.right_mode.get() right_value = int(self.w.spinner_right.value.get()) # iterate over glyphs glyph_names = get_glyphs(f) if len(glyph_names) > 0: # print info print 'setting margins for selected glyphs...\n' print '\tleft: %s %s [%s]' % (self.modes[left_mode], left_value, boolstring[left]) print '\tright: %s %s [%s]' % (self.modes[right_mode], right_value, boolstring[right]) print print '\t', # set margins for glyph_name in glyph_names: print glyph_name, self.set_margins(f[glyph_name], (left, left_value, left_mode), (right, right_value, right_mode)) f.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
self._mirror_glyph(f[glyph_name], (scale_x, scale_y)) # RF 2.0 if version[0] == '2': f[glyph_name].changed() # RF 1.8.X else: f[glyph_name].update() # done with font # RF 2.0 if version[0] == '2': f.changed() # RF 1.8.X else: f.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open def _right_callback(self, sender): self._mirror_glyphs((-1, 1))
class adjustVerticalMetrics(hDialog): '''A dialog to adjust the vertical metrics in the font with the help of sliders and nudge buttons. .. image:: imgs/font/adjust-vmetrics.png ''' ascender_min = 1 capheight_min = 1 xheight_min = 1 descender_min = 1 column_1 = 80 column_2 = 200 column_3 = 45 moveX = 0 moveY = 0 def __init__(self): self.title = "vertical metrics" self.box_width = 60 self.width = self.column_1 + self.column_2 + self.column_3 + self.padding_x*3 + self.nudge_button*4 + 2 self.height = self.text_height + self.nudge_button*4 + self.padding_y*6 self.font = CurrentFont() if self.font is not None: self.w = HUDFloatingWindow((self.width, self.height), self.title) # get font vmetrics units_per_em = self.font.info.unitsPerEm ascender = self.font.info.ascender capheight = self.font.info.capHeight xheight = self.font.info.xHeight descender = abs(self.font.info.descender) # set max vmetrics self.ascender_max = units_per_em self.capheight_max = units_per_em self.xheight_max = units_per_em self.descender_max = units_per_em # make button alignments x1 = self.padding_x x2 = x1 + self.column_1 x3 = x2 + self.column_2 + 15 x4 = x3 + self.column_3 - 1 x5 = x4 + self.nudge_button - 1 x6 = x5 + self.nudge_button - 1 x7 = x6 + self.nudge_button - 1 y = self.padding_y self.w.box = Box( (x1, y, self.column_1 + self.column_2, self.text_height)) self.w.box.text = TextBox( (5, 0, -self.padding_x, self.text_height), get_full_name(self.font), sizeStyle=self.size_style) self.w.font_switch = SquareButton( (x3, y, -self.padding_x, self.text_height), 'update', sizeStyle=self.size_style, callback=self.update_font_callback) y += self.text_height + self.padding_y # ascender self.w.ascender_label = TextBox( (x1, y, self.column_1, self.nudge_button), "ascender", sizeStyle=self.size_style) self.w.ascender_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.ascender_min, maxValue=self.ascender_max, value=ascender, callback=self.ascender_slider_callback, sizeStyle=self.size_style) self.w.ascender_value = EditText( (x3, y, self.column_3, self.nudge_button), ascender, callback=self.ascender_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.ascender_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.ascender_minus_01_callback) self.w.ascender_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.ascender_plus_01_callback) self.w.ascender_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.ascender_minus_10_callback) self.w.ascender_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.ascender_plus_10_callback) y += self.nudge_button + self.padding_y # capheight self.w.capheight_label = TextBox( (x1, y, self.column_1, self.nudge_button), "cap-height", sizeStyle=self.size_style) self.w.capheight_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.capheight_min, maxValue=self.capheight_max, value=capheight, callback=self.capheight_slider_callback, sizeStyle=self.size_style) self.w.capheight_value = EditText( (x3, y, self.column_3, self.nudge_button), capheight, callback=self.capheight_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.capheight_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.capheight_minus_01_callback) self.w.capheight_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.capheight_plus_01_callback) self.w.capheight_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.capheight_minus_10_callback) self.w.capheight_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.capheight_plus_10_callback) y += self.nudge_button + self.padding_y # xheight self.w.xheight_label = TextBox( (x1, y, self.column_1, self.nudge_button), "x-height", sizeStyle=self.size_style) self.w.xheight_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.xheight_min, maxValue=self.xheight_max, value=xheight, callback=self.xheight_slider_callback, sizeStyle=self.size_style) self.w.xheight_value = EditText( (x3, y, self.column_3, self.nudge_button), xheight, callback=self.xheight_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.xheight_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.xheight_minus_01_callback) self.w.xheight_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.xheight_plus_01_callback) self.w.xheight_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.xheight_minus_10_callback) self.w.xheight_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.xheight_plus_10_callback) y += self.nudge_button + self.padding_y # descender self.w.descender_label = TextBox( (x1, y, self.column_1, self.nudge_button), "descender", sizeStyle=self.size_style) self.w.descender_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.descender_min, maxValue=self.descender_max, value=descender, callback=self.descender_slider_callback, sizeStyle=self.size_style) self.w.descender_value = EditText( (x3, y, self.column_3, self.nudge_button), descender, callback=self.descender_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.descender_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.descender_minus_01_callback) self.w.descender_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.descender_plus_01_callback) self.w.descender_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.descender_minus_10_callback) self.w.descender_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.descender_plus_10_callback) # open window self.w.open() else: print no_font_open # updates def xheight_update(self, value): self.w.xheight_value.set(value) self.w.xheight_slider.set(value) self.font.info.xHeight = value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def capheight_update(self, value): self.w.capheight_value.set(value) self.w.capheight_slider.set(value) self.font.info.capHeight = value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def descender_update(self, value): self.w.descender_value.set(abs(value)) self.w.descender_slider.set(abs(value)) self.font.info.descender = -abs(value) # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def ascender_update(self, value): self.w.ascender_value.set(value) self.w.ascender_slider.set(value) self.font.info.ascender = value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() # buttons def update_font_callback(self, sender): self.font = CurrentFont() self.w.box.text.set(get_full_name(self.font)) # xheight def xheight_minus_01_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) - 1 self.xheight_update(value) def xheight_plus_01_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) + 1 self.xheight_update(value) def xheight_minus_10_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) - 10 self.xheight_update(value) def xheight_plus_10_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) + 10 self.xheight_update(value) # capheight def capheight_minus_01_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) - 1 self.capheight_update(value) def capheight_plus_01_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) + 1 self.capheight_update(value) def capheight_minus_10_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) - 10 self.capheight_update(value) def capheight_plus_10_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) + 10 self.capheight_update(value) # ascender def ascender_minus_01_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) - 1 self.ascender_update(value) def ascender_plus_01_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) + 1 self.ascender_update(value) def ascender_minus_10_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) - 10 self.ascender_update(value) def ascender_plus_10_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) + 10 self.ascender_update(value) # descender def descender_minus_01_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) - 1 self.descender_update(-value) def descender_plus_01_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) + 1 self.descender_update(-value) def descender_minus_10_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) - 10 self.descender_update(-value) def descender_plus_10_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) + 10 self.descender_update(-value) # sliders def xheight_slider_callback(self, sender): _xheight_value = int(self.w.xheight_slider.get()) # print 'xheight: %s' % _xheight_value self.w.xheight_value.set(_xheight_value) self.font.info.xHeight = _xheight_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def capheight_slider_callback(self, sender): _capheight_value = int(self.w.capheight_slider.get()) # print 'capheight: %s' % _capheight_value self.w.capheight_value.set(_capheight_value) self.font.info.capHeight = _capheight_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def descender_slider_callback(self, sender): _descender_value = int(self.w.descender_slider.get()) # print 'descender: %s' % _descender_value self.w.descender_value.set(abs(_descender_value)) self.font.info.descender = -abs(_descender_value) # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def ascender_slider_callback(self, sender): _ascender_value = int(self.w.ascender_slider.get()) # print 'ascender: %s' % _ascender_value self.w.ascender_value.set(_ascender_value) self.font.info.ascender = _ascender_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() # values def xheight_value_callback(self, sender): _xheight_value = int(sender.get()) # print 'xheight: %s' % _xheight_value self.w.xheight_slider.set(_xheight_value) self.font.info.xHeight = _xheight_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def capheight_value_callback(self, sender): _capheight_value = int(sender.get()) # print 'capheight: %s' % _capheight_value self.w.capheight_slider.set(_capheight_value) self.font.info.capHeight = _capheight_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def ascender_value_callback(self, sender): _ascender_value = int(sender.get()) # print 'ascender: %s' % _ascender_value self.w.ascender_slider.set(_ascender_value) self.font.info.ascender = _ascender_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update() def descender_value_callback(self, sender): _descender_value = int(sender.get()) # print 'descender: %s' % _descender_value self.w.descender_slider.set(_descender_value) self.font.info.descender = - _descender_value # RF 2.0 if version[0] == '2': self.font.changed() # RF 1.8.X else: self.font.update()
class shiftPointsDialog(hDialog): """A dialog to select and shift points in the selected glyphs in a font. .. image:: imgs/glyphs/points-shift.png """ # attributes pos = 250 delta = 125 side = 1 axis = 0 layers = False font = None glyph_names = [] # methods def __init__(self): self.title = 'shift' self.column1 = 51 self.width = (self.nudge_button * 6) + (self.padding_x * 2) - 5 self.small_button = (self.width - (self.padding_x * 2)) / 2 self.height = (self.text_height * 4) + (self.padding_y * 9) + ( self.nudge_button * 2) + (self.button_height * 1) + 5 self.w = FloatingWindow((self.width, self.height), self.title) # position x = 0 y = self.padding_y self.w.spinner_pos = Spinner((x, y), default='100', integer=True, label='pos') # delta y += self.w.spinner_pos.getPosSize()[3] self.w.spinner_delta = Spinner((x, y), default='100', integer=True, label='delta') # axis x = self.padding_x y += self.w.spinner_delta.getPosSize()[3] self.w.axis_label = TextBox((x, y, self.column1, self.text_height), "axis", sizeStyle=self.size_style) x = self.column1 self.w._axis = RadioGroup((x, y, -self.padding_x, self.text_height), ["x", "y"], sizeStyle=self.size_style, isVertical=False) self.w._axis.set(self.axis) # apply buttons x = self.padding_x y += (self.text_height + self.padding_y) self.w.button_minus = SquareButton( (x, y, self.small_button + 1, self.button_height), '-', callback=self.shift_minus_callback) x += self.small_button self.w.button_plus = SquareButton( (x, y, self.small_button, self.button_height), '+', callback=self.shift_plus_callback) # switch sides x = self.padding_x y += (self.button_height + self.padding_y) self.w._side = CheckBox((x, y, -self.padding_x, self.text_height), "invert side", value=False, sizeStyle=self.size_style) y += self.text_height self.w._layers = CheckBox((x, y, -self.padding_x, self.text_height), "all layers", value=self.layers, sizeStyle=self.size_style) # open window self.w.open() # functions def _get_parameters(self): self.pos = int(self.w.spinner_pos.value.get()) self.delta = int(self.w.spinner_delta.value.get()) self.axis = self.w._axis.get() self.side = self.w._side.get() self.layers = self.w._layers.get() def shift_plus_callback(self, sender): self._get_parameters() self.shift_callback(mode=1) def shift_minus_callback(self, sender): self._get_parameters() self.shift_callback(mode=0) def shift_callback(self, mode): self.font = CurrentFont() if self.font is not None: glyph_names = get_glyphs(self.font) if len(glyph_names) > 0: _boolstring = ['False', 'True'] _modes = ['minus', 'plus'] _axes = ['x', 'y'] # set delta value if mode == 1: _delta = self.delta else: _delta = -self.delta # set side if self.axis == 0: _sides = ['right', 'left'] else: _sides = ['top', 'bottom'] # print info print('shifting points in glyphs...\n') print('\tposition: %s' % self.pos) print('\tdelta: %s' % _delta) print('\taxis: %s' % _axes[self.axis]) print('\tmode: %s' % _modes[mode]) print('\tside: %s' % _sides[self.side]) print('\tlayers: %s' % _boolstring[self.layers]) print() print('\t', end=' ') # transform for glyph_name in glyph_names: print(glyph_name, end=' ') # get glyph g = self.font[glyph_name] # shift y if self.axis: # all layers if self.layers: for layer_name in self.font.layerOrder: _g = g.getLayer(layer_name) _g.prepareUndo('shift points y') deselect_points(_g) select_points_y(_g, self.pos, side=_sides[self.side]) shift_selected_points_y(_g, _delta) _g.performUndo() _g.update() # active layer only else: g.prepareUndo('shift points y') deselect_points(g) select_points_y(g, self.pos, side=_sides[self.side]) shift_selected_points_y(g, _delta) g.performUndo() g.update() # shift x else: # all layers if self.layers: for layer_name in self.font.layerOrder: _g = g.getLayer(layer_name) _g.prepareUndo('shift points x') deselect_points(_g) select_points_x(_g, self.pos, side=_sides[self.side]) shift_selected_points_x(_g, _delta) _g.performUndo() _g.update() # active layer only else: g.prepareUndo('shift points x') deselect_points(g) select_points_x(g, self.pos, side=_sides[self.side]) shift_selected_points_x(g, _delta) g.performUndo() g.update() # done glyph # done self.font.update() print() print('\n...done.\n') # no glyph selected else: print(no_glyph_selected) # no font open else: print(no_font_open)
def paste_callback(self, sender): f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) if len(glyph_names) > 0: # get data foreground = self.w.foreground.get() layers = self.w.layers.get() metrics = self.w.metrics.get() anchors = self.w.anchors.get() color = self.w.color.get() # print info bool_string = [False, True] print('pasting data from glyph %s:\n' % self.source_glyph.name) print('\tforeground: %s' % bool_string[foreground]) print('\tlayers: %s' % bool_string[layers]) print('\tmetrics: %s' % bool_string[metrics]) print('\tanchors: %s' % bool_string[anchors]) print('\tcolor: %s' % bool_string[color]) print() print('\tpasting in', end=' ') # copy data for glyph_name in glyph_names: print(glyph_name, end=' ') # prepare undo f[glyph_name].prepareUndo('paste from glyph') # copy outlines in foreground layer if foreground: target_layer = f[glyph_name].getLayer('foreground') pen = target_layer.getPointPen() self.source_glyph.drawPoints(pen) # copy all other layers if layers: for layer_name in self.source_font.layerOrder: source_layer = self.source_glyph.getLayer( layer_name) target_layer = f[glyph_name].getLayer(layer_name) pen = target_layer.getPointPen() source_layer.drawPoints(pen) # copy glyph width if metrics: f[glyph_name].width = self.source_glyph.width # copy anchors if anchors: transfer_anchors(self.source_glyph, f[glyph_name]) # copy mark color if color: f[glyph_name].mark = self.source_glyph.mark # activate undo f[glyph_name].performUndo() # done with glyph f[glyph_name].update() # done f.update() print() print('\n...done.\n') # no glyph selected else: print(no_glyph_selected) # no font open else: print(no_font_open)
class shiftPointsDialog(hDialog): """A dialog to select and shift points in the selected glyphs in a font. .. image:: imgs/glyphs/points-shift.png """ # attributes pos = 250 delta = 125 side = 1 axis = 0 layers = False font = None glyph_names = [] # methods def __init__(self): self.title = 'shift' self.column1 = 51 self.width = (self.nudge_button * 6) + (self.padding_x * 2) - 5 self.small_button = (self.width - (self.padding_x * 2)) / 2 self.height = (self.text_height * 4) + (self.padding_y * 9) + (self.nudge_button * 2) + (self.button_height * 1) + 5 self.w = FloatingWindow((self.width, self.height), self.title) # position x = 0 y = self.padding_y self.w.spinner_pos = Spinner( (x, y), default='100', integer=True, label='pos') # delta y += self.w.spinner_pos.getPosSize()[3] self.w.spinner_delta = Spinner( (x, y), default='100', integer=True, label='delta') # axis x = self.padding_x y += self.w.spinner_delta.getPosSize()[3] self.w.axis_label = TextBox( (x, y, self.column1, self.text_height), "axis", sizeStyle=self.size_style) x = self.column1 self.w._axis = RadioGroup( (x, y, -self.padding_x, self.text_height), ["x", "y"], sizeStyle=self.size_style, isVertical=False) self.w._axis.set(self.axis) # apply buttons x = self.padding_x y += (self.text_height + self.padding_y) self.w.button_minus = SquareButton( (x, y, self.small_button + 1, self.button_height), '-', callback=self.shift_minus_callback) x += self.small_button self.w.button_plus = SquareButton( (x, y, self.small_button, self.button_height), '+', callback=self.shift_plus_callback) # switch sides x = self.padding_x y += (self.button_height + self.padding_y) self.w._side = CheckBox( (x, y, -self.padding_x, self.text_height), "invert side", value=False, sizeStyle=self.size_style) y += self.text_height self.w._layers = CheckBox( (x, y, -self.padding_x, self.text_height), "all layers", value=self.layers, sizeStyle=self.size_style) # open window self.w.open() # functions def _get_parameters(self): self.pos = int(self.w.spinner_pos.value.get()) self.delta = int(self.w.spinner_delta.value.get()) self.axis = self.w._axis.get() self.side = self.w._side.get() self.layers = self.w._layers.get() def shift_plus_callback(self, sender): self._get_parameters() self.shift_callback(mode=1) def shift_minus_callback(self, sender): self._get_parameters() self.shift_callback(mode=0) def shift_callback(self, mode): self.font = CurrentFont() if self.font is not None: glyph_names = get_glyphs(self.font) if len(glyph_names) > 0: _boolstring = [ 'False', 'True' ] _modes = [ 'minus', 'plus' ] _axes = [ 'x', 'y' ] # set delta value if mode == 1: _delta = self.delta else: _delta = -self.delta # set side if self.axis == 0: _sides = [ 'right', 'left' ] else: _sides = [ 'top', 'bottom' ] # print info print 'shifting points in glyphs...\n' print '\tposition: %s' % self.pos print '\tdelta: %s' % _delta print '\taxis: %s' % _axes[self.axis] print '\tmode: %s' % _modes[mode] print '\tside: %s' % _sides[self.side] print '\tlayers: %s' % _boolstring[self.layers] print print '\t', # transform for glyph_name in glyph_names: print glyph_name, # get glyph g = self.font[glyph_name] # shift y if self.axis: # all layers if self.layers: for layer_name in self.font.layerOrder: _g = g.getLayer(layer_name) _g.prepareUndo('shift points y') deselect_points(_g) select_points_y(_g, self.pos, side=_sides[self.side]) shift_selected_points_y(_g, _delta) _g.performUndo() _g.update() # active layer only else: g.prepareUndo('shift points y') deselect_points(g) select_points_y(g, self.pos, side=_sides[self.side]) shift_selected_points_y(g, _delta) g.performUndo() g.update() # shift x else: # all layers if self.layers: for layer_name in self.font.layerOrder: _g = g.getLayer(layer_name) _g.prepareUndo('shift points x') deselect_points(_g) select_points_x(_g, self.pos, side=_sides[self.side]) shift_selected_points_x(_g, _delta) _g.performUndo() _g.update() # active layer only else: g.prepareUndo('shift points x') deselect_points(g) select_points_x(g, self.pos, side=_sides[self.side]) shift_selected_points_x(g, _delta) g.performUndo() g.update() # done glyph # done self.font.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
print 'reflecting selected glyphs...\n' print '\t', for glyph_name in glyph_names: print glyph_name, # mirror all layers if self.layers: for layer_name in f.layerOrder: _g = f[glyph_name].getLayer(layer_name) self._mirror_glyph(_g, (scale_x, scale_y)) # mirror active layer only else: self._mirror_glyph(f[glyph_name], (scale_x, scale_y)) # done with glyph f[glyph_name].update() # done with font f.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open def _right_callback(self, sender): self._mirror_glyphs((-1, 1)) def _up_callback(self, sender): self._mirror_glyphs((1, -1))
class roundToGridDialog(hDialog): """A dialog to round features of the selected glyphs to a grid. .. image:: imgs/glyphs/gridfit.png """ # attributes gridsize = 125 glyph_names = [] b_points = True points = False margins = False glyph_width = True anchors = False layers = False # methods def __init__(self): self.title = 'gridfit' self.column_1 = 40 self.width = 123 self.height = self.button_height + self.nudge_button + ( self.text_height * 7) + (self.padding_y * 5) - 3 self.w = FloatingWindow((self.width, self.height), self.title) # grid size x = 0 y = self.padding_y self.w.spinner = Spinner((x, y), default='25', integer=True, label='grid') # apply button x = self.padding_x y += self.w.spinner.getPosSize()[3] self.w.button_apply = SquareButton( (x, y, -self.padding_x, self.button_height), "apply", callback=self.apply_callback, sizeStyle=self.size_style) # b-points y += (self.button_height + self.padding_y) self.w._b_points_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "bPoints", value=self.b_points, sizeStyle=self.size_style) # points y += self.text_height self.w._points_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "points", value=self.points, sizeStyle=self.size_style) # margins y += self.text_height self.w._margins_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "margins", value=self.margins, sizeStyle=self.size_style) # width y += self.text_height self.w._width_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "width", value=self.glyph_width, sizeStyle=self.size_style) # anchors y += self.text_height self.w._anchors_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "anchors", value=self.anchors, sizeStyle=self.size_style) # all layers y += self.text_height self.w._layers_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "all layers", value=self.layers, sizeStyle=self.size_style) # open self.w.open() # apply callback def gridfit(self, g, options): gridsize = options['gridsize'] # all layers if options['layers']: # align layers data _layers = self.font.layerOrder for layer_name in _layers: glyph = g.getLayer(layer_name) glyph.prepareUndo('align to grid') if options['bpoints']: round_bpoints(glyph, (gridsize, gridsize)) if options['points']: round_points(glyph, (gridsize, gridsize)) if options['anchors']: round_anchors(glyph, (gridsize, gridsize)) glyph.performUndo() # align metrics if options['margins']: round_margins(g, gridsize, left=True, right=True) if options['width']: round_width(g, gridsize) # active layers only else: g.prepareUndo('align to grid') if options['bpoints']: round_bpoints(g, (gridsize, gridsize)) if options['points']: round_points(g, (gridsize, gridsize)) if options['anchors']: round_anchors(g, (gridsize, gridsize)) if options['margins']: round_margins(g, gridsize, left=True, right=True) if options['width']: round_width(g, gridsize) g.performUndo() def apply_callback(self, sender): self.font = CurrentFont() if self.font is not None: glyph_names = get_glyphs(self.font) if len(glyph_names) > 0: print 'gridfitting glyphs...\n' # get options options = { 'bpoints': self.w._b_points_checkBox.get(), 'points': self.w._points_checkBox.get(), 'margins': self.w._margins_checkBox.get(), 'width': self.w._width_checkBox.get(), 'anchors': self.w._anchors_checkBox.get(), 'layers': self.w._layers_checkBox.get(), 'gridsize': int(self.w.spinner.value.get()) } # print info boolstring = [False, True] print '\tgrid size: %s' % options['gridsize'] print '\tbPoints: %s' % boolstring[options['bpoints']] print '\tpoints: %s' % boolstring[options['points']] print '\tmargins: %s' % boolstring[options['margins']] print '\twidth: %s' % boolstring[options['width']] print '\tanchors: %s' % boolstring[options['anchors']] print '\tlayers: %s' % boolstring[options['layers']] print print '\t', for glyph_name in glyph_names: print glyph_name, self.gridfit(self.font[glyph_name], options) # done self.font.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
class roundToGridDialog(hConstants): '''A dialog to round features of the selected glyphs to a grid.''' # attributes gridsize = 125 glyph_names = [] b_points = True points = False margins = False glyph_width = True anchors = False layers = False # methods def __init__(self): self.title = 'gridfit' self.column_1 = 40 self.width = 123 self.height = self.button_height + self.nudge_button + (self.text_height * 7) + (self.padding_y * 5) - 3 self.w = FloatingWindow( (self.width, self.height), self.title) # grid size x = self.padding_x y = self.padding_y # buttons self.w._gridsize_label = TextBox( (x, y, -self.padding_x, self.text_height), "grid", sizeStyle=self.size_style) x += self.column_1 self.w._gridsize_value = EditText( (x, y, -self.padding_x, self.text_height), text=self.gridsize, readOnly=self.read_only, sizeStyle=self.size_style) x = self.padding_x # nudge spinners y += (self.text_height + self.padding_y) self.w._nudge_minus_001 = SquareButton( (x, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self._nudge_minus_001_callback) x += (self.nudge_button - 1) self.w._nudge_plus_001 = SquareButton( (x, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self._nudge_plus_001_callback) x += (self.nudge_button - 1) self.w._nudge_minus_010 = SquareButton( (x, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self._nudge_minus_010_callback) x += (self.nudge_button - 1) self.w._nudge_plus_010 = SquareButton( (x, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self._nudge_plus_010_callback) x += (self.nudge_button - 1) self.w._nudge_minus_100 = SquareButton( (x, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self._nudge_minus_100_callback) x += (self.nudge_button - 1) self.w._nudge_plus_100 = SquareButton( (x, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self._nudge_plus_100_callback) # apply button x = self.padding_x y += (self.nudge_button + self.padding_y) self.w.button_apply = SquareButton( (x, y, -self.padding_x, self.button_height), "apply", callback=self.apply_callback, sizeStyle=self.size_style) # b-points y += (self.button_height + self.padding_y) self.w._b_points_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "bPoints", value=self.b_points, sizeStyle=self.size_style) # points y += self.text_height self.w._points_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "points", value=self.points, sizeStyle=self.size_style) # margins y += self.text_height self.w._margins_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "margins", value=self.margins, sizeStyle=self.size_style) # width y += self.text_height self.w._width_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "width", value=self.glyph_width, sizeStyle=self.size_style) # anchors y += self.text_height self.w._anchors_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "anchors", value=self.anchors, sizeStyle=self.size_style) # all layers y += self.text_height self.w._layers_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "all layers", value=self.layers, sizeStyle=self.size_style) # open self.w.open() # callbacks def _nudge_minus_001_callback(self, sender): _gridsize = int(self.w._gridsize_value.get()) - 1 if _gridsize >= 0: self.gridsize = _gridsize self.w._gridsize_value.set(self.gridsize) def _nudge_minus_010_callback(self, sender): _gridsize = int(self.w._gridsize_value.get()) - 10 if _gridsize >= 0: self.gridsize = _gridsize self.w._gridsize_value.set(self.gridsize) def _nudge_minus_100_callback(self, sender): _gridsize = int(self.w._gridsize_value.get()) - 100 if _gridsize >= 0: self.gridsize = _gridsize self.w._gridsize_value.set(self.gridsize) def _nudge_plus_001_callback(self, sender): self.gridsize = int(self.w._gridsize_value.get()) + 1 self.w._gridsize_value.set(self.gridsize) def _nudge_plus_010_callback(self, sender): self.gridsize = int(self.w._gridsize_value.get()) + 10 self.w._gridsize_value.set(self.gridsize) def _nudge_plus_100_callback(self, sender): self.gridsize = int(self.w._gridsize_value.get()) + 100 self.w._gridsize_value.set(self.gridsize) # apply callback def gridfit(self, g, options): gridsize = options['gridsize'] # all layers if options['layers']: # align layers data _layers = self.font.layerOrder for layer_name in _layers: glyph = g.getLayer(layer_name) glyph.prepareUndo('align to grid') if options['bpoints']: round_bpoints(glyph, (gridsize, gridsize)) if options['points']: round_points(glyph, (gridsize, gridsize)) if options['anchors']: round_anchors(glyph, (gridsize, gridsize)) glyph.performUndo() # align metrics if options['margins']: round_margins(g, gridsize, left=True, right=True) if options['width']: round_width(g, gridsize) # active layers only else: g.prepareUndo('align to grid') if options['bpoints']: round_bpoints(g, (gridsize, gridsize)) if options['points']: round_points(g, (gridsize, gridsize)) if options['anchors']: round_anchors(g, (gridsize, gridsize)) if options['margins']: round_margins(g, gridsize, left=True, right=True) if options['width']: round_width(g, gridsize) g.performUndo() def apply_callback(self, sender): self.font = CurrentFont() if self.font is not None: print 'gridfitting glyphs...\n' # get options boolstring = [ False, True ] params = { 'bpoints' : self.w._b_points_checkBox.get(), 'points' : self.w._points_checkBox.get(), 'margins' : self.w._margins_checkBox.get(), 'width' : self.w._width_checkBox.get(), 'anchors' : self.w._anchors_checkBox.get(), 'layers' : self.w._layers_checkBox.get(), 'gridsize' : int(self.w._gridsize_value.get()) } print '\tgrid size: %s' % params['gridsize'] print '\tbPoints: %s' % boolstring[params['bpoints']] print '\tpoints: %s' % boolstring[params['points']] print '\tmargins: %s' % boolstring[params['margins']] print '\twidth: %s' % boolstring[params['width']] print '\tanchors: %s' % boolstring[params['anchors']] print '\tlayers: %s' % boolstring[params['layers']] print print '\t', # align current glyph g = CurrentGlyph() if g is not None: print g.name, self.gridfit(g, params) # align selected glyphs else: for glyph_name in self.font.selection: print glyph_name, self.gridfit(self.font[glyph_name], params) # done self.font.update() print print '\n...done.\n' else: print no_font_open
class createSpaceGlyphsDialog(hDialog): """A dialog to create space glyphs in a font. .. image:: imgs/font/create-spaces.png """ hairspace_factor = .08 thinspace_factor = .16 thickspace_factor = .333 figurespace_factor = .6 def __init__(self): self.title = 'spaces' self.column_1 = 55 self.field_width = 40 self.box_height = 23 self.height = (self.text_height * 5) + (self.button_height * 1) + (self.padding_y * 8) + self.box_height + 4 self.w = FloatingWindow((self.width, self.height), self.title) # current font x = self.padding_x y = self.padding_y self.w.box = Box( (x, y, -self.padding_x, self.box_height)) self.w.box.font_name = TextBox( (5, 0, -self.padding_x, self.text_height), text='(None)', sizeStyle=self.size_style) # hair space y += self.text_height + 18 self.w.hairspace_label = TextBox( (x, y, self.column_1, self.text_height), "hair", sizeStyle=self.size_style) x += self.column_1 self.w.hairspace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # thin space x = self.padding_x y += self.text_height + self.padding_y self.w.thinspace_label = TextBox( (x, y, self.column_1, self.text_height), "thin", sizeStyle=self.size_style) x += self.column_1 self.w.thinspace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # thick space x = self.padding_x y += self.text_height + self.padding_y self.w.thickspace_label = TextBox( (x, y, self.column_1, self.text_height), "thick", sizeStyle=self.size_style) x += self.column_1 self.w.thickspace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # figure space x = self.padding_x y += self.text_height + self.padding_y self.w.figurespace_label = TextBox( (x, y, self.column_1, self.text_height), "figure", sizeStyle=self.size_style) x += self.column_1 self.w.figurespace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # zero width space x = self.padding_x y += self.text_height + self.padding_y self.w.zerowidth_label = TextBox( (x, y, self.column_1, self.text_height), "0 width", sizeStyle=self.size_style) x += self.column_1 self.w.zerowidth_value = EditText( (x, y, -self.padding_x, self.text_height), text='0', readOnly=self.read_only, sizeStyle=self.size_style) # buttons x = self.padding_x y += self.text_height + self.padding_y self.w.button_apply = SquareButton( (x, y, -self.padding_x, self.button_height), "create", sizeStyle=self.size_style, callback=self.apply_callback) # bind self.w.bind("became key", self.update_callback) self.w.bind("close", self.on_close_window) # observers addObserver(self, "update_callback", "fontDidOpen") addObserver(self, "update_callback", "fontDidClose") # open window self.w.open() # get current font self.get_font() def get_font(self): self.font = CurrentFont() if self.font is not None: self.w.box.font_name.set(get_full_name(self.font)) self.w.hairspace_value.set(int(self.font.info.unitsPerEm * self.hairspace_factor)) self.w.thickspace_value.set(int(self.font.info.unitsPerEm * self.thickspace_factor)) self.w.thinspace_value.set(int(self.font.info.unitsPerEm * self.thinspace_factor)) self.w.figurespace_value.set(int(self.font.info.unitsPerEm * self.figurespace_factor)) else: self.w.box.font_name.set('(None)') self.w.hairspace_value.set('') self.w.thickspace_value.set('') self.w.thinspace_value.set('') self.w.figurespace_value.set('') print no_font_open def apply_callback(self, sender): hairspace = int(self.w.hairspace_value.get()) thinspace = int(self.w.thinspace_value.get()) thickspace = int(self.w.thickspace_value.get()) figurespace = int(self.w.figurespace_value.get()) # boolstring = (False, True) if self.font is not None: # print info print 'creating space glyphs...\n' print '\thair space: %s units' % hairspace print '\tthin space: %s units' % thinspace print '\tthick space: %s units' % thickspace print '\tfigure space: %s units' % figurespace print '\tzero-width space: 0' # hair space self.font.newGlyph('hairspace') self.font['hairspace'].width = hairspace self.font['hairspace'].unicode = unicode_hexstr_to_int('uni200A') self.font['hairspace'].update() # thin space self.font.newGlyph('thinspace') self.font['thinspace'].width = thinspace self.font['thinspace'].unicode = unicode_hexstr_to_int('uni2009') self.font['thinspace'].update() # thick space self.font.newGlyph('thickspace') self.font['thickspace'].width = thickspace self.font['thickspace'].unicode = unicode_hexstr_to_int('uni2004') self.font['thickspace'].update() # figure space self.font.newGlyph('figurespace') self.font['figurespace'].width = figurespace self.font['figurespace'].unicode = unicode_hexstr_to_int('uni2007') self.font['figurespace'].update() # zero-width space self.font.newGlyph('zerowidthspace') self.font['zerowidthspace'].width = 0 self.font['zerowidthspace'].unicode = unicode_hexstr_to_int('uni200B') self.font['zerowidthspace'].update() # done self.font.update() print print '...done.\n' else: print no_font_open def update_callback(self, sender): self.get_font() def on_close_window(self, sender): removeObserver(self, "fontDidOpen") removeObserver(self, "fontDidClose")
class deleteLayerDialog(hDialog): """A dialog to delete a layer in a font. .. image:: imgs/font/delete-layer.png """ # attributes #: The font which is currently selected. font = None #: A list of all layers in the current font. layers = [] # methods def __init__(self): self.get_font() # window self.title = 'delete layers' self.height = self.button_height + (self.padding_y * 3) + (self.text_height * 8) self.w = FloatingWindow((self.width * 1.5, self.height), self.title) x = self.padding_x y = self.padding_y self.w.layers = List((x, y, -self.padding_x, self.text_height * 8), self.layers) y += self.padding_y + self.text_height * 8 self.w.button_apply = SquareButton( (x, y, -self.padding_x, self.button_height), "delete", sizeStyle=self.size_style, callback=self.apply_callback) # bind self.w.bind("became key", self.update_callback) self.w.bind("close", self.on_close_window) # observers addObserver(self, "update_callback", "fontBecameCurrent") # open self.w.open() # callbacks def get_font(self): self.font = CurrentFont() if self.font is not None: self.layers = self.font.layerOrder else: self.layers = [] def update_ui(self): self.layers = self.font.layerOrder self.w.layers.set(self.layers) def update_callback(self, sender): self.get_font() self.update_ui() def apply_callback(self, sender): # no font open if self.font is None: print(no_font_open) # delete layer else: layers_index = self.w.layers.getSelection() layers = [self.layers[i] for i in layers_index] if len(layers): print('deleting layers...\n') for layer in layers: if layer in self.font.layerOrder: print('\tdeleting %s...' % layer) self.font.removeLayer(layer) self.font.update() print() print('...done.\n') # update UI self.get_font() self.update_ui() else: print('no layer selected.') def on_close_window(self, sender): removeObserver(self, "fontBecameCurrent")
def apply_callback(self, sender): # get font f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) if len(glyph_names) > 0: boolstring = [False, True] # get parameters self.old_suffix = self.w.old_suffix_value.get() self.new_suffix = self.w.new_suffix_value.get() self.overwrite = self.w.overwrite_checkbox.get() # print info print('changing glyph name suffixes...\n') print('\told suffix: %s' % (self.old_suffix)) print('\tnew suffix: %s' % (self.new_suffix)) print('\toverwrite: %s' % boolstring[self.overwrite]) print() # batch change glyph names for glyph_name in glyph_names: g = f[glyph_name] # get glyphs with matching suffix if has_suffix(g, self.old_suffix): # switch suffixes : one.osf -> one.onum if len(self.old_suffix) > 0 and len( self.new_suffix) > 0: new_name = change_suffix(g, self.old_suffix, self.new_suffix) # remove suffix : one.osf -> one elif len(self.old_suffix) > 0 and len( self.new_suffix) == 0: new_name = change_suffix(g, self.old_suffix, None) # add suffix : one -> one.onum elif len(self.old_suffix) == 0 and len( self.new_suffix) > 0: new_name = '%s.%s' % (glyph_name, self.new_suffix) else: new_name = glyph_name # new name not in font (rename) if new_name != glyph_name: if new_name not in f: print('\trenaming %s to %s...' % (glyph_name, new_name)) g.name = new_name # new name in font else: # overwrite if self._overwrite: print("\toverwriting '%s' with '%s'" % (new_name, glyph_name)) f.removeGlyph(_new_name) f.update() g.name = new_name g.update() # do not overwrite else: print( "\t'%s' already exists in font, skipping '%s'" % (new_name, glyph_name)) # glyph does not have suffix else: pass # done glyph # done font f.update() print() print('...done.\n') # no glyph selected else: print(no_glyph_selected) # no font open else: print(no_font_open) pass
class GlyphMorf(BaseWindowController): def __init__(self): self.font = CurrentFont() if not self.font: print "Open a font, and try again." return self.prepareFont(self.font) self.w = FloatingWindow((250, 390), "GlyphMorf", closable=True) smax = 61 y = 2 self.w.recipeTitle = TextBox((2, y, -0, 15), "recipe:", sizeStyle='mini') y += 15 self.w.recipe = PopUpButton((10, y, -10, 22), self.font.lib['morf']['recipes'], callback=self.recipeCallback) y += 30 self.w.newRecipe = SquareButton((10, y, 30, 30), u"🌟", callback=self.newRecipe) self.w.delRecipe = SquareButton((50, y, 30, 30), u"⛔", callback=self.delRecipe) self.w.default = SquareButton((90, y, 30, 30), u"🔹", callback=self.setDefaultRecipe) self.w.getDefault = SquareButton( (130, y, 30, 30), u"⚡", callback=self.setDefaultValuesToSliders) #self.w.setFontAsRecipe = SquareButton((170,y,30,15), u"🔺", callback=self.getUFO4Recipe) #self.w.delFontAsRecipe = SquareButton((170,y+15,30,15), u"🔻", callback=self.delUFO4Recipe) self.w.setIndiValue = SquareButton((170, y, 30, 30), u"▪️", callback=self.setIndiValues) self.w.delIndiValue = SquareButton((-40, y, 30, 30), u"▫️", callback=self.delIndiRecipe) y += 50 self.w.widthTitle = TextBox((2, y, -0, 15), "width by:", sizeStyle='mini') y += 15 self.w.width = Slider((2, y, -50, 22), minValue=0, maxValue=2, value=1, callback=self.update, tickMarkCount=smax, stopOnTickMarks=True) self.w.widthRead = TextBox((-40, y, -2, 22), self.w.width.get()) y += 30 self.w.heightTitle = TextBox((2, y, -0, 15), "height by:", sizeStyle='mini') y += 15 self.w.height = Slider((2, y, -50, 22), minValue=0, maxValue=2, value=1, callback=self.update, tickMarkCount=smax, stopOnTickMarks=True) self.w.heightRead = TextBox((-40, y, -2, 22), self.w.height.get()) y += 30 self.w.weightTitle = TextBox((2, y, -0, 15), "weight by: (x,y)", sizeStyle='mini') y += 15 self.w.weightx = Slider((2, y, -50, 22), minValue=0, maxValue=2, value=1, callback=self.update, tickMarkCount=smax, stopOnTickMarks=True) self.w.weightxRead = TextBox((-40, y, -2, 22), self.w.weightx.get()) y += 30 self.w.weighty = Slider((2, y, -50, 22), minValue=0, maxValue=2, value=1, callback=self.update, tickMarkCount=smax, stopOnTickMarks=True) self.w.weightyRead = TextBox((-40, y, -2, 22), self.w.weighty.get()) y += 30 self.w.centerTitle = TextBox((2, y, -0, 15), "center factor:", sizeStyle='mini') y += 15 self.w.centerr = Slider((2, y, -50, 22), minValue=0, maxValue=1, value=.5, callback=self.update, tickMarkCount=41, stopOnTickMarks=True) self.w.centerRead = TextBox((-40, y, -2, 22), self.w.centerr.get()) # self.w.colorFill = ColorWell((7,7,-7,23), callback = self.changeColor) # self.w.colorFill.set(NSColor.colorWithCalibratedRed_green_blue_alpha_(*self.fillColor)) y += 30 self.w.onOff = CheckBox( (10, y, 100, 22), "on/off", value=1, callback=self.update, ) # self.w.rec = CheckBox((120,y,-10,22),"rec", value=0) y += 40 self.w.makeDSD = SquareButton((10, y, 40, 30), u"""DSD""", sizeStyle='mini', callback=self._makeDSD) self.w.getMorfFont = SquareButton((60, y, 40, 30), u"""get\nfont""", sizeStyle='mini', callback=self.getMorfFont) addObserver(self, "mainFunction", event) addObserver(self, "glyphChanged", "currentGlyphChanged") self.setUpBaseWindowBehavior() self.w.open() self.updateView(None) #self.hasLib() # def hasLib(self): # if 'morf' in self.font.lib.keys(): # if 'recipes' in self.font.lib['morf'].keys(): # self.w.recipe.setItems(self.font.lib['morf']['recipes']) # return True # else: # self.w.recipe.setItems([]) # else: # self.w.recipe.setItems([]) def getUfo(self, sinder): ufoPath = getFile()[0] self.ufo = OpenFont(ufoPath, showUI=False) PostNotification('doodle.updateGlyphView') def changes(self, sender): PostNotification('doodle.updateGlyphView') def windowCloseCallback(self, sender): self.w.hide() removeObserver(self, event) removeObserver(self, "currentGlyphChanged") PostNotification('doodle.updateGlyphView') def _close(self, sender): self.w.hide() removeObserver(self, event) removeObserver(self, "currentGlyphChanged") PostNotification('doodle.updateGlyphView') def mainFunction(self, info): if info['glyph']: # self.prepareFont(info) #if not getExtensionDefault(settingsWindow): # self.settingsWindow(onOff=True) #self.w = getExtensionDefault(settingsWindow) g = info['glyph'] if 1: #self.w.onOff.get(): if not len(self.font.lib['morf']['recipes'].keys()): self.currentRecipe = None else: self.currentRecipe = self.font.lib['morf']['recipes'].keys( )[self.w.recipe.get()] ### #glyphStruc = getStrucGlyph(g, self.w.centerr.get()) #glyphPath = getMorfGlyphAsPath(glyphStruc, (self.w.weightx.get(), self.w.weighty.get()), self.w.width.get(), self.w.height.get()) glyphPath = GetMorfGlyph(g, self.w.centerr.get(), self.w.weightx.get(), self.w.weighty.get(), self.w.width.get(), self.w.height.get()).path badTypes = [type(""), type(None)] if type(glyphPath) not in badTypes: self.drawMorf(g, glyphPath) else: self.drawError(g) self.widthBy = self.w.width.get() self.heightBy = self.w.height.get() self.weigtByX = self.w.weightx.get() self.weigtByY = self.w.weighty.get() self.factor = self.w.centerr.get() # if 'morf' in g.lib: # if self.currentRecipe in g.lib['morf'].keys(): # l = g.lib['morf'][self.currentRecipe] # self.widthByMem = l['widthBy'] # if 'heightBy' in l.keys(): # self.heightByMem = l['heightBy'] # else: # self.heightByMem = 1 # self.weigtByMen = l['weightBy'] # self.factorMem = l['factor'] # prep glyph def setIndiValues(self, sender): self.roundValues() g = CurrentGlyph() if 'morf' not in g.lib.keys(): g.lib['morf'] = {} g.lib['morf'][self.currentRecipe] = {} l = g.lib['morf'][self.currentRecipe] l['widthBy'] = self.width l['heightBy'] = self.height l['weightByX'] = self.weightx l['weightByY'] = self.weighty l['factor'] = self.factor def drawMorf(self, g, path): if self.w.onOff.get(): save() translate(g.width, 0) fill(0) #stroke(1,0,0) q = RGlyph() writePathInGlyph(path, q) drawGlyph(q) restore() def drawError(self, g): if self.w.onOff.get(): save() translate(g.width, 0) fill(1, 0, 0) font("Verdana-Bold", 100) text("X", ( 30, 30, )) restore() def getDefaultValues(self): if self.w.recipe.get() != -1: self.currentRecipe = self.font.lib['morf']['recipes'].keys()[ self.w.recipe.get()] defValDict = self.font.lib['morf']['recipes'][ self.currentRecipe]['default'] self.widthBy = defValDict['widthBy'] self.heightBy = defValDict['heightBy'] self.weightByX = defValDict['weightByX'] self.weightByY = defValDict['weightByY'] self.factor = defValDict['factor'] def setDefaultValuesToSliders(self, sender): self.getDefaultValues() self.w.width.set(self.widthBy) self.w.height.set(self.heightBy) self.w.weightx.set(self.weightByX) self.w.weighty.set(self.weightByY) self.w.centerr.set(self.factor) self.update(None) self.updateView(None) def setDefaultRecipe(self, sender): self.roundValues() self.currentRecipe = self.font.lib['morf']['recipes'].keys()[ self.w.recipe.get()] l = self.font.lib['morf']['recipes'][self.currentRecipe]['default'] l['widthBy'] = self.width l['heightBy'] = self.height l['weightByX'] = self.weightx l['weightByY'] = self.weighty l['factor'] = self.factor def newRecipe(self, sender): self.sheet = Sheet((200, 70), self.w) self.sheet.et = EditText((10, 10, -10, 22), callback=self.checkValidNewRecipe) self.sheet.ok = SquareButton((10, 40, -10, 22), "ok", callback=self.makeRecipe) self.sheet.open() def checkValidNewRecipe(self, sender): if self.sheet.et.get() not in self.font.lib['morf']['recipes'].keys(): return True else: return False def makeRecipe(self, sender): if self.checkValidNewRecipe(None): self.font.lib['morf']['recipes'][str(self.sheet.et.get())] = { 'default': { 'widthBy': 1, 'heightBy': 1, 'weightByX': 1, 'weightByY': 1, 'factor': .5, } } self.w.recipe.setItems(self.font.lib['morf']['recipes'].keys()) # set new rec as cur self.w.recipe.set(self.w.recipe.getItems().index( str(self.sheet.et.get()))) self.sheet.close() def delRecipe(self, sender): self.currentRecipe = self.font.lib['morf']['recipes'].keys()[ self.w.recipe.get()] answer = askYesNo(messageText="Really want to DELETE recipe: %s" % self.currentRecipe, informativeText="No undo here!") if answer: #pass del self.font.lib['morf']['recipes'][self.currentRecipe] self.font.update() for g in self.font: if 'morf' in g.lib.keys(): for k in g.lib['morf'].keys(): if k == self.currentRecipe: del g.lib['morf'][k] g.update() self.w.recipe.setItems(self.font.lib['morf']['recipes'].keys()) self.mainFunction({"glyph": CurrentGlyph()}) def getUFO4Recipe(self, sender): self.currentRecipe = self.font.lib['morf']['recipes'].keys()[ self.w.recipe.get()] self.sheet = Sheet((300, 100), self.w) self.sheet.recipe = TextBox((10, 10, -10, 13), self.currentRecipe) self.sheet.et = EditText((10, 35, -10, 22)) self.sheet.ok = SquareButton((10, 65, -40, 22), "set ufo", callback=self.setUFO2Recipe) self.sheet.cancel = SquareButton((-30, 65, -10, 22), "x", callback=self.setUFO2RecipeCancel) self.sheet.open() # self.ufo = getFile(messageText="Where is that ufo?", title="UFO as recipe", directory=None, fileTypes=['ufo'], parentWindow=self.w, resultCallback=self.setUFO2Recipe) #self.font.lib['morf']['recipes'][self.currentRecipe]['ufo'] = "" def setUFO2Recipe(self, sender): self.font.lib['morf']['recipes'][ self.currentRecipe]['ufo'] = self.sheet.et.get() self.sheet.close() def setUFO2RecipeCancel(self, sender): self.sheet.close() def delUFO4Recipe(self, sender): del self.font.lib['morf']['recipes'][self.currentRecipe]['ufo'] def delIndiRecipe(self, sender): self.w.rec.set(False) if self.currentRecipe in self.glyph.lib['morf'].keys(): del self.glyph.lib['morf'][self.currentRecipe] self.updateView(None) def recipeCallback(self, sender): if not len(self.font.lib['morf']['recipes'].keys()): self.currentRecipe = None else: self.setDefaultValuesToSliders(None) self.update(None) def roundValues(self): self.width = (round(self.w.width.get(), 2)) self.height = (round(self.w.height.get(), 2)) self.weightx = (round(self.w.weightx.get(), 2)) self.weighty = (round(self.w.weighty.get(), 2)) self.factor = (round(self.w.centerr.get(), 2)) def update(self, sender): self.roundValues() self.w.widthRead.set(self.width) self.w.heightRead.set(self.height) self.w.weightxRead.set(self.weightx) self.w.weightyRead.set(self.weighty) self.w.centerRead.set(self.factor) self.updateView(None) def _makeDSD(self, sender): f = CurrentFont() if 'morf' in f.lib.keys(): if 'recipes' in f.lib['morf'].keys(): #pass MakeDSD(f, f.lib['morf']['recipes'].keys()) def getMorfFont(self, sender): f = CurrentFont() self.font = f self.currentRecipe = self.font.lib['morf']['recipes'].keys()[ self.w.recipe.get()] recipe = self.currentRecipe nf = f.copy() nf.info.styleName = self.currentRecipe glyphs = f.keys() for gn in glyphs: g = f[gn] #if 1: if 'morf' in g.lib.keys() and recipe in g.lib['morf'].keys(): self.widthBy = g.lib['morf'][recipe]['widthBy'] self.heightBy = g.lib['morf'][recipe]['heightBy'] self.factor = g.lib['morf'][recipe]['factor'] self.weightByX = g.lib['morf'][recipe]['weightByX'] self.weightByY = g.lib['morf'][recipe]['weightByY'] else: self.getDefaultValues() # self.getDefaultValues() path = GetMorfGlyph(g, self.factor, self.weightByX, self.weightByY, self.widthBy, self.heightBy).path if path and type(path) != type(""): # print g nf.newGlyph(g.name) nf[g.name].width = g.width * self.widthBy writePathInGlyph(path, nf[g.name]) nf[g.name].round() else: continue nf.showUI() def updateView(self, sender): PostNotification('doodle.updateGlyphView') def prepareFont(self, curfont): """ make 'morf' in lib and make first 'Neutral' recipe """ if 'morf' not in self.font.lib: self.font.lib['morf'] = {} if 'recipes' not in self.font.lib['morf'].keys(): self.font.lib['morf']['recipes'] = { } #dict {"RecName":{defaultValues}} self.font.lib['morf']['recipes']["Neutral"] = { 'default': { 'widthBy': 1, 'heightBy': 1, 'weightByX': 1, 'weightByY': 1, 'factor': .5, } } def glyphChanged(self, info): #self.mainFunction(info) g = info['glyph'] self.glyph = info['glyph'] self.prepareFont(info) if hasattr(self, 'w'): if not len(self.font.lib['morf']['recipes'].keys()): self.currentRecipe = None else: self.currentRecipe = self.font.lib['morf']['recipes'].keys()[ self.w.recipe.get()] self.widthByMem = self.w.width.get() self.heightByMem = self.w.height.get() self.weigtByXMem = self.w.weightx.get() self.weigtByYMem = self.w.weighty.get() self.factorMem = self.w.centerr.get() indi = False if 'morf' in g.lib.keys(): if self.currentRecipe in g.lib['morf'].keys(): l = g.lib['morf'][self.currentRecipe] self.widthByMem = l['widthBy'] if 'heightBy' in l.keys(): self.heightByMem = l['heightBy'] else: self.heightByMem = 1 self.weigtByXMem = l['weightByX'] self.weigtByYMem = l['weightByY'] self.factorMem = l['factor'] indi = True self.w.width.set(self.widthByMem) self.w.height.set(self.heightByMem) self.w.weightx.set(self.weigtByXMem) self.w.weighty.set(self.weigtByYMem) self.w.centerr.set(self.factorMem) if not indi: self.setDefaultValuesToSliders(None) self.update(None)
class roundToGridDialog(hDialog): """A dialog to round features of the selected glyphs to a grid. .. image:: imgs/glyphs/gridfit.png """ # attributes gridsize = 125 glyph_names = [] b_points = True points = False margins = False glyph_width = True anchors = False layers = False # methods def __init__(self): self.title = 'gridfit' self.column_1 = 40 self.width = 123 self.height = self.button_height + self.nudge_button + (self.text_height * 7) + (self.padding_y * 5) - 3 self.w = FloatingWindow((self.width, self.height), self.title) # grid size x = 0 y = self.padding_y self.w.spinner = Spinner( (x, y), default='25', integer=True, label='grid') # apply button x = self.padding_x y += self.w.spinner.getPosSize()[3] self.w.button_apply = SquareButton( (x, y, -self.padding_x, self.button_height), "apply", callback=self.apply_callback, sizeStyle=self.size_style) # b-points y += (self.button_height + self.padding_y) self.w._b_points_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "bPoints", value=self.b_points, sizeStyle=self.size_style) # points y += self.text_height self.w._points_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "points", value=self.points, sizeStyle=self.size_style) # margins y += self.text_height self.w._margins_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "margins", value=self.margins, sizeStyle=self.size_style) # width y += self.text_height self.w._width_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "width", value=self.glyph_width, sizeStyle=self.size_style) # anchors y += self.text_height self.w._anchors_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "anchors", value=self.anchors, sizeStyle=self.size_style) # all layers y += self.text_height self.w._layers_checkBox = CheckBox( (x, y, -self.padding_x, self.text_height), "all layers", value=self.layers, sizeStyle=self.size_style) # open self.w.open() # apply callback def gridfit(self, g, options): gridsize = options['gridsize'] # all layers if options['layers']: # align layers data _layers = self.font.layerOrder for layer_name in _layers: glyph = g.getLayer(layer_name) glyph.prepareUndo('align to grid') if options['bpoints']: round_bpoints(glyph, (gridsize, gridsize)) if options['points']: round_points(glyph, (gridsize, gridsize)) if options['anchors']: round_anchors(glyph, (gridsize, gridsize)) glyph.performUndo() # align metrics if options['margins']: round_margins(g, gridsize, left=True, right=True) if options['width']: round_width(g, gridsize) # active layers only else: g.prepareUndo('align to grid') if options['bpoints']: round_bpoints(g, (gridsize, gridsize)) if options['points']: round_points(g, (gridsize, gridsize)) if options['anchors']: round_anchors(g, (gridsize, gridsize)) if options['margins']: round_margins(g, gridsize, left=True, right=True) if options['width']: round_width(g, gridsize) g.performUndo() def apply_callback(self, sender): self.font = CurrentFont() if self.font is not None: glyph_names = get_glyphs(self.font) if len(glyph_names) > 0: print 'gridfitting glyphs...\n' # get options options = { 'bpoints' : self.w._b_points_checkBox.get(), 'points' : self.w._points_checkBox.get(), 'margins' : self.w._margins_checkBox.get(), 'width' : self.w._width_checkBox.get(), 'anchors' : self.w._anchors_checkBox.get(), 'layers' : self.w._layers_checkBox.get(), 'gridsize' : int(self.w.spinner.value.get()) } # print info boolstring = [ False, True ] print '\tgrid size: %s' % options['gridsize'] print '\tbPoints: %s' % boolstring[options['bpoints']] print '\tpoints: %s' % boolstring[options['points']] print '\tmargins: %s' % boolstring[options['margins']] print '\twidth: %s' % boolstring[options['width']] print '\tanchors: %s' % boolstring[options['anchors']] print '\tlayers: %s' % boolstring[options['layers']] print print '\t', for glyph_name in glyph_names: print glyph_name, self.gridfit(self.font[glyph_name], options) # done self.font.update() print print '\n...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open
class adjustVerticalMetrics(hDialog): """A dialog to adjust the vertical metrics in the font with the help of sliders and nudge buttons. .. image:: imgs/font/adjust-vmetrics.png """ ascender_min = 1 capheight_min = 1 xheight_min = 1 descender_min = 1 column_1 = 80 column_2 = 200 column_3 = 45 moveX = 0 moveY = 0 def __init__(self): self.title = "vertical metrics" self.box_width = 60 self.width = self.column_1 + self.column_2 + self.column_3 + (self.padding_x * 3) + (self.nudge_button * 4) + 2 self.height = self.text_height + (self.nudge_button * 4) + (self.padding_y * 6) self.font = CurrentFont() if self.font is not None: self.w = FloatingWindow((self.width, self.height), self.title) # get font vmetrics units_per_em = self.font.info.unitsPerEm ascender = self.font.info.ascender capheight = self.font.info.capHeight xheight = self.font.info.xHeight descender = abs(self.font.info.descender) # set max vmetrics self.ascender_max = units_per_em self.capheight_max = units_per_em self.xheight_max = units_per_em self.descender_max = units_per_em # make button alignments x1 = self.padding_x x2 = x1 + self.column_1 x3 = x2 + self.column_2 + 15 x4 = x3 + self.column_3 - 1 x5 = x4 + self.nudge_button - 1 x6 = x5 + self.nudge_button - 1 x7 = x6 + self.nudge_button - 1 y = self.padding_y self.w.box = Box( (x1, y, self.column_1 + self.column_2, self.text_height)) self.w.box.text = TextBox( (5, 0, -self.padding_x, self.text_height), get_full_name(self.font), sizeStyle=self.size_style) self.w.font_switch = SquareButton( (x3, y, -self.padding_x, self.text_height), 'update', sizeStyle=self.size_style, callback=self.update_font_callback) y += self.text_height + self.padding_y # ascender self.w.ascender_label = TextBox( (x1, y, self.column_1, self.nudge_button), "ascender", sizeStyle=self.size_style) self.w.ascender_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.ascender_min, maxValue=self.ascender_max, value=ascender, callback=self.ascender_slider_callback, sizeStyle=self.size_style) self.w.ascender_value = EditText( (x3, y, self.column_3, self.nudge_button), ascender, callback=self.ascender_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.ascender_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.ascender_minus_01_callback) self.w.ascender_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.ascender_plus_01_callback) self.w.ascender_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.ascender_minus_10_callback) self.w.ascender_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.ascender_plus_10_callback) y += self.nudge_button + self.padding_y # capheight self.w.capheight_label = TextBox( (x1, y, self.column_1, self.nudge_button), "cap-height", sizeStyle=self.size_style) self.w.capheight_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.capheight_min, maxValue=self.capheight_max, value=capheight, callback=self.capheight_slider_callback, sizeStyle=self.size_style) self.w.capheight_value = EditText( (x3, y, self.column_3, self.nudge_button), capheight, callback=self.capheight_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.capheight_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.capheight_minus_01_callback) self.w.capheight_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.capheight_plus_01_callback) self.w.capheight_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.capheight_minus_10_callback) self.w.capheight_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.capheight_plus_10_callback) y += self.nudge_button + self.padding_y # xheight self.w.xheight_label = TextBox( (x1, y, self.column_1, self.nudge_button), "x-height", sizeStyle=self.size_style) self.w.xheight_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.xheight_min, maxValue=self.xheight_max, value=xheight, callback=self.xheight_slider_callback, sizeStyle=self.size_style) self.w.xheight_value = EditText( (x3, y, self.column_3, self.nudge_button), xheight, callback=self.xheight_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.xheight_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.xheight_minus_01_callback) self.w.xheight_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.xheight_plus_01_callback) self.w.xheight_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.xheight_minus_10_callback) self.w.xheight_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.xheight_plus_10_callback) y += self.nudge_button + self.padding_y # descender self.w.descender_label = TextBox( (x1, y, self.column_1, self.nudge_button), "descender", sizeStyle=self.size_style) self.w.descender_slider = Slider( (x2, y - 5, self.column_2, self.nudge_button), minValue=self.descender_min, maxValue=self.descender_max, value=descender, callback=self.descender_slider_callback, sizeStyle=self.size_style) self.w.descender_value = EditText( (x3, y, self.column_3, self.nudge_button), descender, callback=self.descender_value_callback, sizeStyle=self.size_style, readOnly=self.read_only) self.w.descender_minus_01 = SquareButton( (x4, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.descender_minus_01_callback) self.w.descender_plus_01 = SquareButton( (x5, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.descender_plus_01_callback) self.w.descender_minus_10 = SquareButton( (x6, y, self.nudge_button, self.nudge_button), '-', sizeStyle=self.size_style, callback=self.descender_minus_10_callback) self.w.descender_plus_10 = SquareButton( (x7, y, self.nudge_button, self.nudge_button), '+', sizeStyle=self.size_style, callback=self.descender_plus_10_callback) # open window self.w.open() else: print(no_font_open) # updates def xheight_update(self, value): self.w.xheight_value.set(value) self.w.xheight_slider.set(value) self.font.info.xHeight = value self.font.update() def capheight_update(self, value): self.w.capheight_value.set(value) self.w.capheight_slider.set(value) self.font.info.capHeight = value self.font.update() def descender_update(self, value): self.w.descender_value.set(abs(value)) self.w.descender_slider.set(abs(value)) self.font.info.descender = -abs(value) self.font.update() def ascender_update(self, value): self.w.ascender_value.set(value) self.w.ascender_slider.set(value) self.font.info.ascender = value self.font.update() # buttons def update_font_callback(self, sender): self.font = CurrentFont() self.w.box.text.set(get_full_name(self.font)) # xheight def xheight_minus_01_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) - 1 self.xheight_update(value) def xheight_plus_01_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) + 1 self.xheight_update(value) def xheight_minus_10_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) - 10 self.xheight_update(value) def xheight_plus_10_callback(self, sender): value = float(self.w.xheight_value.get()) value = int(value) + 10 self.xheight_update(value) # capheight def capheight_minus_01_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) - 1 self.capheight_update(value) def capheight_plus_01_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) + 1 self.capheight_update(value) def capheight_minus_10_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) - 10 self.capheight_update(value) def capheight_plus_10_callback(self, sender): value = float(self.w.capheight_value.get()) value = int(value) + 10 self.capheight_update(value) # ascender def ascender_minus_01_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) - 1 self.ascender_update(value) def ascender_plus_01_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) + 1 self.ascender_update(value) def ascender_minus_10_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) - 10 self.ascender_update(value) def ascender_plus_10_callback(self, sender): value = float(self.w.ascender_value.get()) value = int(value) + 10 self.ascender_update(value) # descender def descender_minus_01_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) - 1 self.descender_update(-value) def descender_plus_01_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) + 1 self.descender_update(-value) def descender_minus_10_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) - 10 self.descender_update(-value) def descender_plus_10_callback(self, sender): value = float(self.w.descender_value.get()) value = abs(int(value)) + 10 self.descender_update(-value) # sliders def xheight_slider_callback(self, sender): _xheight_value = int(self.w.xheight_slider.get()) # print 'xheight: %s' % _xheight_value self.w.xheight_value.set(_xheight_value) self.font.info.xHeight = _xheight_value self.font.update() def capheight_slider_callback(self, sender): _capheight_value = int(self.w.capheight_slider.get()) # print 'capheight: %s' % _capheight_value self.w.capheight_value.set(_capheight_value) self.font.info.capHeight = _capheight_value self.font.update() def descender_slider_callback(self, sender): _descender_value = int(self.w.descender_slider.get()) # print 'descender: %s' % _descender_value self.w.descender_value.set(abs(_descender_value)) self.font.info.descender = -abs(_descender_value) self.font.update() def ascender_slider_callback(self, sender): _ascender_value = int(self.w.ascender_slider.get()) # print 'ascender: %s' % _ascender_value self.w.ascender_value.set(_ascender_value) self.font.info.ascender = _ascender_value self.font.update() # values def xheight_value_callback(self, sender): _xheight_value = int(sender.get()) # print 'xheight: %s' % _xheight_value self.w.xheight_slider.set(_xheight_value) self.font.info.xHeight = _xheight_value self.font.update() def capheight_value_callback(self, sender): _capheight_value = int(sender.get()) # print 'capheight: %s' % _capheight_value self.w.capheight_slider.set(_capheight_value) self.font.info.capHeight = _capheight_value self.font.update() def ascender_value_callback(self, sender): _ascender_value = int(sender.get()) # print 'ascender: %s' % _ascender_value self.w.ascender_slider.set(_ascender_value) self.font.info.ascender = _ascender_value self.font.update() def descender_value_callback(self, sender): _descender_value = int(sender.get()) # print 'descender: %s' % _descender_value self.w.descender_slider.set(_descender_value) self.font.info.descender = - _descender_value self.font.update()
def apply_callback(self, sender): # get font f = CurrentFont() if f is not None: glyph_names = get_glyphs(f) if len(glyph_names) > 0: boolstring = [ False, True ] # get parameters self.old_suffix = self.w.old_suffix_value.get() self.new_suffix = self.w.new_suffix_value.get() self.overwrite = self.w.overwrite_checkbox.get() # print info print 'changing glyph name suffixes...\n' print '\told suffix: %s' % (self.old_suffix) print '\tnew suffix: %s' % (self.new_suffix) print '\toverwrite: %s' % boolstring[self.overwrite] print # batch change glyph names for glyph_name in glyph_names: g = f[glyph_name] # get glyphs with matching suffix if has_suffix(g, self.old_suffix): # switch suffixes : one.osf -> one.onum if len(self.old_suffix) > 0 and len(self.new_suffix) > 0: new_name = change_suffix(g, self.old_suffix, self.new_suffix) # remove suffix : one.osf -> one elif len(self.old_suffix) > 0 and len(self.new_suffix) == 0: new_name = change_suffix(g, self.old_suffix, None) # add suffix : one -> one.onum elif len(self.old_suffix) == 0 and len(self.new_suffix) > 0: new_name = '%s.%s' % (glyph_name, self.new_suffix) else: new_name = glyph_name # new name not in font (rename) if new_name != glyph_name: if not f.has_key(new_name): print '\trenaming %s to %s...' % (glyph_name, new_name) g.name = new_name # new name in font else: # overwrite if self._overwrite: print "\toverwriting '%s' with '%s'" % (new_name, glyph_name) f.removeGlyph(_new_name) f.update() g.name = new_name g.update() # do not overwrite else: print "\t'%s' already exists in font, skipping '%s'" % (new_name, glyph_name) # glyph does not have suffix else: pass # done glyph # done font f.update() print print '...done.\n' # no glyph selected else: print no_glyph_selected # no font open else: print no_font_open pass
class createSpaceGlyphsDialog(object): '''A dialog to create space glyphs in a font.''' _title = 'spaces' _padding = 10 _padding_top = 10 _column_1 = 55 _field_width = 40 _row_height = 18 _button_height = 30 _box_height = 23 _height = (_row_height * 5) + (_button_height * 1) + (_padding * 8) + _box_height + 4 _width = 123 _hairspace_factor = .08 _thinspace_factor = .16 _thickspace_factor = .333 _figurespace_factor = .6 def __init__(self): if CurrentFont() is not None: self.font = CurrentFont() self.w = FloatingWindow( (self._width, self._height), self._title, closable=True) # current font x = self._padding y = self._padding self.w.box = Box( (x, y, -self._padding, self._box_height)) self.w.box.text = TextBox( (5, 0, -self._padding, self._row_height), text=get_full_name(self.font), sizeStyle='small') # hair space y += self._row_height + 18 self.w._hairspace_label = TextBox( (x, y, self._column_1, self._row_height), "hair", sizeStyle='small') x += self._column_1 self.w._hairspace_value = EditText( (x, y, -self._padding, self._row_height), text=int(self.font.info.unitsPerEm * self._hairspace_factor), sizeStyle='small') # thin space x = self._padding y += self._row_height + self._padding self.w._thinspace_label = TextBox( (x, y, self._column_1, self._row_height), "thin", sizeStyle='small') x += self._column_1 self.w._thinspace_value = EditText( (x, y, -self._padding, self._row_height), text=int(self.font.info.unitsPerEm * self._thinspace_factor), sizeStyle='small') # thick space x = self._padding y += self._row_height + self._padding self.w._thickspace_label = TextBox( (x, y, self._column_1, self._row_height), "thick", sizeStyle='small') x += self._column_1 self.w._thickspace_value = EditText( (x, y, -self._padding, self._row_height), text=int(self.font.info.unitsPerEm * self._thickspace_factor), sizeStyle='small') # figure space x = self._padding y += self._row_height + self._padding self.w._figurespace_label = TextBox( (x, y, self._column_1, self._row_height), "figure", sizeStyle='small') x += self._column_1 self.w._figurespace_value = EditText( (x, y, -self._padding, self._row_height), text=int(self.font.info.unitsPerEm * self._figurespace_factor), sizeStyle='small') # zero width space x = self._padding y += self._row_height + self._padding self.w._zerowidth_label = TextBox( (x, y, self._column_1, self._row_height), "0 width", sizeStyle='small') x += self._column_1 self.w._zerowidth_value = EditText( (x, y, -self._padding, self._row_height), text='0', readOnly=True, sizeStyle='small') # buttons x = self._padding y += self._row_height + self._padding self.w._button_apply = SquareButton( (x, y, -self._padding, self._button_height), "create", sizeStyle='small', callback = self.apply_callback) # y += self._button_height + self._padding # self.w._button_switch = SquareButton( # (x, y, # -self._padding, # self._button_height), # "update", # sizeStyle='small', # callback=self.update_font_callback) # open window self.w.open() # no font open else: print 'please open a font first.\n' def apply_callback(self, sender): _hairspace = int(self.w._hairspace_value.get()) _thinspace = int(self.w._thinspace_value.get()) _thickspace = int(self.w._thickspace_value.get()) _figurespace = int(self.w._figurespace_value.get()) # boolstring = (False, True) if self.font is not None: # print info print 'creating space glyphs...\n' print '\thair space: %s units' % _hairspace print '\tthin space: %s units' % _thinspace print '\tthick space: %s units' % _thickspace print '\tfigure space: %s units' % _figurespace print '\tzero-width space: 0' # hair space self.font.newGlyph('hairspace') self.font['hairspace'].width = _hairspace self.font['hairspace'].unicode = unicode_hexstr_to_int('uni200A') self.font['hairspace'].update() # thin space self.font.newGlyph('thinspace') self.font['thinspace'].width = _thinspace self.font['thinspace'].unicode = unicode_hexstr_to_int('uni2009') self.font['thinspace'].update() # thick space self.font.newGlyph('thickspace') self.font['thickspace'].width = _thickspace self.font['thickspace'].unicode = unicode_hexstr_to_int('uni2004') self.font['thickspace'].update() # figure space self.font.newGlyph('figurespace') self.font['figurespace'].width = _figurespace self.font['figurespace'].unicode = unicode_hexstr_to_int('uni2007') self.font['figurespace'].update() # zero-width space self.font.newGlyph('zerowidthspace') self.font['zerowidthspace'].width = 0 self.font['zerowidthspace'].unicode = unicode_hexstr_to_int('uni200B') self.font['zerowidthspace'].update() # done self.font.update() print print '...done.\n' else: print 'No font selected, please close the dialog and try again.\n' def update_font_callback(self, sender): self.font = CurrentFont() self.w.box.text.set(get_full_name(self.font)) def close_callback(self, sender): self.w.close()
class adjustVerticalMetrics(object): """A dialog to adjust the vertical metrics in the font with the help of sliders and nudge buttons.""" _title = "vertical metrics" _moveX = 0 _moveY = 0 _row_height = 28 _box_height = 18 _box_width = 60 _button_2 = _box_height _padding = 10 _column_1 = 80 _column_2 = 200 _column_3 = 45 _width = _column_1 + _column_2 + _column_3 + (_padding * 3) + (_button_2 * 4) + 2 _height = (_row_height * 4) + (_padding * 5) _ascender_min = 1 _capheight_min = 1 _xheight_min = 1 _descender_min = 1 def __init__(self): self.w = FloatingWindow( (self._width, self._height), self._title) # get font vmetrics self.font = CurrentFont() _units_per_em = self.font.info.unitsPerEm _ascender = self.font.info.ascender _capheight = self.font.info.capHeight _xheight = self.font.info.xHeight _descender = abs(self.font.info.descender) # set max vmetrics self._ascender_max = _units_per_em self._capheight_max = _units_per_em self._xheight_max = _units_per_em self._descender_max = _units_per_em # make button alignments x1 = self._padding x2 = x1 + self._column_1 x3 = x2 + self._column_2 + 15 x4 = x3 + self._column_3 - 1 x5 = x4 + self._button_2 - 1 x6 = x5 + self._button_2 - 1 x7 = x6 + self._button_2 - 1 y = self._padding self.w.box = Box( (x1, y, self._column_1 + self._column_2, 23)) self.w.box.text = TextBox( (5, 0, -self._padding, 20), get_full_name(self.font), sizeStyle='small') self.w.font_switch = SquareButton( (x3, y, -self._padding, 23), 'update', sizeStyle='small', callback=self.update_font_callback) y += self._row_height + self._padding # ascender self.w.ascender_label = TextBox( (x1, y, self._column_1, self._row_height), "ascender", sizeStyle='small') self.w.ascender_slider = Slider( (x2, y - 5, self._column_2, self._row_height), minValue=self._ascender_min, maxValue=self._ascender_max, value=_ascender, callback=self.ascender_slider_callback, sizeStyle='small') self.w.ascender_value = EditText( (x3, y, self._column_3, self._box_height), _ascender, callback=self.ascender_value_callback, sizeStyle='small') self.w.ascender_minus_01 = SquareButton( (x4, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.ascender_minus_01_callback) self.w.ascender_plus_01 = SquareButton( (x5, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.ascender_plus_01_callback) self.w.ascender_minus_10 = SquareButton( (x6, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.ascender_minus_10_callback) self.w.ascender_plus_10 = SquareButton( (x7, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.ascender_plus_10_callback) y += self._row_height # capheight self.w.capheight_label = TextBox( (x1, y, self._column_1, self._row_height), "cap-height", sizeStyle='small') self.w.capheight_slider = Slider( (x2, y - 5, self._column_2, self._row_height), minValue=self._capheight_min, maxValue=self._capheight_max, value=_capheight, callback=self.capheight_slider_callback, sizeStyle='small') self.w.capheight_value = EditText( (x3, y, self._column_3, self._box_height), _capheight, callback=self.capheight_value_callback, sizeStyle='small') self.w.capheight_minus_01 = SquareButton( (x4, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.capheight_minus_01_callback) self.w.capheight_plus_01 = SquareButton( (x5, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.capheight_plus_01_callback) self.w.capheight_minus_10 = SquareButton( (x6, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.capheight_minus_10_callback) self.w.capheight_plus_10 = SquareButton( (x7, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.capheight_plus_10_callback) y += self._row_height # xheight self.w.xheight_label = TextBox( (x1, y, self._column_1, self._row_height), "x-height", sizeStyle='small') self.w.xheight_slider = Slider( (x2, y - 5, self._column_2, self._row_height), minValue=self._xheight_min, maxValue=self._xheight_max, value=_xheight, callback=self.xheight_slider_callback, sizeStyle='small') self.w.xheight_value = EditText( (x3, y, self._column_3, self._box_height), _xheight, callback=self.xheight_value_callback, sizeStyle='small') self.w.xheight_minus_01 = SquareButton( (x4, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.xheight_minus_01_callback) self.w.xheight_plus_01 = SquareButton( (x5, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.xheight_plus_01_callback) self.w.xheight_minus_10 = SquareButton( (x6, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.xheight_minus_10_callback) self.w.xheight_plus_10 = SquareButton( (x7, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.xheight_plus_10_callback) y += self._row_height # descender self.w.descender_label = TextBox( (x1, y, self._column_1, self._row_height), "descender", sizeStyle='small') self.w.descender_slider = Slider( (x2, y - 5, self._column_2, self._row_height), minValue=self._descender_min, maxValue=self._descender_max, value=_descender, callback=self.descender_slider_callback, sizeStyle='small') self.w.descender_value = EditText( (x3, y, self._column_3, self._box_height), _descender, callback=self.descender_value_callback, sizeStyle='small') self.w.descender_minus_01 = SquareButton( (x4, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.descender_minus_01_callback) self.w.descender_plus_01 = SquareButton( (x5, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.descender_plus_01_callback) self.w.descender_minus_10 = SquareButton( (x6, y, self._button_2, self._button_2), '-', sizeStyle='small', callback=self.descender_minus_10_callback) self.w.descender_plus_10 = SquareButton( (x7, y, self._button_2, self._button_2), '+', sizeStyle='small', callback=self.descender_plus_10_callback) # open window self.w.open() # updates def xheight_update(self, value): self.w.xheight_value.set(value) self.w.xheight_slider.set(value) self.font.info.xHeight = value self.font.update() def capheight_update(self, value): self.w.capheight_value.set(value) self.w.capheight_slider.set(value) self.font.info.capHeight = value self.font.update() def descender_update(self, value): self.w.descender_value.set(abs(value)) self.w.descender_slider.set(abs(value)) self.font.info.descender = -abs(value) self.font.update() def ascender_update(self, value): self.w.ascender_value.set(value) self.w.ascender_slider.set(value) self.font.info.ascender = value self.font.update() # buttons def update_font_callback(self, sender): self.font = CurrentFont() self.w.box.text.set(get_full_name(self.font)) def xheight_minus_01_callback(self, sender): _xheight_value = int(self.w.xheight_value.get()) - 1 self.xheight_update(_xheight_value) def xheight_plus_01_callback(self, sender): _xheight_value = int(self.w.xheight_value.get()) + 1 self.xheight_update(_xheight_value) def xheight_minus_10_callback(self, sender): _xheight_value = int(self.w.xheight_value.get()) - 10 self.xheight_update(_xheight_value) def xheight_plus_10_callback(self, sender): _xheight_value = int(self.w.xheight_value.get()) + 10 self.xheight_update(_xheight_value) def capheight_minus_01_callback(self, sender): _capheight_value = int(self.w.capheight_value.get()) - 1 self.capheight_update(_capheight_value) def capheight_plus_01_callback(self, sender): _capheight_value = int(self.w.capheight_value.get()) + 1 self.capheight_update(_capheight_value) def capheight_minus_10_callback(self, sender): _capheight_value = int(self.w.capheight_value.get()) - 10 self.capheight_update(_capheight_value) def capheight_plus_10_callback(self, sender): _capheight_value = int(self.w.capheight_value.get()) + 10 self.capheight_update(_capheight_value) def ascender_minus_01_callback(self, sender): _ascender_value = int(self.w.ascender_value.get()) - 1 self.ascender_update(_ascender_value) def ascender_plus_01_callback(self, sender): _ascender_value = int(self.w.ascender_value.get()) + 1 self.ascender_update(_ascender_value) def ascender_minus_10_callback(self, sender): _ascender_value = int(self.w.ascender_value.get()) - 10 self.ascender_update(_ascender_value) def ascender_plus_10_callback(self, sender): _ascender_value = int(self.w.ascender_value.get()) + 10 self.ascender_update(_ascender_value) def descender_minus_01_callback(self, sender): _descender_value = abs(int(self.w.descender_value.get())) - 1 self.descender_update(-_descender_value) def descender_plus_01_callback(self, sender): _descender_value = int(self.w.descender_value.get()) + 1 self.descender_update(_descender_value) def descender_minus_10_callback(self, sender): _descender_value = abs(int(self.w.descender_value.get())) - 10 self.descender_update(-_descender_value) def descender_plus_10_callback(self, sender): _descender_value = int(self.w.descender_value.get()) + 10 self.descender_update(_descender_value) # sliders def xheight_slider_callback(self, sender): _xheight_value = int(self.w.xheight_slider.get()) # print 'xheight: %s' % _xheight_value self.w.xheight_value.set(_xheight_value) self.font.info.xHeight = _xheight_value self.font.update() def capheight_slider_callback(self, sender): _capheight_value = int(self.w.capheight_slider.get()) # print 'capheight: %s' % _capheight_value self.w.capheight_value.set(_capheight_value) self.font.info.capHeight = _capheight_value self.font.update() def descender_slider_callback(self, sender): _descender_value = int(self.w.descender_slider.get()) # print 'descender: %s' % _descender_value self.w.descender_value.set(abs(_descender_value)) self.font.info.descender = -abs(_descender_value) self.font.update() def ascender_slider_callback(self, sender): _ascender_value = int(self.w.ascender_slider.get()) # print 'ascender: %s' % _ascender_value self.w.ascender_value.set(_ascender_value) self.font.info.ascender = _ascender_value self.font.update() # values def xheight_value_callback(self, sender): _xheight_value = int(sender.get()) # print 'xheight: %s' % _xheight_value self.w.xheight_slider.set(_xheight_value) self.font.info.xHeight = _xheight_value self.font.update() def capheight_value_callback(self, sender): _capheight_value = int(sender.get()) # print 'capheight: %s' % _capheight_value self.w.capheight_slider.set(_capheight_value) self.font.info.capHeight = _capheight_value self.font.update() def ascender_value_callback(self, sender): _ascender_value = int(sender.get()) # print 'ascender: %s' % _ascender_value self.w.ascender_slider.set(_ascender_value) self.font.info.ascender = _ascender_value self.font.update() def descender_value_callback(self, sender): _descender_value = int(sender.get()) # print 'descender: %s' % _descender_value self.w.descender_slider.set(_descender_value) self.font.info.descender = - _descender_value self.font.update()
class createSpaceGlyphsDialog(hDialog): '''A dialog to create space glyphs in a font. .. image:: imgs/font/create-spaces.png ''' hairspace_factor = .08 thinspace_factor = .16 thickspace_factor = .333 figurespace_factor = .6 def __init__(self): self.title = 'spaces' self.column_1 = 55 self.field_width = 40 self.box_height = 23 self.height = (self.text_height * 5) + (self.button_height * 1) + (self.padding_y * 8) + self.box_height + 4 self.w = HUDFloatingWindow((self.width, self.height), self.title) # current font x = self.padding_x y = self.padding_y self.w.box = Box( (x, y, -self.padding_x, self.box_height)) self.w.box.font_name = TextBox( (5, 0, -self.padding_x, self.text_height), text='(None)', sizeStyle=self.size_style) # hair space y += self.text_height + 18 self.w.hairspace_label = TextBox( (x, y, self.column_1, self.text_height), "hair", sizeStyle=self.size_style) x += self.column_1 self.w.hairspace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # thin space x = self.padding_x y += self.text_height + self.padding_y self.w.thinspace_label = TextBox( (x, y, self.column_1, self.text_height), "thin", sizeStyle=self.size_style) x += self.column_1 self.w.thinspace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # thick space x = self.padding_x y += self.text_height + self.padding_y self.w.thickspace_label = TextBox( (x, y, self.column_1, self.text_height), "thick", sizeStyle=self.size_style) x += self.column_1 self.w.thickspace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # figure space x = self.padding_x y += self.text_height + self.padding_y self.w.figurespace_label = TextBox( (x, y, self.column_1, self.text_height), "figure", sizeStyle=self.size_style) x += self.column_1 self.w.figurespace_value = EditText( (x, y, -self.padding_x, self.text_height), text='', sizeStyle=self.size_style) # zero width space x = self.padding_x y += self.text_height + self.padding_y self.w.zerowidth_label = TextBox( (x, y, self.column_1, self.text_height), "0 width", sizeStyle=self.size_style) x += self.column_1 self.w.zerowidth_value = EditText( (x, y, -self.padding_x, self.text_height), text='0', readOnly=self.read_only, sizeStyle=self.size_style) # buttons x = self.padding_x y += self.text_height + self.padding_y self.w.button_apply = SquareButton( (x, y, -self.padding_x, self.button_height), "create", sizeStyle=self.size_style, callback=self.apply_callback) # bind self.w.bind("became key", self.update_callback) self.w.bind("close", self.on_close_window) # observers addObserver(self, "update_callback", "fontDidOpen") addObserver(self, "update_callback", "fontDidClose") # open window self.w.open() # get current font self.get_font() def get_font(self): self.font = CurrentFont() if self.font is not None: self.w.box.font_name.set(get_full_name(self.font)) self.w.hairspace_value.set(int(self.font.info.unitsPerEm * self.hairspace_factor)) self.w.thickspace_value.set(int(self.font.info.unitsPerEm * self.thickspace_factor)) self.w.thinspace_value.set(int(self.font.info.unitsPerEm * self.thinspace_factor)) self.w.figurespace_value.set(int(self.font.info.unitsPerEm * self.figurespace_factor)) else: self.w.box.font_name.set('(None)') self.w.hairspace_value.set('') self.w.thickspace_value.set('') self.w.thinspace_value.set('') self.w.figurespace_value.set('') print no_font_open def apply_callback(self, sender): hairspace = int(self.w.hairspace_value.get()) thinspace = int(self.w.thinspace_value.get()) thickspace = int(self.w.thickspace_value.get()) figurespace = int(self.w.figurespace_value.get()) # boolstring = (False, True) if self.font is not None: # print info print 'creating space glyphs...\n' print '\thair space: %s units' % hairspace print '\tthin space: %s units' % thinspace print '\tthick space: %s units' % thickspace print '\tfigure space: %s units' % figurespace print '\tzero-width space: 0' # hair space self.font.newGlyph('hairspace') self.font['hairspace'].width = hairspace self.font['hairspace'].unicode = unicode_hexstr_to_int('uni200A') self.font['hairspace'].update() # thin space self.font.newGlyph('thinspace') self.font['thinspace'].width = thinspace self.font['thinspace'].unicode = unicode_hexstr_to_int('uni2009') self.font['thinspace'].update() # thick space self.font.newGlyph('thickspace') self.font['thickspace'].width = thickspace self.font['thickspace'].unicode = unicode_hexstr_to_int('uni2004') self.font['thickspace'].update() # figure space self.font.newGlyph('figurespace') self.font['figurespace'].width = figurespace self.font['figurespace'].unicode = unicode_hexstr_to_int('uni2007') self.font['figurespace'].update() # zero-width space self.font.newGlyph('zerowidthspace') self.font['zerowidthspace'].width = 0 self.font['zerowidthspace'].unicode = unicode_hexstr_to_int('uni200B') self.font['zerowidthspace'].update() # done self.font.update() print print '...done.\n' else: print no_font_open def update_callback(self, sender): self.get_font() def on_close_window(self, sender): removeObserver(self, "fontDidOpen") removeObserver(self, "fontDidClose")
class clearFontInfoDialog(hDialog): """ .. image:: imgs/font/print-info.png """ # attributes _generic_identification = True _generic_legal = True _generic_dimension = True _generic_miscellaneous = True _opentype_head = False _opentype_hhea = False _opentype_name = True _opentype_os2 = False _opentype_vhea = False _postscript_data = False # methods def __init__(self): self.title = 'font info' self.height = (self.button_height * 2) + (self.text_height * 11) + (self.padding_y * 5) - 6 self.w = FloatingWindow((self.width, self.height), self.title) # buttons x = self.padding_x y = self.padding_y - 3 self.w._select_all = CheckBox( (x, y, -self.padding_x, self.text_height), "(de)select all", value=False, sizeStyle=self.size_style, callback=self._select_all_callback) y += self.text_height + self.padding_y # button : print data self.w.button_print = SquareButton( (x, y, -self.padding_x, self.button_height), "print", callback=self.print_callback, sizeStyle=self.size_style) y += self.button_height + self.padding_y # button : clear data self.w.button_clear = SquareButton( (x, y, -self.padding_x, self.button_height), "clear", callback=self.clear_callback, sizeStyle=self.size_style) # identification x = self.padding_x y += self.button_height + self.padding_y self.w._generic_identification = CheckBox( (x, y, -self.padding_x, self.text_height), "identification", value=self._generic_identification, sizeStyle=self.size_style) y += self.text_height # legal self.w._generic_legal = CheckBox( (x, y, -self.padding_x, self.text_height), "legal", value=self._generic_legal, sizeStyle=self.size_style) y += self.text_height # dimension self.w._generic_dimension = CheckBox( (x, y, -self.padding_x, self.text_height), "dimension", value=self._generic_dimension, sizeStyle=self.size_style) y += self.text_height # miscellaneous self.w._generic_miscellaneous = CheckBox( (x, y, -self.padding_x, self.text_height), "miscellaneous", value=self._generic_miscellaneous, sizeStyle=self.size_style) y += self.text_height # opentype head self.w._opentype_head = CheckBox( (x, y, -self.padding_x, self.text_height), "OT head", value=self._opentype_head, sizeStyle=self.size_style) y += self.text_height # opentype hhea self.w._opentype_hhea = CheckBox( (x, y, -self.padding_x, self.text_height), "OT hhea", value=self._opentype_hhea, sizeStyle=self.size_style) y += self.text_height # opentype name self.w._opentype_name = CheckBox( (x, y, -self.padding_x, self.text_height), "OT name", value=self._opentype_name, sizeStyle=self.size_style) y += self.text_height # opentype os2 self.w._opentype_os2 = CheckBox( (x, y, -self.padding_x, self.text_height), "OT OS/2", value=self._opentype_os2, sizeStyle=self.size_style) y += self.text_height # opentype vhea self.w._opentype_vhea = CheckBox( (x, y, -self.padding_x, self.text_height), "OT vhea", value=self._opentype_vhea, sizeStyle=self.size_style) y += self.text_height # postscript data self.w._postscript_data = CheckBox( (x, y, -self.padding_x, self.text_height), "PS data", value=self._postscript_data, sizeStyle=self.size_style) # open window self.w.open() # callbacks def _select_all_callback(self, sender): value = self.w._select_all.get() self.set_values(value) def set_values(self, value): self.w._generic_identification.set(value) self.w._generic_legal.set(value) self.w._generic_dimension.set(value) self.w._generic_miscellaneous.set(value) self.w._opentype_head.set(value) self.w._opentype_hhea.set(value) self.w._opentype_name.set(value) self.w._opentype_os2.set(value) self.w._opentype_vhea.set(value) self.w._postscript_data.set(value) def get_font(self): self.font = CurrentFont() def get_values(self): self._generic_identification = self.w._generic_identification.get() self._generic_legal = self.w._generic_legal.get() self._generic_dimension = self.w._generic_dimension.get() self._generic_miscellaneous = self.w._generic_miscellaneous.get() self._opentype_head = self.w._opentype_head.get() self._opentype_hhea = self.w._opentype_hhea.get() self._opentype_name = self.w._opentype_name.get() self._opentype_os2 = self.w._opentype_os2.get() self._opentype_vhea = self.w._opentype_vhea.get() self._postscript_data = self.w._postscript_data.get() def clear_callback(self, sender): self.get_font() if self.font is not None: self.get_values() print 'clearing font info...\n' if self._generic_identification: print '\tclear generic identification...' clear_generic_identification(self.font) if self._generic_legal: print '\tclear generic legal...' clear_generic_legal(self.font) if self._generic_dimension: print '\tclear generic dimension...' clear_generic_dimension(self.font) if self._generic_miscellaneous: print '\tclear generic miscellaneous...' clear_generic_miscellaneous(self.font) if self._opentype_head: print '\tclear OpenType head...' clear_opentype_head(self.font) if self._opentype_hhea: print '\tclear OpenType hhea...' clear_opentype_hhea(self.font) if self._opentype_name: print '\tclear OpenType name...' clear_opentype_name(self.font) if self._opentype_os2: print '\tclear OpenType OS/2...' clear_opentype_os2(self.font) if self._opentype_vhea: print '\tclear OpenType vhea...' clear_opentype_vhea(self.font) if self._postscript_data: print '\tclear PostScript data...' clear_postscript_data(self.font) print self.font.update() print '...done.\n' else: print no_font_open def print_callback(self, sender): self.get_font() if self.font is not None: self.get_values() print 'print font info...\n' if self._generic_identification: print_generic_identification(self.font) if self._generic_legal: print_generic_legal(self.font) if self._generic_dimension: print_generic_dimension(self.font) if self._generic_miscellaneous: print_generic_miscellaneous(self.font) if self._opentype_head: print_opentype_head(self.font) if self._opentype_hhea: print_opentype_hhea(self.font) if self._opentype_name: print_opentype_name(self.font) if self._opentype_os2: print_opentype_os2(self.font) if self._opentype_vhea: print_opentype_vhea(self.font) if self._postscript_data: print_postscript_data(self.font) print self.font.update() print '...done.\n' else: print no_font_open