aboutsummaryrefslogtreecommitdiffstats
path: root/Lib/defconQt/glyphView.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/defconQt/glyphView.py')
-rw-r--r--Lib/defconQt/glyphView.py128
1 files changed, 118 insertions, 10 deletions
diff --git a/Lib/defconQt/glyphView.py b/Lib/defconQt/glyphView.py
index d7968ed..02a6994 100644
--- a/Lib/defconQt/glyphView.py
+++ b/Lib/defconQt/glyphView.py
@@ -125,7 +125,7 @@ class AddAnchorDialog(QDialog):
self.setLayout(layout)
@classmethod
- def getNewAnchorData(cls, parent, pos=None):
+ def getNewAnchorName(cls, parent, pos=None):
dialog = cls(pos, parent)
result = dialog.exec_()
name = dialog.anchorNameEdit.text()
@@ -138,6 +138,36 @@ class AddComponentDialog(GotoDialog):
self._sortedGlyphs.remove(args[0].name)
self.updateGlyphList(False)
+class AddLayerDialog(QDialog):
+ def __init__(self, parent=None):
+ super(AddLayerDialog, self).__init__(parent)
+ self.setWindowModality(Qt.WindowModal)
+ self.setWindowTitle("Add layer…")
+
+ layout = QGridLayout(self)
+
+ layerNameLabel = QLabel("Layer name:", self)
+ self.layerNameEdit = QLineEdit(self)
+ self.layerNameEdit.setFocus(True)
+
+ buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+ buttonBox.accepted.connect(self.accept)
+ buttonBox.rejected.connect(self.reject)
+
+ l = 0
+ layout.addWidget(layerNameLabel, l, 0)
+ layout.addWidget(self.layerNameEdit, l, 1)
+ l += 1
+ layout.addWidget(buttonBox, l, 2)
+ self.setLayout(layout)
+
+ @classmethod
+ def getNewLayerName(cls, parent):
+ dialog = cls(parent)
+ result = dialog.exec_()
+ name = dialog.layerNameEdit.text()
+ return (name, result)
+
class MainGfxWindow(QMainWindow):
def __init__(self, glyph, parent=None):
super(MainGfxWindow, self).__init__(parent)
@@ -157,6 +187,7 @@ class MainGfxWindow(QMainWindow):
toolBar = QToolBar(self)
toolBar.setMovable(False)
+ toolBar.setContentsMargins(2, 0, 2, 0)
selectionToolButton = toolBar.addAction("Selection", self.view.setSceneSelection)
selectionToolButton.setCheckable(True)
selectionToolButton.setChecked(True)
@@ -170,6 +201,11 @@ class MainGfxWindow(QMainWindow):
knifeToolButton = toolBar.addAction("Knife", self.view.setSceneKnife)
knifeToolButton.setCheckable(True)
knifeToolButton.setIcon(QIcon("defconQt/resources/cut.svg"))
+ # http://www.setnode.com/blog/right-aligning-a-button-in-a-qtoolbar/
+ spacer = QWidget()
+ spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ toolBar.addWidget(spacer)
+ toolBar.addWidget(self.view.currentLayerBox())
toolsGroup = QActionGroup(self)
toolsGroup.addAction(selectionToolButton)
toolsGroup.addAction(penToolButton)
@@ -177,10 +213,6 @@ class MainGfxWindow(QMainWindow):
toolsGroup.addAction(knifeToolButton)
self.addToolBar(toolBar)
- self.setCentralWidget(self.view)
- self.setWindowTitle(glyph.name, glyph.getParent())
- self.adjustSize()
-
self.setContextMenuPolicy(Qt.ActionsContextMenu)
createAnchorAction = QAction("Add Anchor…", self)
createAnchorAction.triggered.connect(self.view.createAnchor)
@@ -189,6 +221,10 @@ class MainGfxWindow(QMainWindow):
createComponentAction.triggered.connect(self.view.createComponent)
self.addAction(createComponentAction)
+ self.setCentralWidget(self.view)
+ self.setWindowTitle(glyph.name, glyph.getParent())
+ self.adjustSize()
+
def changeGlyph(self):
glyph = self.view._glyph
newGlyph, ok = GotoDialog.getNewGlyph(self, glyph)
@@ -748,6 +784,12 @@ class GlyphScene(QGraphicsScene):
self._blocked = False
+ def _get_glyphObject(self):
+ view = self.views()[0]
+ return view._glyph
+
+ _glyphObject = property(_get_glyphObject, doc="Get the current glyph in the view.")
+
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
@@ -1285,6 +1327,7 @@ class GlyphView(QGraphicsView):
super(GlyphView, self).__init__(parent)
self._glyph = glyph
self._glyph.addObserver(self, "_glyphChanged", "Glyph.Changed")
+ self._glyph.layerSet.addObserver(self, "_layersChanged", "LayerSet.Changed")
self._impliedPointSize = 1000
self._pointSize = None
@@ -1303,6 +1346,9 @@ class GlyphView(QGraphicsView):
font.setFixedPitch(True)
self.setFont(font)
+ self._currentLayerBox = QComboBox(self)
+ self._currentLayerBox.currentIndexChanged.connect(self._currentLayerChanged)
+
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
#self.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
@@ -1315,11 +1361,15 @@ class GlyphView(QGraphicsView):
self.addBackground()
self.addBlues()
self.addHorizontalMetrics()
+ self.addOtherLayersOutlines()
self.addOutlines()
self.addComponents()
self.addAnchors()
self.addPoints()
+ def currentLayerBox(self):
+ return self._currentLayerBox
+
def _glyphChanged(self, notification):
# TODO: maybe detect sidebearing changes (space center) and then only
# translate elements rather than reconstructing them.
@@ -1327,6 +1377,11 @@ class GlyphView(QGraphicsView):
# sp.center values.
self.redrawGlyph()
+ # TODO: diagnose notifications count
+ def _layersChanged(self, notification):
+ self.redrawGlyph()
+ self.redrawOtherLayers()
+
def redrawGlyph(self):
path = self._glyph.getRepresentation("defconQt.NoComponentsQPainterPath")
scene = self.scene()
@@ -1346,6 +1401,14 @@ class GlyphView(QGraphicsView):
# this will not be the case anymore when drag sidebearings pops up
scene._widthItem.setRect(0, -1000, self._glyph.width, 3000)
+ def redrawOtherLayers(self):
+ scene = self.scene()
+ for item in scene.items():
+ # XXX: discriminate better
+ if isinstance(item, QGraphicsPathItem) and item.zValue() == -997:
+ scene.removeItem(item)
+ self.addOtherLayersOutlines()
+
def addBackground(self):
scene = self.scene()
font = self._glyph.getParent()
@@ -1409,16 +1472,38 @@ class GlyphView(QGraphicsView):
item = VGuidelinesTextItem(text, font)
item.setBrush(metricsColor)
item.setFlag(QGraphicsItem.ItemIgnoresTransformations)
- item.setPos(width, y) # XXX
+ item.setPos(width, y)
item.setZValue(-997)
scene.addItem(item)
+ def addOtherLayersOutlines(self):
+ comboBox = self._currentLayerBox
+ comboBox.blockSignals(True)
+ comboBox.clear()
+ scene = self.scene()
+ layerSet = self._glyph.layerSet
+ for layer in layerSet:
+ comboBox.addItem(layer.name, layer)
+ if layer == self._glyph.layer:
+ comboBox.setCurrentText(layer.name)
+ continue
+ if not self._glyph.name in layer:
+ continue
+ path = layer[self._glyph.name].getRepresentation("defconQt.NoComponentsQPainterPath")
+ if layer.color is not None:
+ layerColor = QColor.fromRgbF(tuple(layer.color))
+ else:
+ layerColor = Qt.black
+ item = scene.addPath(path, QPen(layerColor))
+ item.setZValue(-997)
+ comboBox.addItem("New layer...", None)
+ comboBox.blockSignals(False)
+
def addOutlines(self):
scene = self.scene()
path = self._glyph.getRepresentation("defconQt.NoComponentsQPainterPath")
scene._outlineItem = scene.addPath(path, brush=QBrush(fillColor))
scene._outlineItem.setZValue(-995)
- scene._glyphObject = self._glyph
def addComponents(self):
scene = self.scene()
@@ -1532,7 +1617,7 @@ class GlyphView(QGraphicsView):
if scene._integerPlane:
pos.setX(int(pos.x()))
pos.setY(int(pos.y()))
- newAnchorName, ok = AddAnchorDialog.getNewAnchorData(self, pos)
+ newAnchorName, ok = AddAnchorDialog.getNewAnchorName(self, pos)
if ok:
anchor = Anchor()
anchor.x = pos.x()
@@ -1547,21 +1632,44 @@ class GlyphView(QGraphicsView):
component.baseGlyph = newGlyph.name
self._glyph.appendComponent(component)
+ def _currentLayerChanged(self, newLayerIndex):
+ comboBox = self.sender()
+ newLayer = comboBox.itemData(newLayerIndex)
+ if newLayer is None:
+ # add a new layer
+ newLayerName, ok = AddLayerDialog.getNewLayerName(self)
+ if ok:
+ self._glyph.layerSet.newLayer(newLayerName)
+ self._currentLayerBox.blockSignals(True)
+ self._currentLayerBox.setCurrentText(newLayerName)
+ self._currentLayerBox.blockSignals(False)
+ newLayer = self._glyph.layerSet[newLayerName]
+ else:
+ return
+ if not self._glyph.name in newLayer:
+ newLayer.newGlyph(self._glyph.name)
+ # TODO: generalize this out, can’t use newStandardGlyph unfortunately
+ newLayer[self._glyph.name].width = self._glyph.width
+ newLayer[self._glyph.name].template = True
+ newGlyph = newLayer[self._glyph.name]
+ self.setGlyph(newGlyph)
+
def setGlyph(self, glyph):
scene = self.scene()
self._glyph.removeObserver(self, "Glyph.Changed")
+ self._glyph.layerSet.removeObserver(self, "LayerSet.Changed")
# TODO: consider creating a new scene instead of zeroing things out
# manually
scene._dataForUndo = []
scene._dataForRedo = []
self._glyph = glyph
- # XXX: DRY ALERT!
- scene._glyphObject = glyph
app = QApplication.instance()
app.setCurrentGlyph(glyph)
self._glyph.addObserver(self, "_glyphChanged", "Glyph.Changed")
+ self._glyph.layerSet.addObserver(self, "_layersChanged", "LayerSet.Changed")
self.parent().setWindowTitle(self._glyph.name, self._glyph.getParent())
self.redrawGlyph()
+ self.redrawOtherLayers()
def showEvent(self, event):
super(GlyphView, self).showEvent(event)