hkblockchaintechnology's picture
Publish tiny_computer_agent/ from marimo
59022ca verified
Raw History Blame Contribute Delete
2.39 kB
"""Synthetic screens for offline demos and tests.
No display required: this module draws a small fake desktop - a top bar with Files
and Terminal, plus a Save dialog with a file-name field and Save/Cancel buttons - so
the whole pipeline (pixels, OCR, index, menu, model, action) can be exercised on a
headless machine, in CI, or before you let an agent near your real desktop.
"""
from __future__ import annotations
import glob
from pathlib import Path
from typing import Any
def _font(size: int) -> Any:
from PIL import ImageFont
candidates = [
"/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf",
"/System/Library/Fonts/Supplemental/Arial.ttf",
"C:/Windows/Fonts/arial.ttf",
] + glob.glob("/usr/share/fonts/**/*Regular*.ttf", recursive=True)
for path in candidates:
try:
return ImageFont.truetype(path, size)
except Exception:
continue
return ImageFont.load_default()
def fake_desktop(width: int = 720, height: int = 460) -> Any:
"""Draw a screenshot-like image: a desktop with an unsaved Save dialog."""
from PIL import Image, ImageDraw
image = Image.new("RGB", (width, height), (245, 246, 248))
draw = ImageDraw.Draw(image)
draw.rectangle([0, 0, width, 28], fill=(38, 40, 48))
draw.text((12, 7), "Files", fill="white", font=_font(15))
draw.text((90, 7), "Terminal", fill="white", font=_font(15))
draw.rectangle([180, 90, 540, 330], fill="white", outline=(120, 120, 130), width=2)
draw.text((200, 108), "Untitled document - unsaved changes",
fill=(30, 30, 30), font=_font(16))
draw.text((200, 170), "File name", fill=(60, 60, 60), font=_font(15))
draw.rectangle([200, 195, 520, 225], fill=(252, 252, 252),
outline=(120, 120, 130), width=2)
draw.rectangle([200, 265, 380, 300], fill=(66, 111, 220),
outline=(40, 70, 160), width=2)
draw.text((275, 274), "Save", fill="white", font=_font(16))
draw.rectangle([400, 265, 520, 300], fill=(230, 230, 235),
outline=(120, 120, 130), width=2)
draw.text((440, 274), "Cancel", fill=(30, 30, 30), font=_font(16))
return image
def write_fake_desktop(path: str | Path) -> Path:
"""Save :func:`fake_desktop` to a PNG (handy for ``--image``)."""
target = Path(path)
fake_desktop().save(target)
return target