def onMonoFontChange(self, propagate=True): font = QFont(self.monoFontComboBox.currentFont()) font.setPointSize(self.monoFontSizeSpinBox.value()) if propagate and bool(self.state.model): self.state.model.setConfig(Gconf.Key.MonoFont, font.family()) self.state.model.setConfig(Gconf.Key.MonoFontSize, font.pointSize())
def onDisplayMonoFontChange(self, propagate=True): font = QFont(self.displaymonoFontComboBox.currentFont()) font.setPointSize(self.displaymonoFontSizeSpinBox.value()) if propagate: settings = QSettings() settings.setValue(Gopt.Key.MonoFont, font.family()) settings.setValue(Gopt.Key.MonoFontSize, font.pointSize()) self.state.updateDisplayFonts()
class Panel(QWidget): characterSelected = Signal(str) fontResized = Signal(float) def __init__(self, parent=None): super().__init__(parent) self.displayFont = QFont() self.displayFont.setStyleStrategy(QFont.PreferDefault) self.updateFont(self.displayFont.family()) self.currentChar = "" self.setMouseTracking(True) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) def updateFont(self, family): self.displayFont.setFamily(family) self.updateSize(self.displayFont.pointSize()) def updateSize(self, size): size = int(size) self.displayFont.setPointSize(size) self.squareSize = max(SQUARE_SIZE, QFontMetrics(self.displayFont).xHeight() * 3) self.fontResized.emit(self.squareSize) self.adjustSize() self.update() def minimumWidth(self): return COLUMNS * self.squareSize def sizeHint(self): return QSize(self.minimumWidth(), (MAX_CHAR / COLUMNS) * self.squareSize) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.currentChar = chr((event.y() // self.squareSize) * COLUMNS + event.x() // self.squareSize) if not unicodedata.category(self.currentChar).startswith("C"): self.characterSelected.emit(self.currentChar) self.update() else: super().mousePressEvent(event) def mouseMoveEvent(self, event): pos = self.mapFromGlobal(event.globalPos()) code = ((pos.y() // self.squareSize) * COLUMNS + pos.x() // self.squareSize) name = "unnamed" try: name = unicodedata.name(chr(code)).capitalize() except ValueError: pass text = """<p><span style="font-size: 18pt;">{0:c}</span></p> <p><span style="font-size: 13pt;">U+{0:04X}<br>{1}</span></p>""".format( code, name) QToolTip.showText(event.globalPos(), text, self) def paintEvent(self, event): painter = QPainter(self) painter.fillRect(event.rect(), Qt.white) painter.setFont(self.displayFont) redrawRect = event.rect() beginRow = redrawRect.top() // self.squareSize endRow = redrawRect.bottom() // self.squareSize beginColumn = redrawRect.left() // self.squareSize endColumn = redrawRect.right() // self.squareSize painter.setPen(Qt.gray) for row in range(beginRow, endRow + 1): for column in range(beginColumn, endColumn + 1): painter.drawRect(column * self.squareSize, row * self.squareSize, self.squareSize, self.squareSize) fontMetrics = QFontMetrics(self.displayFont) painter.setPen(Qt.black) for row in range(beginRow, endRow + 1): for column in range(beginColumn, endColumn + 1): char = chr(row * COLUMNS + column) painter.setClipRect(column * self.squareSize, row * self.squareSize, self.squareSize, self.squareSize) if char == self.currentChar: painter.fillRect(column * self.squareSize + 1, row * self.squareSize + 1, self.squareSize, self.squareSize, Qt.green) painter.drawText( column * self.squareSize + (self.squareSize / 2) - fontMetrics.width(char) / 2, row * self.squareSize + 4 + fontMetrics.ascent(), char)