aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrien Tétar2015-05-26 21:53:37 +0200
committerAdrien Tétar2015-05-26 21:53:37 +0200
commitecc65d68e0b990399c38e671b48434246dd17592 (patch)
treeef0a39254e9d3605d957e5311add243c372b17e2
parentebf00c3a324a4bc11bab15fb59c2ca2c480aba9c (diff)
downloadtrufont-ecc65d68e0b990399c38e671b48434246dd17592.tar.bz2
fontInfo: shufflings, featEditor, fixes
-rw-r--r--Lib/defconQt/fontView.py2
-rw-r--r--Lib/defconQt/fontinfo.py95
-rw-r--r--Lib/defconQt/spacecenter.py2
-rw-r--r--Lib/defconQt/syntaxhighlighter.py81
4 files changed, 97 insertions, 83 deletions
diff --git a/Lib/defconQt/fontView.py b/Lib/defconQt/fontView.py
index 5d242ae..beb86d6 100644
--- a/Lib/defconQt/fontView.py
+++ b/Lib/defconQt/fontView.py
@@ -313,7 +313,7 @@ class MainWindow(QMainWindow):
def newFile(self):
# TODO: ask for save before leaving
self.font = Font()
- self.font.info.upm = 1000
+ self.font.info.unitsPerEm = 1000
self.font.info.ascender = 750
self.font.info.descender = -250
self.font.info.capHeight = 750
diff --git a/Lib/defconQt/fontinfo.py b/Lib/defconQt/fontinfo.py
index 30cbcb2..492f92f 100644
--- a/Lib/defconQt/fontinfo.py
+++ b/Lib/defconQt/fontinfo.py
@@ -1,6 +1,6 @@
-from PyQt5.QtCore import Qt
+from PyQt5.QtCore import QDate, QDateTime, QTime, Qt
from PyQt5.QtGui import QDoubleValidator, QIntValidator
-from PyQt5.QtWidgets import QComboBox, QDialog, QDialogButtonBox, QFrame, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QScrollArea, QTabWidget, QVBoxLayout, QWidget
+from PyQt5.QtWidgets import QComboBox, QDateTimeEdit, QDialog, QDialogButtonBox, QFrame, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QScrollArea, QTabWidget, QVBoxLayout, QWidget
class TabDialog(QDialog):
@@ -9,7 +9,8 @@ class TabDialog(QDialog):
# TODO: figure a proper correspondence to set and fetch widgets...
self.tabs = {
- "General": 0
+ "General": 0,
+ "Metrics": 1
}
self.font = font
@@ -33,6 +34,7 @@ class TabDialog(QDialog):
def accept(self):
self.tabWidget.widget(self.tabs["General"]).writeValues(self.font)
+ self.tabWidget.widget(self.tabs["Metrics"]).writeValues(self.font)
super(TabDialog, self).accept()
class GeneralTab(QWidget):
@@ -83,24 +85,41 @@ class GeneralTab(QWidget):
# 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/
versionLabel = QLabel("Version:", self)
- self.versionMajorEdit = QLineEdit(str(font.info.versionMajor or ''), self)
+ versionMajor = str(font.info.versionMajor) if font.info.versionMajor is not None else ''
+ self.versionMajorEdit = QLineEdit(versionMajor, self)
self.versionMajorEdit.setAlignment(Qt.AlignRight)
self.versionMajorEdit.setValidator(QIntValidator(self))
versionDotLabel = QLabel(".", self)
- self.versionMinorEdit = QLineEdit(str(font.info.versionMinor or ''), self)#.zfill(3))
+ versionMinor = str(font.info.versionMinor) if font.info.versionMinor is not None else ''
+ self.versionMinorEdit = QLineEdit(versionMinor, self)
self.versionMinorEdit.setValidator(QIntValidator(self))
mainLayout.addWidget(versionLabel, 6, 0)
mainLayout.addWidget(self.versionMajorEdit, 6, 1)
mainLayout.addWidget(versionDotLabel, 6, 2)
mainLayout.addWidget(self.versionMinorEdit, 6, 3)
+
+ dateCreatedLabel = QLabel("Date created:", self)
+ dateTime = QDateTime()
+ #dateTime.fromString(font.info.openTypeHeadCreated, "yyyy/MM/dd hh:mm:ss") # XXX: why does this not work?
+ dateCreated = font.info.openTypeHeadCreated
+ if dateCreated:
+ parse = dateCreated.split(" ")
+ if len(parse) == 2:
+ date = parse[0].split("/")
+ date = QDate(*(int(val) for val in date))
+ dateTime.setDate(date)
+ time = parse[1].split(":")
+ time = QTime(*(int(val) for val in time))
+ dateTime.setTime(time)
+ if not dateCreated:
+ cur = QDateTime.currentDateTime()
+ dateTime.setDate(cur.date())
+ dateTime.setTime(cur.time())
+ self.dateCreatedEdit = QDateTimeEdit(dateTime, self)
- unitsPerEmLabel = QLabel("Units per em:", self)
- self.unitsPerEmEdit = QLineEdit(str(font.info.unitsPerEm or ''), self)
- self.unitsPerEmEdit.setValidator(QIntValidator(self))
-
- mainLayout.addWidget(unitsPerEmLabel, 6, 4)
- mainLayout.addWidget(self.unitsPerEmEdit, 6, 5)
+ mainLayout.addWidget(dateCreatedLabel, 6, 4)
+ mainLayout.addWidget(self.dateCreatedEdit, 6, 5)
licenseLabel = QLabel("License:", self)
self.licenseEdit = QLineEdit(font.info.openTypeNameLicense, self)
@@ -130,9 +149,11 @@ class GeneralTab(QWidget):
font.info.openTypeNameManufacturer = self.manufacturerEdit.text()
font.info.openTypeNameManufacturerURL = self.manufacturerURLEdit.text()
font.info.copyright = self.copyrightEdit.text()
- font.info.versionMajor = int(self.versionMajorEdit.text())
- font.info.versionMinor = int(self.versionMinorEdit.text())
- font.info.unitsPerEm = int(self.unitsPerEmEdit.text())
+ versionMajor = self.versionMajorEdit.text()
+ font.info.versionMajor = int(versionMajor) if versionMajor else None
+ versionMinor = self.versionMinorEdit.text()
+ font.info.versionMinor = int(versionMinor) if versionMinor else None
+ font.info.openTypeHeadCreated = self.dateCreatedEdit.dateTime().toString("yyyy/MM/dd hh:mm:ss")
font.info.openTypeNameLicense = self.licenseEdit.text()
font.info.openTypeNameLicenseURL = self.licenseURLEdit.text()
font.info.trademark = self.trademarkEdit.text()
@@ -173,36 +194,48 @@ class NextTab(QWidget):
mainLayout.addWidget(self.styleMapStyleDrop, 0, 5)
ascenderLabel = QLabel("Ascender:", self)
- self.ascenderEdit = QLineEdit(str(font.info.ascender or ''), self)
+ ascender = str(font.info.ascender) if font.info.ascender is not None else ''
+ self.ascenderEdit = QLineEdit(ascender, self)
self.ascenderEdit.setValidator(QIntValidator(self))
descenderLabel = QLabel("Descender:", self)
- self.descenderEdit = QLineEdit(str(font.info.descender or ''), self)
+ descender = str(font.info.descender) if font.info.descender is not None else ''
+ self.descenderEdit = QLineEdit(descender, self)
self.descenderEdit.setValidator(QIntValidator(self))
-
- italicAngleLabel = QLabel("Italic angle:", self)
- self.italicAngleEdit = QLineEdit(str(font.info.italicAngle or ''), self)
- self.italicAngleEdit.setValidator(QDoubleValidator(self))
+
+ unitsPerEmLabel = QLabel("Units per em:", self)
+ unitsPerEm = str(font.info.unitsPerEm) if font.info.unitsPerEm is not None else ''
+ self.unitsPerEmEdit = QLineEdit(unitsPerEm, self)
+ self.unitsPerEmEdit.setValidator(QIntValidator(self))
mainLayout.addWidget(ascenderLabel, 1, 0)
mainLayout.addWidget(self.ascenderEdit, 1, 1)
mainLayout.addWidget(descenderLabel, 1, 2)
mainLayout.addWidget(self.descenderEdit, 1, 3)
- mainLayout.addWidget(italicAngleLabel, 1, 4)
- mainLayout.addWidget(self.italicAngleEdit, 1, 5)
+ mainLayout.addWidget(unitsPerEmLabel, 1, 4)
+ mainLayout.addWidget(self.unitsPerEmEdit, 1, 5)
xHeightLabel = QLabel("x-height:", self)
- self.xHeightEdit = QLineEdit(str(font.info.xHeight or ''), self)
+ xHeight = str(font.info.xHeight) if font.info.xHeight is not None else ''
+ self.xHeightEdit = QLineEdit(xHeight, self)
self.xHeightEdit.setValidator(QIntValidator(self))
capHeightLabel = QLabel("Cap height:", self)
- self.capHeightEdit = QLineEdit(str(font.info.capHeight or ''), 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)
+ italicAngle = str(font.info.italicAngle) if font.info.italicAngle is not None else ''
+ self.italicAngleEdit = QLineEdit(italicAngle, self)
+ self.italicAngleEdit.setValidator(QDoubleValidator(self))
mainLayout.addWidget(xHeightLabel, 2, 0)
mainLayout.addWidget(self.xHeightEdit, 2, 1)
mainLayout.addWidget(capHeightLabel, 2, 2)
mainLayout.addWidget(self.capHeightEdit, 2, 3)
+ mainLayout.addWidget(italicAngleLabel, 2, 4)
+ mainLayout.addWidget(self.italicAngleEdit, 2, 5)
self.setLayout(mainLayout)
@@ -213,4 +246,16 @@ class NextTab(QWidget):
elif sn == 2: font.info.styleMapStyleName = "italic"
elif sn == 3: font.info.styleMapStyleName = "bold"
elif sn == 4: font.info.styleMapStyleName = "bold italic"
- else: font.info.styleMapStyleName = None \ No newline at end of file
+ else: font.info.styleMapStyleName = None
+ ascender = self.ascenderEdit.text()
+ font.info.ascender = int(ascender) if ascender else None
+ descender = self.descenderEdit.text()
+ font.info.descender = int(descender) if descender else None
+ unitsPerEm = self.unitsPerEmEdit.text()
+ font.info.unitsPerEm = int(unitsPerEm) if unitsPerEm else None
+ xHeight = self.xHeightEdit.text()
+ font.info.xHeight = int(xHeight) if xHeight else None
+ capHeight = self.capHeightEdit.text()
+ font.info.capHeight = int(capHeight) if capHeight else None
+ italicAngle = self.italicAngleEdit.text()
+ font.info.italicAngle = float(italicAngle) if italicAngle else None \ No newline at end of file
diff --git a/Lib/defconQt/spacecenter.py b/Lib/defconQt/spacecenter.py
index 07b1ed5..6c15152 100644
--- a/Lib/defconQt/spacecenter.py
+++ b/Lib/defconQt/spacecenter.py
@@ -44,7 +44,7 @@ class MainSpaceWindow(QWidget):
self._unsubscribeFromGlyphs()
super(MainSpaceWindow, self).close()
- def _fontInfoChanged(self):
+ def _fontInfoChanged(self, event):
self.canvas.update()
def _glyphChanged(self, event):
diff --git a/Lib/defconQt/syntaxhighlighter.py b/Lib/defconQt/syntaxhighlighter.py
index a5f0988..556735c 100644
--- a/Lib/defconQt/syntaxhighlighter.py
+++ b/Lib/defconQt/syntaxhighlighter.py
@@ -1,5 +1,5 @@
from PyQt5.QtCore import QFile, QRegExp, Qt
-from PyQt5.QtGui import QColor, QFont, QKeySequence, QPainter, QSyntaxHighlighter, QTextCharFormat
+from PyQt5.QtGui import QColor, QFont, QKeySequence, QPainter, QSyntaxHighlighter, QTextCharFormat, QTextCursor
from PyQt5.QtWidgets import (QApplication, QFileDialog, QMainWindow, QMenu,
QMessageBox, QPlainTextEdit, QWidget)
@@ -51,14 +51,14 @@ class TextEditor(QPlainTextEdit):
font.setPointSize(10)
font.setFixedPitch(True)
- self.setPlainText(text)
- self.setFont(font)
-
+ self._indent = " "
self.highlighter = Highlighter(self.document())
- # TODO: get rid of jitter on opening
self.lineNumbers = LineNumberArea(self)
self.blockCountChanged.connect(self.updateLineNumberAreaWidth)
self.updateRequest.connect(self.updateLineNumberArea)
+
+ self.setPlainText(text)
+ self.setFont(font)
def setFontParams(self, family='CamingoCode', ptSize=10, isMono=True):
font = QFont()
@@ -77,7 +77,7 @@ class TextEditor(QPlainTextEdit):
a = event.rect().bottomRight()
painter.setPen(Qt.darkGray)
painter.drawLine(d.x(), d.y(), a.x(), a.y())
- painter.setPen(Qt.black)
+ painter.setPen(QColor(100, 100, 100))
painter.setFont(self.font())
block = self.firstVisibleBlock()
@@ -102,6 +102,8 @@ class TextEditor(QPlainTextEdit):
while (top >= 10):
top /= 10
digits += 1
+ # Avoid too frequent geometry changes
+ if digits < 3: digits = 3
return 10 + self.fontMetrics().width('9') * digits
def updateLineNumberArea(self, rect, dy):
@@ -122,25 +124,27 @@ class TextEditor(QPlainTextEdit):
cr = self.contentsRect()
self.lineNumbers.setGeometry(cr.left(), cr.top(), self.lineNumberAreaWidth(), cr.height())
- '''
+ # TODO: add closing bracket and feature name
def keyPressEvent(self, event):
if event.key() == Qt.Key_Return:
- content = self.toPlainText()
- cur_pos = self.textCursor().position()
- if (content[cur_pos-1] == "{"):
- #print(content[:cur_pos+1])
- #print(content[cur_pos+1:])
- # Probably does not handle CR properly
- newtext = content[:cur_pos+1] + " \n" + content[cur_pos+1:]
- #print(newtext)
- self.setPlainText(newtext)
- self.textCursor().setPosition(cur_pos+5)
+ cursor = self.textCursor()
+ indentLvl = 0
+ cursor.movePosition(QTextCursor.PreviousCharacter, QTextCursor.KeepAnchor)
+ if cursor.selectedText() == '{': indentLvl += 1
+ cursor.select(QTextCursor.LineUnderCursor)
+ lineLength = len(cursor.selectedText()) // len(self._indent)
+ cursor.movePosition(QTextCursor.StartOfLine)
+ while (lineLength > 0):
+ cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor, len(self._indent))
+ if cursor.selectedText() == self._indent:
+ indentLvl += 1
+ cursor.movePosition(QTextCursor.NoMove)
+ lineLength -= 1
+ cursor.movePosition(QTextCursor.EndOfLine)
+ super(TextEditor, self).keyPressEvent(event)
+ cursor.insertText("".join((self._indent for _ in range(indentLvl))))
else:
super(TextEditor, self).keyPressEvent(event)
- '''
-
- def insertSpaces(self, text):
- print(text[-1])
class Highlighter(QSyntaxHighlighter):
def __init__(self, parent=None):
@@ -178,21 +182,6 @@ class Highlighter(QSyntaxHighlighter):
classFormat.setForeground(QColor(200,50,150))
self.highlightingRules.append((QRegExp("@[A-Za-z0-9_.]+"),
classFormat))
-# self.multiLineCommentFormat = QTextCharFormat()
-# self.multiLineCommentFormat.setForeground(Qt.red)
-
-# quotationFormat = QTextCharFormat()
-# quotationFormat.setForeground(Qt.darkGreen)
-# self.highlightingRules.append((QRegExp("\".*\""), quotationFormat))
-
-# functionFormat = QTextCharFormat()
-# functionFormat.setFontItalic(True)
-# functionFormat.setForeground(Qt.blue)
-# self.highlightingRules.append((QRegExp("\\b[A-Za-z0-9_]+(?=\\()"),
-# functionFormat))
-
-# self.commentStartExpression = QRegExp("/\\*")
-# self.commentEndExpression = QRegExp("\\*/")
def highlightBlock(self, text):
for pattern, format in self.highlightingRules:
@@ -205,26 +194,6 @@ class Highlighter(QSyntaxHighlighter):
self.setCurrentBlockState(0)
- '''
- startIndex = 0
- if self.previousBlockState() != 1:
- startIndex = self.commentStartExpression.indexIn(text)
-
- while startIndex >= 0:
- endIndex = self.commentEndExpression.indexIn(text, startIndex)
-
- if endIndex == -1:
- self.setCurrentBlockState(1)
- commentLength = len(text) - startIndex
- else:
- commentLength = endIndex - startIndex + self.commentEndExpression.matchedLength()
-
- self.setFormat(startIndex, commentLength,
- self.multiLineCommentFormat)
- startIndex = self.commentStartExpression.indexIn(text,
- startIndex + commentLength);
- '''
-
if __name__ == '__main__':
import sys