McRogueFace/tests/cookbook/primitives/demo_toast.py

237 lines
7 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python3
"""Toast Notification Demo - Auto-dismissing notification popups
Interactive controls:
1: Show default toast
2: Show success toast (green)
3: Show error toast (red)
4: Show warning toast (yellow)
5: Show info toast (blue)
S: Spam multiple toasts
C: Clear all toasts
ESC: Exit demo
"""
import mcrfpy
import sys
# Add parent to path for imports
sys.path.insert(0, str(__file__).rsplit('/', 2)[0])
from lib.toast import ToastManager
class ToastDemo:
def __init__(self):
self.scene = mcrfpy.Scene("toast_demo")
self.ui = self.scene.children
self.toast_count = 0
self.setup()
def setup(self):
"""Build the demo scene."""
# Background
bg = mcrfpy.Frame(
pos=(0, 0),
size=(1024, 768),
fill_color=mcrfpy.Color(20, 20, 25)
)
self.ui.append(bg)
# Title
title = mcrfpy.Caption(
text="Toast Notification Demo",
pos=(512, 30),
font_size=28,
fill_color=mcrfpy.Color(255, 255, 255)
)
title.outline = 2
title.outline_color = mcrfpy.Color(0, 0, 0)
self.ui.append(title)
# Create toast manager
self.toasts = ToastManager(self.scene, position="top-right", max_toasts=5)
# Instructions panel
panel = mcrfpy.Frame(
pos=(50, 100),
size=(400, 400),
fill_color=mcrfpy.Color(30, 30, 40),
outline_color=mcrfpy.Color(60, 60, 80),
outline=1
)
self.ui.append(panel)
panel_title = mcrfpy.Caption(
text="Toast Types",
pos=(200, 15),
font_size=18,
fill_color=mcrfpy.Color(200, 200, 200)
)
panel.children.append(panel_title)
# Type descriptions
types = [
("1 - Default", "Standard notification", mcrfpy.Color(200, 200, 200)),
("2 - Success", "Confirmation messages", mcrfpy.Color(100, 200, 100)),
("3 - Error", "Error notifications", mcrfpy.Color(200, 100, 100)),
("4 - Warning", "Warning alerts", mcrfpy.Color(200, 180, 80)),
("5 - Info", "Informational messages", mcrfpy.Color(100, 150, 200)),
]
for i, (key, desc, color) in enumerate(types):
y = 50 + i * 50
key_label = mcrfpy.Caption(
text=key,
pos=(20, y),
font_size=16,
fill_color=color
)
panel.children.append(key_label)
desc_label = mcrfpy.Caption(
text=desc,
pos=(20, y + 20),
font_size=12,
fill_color=mcrfpy.Color(150, 150, 150)
)
panel.children.append(desc_label)
# Additional controls
controls = [
("S - Spam", "Show multiple toasts quickly"),
("C - Clear", "Dismiss all active toasts"),
]
for i, (key, desc) in enumerate(controls):
y = 300 + i * 40
key_label = mcrfpy.Caption(
text=key,
pos=(20, y),
font_size=14,
fill_color=mcrfpy.Color(180, 180, 180)
)
panel.children.append(key_label)
desc_label = mcrfpy.Caption(
text=desc,
pos=(20, y + 18),
font_size=12,
fill_color=mcrfpy.Color(120, 120, 120)
)
panel.children.append(desc_label)
# Stats display
self.stats_label = mcrfpy.Caption(
text="Toasts shown: 0 | Active: 0",
pos=(50, 520),
font_size=14,
fill_color=mcrfpy.Color(150, 150, 150)
)
self.ui.append(self.stats_label)
# Preview area
preview_label = mcrfpy.Caption(
text="Toasts appear in the top-right corner ->",
pos=(500, 200),
font_size=16,
fill_color=mcrfpy.Color(100, 100, 100)
)
self.ui.append(preview_label)
arrow = mcrfpy.Caption(
text=">>>",
pos=(750, 200),
font_size=24,
fill_color=mcrfpy.Color(100, 100, 100)
)
self.ui.append(arrow)
# Instructions
instr = mcrfpy.Caption(
text="Press 1-5 to show different toast types | S: Spam | C: Clear all | ESC: Exit",
pos=(50, 730),
font_size=14,
fill_color=mcrfpy.Color(120, 120, 120)
)
self.ui.append(instr)
def update_stats(self):
"""Update the stats display."""
active = len([t for t in self.toasts.toasts if not t.is_dismissed])
self.stats_label.text = f"Toasts shown: {self.toast_count} | Active: {active}"
def on_key(self, key, state):
"""Handle keyboard input."""
if state != "start":
return
if key == "Escape":
sys.exit(0)
elif key == "Num1":
self.toast_count += 1
self.toasts.show(f"Default notification #{self.toast_count}")
self.update_stats()
elif key == "Num2":
self.toast_count += 1
self.toasts.show_success("Operation completed successfully!")
self.update_stats()
elif key == "Num3":
self.toast_count += 1
self.toasts.show_error("An error occurred!")
self.update_stats()
elif key == "Num4":
self.toast_count += 1
self.toasts.show_warning("Warning: Low health!")
self.update_stats()
elif key == "Num5":
self.toast_count += 1
self.toasts.show_info("New quest available")
self.update_stats()
elif key == "S":
# Spam multiple toasts
messages = [
"Game saved!",
"Achievement unlocked!",
"New item acquired!",
"Level up!",
"Quest complete!",
]
for msg in messages:
self.toast_count += 1
self.toasts.show(msg)
self.update_stats()
elif key == "C":
self.toasts.dismiss_all()
self.update_stats()
def activate(self):
"""Activate the demo scene."""
self.scene.on_key = self.on_key
mcrfpy.current_scene = self.scene
def main():
"""Run the toast demo."""
demo = ToastDemo()
demo.activate()
# Headless mode: show some toasts and screenshot
try:
if mcrfpy.headless_mode():
from mcrfpy import automation
# Show a few sample toasts
demo.toasts.show("Game saved!")
demo.toasts.show_success("Achievement unlocked!")
demo.toasts.show_error("Connection lost!")
mcrfpy.Timer("screenshot", lambda rt: (
automation.screenshot("screenshots/primitives/toast_demo.png"),
sys.exit(0)
), 500)
except AttributeError:
pass
if __name__ == "__main__":
main()