diff options
| author | Adrien Tétar | 2015-10-29 21:42:25 +0100 | 
|---|---|---|
| committer | Adrien Tétar | 2015-10-29 21:42:25 +0100 | 
| commit | 9c66d880cfaa938f3d0814eaaf215e9a9dbfffa3 (patch) | |
| tree | 83d9b76e4fb6a40d096e63a122b989061cf1bc65 /Lib/defconQt/fontView.py | |
| parent | 5d62be8c4dfb601b92f9153400e3e1cc8712cf94 (diff) | |
| parent | 1a889dc612c036763d80815a00d4b9a8fc73ba78 (diff) | |
| download | trufont-9c66d880cfaa938f3d0814eaaf215e9a9dbfffa3.tar.bz2 | |
Merge pull request #95 from trufont/patch-5
meta: shufflings, loadMostRecentFile, metricsWindow: canvas key short…
Diffstat (limited to 'Lib/defconQt/fontView.py')
| -rw-r--r-- | Lib/defconQt/fontView.py | 203 | 
1 files changed, 122 insertions, 81 deletions
| diff --git a/Lib/defconQt/fontView.py b/Lib/defconQt/fontView.py index b0cc7e9..523719f 100644 --- a/Lib/defconQt/fontView.py +++ b/Lib/defconQt/fontView.py @@ -1,3 +1,4 @@ +from defconQt import __version__  from defconQt.featureTextEditor import MainEditWindow  from defconQt.fontInfo import TabDialog  from defconQt.glyphCollectionView import GlyphCollectionWidget @@ -8,7 +9,7 @@ from defconQt.scriptingWindow import MainScriptingWindow  from defconQt.objects.defcon import GlyphSet, TFont, TGlyph  from defconQt.util import platformSpecific  from defcon import Color, Component -from defconQt.spaceCenter import MainSpaceWindow, comboBoxItems +from defconQt.metricsWindow import MainMetricsWindow, comboBoxItems  from PyQt5.QtCore import (      pyqtSignal, QEvent, QMimeData, QRegularExpression, QSettings, Qt)  from PyQt5.QtGui import ( @@ -16,13 +17,14 @@ from PyQt5.QtGui import (      QRegularExpressionValidator, QTextCursor)  from PyQt5.QtWidgets import (      QAbstractItemView, QAction, QApplication, QCheckBox, QComboBox, QDialog, -    QDialogButtonBox, QErrorMessage, QFileDialog, QGridLayout, QGroupBox, -    QLabel, QLineEdit, QListWidget, QListWidgetItem, QMainWindow, QMenu, -    QMessageBox, QPlainTextEdit, QPushButton, QRadioButton, QSlider, QSplitter, -    QTabWidget, QTextEdit, QToolTip, QVBoxLayout, QWidget) +    QDialogButtonBox, QFileDialog, QGridLayout, QGroupBox, QLabel, QLineEdit, +    QListWidget, QListWidgetItem, QMainWindow, QMenu, QMessageBox, +    QPlainTextEdit, QPushButton, QRadioButton, QSlider, QSplitter, QTabWidget, +    QTextEdit, QToolTip, QVBoxLayout, QWidget)  from collections import OrderedDict  import os  import pickle +import platform  import traceback  cannedDesign = [ @@ -114,11 +116,11 @@ class Application(QApplication):  MAX_RECENT_FILES = 6 -class InspectorWindow(QWidget): +class InfoPanel(QWidget):      def __init__(self): -        super(InspectorWindow, self).__init__(flags=Qt.Tool) -        self.setWindowTitle("Inspector") +        super().__init__(flags=Qt.Tool) +        self.setWindowTitle("Info Panel")          self._blocked = False          self._glyph = None @@ -248,7 +250,8 @@ class InspectorWindow(QWidget):          self.setLayout(mainLayout)      def showEvent(self, event): -        super(InspectorWindow, self).showEvent(event) +        super().showEvent(event) +        # TODO: does not put window on secondary screen if applicable          screenRect = QApplication.desktop().screenGeometry()          widgetRect = self.frameGeometry()          x = screenRect.width() - (widgetRect.width() + 20) @@ -381,11 +384,11 @@ class InspectorWindow(QWidget):          self._blocked = False -class AddGlyphDialog(QDialog): +class AddGlyphsDialog(QDialog):      # TODO: implement Frederik's Glyph Construction Builder      def __init__(self, currentGlyphs=None, parent=None): -        super(AddGlyphDialog, self).__init__(parent) +        super(AddGlyphsDialog, self).__init__(parent)          self.setWindowModality(Qt.WindowModal)          self.setWindowTitle("Add glyphs…")          self.currentGlyphs = currentGlyphs @@ -398,8 +401,8 @@ class AddGlyphDialog(QDialog):          for name, glyphNames in glyphSets.items():              self.importCharDrop.addItem(name, glyphNames)          self.importCharDrop.currentIndexChanged[int].connect(self.importGlyphs) -        self.addGlyphEdit = QPlainTextEdit(self) -        self.addGlyphEdit.setFocus(True) +        self.addGlyphsEdit = QPlainTextEdit(self) +        self.addGlyphsEdit.setFocus(True)          self.addUnicodeBox = QCheckBox("Add Unicode", self)          self.addUnicodeBox.setChecked(True) @@ -415,7 +418,7 @@ class AddGlyphDialog(QDialog):          l = 0          layout.addWidget(self.importCharDrop, l, 3, 1, 2)          l += 1 -        layout.addWidget(self.addGlyphEdit, l, 0, 1, 5) +        layout.addWidget(self.addGlyphsEdit, l, 0, 1, 5)          l += 1          layout.addWidget(self.addUnicodeBox, l, 0)          layout.addWidget(self.addAsTemplateBox, l, 1) @@ -435,7 +438,7 @@ class AddGlyphDialog(QDialog):              sortFont=dialog.sortFontBox.isChecked(),          )          newGlyphNames = [] -        for name in dialog.addGlyphEdit.toPlainText().split(): +        for name in dialog.addGlyphsEdit.toPlainText().split():              if name not in dialog.currentGlyphNames:                  newGlyphNames.append(name)          return (newGlyphNames, params, result) @@ -444,7 +447,7 @@ class AddGlyphDialog(QDialog):          if index == 0:              return          glyphNames = self.importCharDrop.currentData() -        editorNames = self.addGlyphEdit.toPlainText().split() +        editorNames = self.addGlyphsEdit.toPlainText().split()          currentNames = set(self.currentGlyphNames) ^ set(editorNames)          changed = False          for name in glyphNames: @@ -452,12 +455,12 @@ class AddGlyphDialog(QDialog):                  changed = True                  editorNames.append(name)          if changed: -            self.addGlyphEdit.setPlainText(" ".join(editorNames)) -            cursor = self.addGlyphEdit.textCursor() +            self.addGlyphsEdit.setPlainText(" ".join(editorNames)) +            cursor = self.addGlyphsEdit.textCursor()              cursor.movePosition(QTextCursor.End, QTextCursor.MoveAnchor) -            self.addGlyphEdit.setTextCursor(cursor) +            self.addGlyphsEdit.setTextCursor(cursor)          self.importCharDrop.setCurrentIndex(0) -        self.addGlyphEdit.setFocus(True) +        self.addGlyphsEdit.setFocus(True)  class SortDialog(QDialog): @@ -467,7 +470,7 @@ class SortDialog(QDialog):          self.setWindowModality(Qt.WindowModal)          self.setWindowTitle("Sort…") -        self.smartSortBox = QRadioButton("Smart sort", self) +        self.smartSortBox = QRadioButton("Optimized sort", self)          self.smartSortBox.setToolTip("A combination of simple, complex and "                                       "custom sorts that give optimized "                                       "ordering results.") @@ -624,10 +627,16 @@ class MainWindow(QMainWindow):          self.collectionWidget = GlyphCollectionWidget(self)          self._font = None          self._sortDescriptor = None -        if font is None: -            self.newFile(True) -        else: +        settings = QSettings() +        loadRecentFile = settings.value("core/loadRecentFile", False, bool) +        if font is None and loadRecentFile: +            recentFiles = settings.value("core/recentFiles", [], type=str) +            if len(recentFiles): +                self.openFile(recentFiles[0], True) +        elif font is not None:              self.font = font +        if self._font is None: +            self.newFile(True)          self.collectionWidget.glyphSelectedCallback = self._selectionChanged          self.collectionWidget.doubleClickCallback = self._glyphOpened          # TODO: should default be True or False? @@ -640,7 +649,7 @@ class MainWindow(QMainWindow):          fileMenu.addAction("&New…", self.newFile, QKeySequence.New)          fileMenu.addAction("&Open…", self.openFile, QKeySequence.Open)          # recent files -        self.recentFilesMenu = QMenu("Open &recent…", self) +        self.recentFilesMenu = QMenu("Open &Recent…", self)          for i in range(MAX_RECENT_FILES):              action = QAction(self.recentFilesMenu)              action.setVisible(False) @@ -650,14 +659,14 @@ class MainWindow(QMainWindow):          fileMenu.addMenu(self.recentFilesMenu)          fileMenu.addSeparator()          fileMenu.addAction("&Save", self.saveFile, QKeySequence.Save) -        fileMenu.addAction("Save &as…", self.saveFileAs, QKeySequence.SaveAs) +        fileMenu.addAction("Save &As…", self.saveFileAs, QKeySequence.SaveAs)          fileMenu.addAction("Export…", self.export) -        fileMenu.addAction("Reload from disk", self.reload) +        fileMenu.addAction("Reload From Disk", self.reload)          fileMenu.addAction("E&xit", self.close, QKeySequence.Quit)          menuBar.addMenu(fileMenu)          editMenu = QMenu("&Edit", self) -        markColorMenu = QMenu("Flag color", self) +        markColorMenu = QMenu("Flag Color", self)          pixmap = QPixmap(24, 24)          none = markColorMenu.addAction("None", self.markColor)          none.setData(None) @@ -675,7 +684,7 @@ class MainWindow(QMainWindow):          green.setData(QColor(Qt.green))          editMenu.addMenu(markColorMenu)          editMenu.addAction("Copy", self.copy, QKeySequence.Copy) -        editMenu.addAction("Copy as component", +        editMenu.addAction("Copy As Component",                             self.copyAsComponent, "Ctrl+Alt+C")          editMenu.addAction("Paste", self.paste, QKeySequence.Paste)          editMenu.addSeparator() @@ -685,23 +694,23 @@ class MainWindow(QMainWindow):          fontMenu = QMenu("&Font", self)          # TODO: work out sensible shortcuts and make sure they're          # cross-platform ready - consider extracting them into separate file? -        fontMenu.addAction("&Add glyph", self.addGlyph, "Ctrl+G") -        fontMenu.addAction("Font &info", self.fontInfo, "Ctrl+Alt+I") -        fontMenu.addAction("Font &features", self.fontFeatures, "Ctrl+Alt+F") +        fontMenu.addAction("&Add Glyphs…", self.addGlyphs, "Ctrl+G") +        fontMenu.addAction("Font &Info", self.fontInfo, "Ctrl+Alt+I") +        fontMenu.addAction("Font &Features", self.fontFeatures, "Ctrl+Alt+F")          fontMenu.addSeparator() -        fontMenu.addAction("Sort…", self.sortGlyphs) +        fontMenu.addAction("&Sort…", self.sortGlyphs)          menuBar.addMenu(fontMenu)          pythonMenu = QMenu("&Python", self) -        pythonMenu.addAction("Scripting &window", self.scripting, "Ctrl+Alt+R") +        pythonMenu.addAction("Scripting &Window", self.scripting, "Ctrl+Alt+R")          menuBar.addMenu(pythonMenu)          windowMenu = QMenu("&Windows", self) -        action = windowMenu.addAction("&Inspector", self.inspector, "Ctrl+I") +        action = windowMenu.addAction("&Info Panel", self.infoPanel, "Ctrl+I")          # XXX: we're getting duplicate shortcut when we spawn a new window...          action.setShortcutContext(Qt.ApplicationShortcut) -        windowMenu.addAction("&Space center", self.spaceCenter, "Ctrl+Alt+S") -        windowMenu.addAction("&Groups window", self.fontGroups, "Ctrl+Alt+G") +        windowMenu.addAction("&Metrics Window", self.metrics, "Ctrl+Alt+S") +        windowMenu.addAction("&Groups Window", self.groups, "Ctrl+Alt+G")          menuBar.addMenu(windowMenu)          helpMenu = QMenu("&Help", self) @@ -753,7 +762,7 @@ class MainWindow(QMainWindow):          else:              self.font = font -    def openFile(self, path=None): +    def openFile(self, path=None, stickToSelf=False):          if not path:              path, ok = QFileDialog.getOpenFileName(                  self, "Open File", '', @@ -765,7 +774,7 @@ class MainWindow(QMainWindow):              if ".plist" in path:                  path = os.path.dirname(path)              for window in QApplication.topLevelWidgets(): -                if (isinstance(window, MainWindow) +                if (isinstance(window, MainWindow) and window._font is not None                          and window._font.path == path):                      window.raise_()                      return @@ -774,8 +783,11 @@ class MainWindow(QMainWindow):              except:                  print(traceback.format_exc())                  return -            window = MainWindow(font) -            window.show() +            if not stickToSelf: +                window = MainWindow(font) +                window.show() +            else: +                self.font = font      def openRecentFont(self):          fontPath = self.sender().toolTip() @@ -822,12 +834,12 @@ class MainWindow(QMainWindow):          try:              from ufo2fdk import haveFDK, OTFCompiler          except Exception as e: -            errorMessage = QErrorMessage(self) -            errorMessage.showMessage(e) +            title = e.__class__.__name__ +            QMessageBox.critical(self, title, str(e))              return          if not haveFDK(): -            errorMessage = QErrorMessage(self) -            errorMessage.showMessage("The Adobe FDK could not be found.") +            QMessageBox.critical(self, "Missing dependency", "The Adobe FDK " +                                 "could not be found.")              return          path, ok = QFileDialog.getSaveFileName(self, "Save File", None, @@ -1095,32 +1107,31 @@ class MainWindow(QMainWindow):          else:              self.fontFeaturesWindow.raise_() -    def spaceCenter(self): +    def metrics(self):          # TODO: see up here -        # TODO: show selection in a space center, rewind selection if we raise -        # window (rf) -        if not (hasattr(self, 'spaceCenterWindow') -                and self.spaceCenterWindow.isVisible()): -            self.spaceCenterWindow = MainSpaceWindow(self.font, parent=self) -            self.spaceCenterWindow.show() +        if not (hasattr(self, 'metricsWindow') +                and self.metricsWindow.isVisible()): +            self.metricsWindow = MainMetricsWindow(self.font, parent=self) +            self.metricsWindow.show()          else: -            self.spaceCenterWindow.raise_() +            self.metricsWindow.raise_() +        # TODO: decouple          selection = self.collectionWidget.selection          if selection:              glyphs = []              for item in sorted(selection):                  glyph = self.collectionWidget.glyphs[item]                  glyphs.append(glyph) -            self.spaceCenterWindow.setGlyphs(glyphs) +            self.metricsWindow.setGlyphs(glyphs) -    def fontGroups(self): +    def groups(self):          # TODO: see up here -        if not (hasattr(self, 'fontGroupsWindow') -                and self.fontGroupsWindow.isVisible()): -            self.fontGroupsWindow = GroupsWindow(self.font, self) -            self.fontGroupsWindow.show() +        if not (hasattr(self, 'groupsWindow') +                and self.groupsWindow.isVisible()): +            self.groupsWindow = GroupsWindow(self.font, self) +            self.groupsWindow.show()          else: -            self.fontGroupsWindow.raise_() +            self.groupsWindow.raise_()      def scripting(self):          app = QApplication.instance() @@ -1132,18 +1143,18 @@ class MainWindow(QMainWindow):          else:              app.scriptingWindow.show() -    def inspector(self): +    def infoPanel(self):          app = QApplication.instance() -        if not hasattr(app, 'inspectorWindow'): -            app.inspectorWindow = InspectorWindow() -            app.inspectorWindow.show() -        elif app.inspectorWindow.isVisible(): +        if not hasattr(app, 'infoPanelWindow'): +            app.infoPanelWindow = InfoPanel() +            app.infoPanelWindow.show() +        elif app.infoPanelWindow.isVisible():              # TODO: do this only if the widget is user-visible, otherwise the              # key press feels as if it did nothing              # toggle -            app.inspectorWindow.close() +            app.infoPanelWindow.close()          else: -            app.inspectorWindow.show() +            app.infoPanelWindow.show()      def sortGlyphs(self):          sortDescriptor, ok = SortDialog.getDescriptor(self, @@ -1151,9 +1162,9 @@ class MainWindow(QMainWindow):          if ok:              self.sortDescriptor = sortDescriptor -    def addGlyph(self): +    def addGlyphs(self):          glyphs = self.collectionWidget.glyphs -        newGlyphNames, params, ok = AddGlyphDialog.getNewGlyphNames( +        newGlyphNames, params, ok = AddGlyphsDialog.getNewGlyphNames(              self, glyphs)          if ok:              sortFont = params.pop("sortFont") @@ -1171,12 +1182,19 @@ class MainWindow(QMainWindow):      def about(self):          name = QApplication.applicationName() -        QMessageBox.about( -            self, "About {}".format(name), -            "<h3>About {}</h3>" -            "<p>I am a new UFO-centric font editor and I aim to bring " -            "the <b>robofab</b> ecosystem to all main operating systems, " -            "in a fast and dependency-free package.</p>".format(name)) +        domain = QApplication.organizationDomain() +        text = "<h3>About {}</h3>" \ +               "<p>I am a new UFO-centric font editor and I aim to bring " \ +               "the <b>robofab</b> ecosystem to all main operating systems, " \ +               "in a fast and dependency-free package.</p>" \ +               "<p>Version {} – Python {}.".format( +                   name, __version__, platform.python_version()) +        if domain: +            text += "<br>See <a href='http://{d}'>{d}</a> for more " \ +                    "information.</p>".format(d=domain) +        else: +            text += "</p>" +        QMessageBox.about(self, "About {}".format(name), text)  class SettingsDialog(QDialog): @@ -1188,7 +1206,8 @@ class SettingsDialog(QDialog):          self.tabWidget = QTabWidget(self)          self.tabWidget.addTab(GlyphSetTab(self), "Glyph sets") -        self.tabWidget.addTab(SpaceCenterTab(self), "Space center") +        self.tabWidget.addTab(MetricsWindowTab(self), "Metrics Window") +        self.tabWidget.addTab(MiscTab(self), "Misc")          buttonBox = QDialogButtonBox(              QDialogButtonBox.Ok | QDialogButtonBox.Cancel) @@ -1232,7 +1251,7 @@ def readGlyphSets(settings=None):  class GlyphSetTab(QWidget):      def __init__(self, parent=None): -        super(GlyphSetTab, self).__init__(parent) +        super().__init__(parent)          settings = QSettings()          self.defaultGlyphSetBox = QCheckBox("Default glyph set:", self) @@ -1366,16 +1385,16 @@ class GlyphSetTab(QWidget):                  settings.setValue("settings/defaultGlyphSet", defaultGlyphSet) -class SpaceCenterTab(QTabWidget): +class MetricsWindowTab(QTabWidget):      def __init__(self, parent=None): -        super(SpaceCenterTab, self).__init__(parent) +        super().__init__(parent)          settings = QSettings()          self.inputTextLabel = QLabel("Default text:", self)          self.inputTextList = QListWidget(self)          self.inputTextList.setDragDropMode(QAbstractItemView.InternalMove) -        entries = settings.value("spaceCenter/comboBoxItems", comboBoxItems, +        entries = settings.value("metricsWindow/comboBoxItems", comboBoxItems,                                   str)          for entry in entries:              item = QListWidgetItem(entry, self.inputTextList) @@ -1414,4 +1433,26 @@ class SpaceCenterTab(QTabWidget):              item = self.inputTextList.item(i)              entries.append(item.text())          settings = QSettings() -        settings.setValue("spaceCenter/comboBoxItems", entries) +        settings.setValue("metricsWindow/comboBoxItems", entries) + + +class MiscTab(QTabWidget): + +    def __init__(self, parent=None): +        super().__init__(parent) + +        settings = QSettings() +        loadRecentFile = settings.value("core/loadRecentFile", False, bool) +        self.loadRecentFileBox = QCheckBox("Load most recent file on start", +                                           self) +        self.loadRecentFileBox.setChecked(loadRecentFile) + +        layout = QVBoxLayout(self) +        l = 0 +        layout.addWidget(self.loadRecentFileBox, l) +        self.setLayout(layout) + +    def writeValues(self): +        settings = QSettings() +        loadRecentFile = self.loadRecentFileBox.isChecked() +        settings.setValue("core/loadRecentFile", loadRecentFile) | 
