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))
def paintEvent(self, event): # if not self._paintable: # #dc = wx.PaintDC(self) # return self.owner()._painter = QPainter(self) self.owner()._painter.setRenderHint(QPainter.Antialiasing) # self._painter.setRenderHint(QPainter.Qt4CompatiblePainting) try: self.owner().on_paint() except Exception: traceback.print_exc() finally: self.owner()._painter = None
def paintEvent(self, event): # noinspection PyNoneFunctionAssignment images = self.images() size = self.size() w = size.width() h = size.height() painter = QPainter(self) painter.drawImage(QPoint(-10, -10), images.nw.qimage) painter.drawImage(QRect(30, -10, w - 60, -10), images.n.qimage) painter.drawImage(QPoint(w - 30, -10), images.ne.qimage) painter.drawImage(QRect(w - 10, 30, -10, h - 60), images.e.qimage) painter.drawImage(QPoint(w - 30, h - 30), images.se.qimage) painter.drawImage(QRect(30, h - 10, w - 60, -10), images.s.qimage) painter.drawImage(QPoint(-10, h - 30), images.sw.qimage) painter.drawImage(QRect(-10, 30, -10, h - 60), images.w.qimage)
def paintEvent(self, event): # noinspection PyNoneFunctionAssignment images = self.images() size = self.size() w = size.width() h = size.height() painter = QPainter(self) painter.drawImage(QPoint(-10, -10), images.nw.qimage) painter.drawImage(QRect(30, -10, w - 60, -10), images.n.qimage) painter.drawImage(QPoint(w - 30, -10), images.ne.qimage) painter.drawImage(QRect(w - 10, 30, -10, h - 60), images.e.qimage) painter.drawImage(QPoint(w - 30, h - 30), images.se.qimage) painter.drawImage(QRect(30, h - 10, w - 60, -10), images.s.qimage) painter.drawImage(QPoint(-10, h - 30), images.sw.qimage) painter.drawImage(QRect(-10, 30, -10, h - 60), images.w.qimage)
def create_retroarch_layout(self): if self.stretching() == self.STRETCH_FILL_SCREEN or not self.bezel(): return if not self.use_fullscreen(): return # FIXME: file cmp? paths = self.prepare_emulator_skin() print(paths) # FIXME: SUPPORT frame = 0 ( bezel = 0) option # FIXME: With no bezel, we should still use a black bezel to # hide screen stretching screen_width, screen_height = self.screen_size() # dst_x = 0 dst_y = 0 # dst_w = 0 # dst_w = 160 dst_h = screen_height # Bezel size is normalized against 1080 (height) scale = screen_height / 1080 # Bezel width: 160 dst_w = round(160 * scale) game_x, game_y, game_w, game_h = self.display_rect_fullscreen() from fsui.qt import Qt, QImage, QPainter, QRect, QSize image = QImage(QSize(screen_width, screen_height), QImage.Format_RGBA8888) image.fill(Qt.transparent) # painter = image.paintEngine() painter = QPainter(image) dst_x = game_x - dst_w left = QImage(paths["left"]) painter.drawImage(QRect(dst_x, dst_y, dst_w, dst_h), left) dst_x = game_x + game_w right = QImage(paths["right"]) painter.drawImage(QRect(dst_x, dst_y, dst_w, dst_h), right) painter.end() overlay_png_file = self.temp_file("overlay.png").path image.save(overlay_png_file) # noinspection SpellCheckingInspection overlay_config = """overlays = 1 overlay0_overlay = {overlay} overlay0_full_screen = true overlay0_rect = "0.0,0.0,1.0,1.0" overlay0_descs = 0 """.format(overlay=overlay_png_file) # overlay_config = ( # """overlays = 2 # overlay0_overlay = {left} # overlay0_full_screen = true # overlay0_rect = "0.0,0.0,0.12,1.0" # overlay0_descs = 0 # overlay1_overlay = {right} # overlay1_full_screen = true # overlay1_rect = "0.8,0.0,0.2,1.0" # overlay1_descs = 0 # # """.format(left=paths["left"], right=paths["right"])) overlay_config_file = self.temp_file("overlay.cfg") with open(overlay_config_file.path, "w") as f: f.write(overlay_config) return overlay_config_file.path
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 paintEvent(self, event): # noinspection PyNoneFunctionAssignment images = self.images() w = self.width() h = self.height() from fsui.qt import QPainter, QPoint, QRect painter = QPainter(self) painter.drawImage(QPoint(0, 0), images.nw.qimage) painter.drawImage(QRect(40, 0, w - 80, 20), images.n.qimage) painter.drawImage(QPoint(w - 40, 0), images.ne.qimage) painter.drawImage(QRect(w - 20, 40, 20, h - 80), images.e.qimage) painter.drawImage(QPoint(w - 40, h - 40), images.se.qimage) painter.drawImage(QRect(40, h - 20, w - 80, 20), images.s.qimage) painter.drawImage(QPoint(0, h - 40), images.sw.qimage) painter.drawImage(QRect(0, 40, 20, h - 80), images.w.qimage)
def create_retroarch_layout(self): if self.stretching() == self.STRETCH_FILL_SCREEN or not self.bezel(): return if not self.use_fullscreen(): return # FIXME: file cmp? paths = self.prepare_emulator_skin() print(paths) # FIXME: SUPPORT frame = 0 ( bezel = 0) option # FIXME: With no bezel, we should still use a black bezel to # hide screen stretching screen_width, screen_height = self.screen_size() # dst_x = 0 dst_y = 0 # dst_w = 0 # dst_w = 160 dst_h = screen_height # Bezel size is normalized against 1080 (height) scale = screen_height / 1080 # Bezel width: 160 dst_w = round(160 * scale) game_x, game_y, game_w, game_h = self.display_rect_fullscreen() from fsui.qt import Qt, QImage, QPainter, QRect, QSize image = QImage( QSize(screen_width, screen_height), QImage.Format_RGBA8888 ) image.fill(Qt.transparent) # painter = image.paintEngine() painter = QPainter(image) dst_x = game_x - dst_w left = QImage(paths["left"]) painter.drawImage(QRect(dst_x, dst_y, dst_w, dst_h), left) dst_x = game_x + game_w right = QImage(paths["right"]) painter.drawImage(QRect(dst_x, dst_y, dst_w, dst_h), right) painter.end() overlay_png_file = self.temp_file("overlay.png").path image.save(overlay_png_file) # noinspection SpellCheckingInspection overlay_config = """overlays = 1 overlay0_overlay = {overlay} overlay0_full_screen = true overlay0_rect = "0.0,0.0,1.0,1.0" overlay0_descs = 0 """.format( overlay=overlay_png_file ) # overlay_config = ( # """overlays = 2 # overlay0_overlay = {left} # overlay0_full_screen = true # overlay0_rect = "0.0,0.0,0.12,1.0" # overlay0_descs = 0 # overlay1_overlay = {right} # overlay1_full_screen = true # overlay1_rect = "0.8,0.0,0.2,1.0" # overlay1_descs = 0 # # """.format(left=paths["left"], right=paths["right"])) overlay_config_file = self.temp_file("overlay.cfg") with open(overlay_config_file.path, "w") as f: f.write(overlay_config) return overlay_config_file.path
def paintEvent(self, event): # noinspection PyNoneFunctionAssignment images = self.images() w = self.width() h = self.height() from fsui.qt import QPainter, QPoint, QRect painter = QPainter(self) painter.drawImage(QPoint(0, 0), images.nw.qimage) painter.drawImage(QRect(40, 0, w - 80, 20), images.n.qimage) painter.drawImage(QPoint(w - 40, 0), images.ne.qimage) painter.drawImage(QRect(w - 20, 40, 20, h - 80), images.e.qimage) painter.drawImage(QPoint(w - 40, h - 40), images.se.qimage) painter.drawImage(QRect(40, h - 20, w - 80, 20), images.s.qimage) painter.drawImage(QPoint(0, h - 40), images.sw.qimage) painter.drawImage(QRect(0, 40, 20, h - 80), images.w.qimage)
def paintEvent(self, event): painter = QPainter(self) painter.setRenderHints(QPainter.Antialiasing) pen = QPen(QColor(0x80, 0x80, 0x80)) pen.setWidth(2) painter.setPen(pen) painter.setBrush(QBrush(Qt.white)) x = 1 y = 1 w = self.width() - 2 h = self.height() - 2 rect = QRect(x, y, w, h) painter.drawEllipse(rect) cx = x + w / 2 cy = y + h / 2 a = w / 2 * 0.85 b = h / 2 * 0.85 pen.setWidth(0) painter.setPen(pen) painter.setBrush(QBrush(Qt.black)) for i in range(12): px = cx + a * math.cos(2 * math.pi * i / 12) py = cy + b * math.sin(2 * math.pi * i / 12) painter.drawEllipse(px - 3, py - 3, 6, 6) hours, minutes, seconds = self.time[3:] minutes += seconds / 60.0 hours += minutes / 60.0 a = w / 2 * 0.6 b = h / 2 * 0.6 pen.setWidth(4) painter.setPen(pen) self.draw_hand_line(painter, w, h, cx, cy, a, b, 2.0 * math.pi * hours / 12) a = w / 2 * 0.8 b = h / 2 * 0.8 pen.setWidth(3) painter.setPen(pen) self.draw_hand_line(painter, w, h, cx, cy, a, b, 2.0 * math.pi * minutes / 60) pen = QPen(QColor(0xFF, 0x00, 0x00)) pen.setWidth(2) painter.setPen(pen) self.draw_hand_line(painter, w, h, cx, cy, a, b, 2.0 * math.pi * seconds / 60)