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/glyphView.py | |
| 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/glyphView.py')
| -rw-r--r-- | Lib/defconQt/glyphView.py | 76 | 
1 files changed, 73 insertions, 3 deletions
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  | 
