Files
seedsigner/tests/screenshot_generator/utils.py
T
kdmukai e8f26b1e30 Screenshot generator fixes, refactor
* New `ScreenshotConfig` utility class.
* Proper reset & isolation when looping to generate screenshots for multiple locales.
* Bugfix for unpredictable race condition when rendering screenshots.
* Improved screenshots due to the above.
2024-12-11 10:38:13 -06:00

88 lines
2.2 KiB
Python

import os
from dataclasses import dataclass
from PIL import Image, ImageDraw
from seedsigner.gui.renderer import Renderer
from seedsigner.gui.toast import BaseToastOverlayManagerThread
from seedsigner.views.view import View
class ScreenshotComplete(Exception):
pass
class ScreenshotRenderer(Renderer):
screenshot_path: str = None
screenshot_filename: str = None
@classmethod
def configure_instance(cls):
# Instantiate the one and only Renderer instance
renderer = cls.__new__(cls)
cls._instance = renderer
# Hard-coding output values for now
renderer.canvas_width = 240
renderer.canvas_height = 240
renderer.canvas = Image.new('RGB', (renderer.canvas_width, renderer.canvas_height))
renderer.draw = ImageDraw.Draw(renderer.canvas)
def set_screenshot_filename(self, filename:str):
self.screenshot_filename = filename
def set_screenshot_path(self, path):
if not os.path.exists(path):
os.makedirs(path)
self.screenshot_path = path
def show_image(self, image=None, alpha_overlay=None, is_background_thread: bool = False):
if is_background_thread:
return
if alpha_overlay:
if image == None:
image = self.canvas
image = Image.alpha_composite(image, alpha_overlay)
if image:
# Always write to the current canvas, rather than trying to replace it
self.canvas.paste(image)
self.canvas.save(os.path.join(self.screenshot_path, self.screenshot_filename))
raise ScreenshotComplete()
@dataclass
class ScreenshotConfig:
View_cls: View
view_kwargs: dict = None
screenshot_name: str = None
toast_thread: BaseToastOverlayManagerThread = None
run_before: callable = None
run_after: callable = None
def __post_init__(self):
if not self.view_kwargs:
self.view_kwargs = {}
if not self.screenshot_name:
self.screenshot_name = self.View_cls.__name__
def run_callback_before(self):
if self.run_before:
self.run_before()
def run_callback_after(self):
if self.run_after:
self.run_after()