aboutsummaryrefslogtreecommitdiffstats
path: root/Lib/defconQt
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/defconQt')
-rw-r--r--Lib/defconQt/featureTextEditor.py2
-rw-r--r--Lib/defconQt/fontInfo.py12
-rw-r--r--Lib/defconQt/fontView.py43
-rw-r--r--Lib/defconQt/glyphView.py76
4 files changed, 105 insertions, 28 deletions
diff --git a/Lib/defconQt/featureTextEditor.py b/Lib/defconQt/featureTextEditor.py
index 75f4de4..9b32290 100644
--- a/Lib/defconQt/featureTextEditor.py
+++ b/Lib/defconQt/featureTextEditor.py
@@ -190,7 +190,7 @@ class TextEditor(QPlainTextEdit):
cursor.movePosition(QTextCursor.EndOfLine)
super(TextEditor, self).keyPressEvent(event)
- newLineSpace = "".join((self._indent for _ in range(indentLvl)))
+ newLineSpace = "".join(self._indent for _ in range(indentLvl))
cursor.insertText(newLineSpace)
if newBlock:
super(TextEditor, self).keyPressEvent(event)
diff --git a/Lib/defconQt/fontInfo.py b/Lib/defconQt/fontInfo.py
index bc9b9f2..3ffcf35 100644
--- a/Lib/defconQt/fontInfo.py
+++ b/Lib/defconQt/fontInfo.py
@@ -529,19 +529,19 @@ class PostScriptTab(QWidget):
hintingLayout = QGridLayout(self)
blueValuesLabel = QLabel("Blue values:", self)
- blueValues = " ".join((str(val) for val in font.info.postscriptBlueValues))
+ 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))
+ 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))
+ 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))
+ familyOtherBlues = " ".join(str(val) for val in font.info.postscriptFamilyOtherBlues)
self.familyOtherBluesEdit = QLineEdit(familyOtherBlues, self)
hintingLayout.addWidget(blueValuesLabel, l, 0)
@@ -561,7 +561,7 @@ class PostScriptTab(QWidget):
self.blueFuzzEdit.setValidator(QDoubleValidator(self))
stemSnapHLabel = QLabel("StemSnapH:", self)
- stemSnapH = " ".join((str(val) for val in font.info.postscriptStemSnapH))
+ stemSnapH = " ".join(str(val) for val in font.info.postscriptStemSnapH)
self.stemSnapHEdit = QLineEdit(stemSnapH, self)
blueScaleLabel = QLabel("Blue scale:", self)
@@ -570,7 +570,7 @@ class PostScriptTab(QWidget):
self.blueScaleEdit.setValidator(QDoubleValidator(self))
stemSnapVLabel = QLabel("StemSnapV:", self)
- stemSnapV = " ".join((str(val) for val in font.info.postscriptStemSnapV))
+ stemSnapV = " ".join(str(val) for val in font.info.postscriptStemSnapV)
self.stemSnapVEdit = QLineEdit(stemSnapV, self)
blueShiftLabel = QLabel("Blue shift:", self)
diff --git a/Lib/defconQt/fontView.py b/Lib/defconQt/fontView.py
index d35c0ab..b15ba66 100644
--- a/Lib/defconQt/fontView.py
+++ b/Lib/defconQt/fontView.py
@@ -243,18 +243,20 @@ class CharacterWidget(QWidget):
key = (event.y() // self.squareSize) * self.columns + event.x() // self.squareSize
if key > len(self.glyphs)-1: return
modifiers = event.modifiers()
- if modifiers & Qt.ShiftModifier and len(self._selection)==1:
+ if modifiers & Qt.ShiftModifier and len(self._selection) == 1:
self.lastKey = self._selection.pop()
self.moveKey = key
- elif key in self._selection:
+ elif modifiers & Qt.ControlModifier:
+ self.lastKey = key
+ self.moveKey = self.lastKey
+ elif key in self._selection and not modifiers & Qt.ShiftModifier:
self._maybeDragPosition = event.pos()
event.accept()
return
else:
+ self._selection = set()
self.lastKey = key
self.moveKey = self.lastKey
- if not modifiers & Qt.ControlModifier:
- self._selection = set()
self.computeCharacterSelected()
event.accept()
@@ -268,14 +270,14 @@ class CharacterWidget(QWidget):
if ((event.pos() - self._maybeDragPosition).manhattanLength() \
< QApplication.startDragDistance()): return
# TODO: needs ordering or not?
- # TODO: see about dropping join tuples
- glyphList = " ".join((self.glyphs[key].name for key in self._selection))
+ glyphList = " ".join(self.glyphs[key].name for key in self._selection)
drag = QDrag(self)
mimeData = QMimeData()
mimeData.setData("text/plain", glyphList)
drag.setMimeData(mimeData)
dropAction = drag.exec_()
+ self._maybeDragPosition = None
event.accept()
return
key = (event.y() // self.squareSize) * self.columns + min(event.x() // self.squareSize, self.columns-1)
@@ -291,20 +293,25 @@ class CharacterWidget(QWidget):
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self._maybeDragPosition = None
- lastKey = self.lastKey if self.lastKey < len(self.glyphs) else len(self.glyphs)-1
- moveKey = self.moveKey if self.moveKey < len(self.glyphs) else len(self.glyphs)-1
- if event.modifiers() & Qt.ControlModifier:
- if moveKey > lastKey:
- self._selection ^= set(range(lastKey, moveKey+1))
- else:
- self._selection ^= set(range(moveKey, lastKey+1))
+ if self.lastKey == -1:
+ if self._maybeDragPosition is None:
+ self._selection = {(event.y() // self.squareSize) * self.columns + event.x() // self.squareSize}
+ self.computeCharacterSelected()
else:
- if moveKey > lastKey:
- self._selection = set(range(lastKey, moveKey+1))
+ lastKey = self.lastKey if self.lastKey < len(self.glyphs) else len(self.glyphs)-1
+ moveKey = self.moveKey if self.moveKey < len(self.glyphs) else len(self.glyphs)-1
+ if event.modifiers() & Qt.ControlModifier:
+ if moveKey > lastKey:
+ self._selection ^= set(range(lastKey, moveKey+1))
+ else:
+ self._selection ^= set(range(moveKey, lastKey+1))
else:
- self._selection = set(range(moveKey, lastKey+1))
- self.lastKey = -1
- self.moveKey = -1
+ if moveKey > lastKey:
+ self._selection = set(range(lastKey, moveKey+1))
+ else:
+ self._selection = set(range(moveKey, lastKey+1))
+ self.lastKey = -1
+ self.moveKey = -1
event.accept()
self.update()
else:
diff --git a/Lib/defconQt/glyphView.py b/Lib/defconQt/glyphView.py
index cca95c0..505ef1b 100644
--- a/Lib/defconQt/glyphView.py
+++ b/Lib/defconQt/glyphView.py
@@ -152,9 +152,9 @@ class OffCurvePointItem(QGraphicsEllipseItem):
and len(self.scene().selectedItems()) == 1:
ax = abs(value.x())
ay = abs(value.y())
- if ay > ax * 2:
+ if ay >= ax * 2:
value.setX(0)
- elif ay >= ax / 2:
+ elif ay > ax / 2:
avg = (ax + ay) / 2
value.setX(copysign(avg, value.x()))
value.setY(copysign(avg, value.y()))
@@ -204,6 +204,19 @@ class OnCurvePointItem(QGraphicsPathItem):
self.setPen(QPen(pointStrokeColor, 1.5))
self.setBrush(QBrush(onCurvePointColor))
+ def delete(self):
+ if len(self._contour.segments) < 2:
+ self.scene()._glyphObject.removeContour(self._contour)
+ else:
+ self._contour.removeSegment(self.getSegmentIndex(), True)
+ index = 0
+ for _ in self._contour:
+ if self._contour[index].segmentType is not None:
+ self._contour.setStartPoint(index)
+ break
+ index = (index+1) % len(self._contour)
+ self.scene().removeItem(self)
+
def setPointPath(self):
path = QPainterPath()
if self._isSmooth:
@@ -216,6 +229,14 @@ class OnCurvePointItem(QGraphicsPathItem):
def getPointIndex(self):
return self._contour.index(self._point)
+ def getSegmentIndex(self):
+ # is there a contour.segments.index() method?
+ index = 0
+ for pt in self._contour:
+ if pt == self._point: break
+ if pt.segmentType is not None: index += 1
+ return (index-1) % len(self._contour.segments)
+
def _CPMoved(self, newValue):
pointIndex = self.getPointIndex()
children = self.childItems()
@@ -278,7 +299,10 @@ class OnCurvePointItem(QGraphicsPathItem):
return value
def mouseDoubleClickEvent(self, event):
- self._isSmooth = not self._isSmooth
+ self.setIsSmooth(not self._isSmooth)
+
+ def setIsSmooth(self, isSmooth):
+ self._isSmooth = isSmooth
self._point.smooth = self._isSmooth
self.setPointPath()
@@ -298,12 +322,19 @@ class GlyphScene(QGraphicsScene):
def __init__(self, parent):
super(GlyphScene, self).__init__(parent)
self._editing = False
+
+ def getItemForPoint(self, point):
+ for item in self.items():
+ if isinstance(item, OnCurvePointItem) and item._point == point:
+ return item
+ return None
# TODO: implement key multiplex in a set()
# http://stackoverflow.com/a/10568233/2037879
def keyPressEvent(self, event):
key = event.key()
count = event.count()
+ modifiers = event.modifiers()
if key == Qt.Key_Left:
x,y = -count,0
elif key == Qt.Key_Up:
@@ -312,7 +343,28 @@ class GlyphScene(QGraphicsScene):
x,y = count,0
elif key == Qt.Key_Down:
x,y = 0,-count
+ elif key == Qt.Key_Delete:
+ for item in self.selectedItems():
+ if isinstance(item, OnCurvePointItem):
+ item.delete()
+ event.accept()
+ return
+ elif modifiers & Qt.ControlModifier and key == Qt.Key_A:
+ path = QPainterPath()
+ path.addRect(self.sceneRect())
+ self.setSelectionArea(path, self.views()[0].transform())
+ event.accept()
+ return
+ elif modifiers & Qt.ControlModifier and key == Qt.Key_D:
+ self.setSelectionArea(QPainterPath(), self.views()[0].transform())
+ event.accept()
+ return
else:
+ sel = self.selectedItems()
+ if len(sel) == 1 and isinstance(sel[0], OffCurvePointItem) and \
+ sel[0].parentItem().getPointIndex() == len(sel[0].parentItem()._contour)-2 and \
+ key == Qt.Key_Alt:
+ sel[0].parentItem().setIsSmooth(False)
super(GlyphScene, self).keyPressEvent(event)
return
if len(self.selectedItems()) == 0:
@@ -324,6 +376,14 @@ class GlyphScene(QGraphicsScene):
if isinstance(item, OffCurvePointItem) and item.parentItem().isSelected(): continue
item.moveBy(x,y)
event.accept()
+
+ def keyReleaseEvent(self, event):
+ sel = self.selectedItems()
+ if len(sel) == 1 and isinstance(sel[0], OffCurvePointItem) and \
+ sel[0].parentItem().getPointIndex() == len(sel[0].parentItem()._contour)-2 and \
+ event.key() == Qt.Key_Alt:
+ sel[0].parentItem().setIsSmooth(True)
+ super(GlyphScene, self).keyReleaseEvent(event)
def mousePressEvent(self, event):
if not self.views()[0]._drawingTool: super(GlyphScene, self).mousePressEvent(event); return
@@ -355,6 +415,15 @@ class GlyphScene(QGraphicsScene):
super(GlyphScene, self).mousePressEvent(event)
return
else:
+ if QApplication.keyboardModifiers() & Qt.ShiftModifier:
+ if isLastOnCurve:
+ refx = sel[0].x()
+ refy = sel[0].y()
+ else:
+ refx = sel[0].parentItem().x()
+ refy = sel[0].parentItem().y()
+ if abs(x-refx) > abs(y-refy): y = copysign(refy, y)
+ else: x = copysign(refx, x)
if isLastOffCurve:
lastContour.addPoint((x,y))
lastContour.addPoint((x,y), "curve")
@@ -416,6 +485,7 @@ class GlyphScene(QGraphicsScene):
# remove the last onCurve
sel[0]._contour.removePoint(onCurve)
prev = sel[0]._contour[-1]
+ self.getItemForPoint(prev).childItems()[3].setVisible(True)
# add a zero-length offCurve to the previous point
sel[0]._contour.addPoint((prev.x, prev.y))
# add prevOffCurve and activate