From f83831e31597e8c811f5b3b75cb98a0ff3590a8c Mon Sep 17 00:00:00 2001 From: Adrien Tétar Date: Mon, 21 Sep 2015 20:40:35 +0200 Subject: meta: refactorings and cleanups, fontView: partial rewrite, new AddGlyphsWindow, extract cells widget to a separate location, support CharacterSet objects fully --- Lib/defconQt/groupsView.py | 91 ++++++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 43 deletions(-) (limited to 'Lib/defconQt/groupsView.py') diff --git a/Lib/defconQt/groupsView.py b/Lib/defconQt/groupsView.py index bec64dc..e6ee932 100644 --- a/Lib/defconQt/groupsView.py +++ b/Lib/defconQt/groupsView.py @@ -1,4 +1,4 @@ -from defconQt.fontView import CharacterWidget +from defconQt.glyphCollectionView import GlyphCollectionWidget from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * @@ -9,12 +9,12 @@ class GroupListWidget(QListWidget): #self.setAlternatingRowColors(True) self.setSelectionMode(QAbstractItemView.SingleSelection) self.setSortingEnabled(True) - + for groupName in groupNames: item = QListWidgetItem(groupName, self) item.setFlags(item.flags() | Qt.ItemIsEditable) #if len(groupNames): self.setCurrentRow(0) - + def keyPressEvent(self, event): key = event.key() if key == Qt.Key_Delete: @@ -36,19 +36,19 @@ class GroupStackWidget(QWidget): self.upm = font.info.unitsPerEm self.padding = 10 self.alignRight = False - + def setAlignment(self, alignRight): self.alignRight = alignRight self.update() - + def setGlyphs(self, glyphs): self.glyphs = glyphs self.maxWidth = max(glyph.width for glyph in self.glyphs) if len(self.glyphs) else 300 self.update() - + def sizeHint(self): return QSize(self.maxWidth+2*self.padding, 400) - + def paintEvent(self, event): # TODO: maybe use self.upm*(1+2*BufferHeight) for the denominator as in fontView scale = self.height() / (self.upm*1.2) @@ -60,7 +60,7 @@ class GroupStackWidget(QWidget): painter.setRenderHint(QPainter.Antialiasing) painter.translate(self.padding, self.padding+(self.ascender*1.2)*scale) painter.scale(scale, -scale) - + col = QColor(Qt.black) col.setAlphaF(.2) for glyph in self.glyphs: @@ -72,32 +72,38 @@ class GroupStackWidget(QWidget): painter.fillPath(glyphPath, col) painter.restore() -class GroupCharacterWidget(CharacterWidget): - def __init__(self, font, squareSize=56, scrollArea=None, parent=None): - super(GroupCharacterWidget, self).__init__(font, squareSize, scrollArea, parent) - self.columns = 9 - self.scrollArea.setAcceptDrops(True) - self.scrollArea.dragEnterEvent = self.pipeDragEnterEvent - self.scrollArea.dropEvent = self.pipeDropEvent +class GroupCollectionWidget(GlyphCollectionWidget): + def __init__(self, parent=None): + super(GroupCollectionWidget, self).__init__(parent) + self._columns = 9 + self._scrollArea.setAcceptDrops(True) + self._scrollArea.dragEnterEvent = self.pipeDragEnterEvent + self._scrollArea.dropEvent = self.pipeDropEvent + + # TODO: upstream this, somehow + self.characterDeletionCallback = None + self.characterDropCallback = None self.resize(self.width(), 200) - + # TODO: The standard QListWidget has scrollbar and does not need three times parent call. # Find out how to handle that properly. def keyPressEvent(self, event): if event.key() == Qt.Key_Delete: - self.parent().parent().parent().characterDeleteEvent(self._selection) + if self.characterDeletionCallback is not None: + self.characterDeletionCallback(self.selection) event.accept() else: - super(GroupCharacterWidget, self).keyPressEvent(event) - + super(GroupCollectionWidget, self).keyPressEvent(event) + def pipeDragEnterEvent(self, event): # TODO: the problem with text/plain is that any sort of text can get here. # (It allows direct compatibility with featureTextEditor though.) if (event.mimeData().hasText()): event.acceptProposedAction() - + def pipeDropEvent(self, event): - self.parent().parent().parent().characterDropEvent(event) + if self.characterDropCallback is not None: + self.characterDropCallback(event) class GroupsWindow(QWidget): leftGroups = ["@MMK_L", "public.kern1"] @@ -112,9 +118,9 @@ class GroupsWindow(QWidget): self.groupsList.currentItemChanged.connect(self._groupChanged) self.groupsList.itemChanged.connect(self._groupRenamed) self.groupsList.setFocus(True) - + self.stackWidget = GroupStackWidget(self.font, parent=self) - + self.addGroupButton = QPushButton("+", self) self.addGroupButton.clicked.connect(self._groupAdd) self.removeGroupButton = QPushButton("−", self) @@ -126,12 +132,12 @@ class GroupsWindow(QWidget): self.alignLeftBox.setChecked(True) self.alignLeftBox.toggled.connect(self._alignmentChanged) self._autoDirection = True - - self.scrollArea = QScrollArea(self) - self.characterWidget = GroupCharacterWidget(self.font, scrollArea=self.scrollArea, parent=self) - self.scrollArea.setWidget(self.characterWidget) + + self.collectionWidget = GroupCollectionWidget(parent=self) + self.collectionWidget.characterDeletionCallback = self.characterDeleteEvent + self.collectionWidget.characterDropCallback = self.characterDropEvent self._cachedName = None - + layout = QGridLayout(self) layout.addWidget(self.groupsList, 0, 0, 5, 4) layout.addWidget(self.stackWidget, 0, 4, 5, 4) @@ -139,17 +145,17 @@ class GroupsWindow(QWidget): layout.addWidget(self.removeGroupButton, 5, 3) layout.addWidget(self.alignLeftBox, 5, 4) layout.addWidget(self.alignRightBox, 5, 7) - layout.addWidget(self.scrollArea, 6, 0, 4, 8) + layout.addWidget(self.collectionWidget.scrollArea(), 6, 0, 4, 8) # TODO: calib this more layout.setColumnStretch(4, 1) self.setLayout(layout) - - self.setWindowTitle("%s%s%s%s" % ("Groups window – ", self.font.info.familyName, " ", self.font.info.styleName)) - + + self.setWindowTitle("Groups window – %s %s" % (self.font.info.familyName, self.font.info.styleName)) + def _alignmentChanged(self): alignRight = self.alignRightBox.isChecked() self.stackWidget.setAlignment(alignRight) - + def _groupAdd(self): groupName = "New group" if groupName in self.font.groups: @@ -163,7 +169,7 @@ class GroupsWindow(QWidget): self.groupsList.setCurrentItem(item) self.groupsList.editItem(item) self.removeGroupButton.setEnabled(True) - + def _groupChanged(self): self._cachedName = self.groupsList.currentItem().text() if self._autoDirection: @@ -180,23 +186,22 @@ class GroupsWindow(QWidget): if gName in self.font: glyphs.append(self.font[gName]) self.stackWidget.setGlyphs(glyphs) - self.characterWidget.setGlyphs(glyphs) - self.characterWidget.update() - + self.collectionWidget.glyphs = glyphs + def _groupRenamed(self): newKey = self.groupsList.currentItem() if newKey is None: return newKey = newKey.text() self.font.groups[newKey] = self.font.groups[self._cachedName] del self.font.groups[self._cachedName] - + def _groupDelete(self): newKey = self.groupsList.currentItem().text() del self.font.groups[newKey] self.groupsList.takeItem(self.groupsList.currentRow()) if not self.font.groups.keys(): self.removeGroupButton.setEnabled(False) self._groupChanged() - + def characterDeleteEvent(self, selection): currentGroup = self.groupsList.currentItem().text() currentGroupList = self.font.groups[currentGroup] @@ -206,7 +211,7 @@ class GroupsWindow(QWidget): del currentGroupList[key] self.font.groups[currentGroup] = currentGroupList self._groupChanged() - + def characterDropEvent(self, event): currentGroup = self.groupsList.currentItem() if currentGroup is None: return @@ -220,11 +225,11 @@ class GroupsWindow(QWidget): self.font.groups[currentGroup] = currentGroupList event.acceptProposedAction() self._groupChanged() - + def resizeEvent(self, event): if self.isVisible(): margins = self.layout().contentsMargins() width = event.size().width() - (margins.left() + margins.right()) - self.characterWidget._sizeEvent(width) + self.collectionWidget._sizeEvent(width) self.stackWidget.update() - super(GroupsWindow, self).resizeEvent(event) \ No newline at end of file + super(GroupsWindow, self).resizeEvent(event) -- cgit v1.2.3