diff --git a/BRFNTify.py b/BRFNTify.py index 4388618..dcefdbb 100644 --- a/BRFNTify.py +++ b/BRFNTify.py @@ -38,7 +38,7 @@ import traceback import unicodedata -from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt6 import QtCore, QtGui, QtWidgets Qt = QtCore.Qt import TPLLib @@ -102,7 +102,7 @@ def createHorzLine(): Helper to create a horizontal line widget """ f = QtWidgets.QFrame() - f.setFrameStyle(QtWidgets.QFrame.HLine | QtWidgets.QFrame.Sunken) + f.setFrameStyle(QtWidgets.QFrame.Shape.HLine | QtWidgets.QFrame.Shadow.Sunken) return f @@ -181,16 +181,16 @@ def __init__(self): self.setWindowIcon(ico) self.fontDock = FontMetricsDock(self) - self.fontDock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) + self.fontDock.setAllowedAreas(Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea) self.charDock = CharMetricsDock(self) - self.charDock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) + self.charDock.setAllowedAreas(Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea) self.prevDock = TextPreviewDock(self) self.prevDock.setVisible(False) - self.prevDock.setAllowedAreas(Qt.TopDockWidgetArea | Qt.BottomDockWidgetArea) - self.prevDock.setFeatures(self.prevDock.features() | QtWidgets.QDockWidget.DockWidgetVerticalTitleBar) - self.addDockWidget(Qt.LeftDockWidgetArea, self.fontDock) - self.addDockWidget(Qt.RightDockWidgetArea, self.charDock) - self.addDockWidget(Qt.BottomDockWidgetArea, self.prevDock) + self.prevDock.setAllowedAreas(Qt.DockWidgetArea.TopDockWidgetArea | Qt.DockWidgetArea.BottomDockWidgetArea) + self.prevDock.setFeatures(self.prevDock.features() | QtWidgets.QDockWidget.DockWidgetFeature.DockWidgetVerticalTitleBar) + self.addDockWidget(Qt.DockWidgetArea.LeftDockWidgetArea, self.fontDock) + self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, self.charDock) + self.addDockWidget(Qt.DockWidgetArea.BottomDockWidgetArea, self.prevDock) self.brfntScene.selectionChanged.connect(self.charDock.updateGlyph) self.CreateMenus() @@ -202,12 +202,12 @@ def CreateMenus(self): """ # create the actions self.actions = {} - self.CreateAction('open', self.HandleOpen, GetIcon('open'), '&Open...', 'Open a font file', QtGui.QKeySequence.Open) - self.CreateAction('save', self.HandleSave, GetIcon('save'), '&Save', 'Save the font file', QtGui.QKeySequence.Save) - self.CreateAction('saveas', self.HandleSaveAs, GetIcon('saveas'), 'Save &as...', 'Save the font file to a new filename', QtGui.QKeySequence.SaveAs) - self.CreateAction('exportasimg', self.HandleExportAsImage, None, '&Export as Image...', 'Export all characters as an image', 'Ctrl+E') - self.CreateAction('importfromimg', self.HandleImportFromImage, None, '&Import from Image...', 'Import all characters from an image', 'Ctrl+I') - self.CreateAction('generate', self.HandleGenerate, None, '&Generate', 'Generate a font from one installed on your computer', 'Ctrl+G') + self.CreateAction('open', self.HandleOpen, GetIcon('open'), '&Open...', 'Open a font file', QtGui.QKeySequence.StandardKey.Open) + self.CreateAction('save', self.HandleSave, GetIcon('save'), '&Save', 'Save the font file', QtGui.QKeySequence.StandardKey.Save) + self.CreateAction('saveas', self.HandleSaveAs, GetIcon('saveas'), 'Save &as...', 'Save the font file to a new filename', QtGui.QKeySequence.StandardKey.SaveAs) + self.CreateAction('importfromimg', self.HandleImportFromImage, GetIcon('import'), '&Import from Image...', 'Import all characters from an image', 'Ctrl+I') + self.CreateAction('exportasimg', self.HandleExportAsImage, GetIcon('export'), '&Export as Image...', 'Export all characters as an image', 'Ctrl+E') + self.CreateAction('generate', self.HandleGenerate, GetIcon('generate'), '&Generate', 'Generate a font from one installed on your computer', 'Ctrl+G') self.SetOutputEnabled(False) # Dock show/hide actions are created later self.CreateAction('leading', self.HandleLeading, GetIcon('leading'), '&Leading', 'Show or hide leading lines (the height of each line of text)', 'Ctrl+1') @@ -241,8 +241,8 @@ def CreateMenus(self): self.fileMenu.addAction(self.actions['save']) self.fileMenu.addAction(self.actions['saveas']) self.fileMenu.addSeparator() - self.fileMenu.addAction(self.actions['exportasimg']) self.fileMenu.addAction(self.actions['importfromimg']) + self.fileMenu.addAction(self.actions['exportasimg']) self.fileMenu.addSeparator() self.fileMenu.addAction(self.actions['generate']) m.addMenu(self.fileMenu) @@ -294,9 +294,9 @@ def CreateAction(self, shortname, function, icon, text, statustext, shortcut, to """ if icon is not None: - act = QtWidgets.QAction(icon, text, self) + act = QtGui.QAction(icon, text, self) else: - act = QtWidgets.QAction(text, self) + act = QtGui.QAction(text, self) if shortcut is not None: act.setShortcut(shortcut) if statustext is not None: act.setStatusTip(statustext) @@ -339,7 +339,7 @@ def ShowErrorBox(self, caption): txtedit = QtWidgets.QPlainTextEdit(btm) txtedit.setReadOnly(True) - buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok) + buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.StandardButton.Ok) layout = QtWidgets.QVBoxLayout() layout.addWidget(toplbl) @@ -352,7 +352,7 @@ def ShowErrorBox(self, caption): dlg.setMinimumWidth(384) dlg.setWindowTitle('Error') buttonBox.accepted.connect(dlg.accept) - dlg.exec_() + dlg.exec() def HandleOpen(self): @@ -477,7 +477,7 @@ def HandleGenerate(self): """ dlg = GenerateDialog() - if dlg.exec_() == QtWidgets.QDialog.Accepted: + if dlg.exec() == QtWidgets.QDialog.DialogCode.Accepted: # Create a bunch of glyphs, I guess. chars = dlg.chars.text() @@ -551,19 +551,23 @@ def HandleAbout(self): txtedit = QtWidgets.QPlainTextEdit(readme) txtedit.setReadOnly(True) - buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok) + buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.StandardButton.Ok) layout = QtWidgets.QVBoxLayout() layout.addWidget(txtedit) layout.addWidget(buttonBox) dlg = QtWidgets.QDialog() + ico = QtGui.QIcon() + ico.addPixmap(QtGui.QPixmap('data/icon-logobig.png')) + ico.addPixmap(QtGui.QPixmap('data/icon-logosmall.png')) + dlg.setWindowIcon(ico) dlg.setLayout(layout) dlg.setModal(True) dlg.setMinimumWidth(512) dlg.setWindowTitle('About') buttonBox.accepted.connect(dlg.accept) - dlg.exec_() + dlg.exec() zoomLevels = [20.0, 35.0, 50.0, 65.0, 80.0, 90.0, 100.0, 125.0, 150.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0] @@ -595,11 +599,15 @@ class GenerateDialog(QtWidgets.QDialog): """ Allows the user to generate a glyph table from an installed font """ - fg = Qt.black - bg = Qt.transparent + fg = Qt.GlobalColor.black + bg = Qt.GlobalColor.transparent def __init__(self): super().__init__() + ico = QtGui.QIcon() + ico.addPixmap(QtGui.QPixmap('data/icon-logobig.png')) + ico.addPixmap(QtGui.QPixmap('data/icon-logosmall.png')) + self.setWindowIcon(ico) self.setWindowTitle('Generate a Font') # Font and style group box @@ -608,7 +616,7 @@ def __init__(self): self.fontCombo = QtWidgets.QFontComboBox() self.sizeCombo = QtWidgets.QComboBox() self.weightValue = QtWidgets.QSpinBox() - self.italicCheckbox = QtWidgets.QCheckBox('Italic') + self.italicCheckbox = QtWidgets.QCheckBox() self.findSizes(self.fontCombo.currentFont()) @@ -621,8 +629,14 @@ def __init__(self): fontLayout.addRow('Font:', self.fontCombo) fontLayout.addRow('Size:', self.sizeCombo) fontLayout.addRow('Weight:', self.weightValue) - fontLayout.addRow('', QtWidgets.QLabel('Default is 50. Bold is 75. More information.')) - fontLayout.addRow(self.italicCheckbox) + + # separate the QLabel from the addRow function so the link can actually be clicked on + + boldLabel = QtWidgets.QLabel('Default is 50. Bold is 75. More information.') + boldLabel.setOpenExternalLinks(True) + + fontLayout.addRow('', boldLabel) + fontLayout.addRow('Italic:', self.italicCheckbox) # Colors group box colorsGroupBox = QtWidgets.QGroupBox('Colors') @@ -663,7 +677,7 @@ def __init__(self): charsLayout.addWidget(self.chars) # Button box and overall layout - buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) + buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.StandardButton.Ok | QtWidgets.QDialogButtonBox.StandardButton.Cancel) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) @@ -678,13 +692,12 @@ def findSizes(self, font): """ Add font sizes to self.sizeCombo """ - fontDatabase = QtGui.QFontDatabase() currentSize = self.sizeCombo.currentText() with blockSignalsFrom(self.sizeCombo): self.sizeCombo.clear() - if fontDatabase.isSmoothlyScalable(font.family(), fontDatabase.styleString(font)): + if QtGui.QFontDatabase.isSmoothlyScalable(font.family(), QtGui.QFontDatabase.styleString(font)): self.sizeCombo.setEditable(True) for size in QtGui.QFontDatabase.standardSizes(): @@ -694,7 +707,7 @@ def findSizes(self, font): self.sizeCombo.setEditable(False) addedAny = False - for size in fontDatabase.smoothSizes(font.family(), fontDatabase.styleString(font)): + for size in QtGui.QFontDatabase.smoothSizes(font.family(), QtGui.QFontDatabase.styleString(font)): self.sizeCombo.addItem(str(size)) addedAny = True @@ -714,7 +727,7 @@ def fgBtnClick(self): User clicked the Choose... button for the foreground color """ dlg = QtWidgets.QColorDialog(self) - dlg.setOption(dlg.ShowAlphaChannel, True) + dlg.setOption(dlg.ColorDialogOption.ShowAlphaChannel, True) dlg.setCurrentColor(self.fg) dlg.open() dlg.finished.connect(lambda state: self.fgBtnClick2(state, dlg)) @@ -724,7 +737,7 @@ def fgBtnClick2(self, state, dlg): """ Called when the user closes the color dialog """ - if state != dlg.Accepted: return + if state != dlg.DialogCode.Accepted: return self.fg = dlg.currentColor() @@ -738,7 +751,7 @@ def bgBtnClick(self): User clicked the Choose... button for the background color """ dlg = QtWidgets.QColorDialog(self) - dlg.setOption(dlg.ShowAlphaChannel, True) + dlg.setOption(dlg.ColorDialogOption.ShowAlphaChannel, True) dlg.setCurrentColor(self.bg) dlg.open() dlg.finished.connect(lambda state: self.bgBtnClick2(state, dlg)) @@ -748,7 +761,7 @@ def bgBtnClick2(self, state, dlg): """ Called when the user closes the color dialog """ - if state != dlg.Accepted: return + if state != dlg.DialogCode.Accepted: return self.bg = dlg.currentColor() @@ -786,9 +799,9 @@ def __init__(self, pixmap, char, leftMargin=0, charWidth=0, fullWidth=0): self.boundingRect = QtCore.QRectF(0,0,pixmap.width(),pixmap.height()) self.selectionRect = QtCore.QRectF(0,0,pixmap.width()-1,pixmap.height()-1) - self.setFlag(self.ItemIsMovable, False) - self.setFlag(self.ItemIsSelectable, True) - self.setFlag(self.ItemIsFocusable, True) + self.setFlag(self.GraphicsItemFlag.ItemIsMovable, False) + self.setFlag(self.GraphicsItemFlag.ItemIsSelectable, True) + self.setFlag(self.GraphicsItemFlag.ItemIsFocusable, True) def value(self, encoding): @@ -829,9 +842,9 @@ def contextMenuEvent(self, e): QtWidgets.QGraphicsItem.contextMenuEvent(self, e) menu = QtWidgets.QMenu() - menu.addAction('Import...', self.handleImport) - menu.addAction('Export...', self.handleExport) - menu.exec_(e.screenPos()) + menu.addAction(GetIcon('import'), 'Import...', self.handleImport) + menu.addAction(GetIcon('export'), 'Export...', self.handleExport) + menu.exec(e.screenPos()) def handleExport(self): @@ -864,11 +877,11 @@ def handleImport(self): tooWide = pix.width() > self.pixmap.width() tooTall = pix.height() > self.pixmap.height() if tooWide and tooTall: - pix = pix.scaled(self.pixmap.width(), self.pixmap.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) + pix = pix.scaled(self.pixmap.width(), self.pixmap.height(), Qt.AspectRatioMode.IgnoreAspectRatio, Qt.TransformationMode.SmoothTransformation) elif tooWide: - pix = pix.scaledToWidth(self.pixmap.width(), Qt.SmoothTransformation) + pix = pix.scaledToWidth(self.pixmap.width(), Qt.TransformationMode.SmoothTransformation) elif tooTall: - pix = pix.scaledToHeight(self.pixmap.height(), Qt.SmoothTransformation) + pix = pix.scaledToHeight(self.pixmap.height(), Qt.TransformationMode.SmoothTransformation) # Set it self.pixmap = pix @@ -884,7 +897,7 @@ def paint(self, painter, option, widget): painter.drawPixmap(0, 0, self.pixmap) if self.isSelected(): - painter.setPen(QtGui.QPen(Qt.blue, 1, Qt.SolidLine)) + painter.setPen(QtGui.QPen(Qt.GlobalColor.blue, 1, Qt.PenStyle.SolidLine)) painter.drawRect(self.selectionRect) painter.fillRect(self.selectionRect, QtGui.QColor.fromRgb(255, 255, 255, 64)) @@ -1013,7 +1026,7 @@ def handler(): scrollArea = QtWidgets.QScrollArea() scrollArea.setWidget(baseWidget) scrollArea.setWidgetResizable(True) - scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) self.setWidget(scrollArea) @@ -1300,11 +1313,11 @@ def __init__(self, parent): self.textEdit = QtWidgets.QPlainTextEdit() self.textEdit.setEnabled(False) self.textEdit.textChanged.connect(self.updatePreview) - self.textEdit.setWordWrapMode(QtGui.QTextOption.NoWrap) + self.textEdit.setWordWrapMode(QtGui.QTextOption.WrapMode.NoWrap) self.textEdit.setMinimumWidth(128) self.prevWidget = QtWidgets.QLabel() - self.prevWidget.setAlignment(Qt.AlignLeft | Qt.AlignTop) + self.prevWidget.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) scrl = QScrollAreaWithContextMenuSignal() scrl.setWidget(self.prevWidget) scrl.setWidgetResizable(True) @@ -1387,7 +1400,7 @@ def handleContextMenu(self, event): if self.prevWidget.pixmap() is None: act.setEnabled(False) - menu.exec_(event.globalPos()) + menu.exec(event.globalPos()) def handleExport(self): """ @@ -1432,11 +1445,11 @@ def __init__(self, parent=None): self.drawBaseline = False self.drawWidths = False - self.setAlignment(Qt.AlignLeft | Qt.AlignTop) + self.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignTop) self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor.fromRgb(119, 136, 153))) self.setMouseTracking(True) - self.YScrollBar = QtWidgets.QScrollBar(Qt.Vertical, parent) - self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.YScrollBar = QtWidgets.QScrollBar(Qt.Orientation.Vertical, parent) + self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) def updateDisplay(self): @@ -1671,7 +1684,7 @@ def _initFromData(self, tmpf): decoder = TPLLib.decoder(self.texFormat) decoder = decoder(tex, texWidth, texHeight) newdata = decoder.run() - dest = QtGui.QImage(newdata, texWidth, texHeight, 4 * texWidth, QtGui.QImage.Format_ARGB32) + dest = QtGui.QImage(newdata, texWidth, texHeight, 4 * texWidth, QtGui.QImage.Format.Format_ARGB32) y = 0 for a in range(self.charsPerColumn): @@ -1705,6 +1718,7 @@ def generate(cls, qfont, chars, fgColor, bgColor): self.encoding = 'UTF-16' self.endianness = '>' + self.offsetSize64 = False self.glyphs = [] fontMetrics = QtGui.QFontMetrics(qfont) @@ -1712,7 +1726,7 @@ def generate(cls, qfont, chars, fgColor, bgColor): for c in chars: # make a pixmap rect = fontMetrics.boundingRect(c) - tex = QtGui.QImage(fontMetrics.maxWidth(), fontMetrics.height(), QtGui.QImage.Format_ARGB32) + tex = QtGui.QImage(fontMetrics.maxWidth(), fontMetrics.height(), QtGui.QImage.Format.Format_ARGB32) tex.fill(bgColor) painter = QtGui.QPainter(tex) painter.setPen(fgColor) @@ -1722,7 +1736,7 @@ def generate(cls, qfont, chars, fgColor, bgColor): painter.end() newtex = QtGui.QPixmap.fromImage(tex) - self.glyphs.append(Glyph(newtex, c, 0, fontMetrics.width(c), fontMetrics.width(c))) + self.glyphs.append(Glyph(newtex, c, 0, fontMetrics.horizontalAdvance(c), fontMetrics.horizontalAdvance(c))) self.rfntVersionMajor = 0xFFFE @@ -1782,8 +1796,8 @@ def save(self): for g in self.glyphs: if currentTexP is None: # make new tex - tex = QtGui.QImage(texWidth, texHeight, QtGui.QImage.Format_ARGB32_Premultiplied) - tex.fill(QtCore.Qt.transparent) + tex = QtGui.QImage(texWidth, texHeight, QtGui.QImage.Format.Format_ARGB32_Premultiplied) + tex.fill(QtCore.Qt.GlobalColor.transparent) currentTexP = QtGui.QPainter(tex) texImages.append(tex) @@ -2002,8 +2016,8 @@ def exportImage(self): """ texWidth, texHeight, rows, columns = self.getExportedImageMetrics() - tex = QtGui.QImage(texWidth, texHeight, QtGui.QImage.Format_ARGB32_Premultiplied) - tex.fill(QtCore.Qt.transparent) + tex = QtGui.QImage(texWidth, texHeight, QtGui.QImage.Format.Format_ARGB32_Premultiplied) + tex.fill(QtCore.Qt.GlobalColor.transparent) texP = QtGui.QPainter(tex) for i, g in enumerate(self.glyphs): @@ -2102,4 +2116,4 @@ def charToValue(char, encoding): window = Window() window.show() - sys.exit(app.exec_()) + sys.exit(app.exec()) diff --git a/data/icon-ascent.png b/data/icon-ascent.png index ac0d044..56c6fd4 100644 Binary files a/data/icon-ascent.png and b/data/icon-ascent.png differ diff --git a/data/icon-baseline.png b/data/icon-baseline.png index 22d187c..69e026a 100644 Binary files a/data/icon-baseline.png and b/data/icon-baseline.png differ diff --git a/data/icon-export.png b/data/icon-export.png new file mode 100644 index 0000000..a79bb94 Binary files /dev/null and b/data/icon-export.png differ diff --git a/data/icon-generate.png b/data/icon-generate.png new file mode 100644 index 0000000..cce35e2 Binary files /dev/null and b/data/icon-generate.png differ diff --git a/data/icon-leading.png b/data/icon-leading.png index fee7ae5..7d98685 100644 Binary files a/data/icon-leading.png and b/data/icon-leading.png differ diff --git a/data/icon-widths.png b/data/icon-widths.png index d27b353..56f0620 100644 Binary files a/data/icon-widths.png and b/data/icon-widths.png differ diff --git a/readme.md b/readme.md index 953074c..5298a4b 100644 --- a/readme.md +++ b/readme.md @@ -6,7 +6,7 @@ By Tempus ## Requirements -Requires Python 3, PyQt5 and TPLLib +Requires Python 3, PyQt6 and TPLLib ## Credits * Tempus, for making the first version of this