aboutsummaryrefslogtreecommitdiffstats
path: root/Lib/defconQt/fontView.py
diff options
context:
space:
mode:
authorAdrien Tétar2015-05-26 14:17:35 +0200
committerAdrien Tétar2015-05-26 14:17:35 +0200
commitebf00c3a324a4bc11bab15fb59c2ca2c480aba9c (patch)
treecef3700395ea8e2b6053a7e62c2fe6ab977d9bef /Lib/defconQt/fontView.py
parentf52dbefa8463cf26a82d020ad2c91fe0a7dfb024 (diff)
downloadtrufont-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.py134
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:")