McRogueFace/tests/cookbook/automation/capture_primitives.py

117 lines
3.3 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""Capture screenshots for all primitive widget demos.
Run with:
cd build && ./mcrogueface --headless --exec ../tests/cookbook/automation/capture_primitives.py
"""
import mcrfpy
from mcrfpy import automation
import sys
import os
# Add cookbook to path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# List of demos to capture with their setup functions
DEMOS = [
("button", "demo_button"),
("stat_bar", "demo_stat_bar"),
("choice_list", "demo_choice_list"),
("text_box", "demo_text_box"),
("toast", "demo_toast"),
]
# Screenshot output directory (relative to build/)
OUTPUT_DIR = "../tests/cookbook/screenshots/primitives"
class ScreenshotCapture:
"""Captures screenshots for all primitive demos."""
def __init__(self):
self.current_demo = 0
self.demos = []
def load_demos(self):
"""Load all demo modules."""
for name, module_name in DEMOS:
try:
module = __import__(f"primitives.{module_name}", fromlist=[module_name])
self.demos.append((name, module))
print(f"Loaded: {name}")
except Exception as e:
print(f"Failed to load {name}: {e}")
def capture_next(self, runtime=None):
"""Capture the next demo screenshot."""
if self.current_demo >= len(self.demos):
print(f"\nDone! Captured {self.current_demo} screenshots.")
sys.exit(0)
return
name, module = self.demos[self.current_demo]
print(f"Capturing: {name}...")
try:
# Create demo instance
demo_class = None
for attr_name in dir(module):
attr = getattr(module, attr_name)
if isinstance(attr, type) and attr_name.endswith('Demo'):
demo_class = attr
break
if demo_class:
demo = demo_class()
demo.activate()
# Schedule screenshot after render
def take_screenshot(rt):
filename = f"{OUTPUT_DIR}/{name}.png"
try:
automation.screenshot(filename)
print(f" Saved: {filename}")
except Exception as e:
print(f" Error saving: {e}")
self.current_demo += 1
self.capture_next()
mcrfpy.Timer(f"capture_{name}", take_screenshot, 100)
else:
print(f" No Demo class found in {name}")
self.current_demo += 1
self.capture_next()
except Exception as e:
print(f" Error: {e}")
import traceback
traceback.print_exc()
self.current_demo += 1
self.capture_next()
def start(self):
"""Start the capture process."""
print("=" * 50)
print("Cookbook Primitive Screenshot Capture")
print("=" * 50)
# Ensure output directory exists
os.makedirs(OUTPUT_DIR, exist_ok=True)
self.load_demos()
print(f"\nCapturing {len(self.demos)} demos...")
print("-" * 50)
# Start capture process
self.capture_next()
def main():
capture = ScreenshotCapture()
capture.start()
if __name__ == "__main__":
main()