aboutsummaryrefslogtreecommitdiffstats
path: root/Lib/defconQt/groupsView.py
diff options
context:
space:
mode:
authorAdrien Tétar2015-06-01 23:31:16 +0200
committerAdrien Tétar2015-06-01 23:31:16 +0200
commit153f7a7f706b68c463cae2f6f0148bf73c1f74de (patch)
treed2f9b75a642cafb8b3edb2785f482f2f674b2428 /Lib/defconQt/groupsView.py
parent0897c38388d900fc6c181a460a0917e28cd6e269 (diff)
downloadtrufont-153f7a7f706b68c463cae2f6f0148bf73c1f74de.tar.bz2
improve groups window, fontView tweaks, featureTextEditor smart block fixes
Diffstat (limited to 'Lib/defconQt/groupsView.py')
-rw-r--r--Lib/defconQt/groupsView.py71
1 files changed, 64 insertions, 7 deletions
diff --git a/Lib/defconQt/groupsView.py b/Lib/defconQt/groupsView.py
index db4645f..a88d9eb 100644
--- a/Lib/defconQt/groupsView.py
+++ b/Lib/defconQt/groupsView.py
@@ -1,28 +1,64 @@
+from fontView import CharacterWidget
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
+class GroupCharacterWidget(CharacterWidget):
+ def __init__(self, font, squareSize=56, scrollArea=None, parent=None):
+ super(GroupCharacterWidget, self).__init__(font, squareSize, scrollArea, parent)
+ self.columns = 8
+ self.scrollArea.setAcceptDrops(True)
+ self.scrollArea.dragEnterEvent = self.pipeDragEnterEvent
+ self.scrollArea.dropEvent = self.pipeDropEvent
+
+ def keyPressEvent(self, event):
+ if event.key() == Qt.Key_Delete:
+ self.parent().parent().parent().characterDeleteEvent(self._selection)
+ event.accept()
+ else:
+ super(GroupCharacterWidget, 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().hasFormat("text/plain")):
+ event.acceptProposedAction()
+
+ def pipeDropEvent(self, event):
+ self.parent().parent().parent().characterDropEvent(event)
+
class GroupsWindow(QWidget):
def __init__(self, font, parent=None):
super(GroupsWindow, self).__init__(parent, Qt.Window)
self.font = font
- self.groups = sorted(font.groups.keys(), key=lambda t: t[0])
self.groupsList = QListWidget(self)
- #self.groupsList.addItems(self.font.groups.keys())
- #self.groupsList.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.EditKeyPressed)
+ self.groupsList.setSelectionMode(QAbstractItemView.SingleSelection)
+ self.groupsList.setSortingEnabled(True)
for groupName in self.font.groups.keys():
item = QListWidgetItem(groupName, self.groupsList)
- #item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsEditable)
item.setFlags(item.flags() | Qt.ItemIsEditable)
self.groupsList.itemChanged.connect(self._groupRenamed)
- layout = QVBoxLayout(self)
+ self.scrollArea = QScrollArea(self)
+ self.characterWidget = GroupCharacterWidget(self.font, scrollArea=self.scrollArea, parent=self)
+ self.scrollArea.setWidget(self.characterWidget)
+ self.groupsList.currentItemChanged.connect(self._groupChanged)
+
+ layout = QHBoxLayout(self)
layout.addWidget(self.groupsList)
+ layout.addWidget(self.scrollArea)
self.setLayout(layout)
self.setWindowTitle("%s%s%s%s" % ("Groups window – ", self.font.info.familyName, " ", self.font.info.styleName))
+ def _groupChanged(self):
+ currentGroup = self.groupsList.currentItem().text()
+ glyphs = []
+ for gName in self.font.groups[currentGroup]:
+ glyphs.append(self.font[gName])
+ self.characterWidget.setGlyphs(glyphs)
+
def _groupRenamed(self):
cur = self.groupsList.currentItem()
# XXX: perf?
@@ -30,5 +66,26 @@ class GroupsWindow(QWidget):
newKey = cur.text()
self.font.groups[newKey] = self.font.groups[self.groups[index]]
del self.font.groups[self.groups[index]]
- self.groups[index] = newKey
- #print(self.groupsList.currentItem().text()) \ No newline at end of file
+ #print(self.groupsList.currentItem().text())
+
+ def characterDeleteEvent(self, selection):
+ currentGroup = self.groupsList.currentItem().text()
+ currentGroupList = self.font.groups[currentGroup]
+ # relying on ordered group elements
+ # reverse to not change index of smaller elements
+ for key in sorted(selection, reverse=True):
+ del currentGroupList[key]
+ self.font.groups[currentGroup] = currentGroupList
+ self.characterWidget.update()
+
+ def characterDropEvent(self, event):
+ currentGroup = self.groupsList.currentItem().text()
+ glyphNames = event.mimeData().text().split(" ")
+ for gName in glyphNames:
+ # Due to defcon limitations, we must fetch and update for the
+ # notification to pass through
+ currentGroupList = self.font.groups[currentGroup]
+ currentGroupList.append(gName)
+ self.font.groups[currentGroup] = currentGroupList
+ event.acceptProposedAction()
+ self._groupChanged() \ No newline at end of file