class Viewer(QWidget): def __init__(self, window): super().__init__(window) self.setGeometry(8, 8, 463, 463) self.window = window self.renderer = Renderer() self.bg_color = Qt.white self.fg_color = Qt.black self.should_clear_viewer = False self.pen_size = None self.animation_speed = None self.pen = None self.set_pen_size(1) self.set_animation_speed(50) def paintEvent(self, event): painter = QPainter() try: painter.begin(self.window) self.update_bg(painter) painter.setPen(self.pen) self.renderer.paint(painter) if self.should_clear_viewer: self.clear_viewer(painter) self.update() finally: painter.end() def render(self, commands): self.reset_values() self.renderer.render(commands) self.renderer.start_animations(self.animation_speed) def clear(self): # Invokes 'clear_viewer' method which requires a QPainter self.should_clear_viewer = True def clear_viewer(self, painter): # Draws a fill rect over viewer to clear it painter.fillRect(QRect(10, 10, 460, 460), QBrush(self.bg_color)) def reset_values(self): self.should_clear_viewer = False def set_bg_color(self, color): self.bg_color = color def set_fg_color(self, color): self.fg_color = color self.update_pen() def set_pen_size(self, size): self.pen_size = size self.update_pen() def set_animation_speed(self, speed): self.animation_speed = 100 - speed def get_drawing_point_pos(self): if self.renderer.drawing_point: return self.renderer.drawing_point.get_position() def update_pen(self): self.pen = QPen(self.fg_color, self.pen_size, Qt.SolidLine) def update_bg(self, painter): painter.setBrush(self.bg_color) painter.drawRect(9, 9, 461, 461)