#!/usr/bin/env python3 """Test UIFrame clipping functionality""" import mcrfpy from mcrfpy import Color, Frame, Caption import sys # Module-level state to avoid closures _test_state = {} def take_second_screenshot(runtime): """Take final screenshot and exit""" mcrfpy.delTimer("screenshot2") from mcrfpy import automation automation.screenshot("frame_clipping_animated.png") print("\nTest completed successfully!") print("Screenshots saved:") print(" - frame_clipping_test.png (initial state)") print(" - frame_clipping_animated.png (with animation)") sys.exit(0) def animate_frames(runtime): """Animate frames to demonstrate clipping""" mcrfpy.delTimer("animate") scene = mcrfpy.sceneUI("test") # Move child frames parent1 = scene[0] parent2 = scene[1] parent1.children[1].x = 50 parent2.children[1].x = 50 mcrfpy.setTimer("screenshot2", take_second_screenshot, 500) def test_clipping(runtime): """Test that clip_children property works correctly""" mcrfpy.delTimer("test_clipping") print("Testing UIFrame clipping functionality...") scene = mcrfpy.sceneUI("test") # Create parent frame with clipping disabled (default) parent1 = Frame(pos=(50, 50), size=(200, 150), fill_color=Color(100, 100, 200), outline_color=Color(255, 255, 255), outline=2) parent1.name = "parent1" scene.append(parent1) # Create parent frame with clipping enabled parent2 = Frame(pos=(300, 50), size=(200, 150), fill_color=Color(200, 100, 100), outline_color=Color(255, 255, 255), outline=2) parent2.name = "parent2" parent2.clip_children = True scene.append(parent2) # Add captions to both frames caption1 = Caption(text="This text should overflow the frame bounds", pos=(10, 10)) caption1.font_size = 16 caption1.fill_color = Color(255, 255, 255) parent1.children.append(caption1) caption2 = Caption(text="This text should be clipped to frame bounds", pos=(10, 10)) caption2.font_size = 16 caption2.fill_color = Color(255, 255, 255) parent2.children.append(caption2) # Add child frames that extend beyond parent bounds child1 = Frame(pos=(150, 100), size=(100, 100), fill_color=Color(50, 255, 50), outline_color=Color(0, 0, 0), outline=1) parent1.children.append(child1) child2 = Frame(pos=(150, 100), size=(100, 100), fill_color=Color(50, 255, 50), outline_color=Color(0, 0, 0), outline=1) parent2.children.append(child2) # Add caption to show clip state status = Caption(text=f"Left frame: clip_children={parent1.clip_children}\n" f"Right frame: clip_children={parent2.clip_children}", pos=(50, 250)) status.font_size = 14 status.fill_color = Color(255, 255, 255) scene.append(status) # Add instructions instructions = Caption(text="Left: Children should overflow (no clipping)\n" "Right: Children should be clipped to frame bounds\n" "Press 'c' to toggle clipping on left frame", pos=(50, 300)) instructions.font_size = 12 instructions.fill_color = Color(200, 200, 200) scene.append(instructions) # Take screenshot from mcrfpy import automation automation.screenshot("frame_clipping_test.png") print(f"Parent1 clip_children: {parent1.clip_children}") print(f"Parent2 clip_children: {parent2.clip_children}") # Test toggling clip_children parent1.clip_children = True print(f"After toggle - Parent1 clip_children: {parent1.clip_children}") # Verify the property setter works try: parent1.clip_children = "not a bool" print("ERROR: clip_children accepted non-boolean value") except TypeError as e: print(f"PASS: clip_children correctly rejected non-boolean: {e}") # Start animation after a short delay mcrfpy.setTimer("animate", animate_frames, 100) def handle_keypress(key, modifiers): if key == "c": scene = mcrfpy.sceneUI("test") parent1 = scene[0] parent1.clip_children = not parent1.clip_children print(f"Toggled parent1 clip_children to: {parent1.clip_children}") # Main execution print("Creating test scene...") mcrfpy.createScene("test") mcrfpy.setScene("test") mcrfpy.keypressScene(handle_keypress) mcrfpy.setTimer("test_clipping", test_clipping, 100) print("Test scheduled, running...")