aboutsummaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/defconQt/fontView.py134
-rw-r--r--Lib/defconQt/fontView.qrc6
-rw-r--r--Lib/defconQt/spacecenter.py41
3 files changed, 118 insertions, 63 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:")
diff --git a/Lib/defconQt/fontView.qrc b/Lib/defconQt/fontView.qrc
new file mode 100644
index 0000000..8e45d53
--- /dev/null
+++ b/Lib/defconQt/fontView.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/">
+ <file>resources/icon.png</file>
+</qresource>
+</RCC>
+
diff --git a/Lib/defconQt/spacecenter.py b/Lib/defconQt/spacecenter.py
index 1ac3b6e..07b1ed5 100644
--- a/Lib/defconQt/spacecenter.py
+++ b/Lib/defconQt/spacecenter.py
@@ -54,11 +54,15 @@ class MainSpaceWindow(QWidget):
self.table.blockSignals(False)
def _textChanged(self, newText):
- self.setGlyphs(newText)
+ # unsubscribe from the old glyphs
+ self._unsubscribeFromGlyphs()
+ # subscribe to the new glyphs
+ self._subscribeToGlyphsText(newText)
+ # set the records into the view
self.canvas._glyphsChanged(self.glyphs)
- self.table.blockSignals(True)
+ #self.table.blockSignals(True) # XXX: needed?
self.table._glyphsChanged(self.glyphs)
- self.table.blockSignals(False)
+ #self.table.blockSignals(False)
# Tal Leming. Edited.
def textToGlyphNames(self, text):
@@ -104,6 +108,9 @@ class MainSpaceWindow(QWidget):
for gName in glyphNames:
if gName not in self.font: continue
glyphs.append(self.font[gName])
+ self._subscribeToGlyphs(glyphs)
+
+ def _subscribeToGlyphs(self, glyphs):
self.glyphs = glyphs
handledGlyphs = set()
@@ -122,11 +129,17 @@ class MainSpaceWindow(QWidget):
glyph.removeObserver(self, "Glyph.Changed")
#self.glyphs = None
- def setGlyphs(self, string):
+ def setGlyphs(self, glyphs):
# unsubscribe from the old glyphs
self._unsubscribeFromGlyphs()
# subscribe to the new glyphs
- self._subscribeToGlyphsText(string)
+ self._subscribeToGlyphs(glyphs)
+ glyphNames = []
+ for glyph in glyphs:
+ glyphNames.append(chr(glyph.unicode) if glyph.unicode else "".join(("/", glyph.name, " ")))
+ self.toolbar.textField.blockSignals(True) # XXX: needed?
+ self.toolbar.textField.setText("".join(glyphNames))
+ self.toolbar.textField.blockSignals(False)
# set the records into the view
self.canvas._glyphsChanged(self.glyphs)
self.table._glyphsChanged(self.glyphs)
@@ -150,6 +163,8 @@ class GlyphsCanvas(QWidget):
def __init__(self, font, glyphs, pointSize=defaultPointSize, parent=None):
super(GlyphsCanvas, self).__init__(parent)
+ self.ascender = font.info.ascender
+ if self.ascender is None: self.ascender = 750
self.descender = font.info.descender
if self.descender is None: self.descender = 250
self.upm = font.info.unitsPerEm
@@ -160,7 +175,7 @@ class GlyphsCanvas(QWidget):
self.padding = 10
def calculateScale(self):
- scale = self.ptSize / float(self.upm)
+ scale = self.ptSize / self.upm
if scale < .01: scale = 0.01
self.scale = scale
@@ -200,7 +215,7 @@ class GlyphsCanvas(QWidget):
painter.setRenderHint(QPainter.Antialiasing)
painter.fillRect(0, 0, self.width(), self.height(), Qt.white)
# TODO: should padding be added for the right boundary as well? I'd say no but not sure
- painter.translate(self.padding, self.padding+self.ptSize+self.descender*self.scale)
+ painter.translate(self.padding, self.padding+self.ascender*self.scale)
cur_width = 0
for glyph in self.glyphs:
@@ -293,18 +308,6 @@ class SpaceTable(QTableWidget):
elif row == 3:
glyph.rightMargin = item
# defcon callbacks do the update
-
- '''
- # This won't help...
- def keyPressEvent(self, event):
- # We don't want to stop edition on enter, so
- # update the canvas and don't propagate the event
- if event.key() == Qt.Key_Enter:
- self._cellEdited()
- event.accept()
- return
- super(SpaceTable, self).keyPressEvent(event)
- '''
def sizeHint(self):
# http://stackoverflow.com/a/7216486/2037879