diff options
Diffstat (limited to 'Lib/defconQt/fontInfo.py')
| -rw-r--r-- | Lib/defconQt/fontInfo.py | 1221 | 
1 files changed, 548 insertions, 673 deletions
| diff --git a/Lib/defconQt/fontInfo.py b/Lib/defconQt/fontInfo.py index 45f954f..93fc3df 100644 --- a/Lib/defconQt/fontInfo.py +++ b/Lib/defconQt/fontInfo.py @@ -1,9 +1,10 @@  from PyQt5.QtCore import QDate, QDateTime, QTime, Qt -from PyQt5.QtGui import QDoubleValidator, QIntValidator +from PyQt5.QtGui import ( +    QDoubleValidator, QIntValidator, QStandardItem, QStandardItemModel)  from PyQt5.QtWidgets import (      QCheckBox, QComboBox, QDateTimeEdit, QDialog, QDialogButtonBox, -    QGridLayout, QGroupBox, QLabel, QLineEdit, QPlainTextEdit, QTabWidget, -    QVBoxLayout, QWidget) +    QGridLayout, QGroupBox, QLabel, QLineEdit, QListView, QPlainTextEdit, +    QTabWidget, QVBoxLayout, QWidget)  class InfoTabWidget(QTabWidget): @@ -15,13 +16,14 @@ class InfoTabWidget(QTabWidget):  class TabDialog(QDialog):      def __init__(self, font, parent=None): -        super(TabDialog, self).__init__(parent) +        super().__init__(parent)          self.font = font          self.tabWidget = InfoTabWidget(self)          self.tabWidget.addNamedTab(GeneralTab(self.font))          self.tabWidget.addNamedTab(MetricsTab(self.font))          self.tabWidget.addNamedTab(OpenTypeTab(self.font)) +        self.tabWidget.addNamedTab(OS2Tab(self.font))          self.tabWidget.addNamedTab(PostScriptTab(self.font))          buttonBox = QDialogButtonBox( @@ -41,80 +43,170 @@ class TabDialog(QDialog):      def accept(self):          for i in range(self.tabWidget.count()):              self.tabWidget.widget(i).writeValues(self.font) -        super(TabDialog, self).accept() +        super().accept() -class GeneralTab(QWidget): -    name = "General" +class TabWidget(QWidget): + +    def __init__(self, font, parent=None, name=None): +        self.name = name +        self.font = font +        super().__init__(parent) + +    def loadString(self, font, src, dst): +        value = getattr(font.info, src) +        if value is not None: +            setattr(self, dst + "Edit", QLineEdit(value, self)) +        else: +            setattr(self, dst + "Edit", QLineEdit(None, self)) + +    def writeString(self, font, src, dst): +        value = getattr(self, src + "Edit").text() +        if value != "": +            setattr(font.info, dst, value) +        else: +            setattr(font.info, dst, None) + +    def loadInteger(self, font, src, dst): +        value = getattr(font.info, src) +        if value is not None: +            value = str(value) +        else: +            value = "" +        setattr(self, dst + "Edit", QLineEdit(value, self)) +        getattr(self, dst + "Edit").setValidator(QIntValidator(self)) + +    def writeInteger(self, font, src, dst): +        value = getattr(self, src + "Edit").text() +        if value != "": +            setattr(font.info, dst, int(value)) +        else: +            setattr(font.info, dst, None) + +    def loadPositiveInteger(self, font, src, dst): +        value = getattr(font.info, src) +        if value is not None: +            value = str(value) +        else: +            value = "" +        setattr(self, dst + "Edit", QLineEdit(value, self)) +        getattr(self, dst + "Edit").setValidator(QIntValidator(self)) +        validator = QIntValidator(self) +        validator.setBottom(0) +        getattr(self, dst + "Edit").setValidator(validator) + +    writePositiveInteger = writeInteger + +    def loadIntegerFloat(self, font, src, dst): +        value = getattr(font.info, src) +        if value is not None: +            value = str(value) +        else: +            value = "" +        setattr(self, dst + "Edit", QLineEdit(value, self)) +        getattr(self, dst + "Edit").setValidator(QDoubleValidator(self)) + +    def writeIntegerFloat(self, font, src, dst): +        value = getattr(self, src + "Edit").text() +        if "." in value: +            setattr(font.info, dst, float(value)) +        elif value: +            setattr(font.info, dst, int(value)) +        else: +            setattr(font.info, dst, None) + +    def loadPositiveIntegerFloat(self, font, src, dst): +        value = getattr(font.info, src) +        if value is not None: +            value = str(value) +        else: +            value = "" +        setattr(self, dst + "Edit", QLineEdit(value, self)) +        validator = QDoubleValidator(self) +        validator.setBottom(0) +        getattr(self, dst + "Edit").setValidator(validator) + +    writePositiveIntegerFloat = writeIntegerFloat + +    def loadIntegerFloatList(self, font, src, dst): +        values = " ".join(str(val) for val in getattr(font.info, src)) +        setattr(self, dst + "Edit", QLineEdit(values, self)) + +    def writeIntegerFloatList(self, font, src, dst): +        values = getattr(self, src + "Edit").text() +        dstValues = [] +        for val in values: +            if "." in val: +                dstValues.append(float(val)) +            elif val not in ("", " "): +                dstValues.append(int(val)) +        setattr(font.info, dst, dstValues) + +    def loadBoolean(self, font, src, dst): +        value = getattr(font.info, src) +        setattr(self, dst + "Box", QCheckBox(self)) +        if value is None: +            getattr(self, dst + "Box").setCheckState(Qt.PartiallyChecked) +        else: +            getattr(self, dst + "Box").setCheckState(value) + +    def writeBoolean(self, font, src, dst): +        value = getattr(self, src + "Box").checkState() +        if value == Qt.PartiallyChecked: +            setattr(font.info, dst, None) +        else: +            setattr(font.info, dst, bool(value)) + + +class GeneralTab(TabWidget):      def __init__(self, font, parent=None): -        super(GeneralTab, self).__init__(parent) +        super().__init__(parent, name="General")          mainLayout = QGridLayout(self)          familyNameLabel = QLabel("Family name:", self) -        self.familyNameEdit = QLineEdit(font.info.familyName, self)          styleNameLabel = QLabel("Style name:", self) -        self.styleNameEdit = QLineEdit(font.info.styleName, self) +        designerLabel = QLabel("Designer:", self) +        designerURLLabel = QLabel("Designer URL:", self) +        manufacturerLabel = QLabel("Manufacturer:", self) +        manufacturerURLLabel = QLabel("Manufacturer URL:", self) +        copyrightLabel = QLabel("Copyright:", self) +        licenseLabel = QLabel("License:", self) +        licenseURLLabel = QLabel("License URL:", self) +        trademarkLabel = QLabel("Trademark:", self) +        # TODO: give visual feedback of input data validity using QLineEdit +        # lose focus event +        # http://snorf.net/blog/2014/08/09/using-qvalidator-in-pyqt4-to-validate-user-input/ # noqa +        versionLabel = QLabel("Version:", self) +        versionDotLabel = QLabel(".", self) +        self.loadString(font, "familyName", "familyName") +        self.loadString(font, "styleName", "styleName") +        self.loadString(font, "openTypeNameDesigner", "designer") +        self.loadString(font, "openTypeNameDesignerURL", "designerURL") +        self.loadString(font, "openTypeNameManufacturer", "manufacturer") +        self.loadString(font, "openTypeNameManufacturerURL", "manufacturerURL") +        self.loadString(font, "copyright", "copyright") +        self.loadString(font, "openTypeNameLicense", "license") +        self.loadString(font, "openTypeNameLicenseURL", "licenseURL") +        self.loadString(font, "trademark", "trademark") +        self.loadInteger(font, "versionMajor", "versionMajor") +        self.versionMajorEdit.setAlignment(Qt.AlignRight) +        self.loadPositiveInteger(font, "versionMinor", "versionMinor")          mainLayout.addWidget(familyNameLabel, 0, 0)          mainLayout.addWidget(self.familyNameEdit, 0, 1, 1, 3)          mainLayout.addWidget(styleNameLabel, 0, 4)          mainLayout.addWidget(self.styleNameEdit, 0, 5) - -        designerLabel = QLabel("Designer:", self) -        self.designerEdit = QLineEdit(font.info.openTypeNameDesigner, self) -          mainLayout.addWidget(designerLabel, 1, 0)          mainLayout.addWidget(self.designerEdit, 1, 1, 1, 5) - -        designerURLLabel = QLabel("Designer URL:", self) -        self.designerURLEdit = QLineEdit( -            font.info.openTypeNameDesignerURL, self) -          mainLayout.addWidget(designerURLLabel, 2, 0)          mainLayout.addWidget(self.designerURLEdit, 2, 1, 1, 5) - -        manufacturerLabel = QLabel("Manufacturer:", self) -        self.manufacturerEdit = QLineEdit( -            font.info.openTypeNameManufacturer, self) -          mainLayout.addWidget(manufacturerLabel, 3, 0)          mainLayout.addWidget(self.manufacturerEdit, 3, 1, 1, 5) - -        manufacturerURLLabel = QLabel("Manufacturer URL:", self) -        self.manufacturerURLEdit = QLineEdit( -            font.info.openTypeNameManufacturerURL, self) -          mainLayout.addWidget(manufacturerURLLabel, 4, 0)          mainLayout.addWidget(self.manufacturerURLEdit, 4, 1, 1, 5) - -        copyrightLabel = QLabel("Copyright:", self) -        self.copyrightEdit = QLineEdit(font.info.copyright, self) -          mainLayout.addWidget(copyrightLabel, 5, 0)          mainLayout.addWidget(self.copyrightEdit, 5, 1, 1, 5) - -        # TODO: give visual feedback of input data validity using QLineEdit -        # lose focus event -        # http://snorf.net/blog/2014/08/09/using-qvalidator-in-pyqt4-to-validate-user-input/ # noqa -        versionLabel = QLabel("Version:", self) -        if font.info.versionMajor is not None: -            versionMajor = str(font.info.versionMajor) -        else: -            versionMajor = '' -        self.versionMajorEdit = QLineEdit(versionMajor, self) -        self.versionMajorEdit.setAlignment(Qt.AlignRight) -        self.versionMajorEdit.setValidator(QIntValidator(self)) -        versionDotLabel = QLabel(".", self) -        if font.info.versionMinor is not None: -            versionMinor = str(font.info.versionMinor) -        else: -            versionMinor = '' -        self.versionMinorEdit = QLineEdit(versionMinor, self) -        validator = QIntValidator(self) -        validator.setBottom(0) -        self.versionMinorEdit.setValidator(validator) -          mainLayout.addWidget(versionLabel, 6, 0)          mainLayout.addWidget(self.versionMajorEdit, 6, 1)          mainLayout.addWidget(versionDotLabel, 6, 2) @@ -142,97 +234,39 @@ class GeneralTab(QWidget):          mainLayout.addWidget(dateCreatedLabel, 6, 4)          mainLayout.addWidget(self.dateCreatedEdit, 6, 5) - -        licenseLabel = QLabel("License:", self) -        self.licenseEdit = QLineEdit(font.info.openTypeNameLicense, self) -          mainLayout.addWidget(licenseLabel, 7, 0)          mainLayout.addWidget(self.licenseEdit, 7, 1, 1, 5) - -        licenseURLLabel = QLabel("License URL:", self) -        self.licenseURLEdit = QLineEdit(font.info.openTypeNameLicenseURL, self) -          mainLayout.addWidget(licenseURLLabel, 8, 0)          mainLayout.addWidget(self.licenseURLEdit, 8, 1, 1, 5) - -        trademarkLabel = QLabel("Trademark:", self) -        self.trademarkEdit = QLineEdit(font.info.trademark, self) -          mainLayout.addWidget(trademarkLabel, 9, 0)          mainLayout.addWidget(self.trademarkEdit, 9, 1, 1, 5)          self.setLayout(mainLayout)      def writeValues(self, font): -        familyName = self.familyNameEdit.text() -        if familyName != '': -            font.info.familyName = familyName -        else: -            font.info.trademark = None -        styleName = self.styleNameEdit.text() -        if styleName != '': -            font.info.styleName = styleName -        else: -            font.info.trademark = None -        designer = self.designerEdit.text() -        if designer != '': -            font.info.openTypeNameDesigner = designer -        else: -            font.info.trademark = None -        designerURL = self.designerURLEdit.text() -        if designerURL != '': -            font.info.openTypeNameDesignerURL = designerURL -        else: -            font.info.trademark = None -        manufacturer = self.manufacturerEdit.text() -        if manufacturer != '': -            font.info.openTypeNameManufacturer = manufacturer -        else: -            font.info.trademark = None -        manufacturerURL = self.manufacturerURLEdit.text() -        if manufacturerURL != '': -            font.info.openTypeNameManufacturerURL = manufacturerURL -        else: -            font.info.trademark = None -        copyright = self.copyrightEdit.text() -        if copyright != '': -            font.info.copyright = copyright -        else: -            font.info.trademark = None -        versionMajor = self.versionMajorEdit.text() -        if versionMajor: -            font.info.versionMajor = int(versionMajor) -        else: -            font.info.versionMajor = None -        versionMinor = self.versionMinorEdit.text() -        if versionMinor: -            font.info.versionMinor = int(versionMinor) -        else: -            font.info.versionMinor = None -        font.info.openTypeHeadCreated = self.dateCreatedEdit.dateTime( -        ).toString("yyyy/MM/dd hh:mm:ss") -        license = self.licenseEdit.text() -        if license != '': -            font.info.openTypeNameLicense = license -        else: -            font.info.trademark = None -        licenseURL = self.licenseURLEdit.text() -        if licenseURL != '': -            font.info.openTypeNameLicenseURL = licenseURL -        else: -            font.info.trademark = None -        trademark = self.trademarkEdit.text() -        if trademark != '': -            font.info.trademark = trademark -        else: -            font.info.trademark = None +        self.writeString(font, "familyName", "familyName") +        self.writeString(font, "styleName", "styleName") +        self.writeString(font, "trademark", "trademark") +        self.writeString(font, "copyright", "copyright") +        self.writeString(font, "designer", "openTypeNameDesigner") +        self.writeString(font, "designerURL", "openTypeNameDesignerURL") +        self.writeString(font, "manufacturer", "openTypeNameManufacturer") +        self.writeString( +            font, "manufacturerURL", "openTypeNameManufacturerURL") +        self.writeString(font, "license", "openTypeNameLicense") +        self.writeString(font, "licenseURL", "openTypeNameLicenseURL") + +        self.writeInteger(font, "versionMajor", "versionMajor") +        self.writePositiveInteger(font, "versionMinor", "versionMinor") +        font.info.openTypeHeadCreated = \ +            self.dateCreatedEdit.dateTime().toString("yyyy/MM/dd hh:mm:ss") -class MetricsTab(QWidget): -    name = "Metrics" + +class MetricsTab(TabWidget):      def __init__(self, font, parent=None): -        super(MetricsTab, self).__init__(parent) +        super().__init__(parent, name="Metrics")          mainLayout = QGridLayout()          styleMapFamilyLabel = QLabel("Style map family name:", self) @@ -260,24 +294,19 @@ class MetricsTab(QWidget):          mainLayout.addWidget(self.styleMapStyleDrop, 0, 5)          unitsPerEmLabel = QLabel("Units per em:", self) -        unitsPerEm = str( -            font.info.unitsPerEm) if font.info.unitsPerEm is not None else '' -        self.unitsPerEmEdit = QLineEdit(unitsPerEm, self) -        validator = QIntValidator(self) -        validator.setBottom(0) -        self.unitsPerEmEdit.setValidator(validator) -          ascenderLabel = QLabel("Ascender:", self) -        ascender = str( -            font.info.ascender) if font.info.ascender is not None else '' -        self.ascenderEdit = QLineEdit(ascender, self) -        self.ascenderEdit.setValidator(QIntValidator(self)) -          capHeightLabel = QLabel("Cap height:", self) -        capHeight = str( -            font.info.capHeight) if font.info.capHeight is not None else '' -        self.capHeightEdit = QLineEdit(capHeight, self) -        self.capHeightEdit.setValidator(QIntValidator(self)) +        italicAngleLabel = QLabel("Italic angle:", self) +        descenderLabel = QLabel("Descender:", self) +        xHeightLabel = QLabel("x-height:", self) +        # In the UFO specs these are integer or float, and unitsPerEm is +        # non-negative integer or float +        self.loadPositiveIntegerFloat(font, "unitsPerEm", "unitsPerEm") +        self.loadIntegerFloat(font, "ascender", "ascender") +        self.loadIntegerFloat(font, "capHeight", "capHeight") +        self.loadIntegerFloat(font, "italicAngle", "italicAngle") +        self.loadIntegerFloat(font, "descender", "descender") +        self.loadIntegerFloat(font, "xHeight", "xHeight")          mainLayout.addWidget(unitsPerEmLabel, 1, 0)          mainLayout.addWidget(self.unitsPerEmEdit, 1, 1) @@ -285,25 +314,6 @@ class MetricsTab(QWidget):          mainLayout.addWidget(self.ascenderEdit, 1, 3)          mainLayout.addWidget(capHeightLabel, 1, 4)          mainLayout.addWidget(self.capHeightEdit, 1, 5) - -        italicAngleLabel = QLabel("Italic angle:", self) -        italicAngle = str( -            font.info.italicAngle) if font.info.italicAngle is not None else '' -        self.italicAngleEdit = QLineEdit(italicAngle, self) -        self.italicAngleEdit.setValidator(QDoubleValidator(self)) - -        descenderLabel = QLabel("Descender:", self) -        descender = str( -            font.info.descender) if font.info.descender is not None else '' -        self.descenderEdit = QLineEdit(descender, self) -        self.descenderEdit.setValidator(QIntValidator(self)) - -        xHeightLabel = QLabel("x-height:", self) -        xHeight = str( -            font.info.xHeight) if font.info.xHeight is not None else '' -        self.xHeightEdit = QLineEdit(xHeight, self) -        self.xHeightEdit.setValidator(QIntValidator(self)) -          mainLayout.addWidget(italicAngleLabel, 2, 0)          mainLayout.addWidget(self.italicAngleEdit, 2, 1)          mainLayout.addWidget(descenderLabel, 2, 2) @@ -336,48 +346,14 @@ class MetricsTab(QWidget):              font.info.styleMapStyleName = "bold italic"          else:              font.info.styleMapStyleName = None -        unitsPerEm = self.unitsPerEmEdit.text() -        if "." in unitsPerEm: -            font.info.unitsPerEm = float(unitsPerEm) -        elif unitsPerEm: -            font.info.unitsPerEm = int(unitsPerEm) -        else: -            font.info.unitsPerEm = None -        italicAngle = self.italicAngleEdit.text() -        if "." in italicAngle: -            font.info.italicAngle = float(italicAngle) -        elif italicAngle: -            font.info.italicAngle = int(italicAngle) -        else: -            font.info.italicAngle = None -        ascender = self.ascenderEdit.text() -        if "." in ascender: -            font.info.ascender = float(ascender) -        elif ascender: -            font.info.ascender = int(ascender) -        else: -            font.info.ascender = None -        descender = self.descenderEdit.text() -        if "." in descender: -            font.info.descender = float(descender) -        elif descender: -            font.info.descender = int(descender) -        else: -            font.info.descender = None -        capHeight = self.capHeightEdit.text() -        if "." in capHeight: -            font.info.capHeight = float(capHeight) -        elif capHeight: -            font.info.capHeight = int(capHeight) -        else: -            font.info.capHeight = None -        xHeight = self.xHeightEdit.text() -        if "." in xHeight: -            font.info.xHeight = float(xHeight) -        elif xHeight: -            font.info.xHeight = int(xHeight) -        else: -            font.info.xHeight = None + +        self.writePositiveIntegerFloat(font, "unitsPerEm", "unitsPerEm") +        self.writeIntegerFloat(font, "italicAngle", "italicAngle") +        self.writeIntegerFloat(font, "ascender", "ascender") +        self.writeIntegerFloat(font, "descender", "descender") +        self.writeIntegerFloat(font, "capHeight", "capHeight") +        self.writeIntegerFloat(font, "xHeight", "xHeight") +          note = self.noteEdit.toPlainText()          if note != '':              font.info.note = note @@ -385,48 +361,38 @@ class MetricsTab(QWidget):              font.info.note = None -class OpenTypeTab(QWidget): -    name = "OpenType" +class OpenTypeTab(TabWidget):      def __init__(self, font, parent=None): -        super(OpenTypeTab, self).__init__(parent) +        super().__init__(parent, name="OpenType")          nameGroup = QGroupBox("name table", self)          # nameGroup.setFlat(True)          nameLayout = QGridLayout(self)          preferredFamilyNameLabel = QLabel("Pref. Family Name:", self) -        self.preferredFamilyNameEdit = QLineEdit( -            font.info.openTypeNamePreferredFamilyName, self) -          preferredSubfamilyNameLabel = QLabel("Pref. Subfamily Name:", self) -        self.preferredSubfamilyNameEdit = QLineEdit( -            font.info.openTypeNamePreferredSubfamilyName, self) -          compatibleFullNameLabel = QLabel("Compatible Full Name:", self) -        self.compatibleFullNameEdit = QLineEdit( -            font.info.openTypeNameCompatibleFullName, self) -          WWSFamilyNameLabel = QLabel("WWS Family Name:", self) -        self.WWSFamilyNameEdit = QLineEdit( -            font.info.openTypeNameWWSFamilyName, self) -          WWSSubfamilyNameLabel = QLabel("WWS Subfamily Name:", self) -        self.WWSSubfamilyNameEdit = QLineEdit( -            font.info.openTypeNameWWSSubfamilyName, self) -          versionLabel = QLabel("Version:", self) -        self.versionEdit = QLineEdit(font.info.openTypeNameVersion, self) -          uniqueIDLabel = QLabel("Unique ID:", self) -        self.uniqueIDEdit = QLineEdit(font.info.openTypeNameUniqueID, self) -          descriptionLabel = QLabel("Description:", self) -        self.descriptionEdit = QLineEdit( -            font.info.openTypeNameDescription, self) -          sampleTextLabel = QLabel("Sample text:", self) -        self.sampleTextEdit = QLineEdit(font.info.openTypeNameSampleText, self) +        self.loadString( +            font, "openTypeNamePreferredFamilyName", "preferredFamilyName") +        self.loadString( +            font, "openTypeNamePreferredSubfamilyName", +            "preferredSubfamilyName") +        self.loadString( +            font, "openTypeNameCompatibleFullName", "compatibleFullName") +        self.loadString(font, "openTypeNameWWSFamilyName", "WWSFamilyName") +        self.loadString( +            font, "openTypeNameWWSSubfamilyName", "WWSSubfamilyName") +        self.loadString(font, "openTypeNameVersion", "version") +        self.loadString(font, "openTypeNameUniqueID", "uniqueID") +        self.loadString(font, "openTypeNameDescription", "description") +        self.loadString(font, "openTypeNameSampleText", "sampleText")          l = 0          nameLayout.addWidget(preferredFamilyNameLabel, l, 0) @@ -458,52 +424,17 @@ class OpenTypeTab(QWidget):          hheaLayout = QGridLayout(self)          ascenderLabel = QLabel("Ascender:", self) -        if font.info.openTypeHheaAscender is not None: -            ascender = str(font.info.openTypeHheaAscender) -        else: -            ascender = '' -        self.ascenderEdit = QLineEdit(ascender, self) -        self.ascenderEdit.setValidator(QIntValidator(self)) -          descenderLabel = QLabel("Descender:", self) -        if font.info.openTypeHheaDescender is not None: -            descender = str(font.info.openTypeHheaDescender) -        else: -            descender = '' -        self.descenderEdit = QLineEdit(descender, self) -        self.descenderEdit.setValidator(QIntValidator(self)) -          lineGapLabel = QLabel("LineGap:", self) -        if font.info.openTypeHheaLineGap is not None: -            lineGap = str(font.info.openTypeHheaLineGap) -        else: -            lineGap = '' -        self.lineGapEdit = QLineEdit(lineGap, self) -        self.lineGapEdit.setValidator(QIntValidator(self)) -          caretSlopeRiseLabel = QLabel("caretSlopeRise:", self) -        if font.info.openTypeHheaCaretSlopeRise is not None: -            caretSlopeRise = str(font.info.openTypeHheaCaretSlopeRise) -        else: -            caretSlopeRise = '' -        self.caretSlopeRiseEdit = QLineEdit(caretSlopeRise, self) -        self.caretSlopeRiseEdit.setValidator(QIntValidator(self)) -          caretSlopeRunLabel = QLabel("caretSlopeRun:", self) -        if font.info.openTypeHheaCaretSlopeRun is not None: -            caretSlopeRun = str(font.info.openTypeHheaCaretSlopeRun) -        else: -            caretSlopeRun = '' -        self.caretSlopeRunEdit = QLineEdit(caretSlopeRun, self) -        self.caretSlopeRunEdit.setValidator(QIntValidator(self)) -          caretOffsetLabel = QLabel("caretOffset:", self) -        if font.info.openTypeHheaCaretOffset is not None: -            caretOffset = str(font.info.openTypeHheaCaretOffset) -        else: -            caretOffset = '' -        self.caretOffsetEdit = QLineEdit(caretOffset, self) -        self.caretOffsetEdit.setValidator(QIntValidator(self)) +        self.loadInteger(font, "openTypeHheaAscender", "ascender") +        self.loadInteger(font, "openTypeHheaDescender", "descender") +        self.loadInteger(font, "openTypeHheaLineGap", "lineGap") +        self.loadInteger(font, "openTypeHheaCaretSlopeRise", "caretSlopeRise") +        self.loadInteger(font, "openTypeHheaCaretSlopeRun", "caretSlopeRun") +        self.loadInteger(font, "openTypeHheaCaretOffset", "caretOffset")          l = 0          hheaLayout.addWidget(ascenderLabel, l, 0) @@ -527,52 +458,22 @@ class OpenTypeTab(QWidget):          vheaLayout = QGridLayout(self)          vertTypoAscenderLabel = QLabel("vertTypoAscender:", self) -        if font.info.openTypeVheaVertTypoAscender is not None: -            vertTypoAscender = str(font.info.openTypeVheaVertTypoAscender) -        else: -            vertTypoAscender = '' -        self.vertTypoAscenderEdit = QLineEdit(vertTypoAscender, self) -        self.vertTypoAscenderEdit.setValidator(QIntValidator(self)) -          vertTypoDescenderLabel = QLabel("vertTypoDescender:", self) -        if font.info.openTypeVheaVertTypoDescender is not None: -            vertTypoDescender = str(font.info.openTypeVheaVertTypoDescender) -        else: -            vertTypoDescender = '' -        self.vertTypoDescenderEdit = QLineEdit(vertTypoDescender, self) -        self.vertTypoDescenderEdit.setValidator(QIntValidator(self)) -          vertTypoLineGapLabel = QLabel("vertTypoLineGap:", self) -        if font.info.openTypeVheaVertTypoLineGap is not None: -            vertTypoLineGap = str(font.info.openTypeVheaVertTypoLineGap) -        else: -            vertTypoLineGap = '' -        self.vertTypoLineGapEdit = QLineEdit(vertTypoLineGap, self) -        self.vertTypoLineGapEdit.setValidator(QIntValidator(self)) -          vheaCaretSlopeRiseLabel = QLabel("caretSlopeRise:", self) -        if font.info.openTypeVheaCaretSlopeRise is not None: -            vheaCaretSlopeRise = str(font.info.openTypeVheaCaretSlopeRise) -        else: -            vheaCaretSlopeRise = '' -        self.vheaCaretSlopeRiseEdit = QLineEdit(vheaCaretSlopeRise, self) -        self.vheaCaretSlopeRiseEdit.setValidator(QIntValidator(self)) -          vheaCaretSlopeRunLabel = QLabel("caretSlopeRun:", self) -        if font.info.openTypeVheaCaretSlopeRun is not None: -            vheaCaretSlopeRun = str(font.info.openTypeVheaCaretSlopeRun) -        else: -            vheaCaretSlopeRun = '' -        self.vheaCaretSlopeRunEdit = QLineEdit(vheaCaretSlopeRun, self) -        self.vheaCaretSlopeRunEdit.setValidator(QIntValidator(self)) -          vheaCaretOffsetLabel = QLabel("caretOffset:", self) -        if font.info.openTypeVheaCaretOffset is not None: -            vheaCaretOffset = str(font.info.openTypeVheaCaretOffset) -        else: -            vheaCaretOffset = '' -        self.vheaCaretOffsetEdit = QLineEdit(vheaCaretOffset, self) -        self.vheaCaretOffsetEdit.setValidator(QIntValidator(self)) +        self.loadInteger( +            font, "openTypeVheaVertTypoAscender", "vertTypoAscender") +        self.loadInteger( +            font, "openTypeVheaVertTypoDescender", "vertTypoDescender") +        self.loadInteger( +            font, "openTypeVheaVertTypoLineGap", "vertTypoLineGap") +        self.loadInteger( +            font, "openTypeVheaCaretSlopeRise", "vheaCaretSlopeRise") +        self.loadInteger( +            font, "openTypeVheaCaretSlopeRun", "vheaCaretSlopeRun") +        self.loadInteger(font, "openTypeVheaCaretOffset", "vheaCaretOffset")          l = 0          vheaLayout.addWidget(vertTypoAscenderLabel, l, 0) @@ -598,140 +499,298 @@ class OpenTypeTab(QWidget):          self.setLayout(mainLayout)      def writeValues(self, font): -        preferredFamilyName = self.preferredFamilyNameEdit.text() -        if preferredFamilyName != '': -            font.info.openTypeNamePreferredFamilyName = preferredFamilyName -        else: -            font.info.openTypeNamePreferredFamilyName = None -        preferredSubfamilyName = self.preferredSubfamilyNameEdit.text() -        if preferredSubfamilyName != '': -            font.info.openTypeNamePreferredSubfamilyName = \ -                preferredSubfamilyName -        else: -            font.info.openTypeNamePreferredSubfamilyName = None -        WWSFamilyName = self.WWSFamilyNameEdit.text() -        if WWSFamilyName != '': -            font.info.openTypeNameWWSFamilyName = WWSFamilyName -        else: -            font.info.openTypeNameWWSFamilyName = None -        WWSSubfamilyName = self.WWSSubfamilyNameEdit.text() -        if WWSSubfamilyName != '': -            font.info.openTypeNameWWSSubfamilyName = WWSSubfamilyName -        else: -            font.info.openTypeNameWWSSubfamilyName = None -        compatibleFullName = self.compatibleFullNameEdit.text() -        if compatibleFullName != '': -            font.info.openTypeNameCompatibleFullName = compatibleFullName -        else: -            font.info.openTypeNameCompatibleFullName = None -        version = self.versionEdit.text() -        if version != '': -            font.info.openTypeNameVersion = version -        else: -            font.info.openTypeNameVersion = None -        uniqueID = self.uniqueIDEdit.text() -        if uniqueID != '': -            font.info.openTypeNameUniqueID = uniqueID -        else: -            font.info.openTypeNameUniqueID = None -        description = self.descriptionEdit.text() -        if description != '': -            font.info.openTypeNameDescription = description -        else: -            font.info.openTypeNameDescription = None -        sampleText = self.sampleTextEdit.text() -        if sampleText != '': -            font.info.openTypeNameSampleText = sampleText -        else: -            font.info.openTypeNameSampleText = None -        ascender = self.ascenderEdit.text() -        if ascender != '': -            font.info.openTypeHheaAscender = int(ascender) -        else: -            font.info.openTypeHheaAscender = None -        descender = self.descenderEdit.text() -        if descender != '': -            font.info.openTypeHheaDescender = int(descender) -        else: -            font.info.openTypeHheaDescender = None -        lineGap = self.lineGapEdit.text() -        if lineGap != '': -            font.info.openTypeHheaLineGap = int(lineGap) -        else: -            font.info.openTypeHheaLineGap = None -        caretSlopeRise = self.caretSlopeRiseEdit.text() -        if caretSlopeRise != '': -            font.info.openTypeHheaCaretSlopeRise = int(caretSlopeRise) -        else: -            font.info.openTypeHheaCaretSlopeRise = None -        caretSlopeRun = self.caretSlopeRunEdit.text() -        if caretSlopeRun != '': -            font.info.openTypeHheaCaretSlopeRun = int(caretSlopeRun) -        else: -            font.info.openTypeHheaCaretSlopeRun = None -        caretOffset = self.caretOffsetEdit.text() -        if caretOffset != '': -            font.info.openTypeHheaCaretOffset = int(caretOffset) -        else: -            font.info.openTypeHheaCaretOffset = None -        vertTypoAscender = self.vertTypoAscenderEdit.text() -        if vertTypoAscender != '': -            font.info.openTypeVheaAscender = int(vertTypoAscender) -        else: -            font.info.openTypeVheaAscender = None -        vertTypoDescender = self.vertTypoDescenderEdit.text() -        if vertTypoDescender != '': -            font.info.openTypeVheaDescender = int(vertTypoDescender) -        else: -            font.info.openTypeVheaDescender = None -        vertTypoLineGap = self.vertTypoLineGapEdit.text() -        if vertTypoLineGap != '': -            font.info.openTypeVheaLineGap = int(vertTypoLineGap) -        else: -            font.info.openTypeVheaLineGap = None -        vheaCaretSlopeRise = self.vheaCaretSlopeRiseEdit.text() -        if vheaCaretSlopeRise != '': -            font.info.openTypeVheaCaretSlopeRise = int(vheaCaretSlopeRise) -        else: -            font.info.openTypeVheaCaretSlopeRise = None -        vheaCaretSlopeRun = self.vheaCaretSlopeRunEdit.text() -        if vheaCaretSlopeRun != '': -            font.info.openTypeVheaCaretSlopeRun = int(vheaCaretSlopeRun) -        else: -            font.info.openTypeVheaCaretSlopeRun = None -        vheaCaretOffset = self.vheaCaretOffsetEdit.text() -        if vheaCaretOffset != '': -            font.info.openTypeVheaCaretOffset = int(vheaCaretOffset) -        else: -            font.info.openTypeVheaCaretOffset = None +        self.writeString( +            font, "preferredFamilyName", "openTypeNamePreferredFamilyName") +        self.writeString( +            font, "preferredSubfamilyName", +            "openTypeNamePreferredSubfamilyName") +        self.writeString(font, "WWSFamilyName", "openTypeNameWWSFamilyName") +        self.writeString( +            font, "WWSSubfamilyName", "openTypeNameWWSSubfamilyName") +        self.writeString( +            font, "compatibleFullName", "openTypeNameCompatibleFullName") +        self.writeString(font, "version", "openTypeNameVersion") +        self.writeString(font, "uniqueID", "openTypeNameUniqueID") +        self.writeString(font, "description", "openTypeNameDescription") +        self.writeString(font, "sampleText", "openTypeNameSampleText") +        self.writeInteger(font, "ascender", "openTypeHheaAscender") +        self.writeInteger(font, "descender", "openTypeHheaDescender") +        self.writeInteger(font, "lineGap", "openTypeHheaLineGap") +        self.writeInteger(font, "caretSlopeRise", "openTypeHheaCaretSlopeRise") +        self.writeInteger(font, "caretSlopeRun", "openTypeHheaCaretSlopeRun") +        self.writeInteger(font, "caretOffset", "openTypeHheaCaretOffset") +        self.writeInteger( +            font, "vertTypoAscender", "openTypeVheaVertTypoAscender") +        self.writeInteger( +            font, "vertTypoDescender", "openTypeVheaVertTypoDescender") +        self.writeInteger( +            font, "vertTypoLineGap", "openTypeVheaVertTypoLineGap") +        self.writeInteger( +            font, "vheaCaretSlopeRise", "openTypeVheaCaretSlopeRise") +        self.writeInteger( +            font, "vheaCaretSlopeRun", "openTypeVheaCaretSlopeRun") +        self.writeInteger(font, "vheaCaretOffset", "openTypeVheaCaretOffset") + + +class OS2Tab(TabWidget): + +    def __init__(self, font, parent=None): +        super().__init__(parent, name="OS/2") + +        # OS2Group = QGroupBox("OS/2 table", self) +        # OS2Group.setFlat(True) +        OS2Layout = QGridLayout(self) + +        usWidthClassLabel = QLabel("usWidthClass:", self) +        self.usWidthClassDrop = QComboBox(self) +        items = [ +            "None", "Ultra-condensed", "Extra-condensed", "Condensed", +            "Semi-Condensed", "Medium (normal)", "Semi-expanded", "Expanded", +            "Extra-expanded", "Ultra-expanded"] +        self.usWidthClassDrop.insertItems(0, items) +        if font.info.openTypeOS2WidthClass is not None: +            self.usWidthClassDrop.setCurrentIndex( +                font.info.openTypeOS2WidthClass) + +        fsSelectionLabel = QLabel("fsSelection:", self) +        fsSelection = font.info.openTypeOS2Selection +        self.fsSelectionList = QListView(self) +        items = [ +            "1 UNDERSCORE", "2 NEGATIVE", "3 OUTLINED", "4 STRIKEOUT", +            "7 USE_TYPO_METRICS", "8 WWS", "9 OBLIQUE"] +        # http://stackoverflow.com/a/26613163 +        model = QStandardItemModel(7, 1) +        for index, elem in enumerate(items): +            item = QStandardItem() +            item.setText(elem) +            item.setCheckable(True) +            bit = index + 1 +            if fsSelection is not None and bit in fsSelection: +                # maybe default setting? if so, unneeded +                item.setCheckState(Qt.Checked) +            else: +                item.setCheckState(Qt.Unchecked) +            model.setItem(index, item) +        self.fsSelectionList.setModel(model) + +        achVendorIDLabel = QLabel("achVendorID:", self) +        self.achVendorIDEdit = QLineEdit(font.info.openTypeOS2VendorID, self) +        self.achVendorIDEdit.setMaxLength(4) + +        fsTypeLabel = QLabel("fsType:", self) +        fsType = font.info.openTypeOS2Type +        self.fsTypeDrop = QComboBox(self) +        items = [ +            "No embedding restrictions", "Restricted embedding", +            "Preview and print embedding allowed", +            "Editable embedding allowed"] +        self.allowSubsettingBox = QCheckBox("Allow subsetting", self) +        self.allowBitmapEmbeddingBox = QCheckBox( +            "Allow only bitmap embedding", self) +        self.fsTypeDrop.currentIndexChanged[int].connect( +            self._updateFsTypeVisibility) +        self.fsTypeDrop.insertItems(0, items) +        if fsType is not None: +            for i in range(1, 4): +                if i in fsType: +                    self.fsTypeDrop.setCurrentIndex(i) +                    break +            self.allowSubsettingBox.setChecked(8 not in fsType) +            self.allowBitmapEmbeddingBox.setChecked(9 in fsType) + +        # XXX: ulUnicodeRange + +        # XXX: ulCodePageRange + +        sTypoAscenderLabel = QLabel("sTypoAscender:", self) +        sTypoDescenderLabel = QLabel("sTypoDescender:", self) +        sTypoLineGapLabel = QLabel("sTypoLineGap:", self) +        usWeightClassLabel = QLabel("usWeightClass:", self) +        usWinAscentLabel = QLabel("usWinAscent:", self) +        usWinDescentLabel = QLabel("usWinDescent:", self) +        ySubscriptXSizeLabel = QLabel("ySubscriptXSize:", self) +        ySubscriptYSizeLabel = QLabel("ySubscriptYSize:", self) +        ySubscriptXOffsetLabel = QLabel("ySubscriptXOffset:", self) +        ySubscriptYOffsetLabel = QLabel("ySubscriptYOffset:", self) +        ySuperscriptXSizeLabel = QLabel("ySuperscriptXSize:", self) +        ySuperscriptYSizeLabel = QLabel("ySuperscriptYSize:", self) +        ySuperscriptXOffsetLabel = QLabel("ySuperscriptXOffset:", self) +        ySuperscriptYOffsetLabel = QLabel("ySuperscriptYOffset:", self) +        yStrikeoutSizeLabel = QLabel("yStrikeoutSize:", self) +        yStrikeoutPositionLabel = QLabel("yStrikeoutPosition:", self) +        self.loadPositiveInteger( +            font, "openTypeOS2WeightClass", "usWeightClass") +        self.loadInteger(font, "openTypeOS2TypoAscender", "sTypoAscender") +        self.loadInteger(font, "openTypeOS2TypoDescender", "sTypoDescender") +        self.loadInteger(font, "openTypeOS2TypoLineGap", "sTypoLineGap") +        self.loadPositiveInteger(font, "openTypeOS2WinAscent", "usWinAscent") +        self.loadPositiveInteger(font, "openTypeOS2WinDescent", "usWinDescent") +        self.loadInteger(font, "openTypeOS2SubscriptXSize", "ySubscriptXSize") +        self.loadInteger(font, "openTypeOS2SubscriptYSize", "ySubscriptYSize") +        self.loadInteger( +            font, "openTypeOS2SubscriptXOffset", "ySubscriptXOffset") +        self.loadInteger( +            font, "openTypeOS2SubscriptYOffset", "ySubscriptYOffset") +        self.loadInteger( +            font, "openTypeOS2SuperscriptXSize", "ySuperscriptXSize") +        self.loadInteger( +            font, "openTypeOS2SuperscriptYSize", "ySuperscriptYSize") +        self.loadInteger( +            font, "openTypeOS2SuperscriptXOffset", "ySuperscriptXOffset") +        self.loadInteger( +            font, "openTypeOS2SuperscriptYOffset", "ySuperscriptYOffset") +        self.loadInteger(font, "openTypeOS2StrikeoutSize", "yStrikeoutSize") +        self.loadInteger( +            font, "openTypeOS2StrikeoutPosition", "yStrikeoutPosition") + +        # XXX: panose + +        l = 0 +        OS2Layout.addWidget(usWidthClassLabel, l, 0) +        OS2Layout.addWidget(self.usWidthClassDrop, l, 1, 1, 2) +        OS2Layout.addWidget(achVendorIDLabel, l, 3) +        OS2Layout.addWidget(self.achVendorIDEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(usWeightClassLabel, l, 0) +        OS2Layout.addWidget(self.usWeightClassEdit, l, 1, 1, 2) +        l += 1 +        OS2Layout.addWidget(fsSelectionLabel, l, 0, 3, 1) +        OS2Layout.addWidget(self.fsSelectionList, l, 1, 3, 2) +        OS2Layout.addWidget(fsTypeLabel, l, 3, 3, 1) +        OS2Layout.addWidget(self.fsTypeDrop, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(self.allowSubsettingBox, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(self.allowBitmapEmbeddingBox, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(sTypoAscenderLabel, l, 0) +        OS2Layout.addWidget(self.sTypoAscenderEdit, l, 1, 1, 2) +        OS2Layout.addWidget(usWinAscentLabel, l, 3) +        OS2Layout.addWidget(self.usWinAscentEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(sTypoDescenderLabel, l, 0) +        OS2Layout.addWidget(self.sTypoDescenderEdit, l, 1, 1, 2) +        OS2Layout.addWidget(usWinDescentLabel, l, 3) +        OS2Layout.addWidget(self.usWinDescentEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(sTypoLineGapLabel, l, 0) +        OS2Layout.addWidget(self.sTypoLineGapEdit, l, 1, 1, 2) +        l += 1 +        OS2Layout.addWidget(ySubscriptXSizeLabel, l, 0) +        OS2Layout.addWidget(self.ySubscriptXSizeEdit, l, 1, 1, 2) +        OS2Layout.addWidget(ySubscriptXOffsetLabel, l, 3) +        OS2Layout.addWidget(self.ySubscriptXOffsetEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(ySubscriptYSizeLabel, l, 0) +        OS2Layout.addWidget(self.ySubscriptYSizeEdit, l, 1, 1, 2) +        OS2Layout.addWidget(ySubscriptYOffsetLabel, l, 3) +        OS2Layout.addWidget(self.ySubscriptYOffsetEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(ySuperscriptXSizeLabel, l, 0) +        OS2Layout.addWidget(self.ySuperscriptXSizeEdit, l, 1, 1, 2) +        OS2Layout.addWidget(ySuperscriptXOffsetLabel, l, 3) +        OS2Layout.addWidget(self.ySuperscriptXOffsetEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(ySuperscriptYSizeLabel, l, 0) +        OS2Layout.addWidget(self.ySuperscriptYSizeEdit, l, 1, 1, 2) +        OS2Layout.addWidget(ySuperscriptYOffsetLabel, l, 3) +        OS2Layout.addWidget(self.ySuperscriptYOffsetEdit, l, 4, 1, 2) +        l += 1 +        OS2Layout.addWidget(yStrikeoutSizeLabel, l, 0) +        OS2Layout.addWidget(self.yStrikeoutSizeEdit, l, 1, 1, 2) +        OS2Layout.addWidget(yStrikeoutPositionLabel, l, 3) +        OS2Layout.addWidget(self.yStrikeoutPositionEdit, l, 4, 1, 2) +        # OS2Group.setLayout(OS2Layout) +        self.setLayout(OS2Layout) + +    def _updateFsTypeVisibility(self, index): +        if index == 0: +            # TODO: maybe uncheck as well? +            self.allowSubsettingBox.setEnabled(False) +            self.allowBitmapEmbeddingBox.setEnabled(False) +        else: +            self.allowSubsettingBox.setEnabled(True) +            self.allowBitmapEmbeddingBox.setEnabled(True) +    def writeValues(self, font): -class PostScriptTab(QWidget): -    name = "Postscript" +        self.writePositiveInteger( +            font, "usWeightClass", "openTypeOS2WeightClass") +        self.writeInteger(font, "sTypoAscender", "openTypeOS2TypoAscender") +        self.writeInteger(font, "sTypoDescender", "openTypeOS2TypoDescender") +        self.writeInteger(font, "sTypoLineGap", "openTypeOS2TypoLineGap") +        self.writePositiveInteger(font, "usWinAscent", "openTypeOS2WinAscent") +        self.writePositiveInteger( +            font, "usWinDescent", "openTypeOS2WinDescent") +        self.writeInteger(font, "ySubscriptXSize", "openTypeOS2SubscriptXSize") +        self.writeInteger(font, "ySubscriptYSize", "openTypeOS2SubscriptYSize") +        self.writeInteger( +            font, "ySubscriptXOffset", "openTypeOS2SubscriptXOffset") +        self.writeInteger( +            font, "ySubscriptYOffset", "openTypeOS2SubscriptYOffset") +        self.writeInteger( +            font, "ySuperscriptXSize", "openTypeOS2SuperscriptXSize") +        self.writeInteger( +            font, "ySuperscriptYSize", "openTypeOS2SuperscriptYSize") +        self.writeInteger( +            font, "ySuperscriptXOffset", "openTypeOS2SuperscriptXOffset") +        self.writeInteger( +            font, "ySuperscriptYOffset", "openTypeOS2SuperscriptYOffset") +        self.writeInteger(font, "yStrikeoutSize", "openTypeOS2StrikeoutSize") +        self.writeInteger( +            font, "yStrikeoutPosition", "openTypeOS2StrikeoutPosition") + +        fsSelectionModel = self.fsSelectionList.model() +        fsSelection = [] +        for i in range(7): +            item = fsSelectionModel.item(i) +            if item.checkState() == Qt.Checked: +                fsSelection.append(i) +        if len(fsSelection): +            font.info.openTypeOS2Selection = fsSelection +        else: +            # XXX: None or empty array? should distinct those cases +            font.info.openTypeOS2Selection = None + +        fsTypeIndex = self.fsTypeDrop.currentIndex() +        fsType = [] +        if fsTypeIndex > 0: +            fsType.append(fsTypeIndex) +            if not self.allowSubsettingBox.isChecked(): +                fsType.append(8) +            if self.allowBitmapEmbeddingBox.isChecked(): +                fsType.append(9) +        # TODO: provide a way to represent None w this? +        font.info.openTypeOS2Type = fsType + +        # TODO: see if data needs to be padded to 4 chars. +        # I think that this is to be deferred to ufo2fdk(?) +        font.info.openTypeOS2VendorID = self.achVendorIDEdit.text() + +        # XXX: ulUnicodeRange + +        # XXX: ulCodePageRange + +        # XXX: panose + + +class PostScriptTab(TabWidget):      def __init__(self, font, parent=None): -        super(PostScriptTab, self).__init__(parent) +        super().__init__(parent, name="PostScript")          namingGroup = QGroupBox("Naming", self)          # namingGroup.setFlat(True)          namingLayout = QGridLayout(self)          fontNameLabel = QLabel("FontName:", self) -        self.fontNameEdit = QLineEdit(font.info.postscriptFontName, self) -          fullNameLabel = QLabel("FullName:", self) -        self.fullNameEdit = QLineEdit(font.info.postscriptFullName, self) -          weightNameLabel = QLabel("WeightName:", self) -        self.weightNameEdit = QLineEdit(font.info.postscriptWeightName, self) -          uniqueIDLabel = QLabel("Unique ID:", self) -        if font.info.postscriptUniqueID is not None: -            uniqueID = str(font.info.postscriptUniqueID) -        else: -            uniqueID = '' -        self.uniqueIDEdit = QLineEdit(uniqueID, self) -        self.uniqueIDEdit.setValidator(QIntValidator(self)) +        self.loadString(font, "postscriptFontName", "fontName") +        self.loadString(font, "postscriptFullName", "fullName") +        self.loadString(font, "postscriptWeightName", "weightName") +        self.loadInteger(font, "postscriptUniqueID", "uniqueID")          l = 0          namingLayout.addWidget(fontNameLabel, l, 0) @@ -749,25 +808,15 @@ class PostScriptTab(QWidget):          # hintingGroup.setFlat(True)          hintingLayout = QGridLayout(self) +        self.loadIntegerFloatList(font, "postscriptBlueValues", "blueValues") +        self.loadIntegerFloatList(font, "postscriptOtherBlues", "otherBlues") +        self.loadIntegerFloatList(font, "postscriptFamilyBlues", "familyBlues") +        self.loadIntegerFloatList( +            font, "postscriptFamilyOtherBlues", "familyOtherBlues")          blueValuesLabel = QLabel("Blue values:", self) -        blueValues = " ".join(str(val) -                              for val in font.info.postscriptBlueValues) -        self.blueValuesEdit = QLineEdit(blueValues, self) -          otherBluesLabel = QLabel("Other blues:", self) -        otherBlues = " ".join(str(val) -                              for val in font.info.postscriptOtherBlues) -        self.otherBluesEdit = QLineEdit(otherBlues, self) -          familyBluesLabel = QLabel("Family blues:", self) -        familyBlues = " ".join(str(val) -                               for val in font.info.postscriptFamilyBlues) -        self.familyBluesEdit = QLineEdit(familyBlues, self) -          familyOtherBluesLabel = QLabel("Family other blues:", self) -        familyOtherBlues = " ".join( -            str(val) for val in font.info.postscriptFamilyOtherBlues) -        self.familyOtherBluesEdit = QLineEdit(familyOtherBlues, self)          l = 0          hintingLayout.addWidget(blueValuesLabel, l, 0) @@ -782,45 +831,18 @@ class PostScriptTab(QWidget):          l += 1          blueFuzzLabel = QLabel("Blue fuzz:", self) -        if font.info.postscriptBlueFuzz is not None: -            blueFuzz = str(font.info.postscriptBlueFuzz) -        else: -            blueFuzz = '' -        self.blueFuzzEdit = QLineEdit(blueFuzz, self) -        self.blueFuzzEdit.setValidator(QDoubleValidator(self)) -          stemSnapHLabel = QLabel("StemSnapH:", self) -        stemSnapH = " ".join(str(val) for val in font.info.postscriptStemSnapH) -        self.stemSnapHEdit = QLineEdit(stemSnapH, self) -          blueScaleLabel = QLabel("Blue scale:", self) -        if font.info.postscriptBlueScale is not None: -            blueScale = str(font.info.postscriptBlueScale) -        else: -            blueScale = '' -        self.blueScaleEdit = QLineEdit(blueScale, self) -        self.blueScaleEdit.setValidator(QDoubleValidator(self)) -          stemSnapVLabel = QLabel("StemSnapV:", self) -        stemSnapV = " ".join(str(val) for val in font.info.postscriptStemSnapV) -        self.stemSnapVEdit = QLineEdit(stemSnapV, self) -          blueShiftLabel = QLabel("Blue shift:", self) -        if font.info.postscriptBlueShift is not None: -            blueShift = str(font.info.postscriptBlueShift) -        else: -            blueShift = '' -        self.blueShiftEdit = QLineEdit(blueShift, self) -        self.blueShiftEdit.setValidator(QDoubleValidator(self)) +        self.loadIntegerFloatList(font, "postscriptStemSnapH", "stemSnapH") +        self.loadIntegerFloatList(font, "postscriptStemSnapV", "stemSnapV") +        self.loadIntegerFloat(font, "postscriptBlueFuzz", "blueFuzz") +        self.loadIntegerFloat(font, "postscriptBlueScale", "blueScale") +        self.loadIntegerFloat(font, "postscriptBlueShift", "blueShift")          forceBoldLabel = QLabel("Force bold:", self) -        forceBold = font.info.postscriptForceBold -        self.forceBoldBox = QCheckBox(self) -        self.forceBoldBox.setTristate() -        if forceBold is None: -            self.forceBoldBox.setCheckState(Qt.PartiallyChecked) -        else: -            self.forceBoldBox.setChecked(forceBold) +        self.loadBoolean(font, "postscriptForceBold", "forceBold")          hintingLayout.addWidget(blueFuzzLabel, l, 0)          hintingLayout.addWidget(self.blueFuzzEdit, l, 1, 1, 2) @@ -843,53 +865,20 @@ class PostScriptTab(QWidget):          metricsLayout = QGridLayout(self)          defaultWidthXLabel = QLabel("DefaultWidthX:", self) -        if font.info.postscriptDefaultWidthX is not None: -            defaultWidthX = str(font.info.postscriptDefaultWidthX) -        else: -            defaultWidthX = '' -        self.defaultWidthXEdit = QLineEdit(defaultWidthX, self) -        self.defaultWidthXEdit.setValidator(QDoubleValidator(self)) -          underlineThicknessLabel = QLabel("UnderlineThickness:", self) -        if font.info.postscriptUnderlineThickness is not None: -            underlineThickness = str(font.info.postscriptUnderlineThickness) -        else: -            underlineThickness = '' -        self.underlineThicknessEdit = QLineEdit(underlineThickness, self) -        self.underlineThicknessEdit.setValidator(QDoubleValidator(self)) -          nominalWidthXLabel = QLabel("NominalWidthX:", self) -        if font.info.postscriptNominalWidthX is not None: -            nominalWidthX = str(font.info.postscriptNominalWidthX) -        else: -            nominalWidthX = '' -        self.nominalWidthXEdit = QLineEdit(nominalWidthX, self) -        self.nominalWidthXEdit.setValidator(QDoubleValidator(self)) -          underlinePositionLabel = QLabel("UnderlinePosition:", self) -        if font.info.postscriptUnderlinePosition is not None: -            underlinePosition = str(font.info.postscriptUnderlinePosition) -        else: -            underlinePosition = '' -        self.underlinePositionEdit = QLineEdit(underlinePosition, self) -        self.underlinePositionEdit.setValidator(QDoubleValidator(self)) -          slantAngleLabel = QLabel("SlantAngle:", self) -        if font.info.postscriptSlantAngle is not None: -            slantAngle = str(font.info.postscriptSlantAngle) -        else: -            slantAngle = '' -        self.slantAngleEdit = QLineEdit(slantAngle, self) -        self.slantAngleEdit.setValidator(QDoubleValidator(self)) +        self.loadIntegerFloat(font, "postscriptDefaultWidthX", "defaultWidthX") +        self.loadIntegerFloat(font, "postscriptNominalWidthX", "nominalWidthX") +        self.loadIntegerFloat( +            font, "postscriptUnderlineThickness", "underlineThickness") +        self.loadIntegerFloat( +            font, "postscriptUnderlinePosition", "underlinePosition") +        self.loadIntegerFloat(font, "postscriptSlantAngle", "slantAngle")          isFixedPitchLabel = QLabel("isFixedPitched:", self) -        isFixedPitch = font.info.postscriptIsFixedPitch -        self.isFixedPitchBox = QCheckBox(self) -        self.isFixedPitchBox.setTristate() -        if isFixedPitch is None: -            self.isFixedPitchBox.setCheckState(Qt.PartiallyChecked) -        else: -            self.isFixedPitchBox.setChecked(isFixedPitch) +        self.loadBoolean(font, "postscriptIsFixedPitch", "isFixedPitch")          l = 0          metricsLayout.addWidget(defaultWidthXLabel, l, 0) @@ -913,8 +902,7 @@ class PostScriptTab(QWidget):          charactersLayout = QGridLayout(self)          defaultCharacterLabel = QLabel("Default character:", self) -        self.defaultCharacterEdit = QLineEdit( -            font.info.postscriptDefaultCharacter, self) +        self.loadString(font, "postscriptDefaultCharacter", "defaultCharacter")          windowsCharacterSetLabel = QLabel("Windows character set:", self)          self.windowsCharacterSetDrop = QComboBox(self) @@ -943,150 +931,37 @@ class PostScriptTab(QWidget):          self.setLayout(mainLayout)      def writeValues(self, font): -        fontName = self.fontNameEdit.text() -        if fontName != '': -            font.info.postscriptFontName = fontName -        else: -            font.info.postscriptFontName = None -        fullName = self.fullNameEdit.text() -        if fullName != '': -            font.info.postscriptFullName = fullName -        else: -            font.info.postscriptFullName = None -        weightName = self.weightNameEdit.text() -        if weightName != '': -            font.info.postscriptWeightName = weightName -        else: -            font.info.postscriptWeightName = None -        uniqueID = self.uniqueIDEdit.text() -        if uniqueID != '': -            font.info.postscriptUniqueID = int(uniqueID) -        else: -            font.info.postscriptUniqueID = None -        blueValues = self.blueValuesEdit.text().split(" ") -        if blueValues is None: -            font.info.postscriptBlueValues = None -        else: -            blues = [] -            for blue in blueValues: -                if blue != '': -                    blues.append(int(blue)) -            font.info.postscriptBlueValues = blues -        otherBlues = self.otherBluesEdit.text().split(" ") -        if otherBlues is None: -            font.info.postscriptOtherBlues = None -        else: -            blues = [] -            for blue in otherBlues: -                if blue != '': -                    blues.append(int(blue)) -            font.info.postscriptOtherBlues = blues -        familyBlues = self.familyBluesEdit.text().split(" ") -        if familyBlues is None: -            font.info.postscriptFamilyBlues = None -        else: -            blues = [] -            for blue in familyBlues: -                if blue != '': -                    blues.append(int(blue)) -            font.info.postscriptFamilyBlues = blues -        familyOtherBlues = self.familyOtherBluesEdit.text().split(" ") -        if familyOtherBlues is None: -            font.info.postscriptFamilyOtherBlues = None -        else: -            blues = [] -            for blue in familyOtherBlues: -                if blue != '': -                    blues.append(int(blue)) -            font.info.postscriptFamilyOtherBlues = blues -        blueFuzz = self.blueFuzzEdit.text() -        if "." in blueFuzz: -            font.info.postscriptBlueFuzz = float(blueFuzz) -        elif blueFuzz != '': -            font.info.postscriptBlueFuzz = int(blueFuzz) -        else: -            font.info.postscriptBlueFuzz = None -        blueScale = self.blueScaleEdit.text() -        if blueScale != '': -            font.info.postscriptBlueScale = float(blueScale) -        else: -            font.info.postscriptBlueScale = None -        blueShift = self.blueShiftEdit.text() -        if "." in blueShift: -            font.info.postscriptBlueShift = float(blueShift) -        elif blueShift != '': -            font.info.postscriptBlueShift = int(blueShift) -        else: -            font.info.postscriptBlueShift = None -        stemSnapH = self.stemSnapHEdit.text().split(" ") -        if stemSnapH is None: -            font.info.postscriptStemSnapH = None -        else: -            stems = [] -            for stem in stemSnapH: -                if stem != '': -                    stems.append(int(stem)) -            font.info.postscriptStemSnapH = stems -        stemSnapV = self.stemSnapVEdit.text().split(" ") -        if stemSnapV is None: -            font.info.postscriptStemSnapV = None -        else: -            stems = [] -            for stem in stemSnapV: -                if stem != '': -                    stems.append(int(stem)) -            font.info.postscriptStemSnapV = stems -        forceBold = self.forceBoldBox.checkState() -        if forceBold == Qt.PartiallyChecked: -            font.info.postscriptForceBold = None -        else: -            font.info.postscriptForceBold = bool(forceBold) -        defaultWidthX = self.defaultWidthXEdit.text() -        if "." in defaultWidthX: -            font.info.postscriptDefaultWidthX = float(defaultWidthX) -        elif defaultWidthX != '': -            font.info.postscriptDefaultWidthX = int(defaultWidthX) -        else: -            font.info.postscriptDefaultWidthX = None -        nominalWidthX = self.nominalWidthXEdit.text() -        if "." in nominalWidthX: -            font.info.postscriptNominalWidthX = float(nominalWidthX) -        elif nominalWidthX != '': -            font.info.postscriptNominalWidthX = int(nominalWidthX) -        else: -            font.info.postscriptNominalWidthX = None -        underlineThickness = self.underlineThicknessEdit.text() -        if "." in underlineThickness: -            font.info.postscriptUnderlineThickness = float(underlineThickness) -        elif underlineThickness != '': -            font.info.postscriptUnderlineThickness = \ -                int(underlineThickness) -        else: -            font.info.postscriptUnderlineThickness = None -        underlinePosition = self.underlinePositionEdit.text() -        if "." in underlinePosition: -            font.info.postscriptUnderlinePosition = float(underlinePosition) -        elif underlinePosition != '': -            font.info.postscriptUnderlinePosition = int(underlinePosition) -        else: -            font.info.postscriptUnderlinePosition = None -        slantAngle = self.slantAngleEdit.text() -        if "." in slantAngle: -            font.info.postscriptSlantAngle = float(slantAngle) -        elif slantAngle != '': -            font.info.postscriptSlantAngle = int(slantAngle) -        else: -                font.info.postscriptSlantAngle = None -        isFixedPitch = self.isFixedPitchBox.checkState() -        if isFixedPitch == Qt.PartiallyChecked: -            font.info.postscriptIsFixedPitch = None -        else: -            font.info.postscriptIsFixedPitch = bool(isFixedPitch) -        defaultCharacter = self.defaultCharacterEdit.text() -        if defaultCharacter != '': -            font.info.postscriptDefaultCharacter = defaultCharacter -        else: -            font.info.postscriptDefaultCharacter = None +        self.writeString(font, "fontName", "postscriptFontName") +        self.writeString(font, "fullName", "postscriptFullName") +        self.writeString(font, "weightName", "postscriptWeightName") +        self.writeInteger(font, "uniqueID", "postscriptUniqueID") +        self.writeIntegerFloatList(font, "blueValues", "postscriptBlueValues") +        self.writeIntegerFloatList(font, "otherBlues", "postscriptOtherBlues") +        self.writeIntegerFloatList( +            font, "familyBlues", "postscriptFamilyBlues") +        self.writeIntegerFloatList( +            font, "familyOtherBlues", "postscriptFamilyOtherBlues") +        self.writeIntegerFloatList(font, "stemSnapH", "postscriptStemSnapH") +        self.writeIntegerFloatList(font, "stemSnapV", "postscriptStemSnapV") +        self.writeIntegerFloat(font, "blueFuzz", "postscriptBlueFuzz") +        self.writeIntegerFloat(font, "blueScale", "postscriptBlueScale") +        self.writeIntegerFloat(font, "blueShift", "postscriptBlueShift") +        self.writeIntegerFloat( +            font, "defaultWidthX", "postscriptDefaultWidthX") +        self.writeIntegerFloat( +            font, "nominalWidthX", "postscriptNominalWidthX") +        self.writeIntegerFloat( +            font, "underlineThickness", "postscriptUnderlineThickness") +        self.writeIntegerFloat( +            font, "underlinePosition", "postscriptUnderlinePosition") +        self.writeIntegerFloat(font, "slantAngle", "postscriptSlantAngle") + +        self.writeBoolean(font, "forceBold", "postscriptForceBold") +        self.writeBoolean(font, "isFixedPitch", "postscriptIsFixedPitch") + +        self.writeString( +            font, "defaultCharacter", "postscriptDefaultCharacter") +          windowsCharacterSet = self.windowsCharacterSetDrop.currentIndex()          if windowsCharacterSet == 0:              font.info.postscriptWindowsCharacterSet = None | 
