Пример #1
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].changed()
             # done
             f.changed()
             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 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
Пример #4
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(self.foreground_layer, self.background_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)
                            # RF 2.0
                            if version[0] == '2':
                                font[glyph_name].changed()
                            # RF 1.8.X
                            else:
                                font[glyph_name].update()

                    # remove anchors from dest layer
                    dest_glyph = font[glyph_name].getLayer(self.background_layer)
                    dest_glyph.clearAnchors()

                # done with glyph
                font[glyph_name].performUndo()

            # done with font

            # RF 2.0
            if version[0] == '2':
                font.changed()
            # RF 1.8.X
            else:
                font.update()

        else:
            print no_font_open
Пример #5
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()

            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.changed()
                print
                print "\n...done.\n"

            else:
                print no_glyph_selected

        else:
            print no_font_open
Пример #6
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.changed()
             print
             print '\n...done.\n'
         # no glyph selected
         else:
             print no_glyph_selected
     # no font open
     else:
         print no_font_open
Пример #7
0
                    # mirror active layer only
                    else:
                        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
Пример #8
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()
Пример #9
0
class shiftPointsDialog(hDialog):

    '''A dialog to select and shift points in the selected glyphs in a font.

    .. image:: imgs/glyphs/points-shift.png

    '''

    pos    = 250
    delta  = 125
    side   = 1
    axis   = 0
    layers = False
    font   = None

    glyph_names = []

    def __init__(self):
        self.title = 'shift points'
        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 + 5
        self.w = HUDFloatingWindow((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:
                                layer_glyph = g.getLayer(layer_name)
                                layer_glyph.prepareUndo('shift points y')
                                deselect_points(layer_glyph)
                                select_points_y(layer_glyph, self.pos, side=sides[self.side])
                                shift_selected_points_y(layer_glyph, delta)
                                layer_glyph.performUndo()
                                # RF 2.0
                                if version[0] == '2':
                                    layer_glyph.changed()
                                # RF 1.8.X
                                else:
                                    layer_glyph.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()
                            # RF 2.0
                            if version[0] == '2':
                                g.changed()
                            # RF 1.8.X
                            else:
                                g.update()
                    #---------
                    # shift x
                    #---------
                    else:
                        # all layers
                        if self.layers:
                            for layer_name in self.font.layerOrder:
                                layer_glyph = g.getLayer(layer_name)
                                layer_glyph.prepareUndo('shift points x')
                                deselect_points(layer_glyph)
                                select_points_x(layer_glyph, self.pos, side=sides[self.side])
                                shift_selected_points_x(layer_glyph, delta)
                                layer_glyph.performUndo()
                                # RF 2.0
                                if version[0] == '2':
                                    layer_glyph.changed()
                                # RF 1.8.X
                                else:
                                    layer_glyph.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()
                            # RF 2.0
                            if version[0] == '2':
                                g.changed()
                            # RF 1.8.X
                            else:
                                g.update()

                    # done with glyph

                # done with font
                # RF 2.0
                if version[0] == '2':
                    self.font.changed()
                # RF 1.8.X
                else:
                    self.font.update()
                print
                print '\n...done.\n'

            # no glyph selected
            else:
                print no_glyph_selected

        # no font open
        else:
            print no_font_open
Пример #10
0
class roundToGridDialog(hDialog):

    '''A dialog to round features of the selected glyphs to a grid.

    .. image:: imgs/glyphs/gridfit.png

    '''

    glyph_names = []
    gridsize    = 125
    b_points    = True
    points      = False
    margins     = False
    glyph_width = True
    anchors     = False
    layers      = False

    def __init__(self):
        self.title = 'gridfit'
        self.column_1 = 40
        self.height = self.button_height + self.nudge_button + self.text_height*7 + self.padding_y*5 - 3
        self.w = HUDFloatingWindow((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()

    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.changed()
                print
                print '\n...done.\n'
            # no glyph selected
            else:
                print no_glyph_selected
        # no font open
        else:
            print no_font_open
Пример #11
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.changed()
                                 g.name = new_name
                                 g.changed()
                             # 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.changed()
             print
             print '...done.\n'
         # no glyph selected
         else:
             print no_glyph_selected
     # no font open
     else:
         print no_font_open
Пример #12
0
class deleteLayerDialog(hDialog):

    '''A dialog to delete a layer in a font.

    .. image:: imgs/font/delete-layer.png

    '''

    #: The font which is currently selected.
    font = None

    #: A list of all layers in the current font.
    layers = []

    def __init__(self):
        self.get_font()
        # window
        self.title = 'layers'
        self.height = self.button_height + (self.padding_y*3) + (self.text_height*8)
        self.w = HUDFloatingWindow((self.width, 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.changed()
                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")