def render(self, text, _, color): if self.font is None: return "", (0, 0) fm = QFontMetrics(self.font) rect = fm.boundingRect(text) im = QImage( rect.x() + rect.width(), rect.height(), QImage.Format_ARGB32_Premultiplied, ) im.fill(QColor(0, 0, 0, 0)) painter = QPainter() painter.begin(im) painter.setPen(QPen(QColor(*color))) painter.setFont(self.font) painter.drawText(QPoint(0 - rect.x(), 0 - rect.y()), text) painter.end() bits = im.bits() try: pixels = bits.tobytes() except AttributeError: bits.setsize(im.byteCount()) pixels = bytes(bits) return pixels, (rect.x() + rect.width(), rect.height())
def __init__(self, parent, *, argv, columns=80, rows=24): super().__init__(parent) self.font = ui.Font("Roboto Mono", 14) self.set_background_color(ui.Color(*COLOR)) self.text_color = ui.Color(0xFF, 0xFF, 0xFF) self.input_thread = None self.output_thread = None self.output.connect(self.__on_output) self._completed = False self.exited.connect(self.__on_exited) self.line_buffer = [] self.lines = [] # for _ in range(25): self._new_line() self.cx = 0 self.cy = 0 # self.execute(["version"]) # self.execute(["python", "-i"]) self.process = None self.execute(argv) # FIXME: Using Qt directly from fsui.qt import Qt, QPainter, QPixmap self._widget.setFocusPolicy(Qt.StrongFocus) painter = QPainter() pixmap = QPixmap(100, 100) painter.begin(pixmap) painter.setFont(self.font.qfont()) size = painter.boundingRect( 0, 0, 10000, 1000, Qt.AlignLeft | Qt.AlignTop, " " * columns ) painter.end() print(size) self.line_width = size.width() self.line_height = size.height() self.set_min_size((self.line_width, self.line_height * rows))