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
Пример #2
0
    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
Пример #3
0
 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
Пример #4
0
 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)
Пример #5
0
 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
Пример #6
0
 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 _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
Пример #8
0
 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
Пример #9
0
 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
Пример #10
0
 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
Пример #11
0
 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
Пример #13
0
 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)
Пример #14
0
    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
Пример #15
0
 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
Пример #16
0
 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
Пример #17
0
 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"
Пример #18
0
 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
Пример #19
0
 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
Пример #20
0
 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)
Пример #21
0
 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
Пример #22
0
 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'
Пример #23
0
 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)
Пример #24
0
 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'
Пример #25
0
    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
Пример #26
0
 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'
Пример #27
0
 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"
Пример #28
0
    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
Пример #29
0
    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
Пример #31
0
 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
Пример #32
0
 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)
Пример #33
0
 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
Пример #34
0
                        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))
Пример #35
0
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()
Пример #36
0
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)
Пример #37
0
 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)
Пример #38
0
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
Пример #39
0
                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))
Пример #40
0
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
Пример #41
0
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
Пример #42
0
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")
Пример #43
0
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")
Пример #44
0
 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
Пример #45
0
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)
Пример #46
0
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
Пример #47
0
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()
Пример #48
0
 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
Пример #49
0
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()
Пример #50
0
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()
Пример #51
0
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")
Пример #52
0
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