McRogueFace/tests/unit/test_text_input.py

110 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""
Test the text input widget system
"""
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src', 'scripts'))
import mcrfpy
from text_input_widget import FocusManager, TextInput
def create_demo():
"""Create demo scene with text inputs"""
# Create scene
mcrfpy.createScene("text_demo")
scene = mcrfpy.sceneUI("text_demo")
# Background
bg = mcrfpy.Frame(0, 0, 800, 600)
bg.fill_color = (40, 40, 40, 255)
scene.append(bg)
# Title
title = mcrfpy.Caption("Text Input Widget Demo", 20, 20)
title.fill_color = (255, 255, 255, 255)
scene.append(title)
# Focus manager
focus_mgr = FocusManager()
# Create inputs
inputs = []
# Name input
name_input = TextInput(50, 100, 300, label="Name:", placeholder="Enter your name")
name_input._focus_manager = focus_mgr
focus_mgr.register(name_input)
name_input.add_to_scene(scene)
inputs.append(name_input)
# Email input
email_input = TextInput(50, 160, 300, label="Email:", placeholder="user@example.com")
email_input._focus_manager = focus_mgr
focus_mgr.register(email_input)
email_input.add_to_scene(scene)
inputs.append(email_input)
# Tags input
tags_input = TextInput(50, 220, 400, label="Tags:", placeholder="comma, separated, tags")
tags_input._focus_manager = focus_mgr
focus_mgr.register(tags_input)
tags_input.add_to_scene(scene)
inputs.append(tags_input)
# Comment input
comment_input = TextInput(50, 280, 500, height=30, label="Comment:", placeholder="Add a comment...")
comment_input._focus_manager = focus_mgr
focus_mgr.register(comment_input)
comment_input.add_to_scene(scene)
inputs.append(comment_input)
# Status display
status = mcrfpy.Caption("Ready for input...", 50, 360)
status.fill_color = (150, 255, 150, 255)
scene.append(status)
# Update handler
def update_status(text=None):
values = [inp.get_text() for inp in inputs]
status.text = f"Data: {values[0]} | {values[1]} | {values[2]} | {values[3]}"
# Set change handlers
for inp in inputs:
inp.on_change = update_status
# Keyboard handler
def handle_keys(scene_name, key):
if not focus_mgr.handle_key(key):
if key == "Tab":
focus_mgr.focus_next()
elif key == "Escape":
print("\nFinal values:")
for i, inp in enumerate(inputs):
print(f" Field {i+1}: '{inp.get_text()}'")
sys.exit(0)
mcrfpy.keypressScene("text_demo", handle_keys)
mcrfpy.setScene("text_demo")
# Run demo test
def run_test(timer_name):
print("\n=== Text Input Widget Test ===")
print("Features:")
print("- Click to focus fields")
print("- Tab to navigate between fields")
print("- Type to enter text")
print("- Backspace/Delete to edit")
print("- Home/End for cursor movement")
print("- Placeholder text")
print("- Visual focus indication")
print("- Press Escape to exit")
print("\nTry it out!")
mcrfpy.setTimer("info", run_test, 100)
if __name__ == "__main__":
create_demo()