diff options
| author | Adrien Tétar | 2015-05-26 14:17:35 +0200 | 
|---|---|---|
| committer | Adrien Tétar | 2015-05-26 14:17:35 +0200 | 
| commit | ebf00c3a324a4bc11bab15fb59c2ca2c480aba9c (patch) | |
| tree | cef3700395ea8e2b6053a7e62c2fe6ab977d9bef /Lib/defconQt/fontView.py | |
| parent | f52dbefa8463cf26a82d020ad2c91fe0a7dfb024 (diff) | |
| download | trufont-ebf00c3a324a4bc11bab15fb59c2ca2c480aba9c.tar.bz2 | |
Discontinous selection now possible in fontView, pass fontView elements to space center
Diffstat (limited to 'Lib/defconQt/fontView.py')
| -rw-r--r-- | Lib/defconQt/fontView.py | 134 | 
1 files changed, 90 insertions, 44 deletions
| diff --git a/Lib/defconQt/fontView.py b/Lib/defconQt/fontView.py index ed356bc..5d242ae 100644 --- a/Lib/defconQt/fontView.py +++ b/Lib/defconQt/fontView.py @@ -39,9 +39,11 @@ class CharacterWidget(QWidget):          self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)          self.squareSize = squareSize          self.columns = 10 +        self._selection = set()          self.lastKey = -1          self.moveKey = -1 -        #self.setMouseTracking(True) +         +        self.setFocusPolicy(Qt.ClickFocus)      def updateFont(self, font):          self.font = font @@ -66,14 +68,47 @@ class CharacterWidget(QWidget):      def sizeHint(self):          return QSize(self.columns * self.squareSize,                  math.ceil(len(self.glyphs) / self.columns) * self.squareSize) +     +    # TODO: eventually get rid of the signal +    def computeCharacterSelected(self): +        lKey, mKey = self.lastKey, self.moveKey +        mKey = self.moveKey if self.moveKey < len(self.glyphs) else len(self.glyphs)-1 +        lKey = self.lastKey if self.lastKey < len(self.glyphs) else len(self.glyphs)-1 +        if lKey == -1: +            elements = set() +        elif lKey > mKey: +            elements = set(range(mKey, lKey+1)) +        else: +            elements = set(range(lKey, mKey+1)) +        elements ^= self._selection +        if len(elements)>1: self.characterSelected.emit(len(elements), "") +        elif len(elements)>0: self.characterSelected.emit(1, self.glyphs[elements.pop()].name) +        else: self.characterSelected.emit(0, "") +     +    def keyPressEvent(self, event): +        if event.key() == Qt.Key_A and event.modifiers() & Qt.ControlModifier: +            self._selection = set(range(len(self.glyphs))) +            self.computeCharacterSelected() +            self.update() +            event.accept() +        else: +            super(CharacterWidget, self).keyPressEvent(event)      def mousePressEvent(self, event):          if event.button() == Qt.LeftButton: -            self.lastKey = (event.y() // self.squareSize) * self.columns + event.x() // self.squareSize -            self.moveKey = -1 -            if self.lastKey > len(self.glyphs)-1: return - -            self.characterSelected.emit(1, self.glyphs[self.lastKey].name) +            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: +                self.lastKey = self._selection.pop() +                self.moveKey = key +            else: +                self.lastKey = key +                self.moveKey = self.lastKey +            if not modifiers & Qt.ControlModifier: +                self._selection = set() +             +            self.computeCharacterSelected()              event.accept()              self.update()          else: @@ -81,36 +116,41 @@ class CharacterWidget(QWidget):      def mouseMoveEvent(self, event):          if event.buttons() & Qt.LeftButton: -            moveKey = (event.y() // self.squareSize) * self.columns + min(event.x() // self.squareSize, self.columns-1) +            key = (event.y() // self.squareSize) * self.columns + min(event.x() // self.squareSize, self.columns-1) +            if key > len(self.glyphs)-1: return +            self.moveKey = key +             +            self.computeCharacterSelected()              event.accept() -            if (moveKey == self.lastKey and self.moveKey != -1): -                self.moveKey = -1 -                self.characterSelected.emit(1, self.glyphs[self.lastKey].name) -            elif moveKey > len(self.glyphs)-1 \ -                or not (moveKey != self.lastKey and moveKey != self.moveKey): return -            else: -                self.moveKey = moveKey -                self.characterSelected.emit(abs(self.moveKey - self.lastKey)+1, "")              self.update() -        # elif event.modifiers() & Qt.ControlModifier: -            # widgetPosition = self.mapFromGlobal(event.globalPos()) -            # key = (widgetPosition.y() // self.squareSize) * self.columns + widgetPosition.x() // self.squareSize -            # uni = self.glyphs[key].unicode -            # char = chr(self.glyphs[key].unicode) if uni is not None else chr(0xFFFD) - -            # # http://stackoverflow.com/questions/6598554/is-there-any-way-to-insert-qpixmap-object-in-html -            # text = '<p align="center" style="font-size: 36pt; font-family: %s">%s</p>' % (QFont().family(), char) -            # if uni is not None: -                # more = ['<p>U+%04x<p>' % self.glyphs[key].unicode, '<p>%s<p>' % unicodedata.name(chr(self.glyphs[key].unicode))] -                # text = text.join(more) -            # QToolTip.showText(event.globalPos(), text, self)          else:              super(CharacterWidget, self).mouseMoveEvent(event) +     +    def mouseReleaseEvent(self, event): +        if event.button() == Qt.LeftButton: +            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: +                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: +            super(CharacterWidget, self).mouseReleaseEvent(event)      def mouseDoubleClickEvent(self, event):          if event.button() == Qt.LeftButton: -            key = (event.y() // self.squareSize) * self.columns + min(event.x() // self.squareSize, self.columns-1) -            if key != self.lastKey: return +            key = (event.y() // self.squareSize) * self.columns + event.x() // self.squareSize +            if key > len(self.glyphs)-1: event.ignore(); return              event.accept()              self.glyphOpened.emit(self.glyphs[key].name)          else: @@ -131,12 +171,16 @@ class CharacterWidget(QWidget):          painter.drawLine(0, 0, redrawRect.right(), 0)          # selection code -        firstKey = min(self.lastKey, self.moveKey) -        lastKey = max(self.lastKey, self.moveKey) -        minKeyInViewport = beginRow * self.columns + beginColumn -        select = False -        if firstKey != -1 and firstKey < minKeyInViewport and lastKey > minKeyInViewport: -            select = True +        if self.moveKey != -1: +            if self.moveKey > self.lastKey: +                curSelection = set(range(self.lastKey, self.moveKey+1)) +            else: +                curSelection = set(range(self.moveKey, self.lastKey+1)) +        elif self.lastKey != -1: # XXX: necessary? +            curSelection = {self.lastKey} +        else: +            curSelection = set() +        curSelection ^= self._selection          gradient = QLinearGradient(0, 0, 0, GlyphCellHeaderHeight)          gradient.setColorAt(0.0, cellHeaderBaseColor) @@ -180,16 +224,12 @@ class CharacterWidget(QWidget):                  painter.drawLine(rightEdgeX, row * self.squareSize + 1, rightEdgeX, bottomEdgeY)                  painter.drawLine(rightEdgeX, bottomEdgeY, column * self.squareSize + 1, bottomEdgeY) -                painter.setRenderHint(QPainter.Antialiasing, False)                  # selection code -                if key == firstKey: -                    select = not select -                if select or (key == self.lastKey and self.moveKey == -1): +                painter.setRenderHint(QPainter.Antialiasing, False) +                if key in curSelection:                      painter.fillRect(column * self.squareSize + 1,                              row * self.squareSize + 1, self.squareSize - 3,                              self.squareSize - 3, cellSelectionColor) -                    if key == lastKey and self.moveKey != -1: -                        select = not select                  painter.setRenderHint(QPainter.Antialiasing)                  glyph = self.glyphs[key].getRepresentation("defconQt.QPainterPath") @@ -321,7 +361,7 @@ class MainWindow(QMainWindow):                  event.accept()              elif ret == QMessageBox.No:                  event.accept() -            elif ret == QMessageBox.Cancel: +            else: #if ret == QMessageBox.Cancel:                  event.ignore()      def _fontChanged(self, event): @@ -334,7 +374,8 @@ class MainWindow(QMainWindow):          glyphViewWindow.show()      def _selectionChanged(self, count, glyph): -        self.selectionLabel.setText("%s%s%s%d %s" % (glyph, " " if count <= 1 else "", "(", count, "selected)")) +        if count == 0: self.selectionLabel.setText("") +        else: self.selectionLabel.setText("%s%s%s%d %s" % (glyph, " " if count <= 1 else "", "(", count, "selected)"))      def _squareSizeChanged(self):          val = self.sqSizeSlider.value() @@ -377,10 +418,15 @@ class MainWindow(QMainWindow):          # TODO: show selection in a space center, rewind selection if we raise window (rf)          from spaceCenter import MainSpaceWindow          if not (hasattr(self, 'spaceCenterWindow') and self.spaceCenterWindow.isVisible()): -            self.spaceCenterWindow = MainSpaceWindow(self.font, "Hiyazee otaHawa.", parent=self) +            self.spaceCenterWindow = MainSpaceWindow(self.font, parent=self)              self.spaceCenterWindow.show()          else:              self.spaceCenterWindow.raise_() +        if self.characterWidget._selection: +            glyphs = [] +            for item in sorted(self.characterWidget._selection): +                glyphs.append(self.characterWidget.glyphs[item]) +            self.spaceCenterWindow.setGlyphs(glyphs)      def addGlyph(self):          gName, ok = QInputDialog.getText(self, "Add glyph", "Name of the glyph:") | 
