diff options
| author | Adrien Tétar | 2015-06-12 22:20:49 +0200 |
|---|---|---|
| committer | Adrien Tétar | 2015-06-12 22:20:49 +0200 |
| commit | 9faef52dee40d3f39e7e85c9ca1db97022ffb066 (patch) | |
| tree | a4590f1b1df48db8b6539b34435eb3b13b53c62e /Lib/defconQt | |
| parent | cd296f4613191f474a700e8330ec29c2a0917189 (diff) | |
| download | trufont-9faef52dee40d3f39e7e85c9ca1db97022ffb066.tar.bz2 | |
Shufflings, more correctness for selection code (but needs refactoring b/w press/release), more glyphView functionality
Diffstat (limited to 'Lib/defconQt')
| -rw-r--r-- | Lib/defconQt/featureTextEditor.py | 2 | ||||
| -rw-r--r-- | Lib/defconQt/fontInfo.py | 12 | ||||
| -rw-r--r-- | Lib/defconQt/fontView.py | 43 | ||||
| -rw-r--r-- | Lib/defconQt/glyphView.py | 76 |
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 |
