def __init__(self, rect: pygame.Rect, manager: 'ui_manager.UIManager', element_ids: List[str], object_ids: Union[List[Union[str, None]], None] = None): new_element_ids = element_ids.copy() if object_ids is not None: new_object_ids = object_ids.copy() else: new_object_ids = [None] self.window_container = None # need to create the container that holds the elements first if this is the root window # so we can bootstrap everything and effectively add the root window to it's own container. # It's a little bit weird. if len(element_ids) == 1 and element_ids[0] == 'root_window': self._layer = 0 self.window_container = UIContainer(rect.copy(), manager, None, None, None) self.window_stack = manager.get_window_stack() self.window_stack.add_new_window(self) super().__init__(rect, manager, container=None, starting_height=1, layer_thickness=1, object_ids=new_object_ids, element_ids=new_element_ids) if self.window_container is None: self.window_container = UIContainer(self.rect.copy(), manager, None, self, None) self.window_stack = self.ui_manager.get_window_stack() self.window_stack.add_new_window(self) self.image = self.image = pygame.Surface((0, 0))
def test_get_top_layer(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) UIButton(relative_rect=pygame.Rect(0, 0, 50, 50), text="", manager=default_ui_manager, container=container) assert container.get_top_layer() == 3
def test_set_position(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) container.set_position((50, 50)) assert container.rect.topleft == (50, 50)
def test_cropping_size_of_drop_down(self, _init_pygame, default_ui_manager): menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar'], starting_option='eggs', relative_rect=pygame.Rect(100, 100, 200, 30), manager=default_ui_manager) menu.current_state.should_transition = True menu.update(0.01) assert menu.current_state.options_selection_list.rect.height == 366 # uncropped menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar'], starting_option='eggs', relative_rect=pygame.Rect(100, 100, 200, 30), manager=default_ui_manager, expansion_height_limit=200) menu.current_state.should_transition = True menu.update(0.01) assert menu.current_state.options_selection_list.scroll_bar is not None assert menu.current_state.options_selection_list.rect.height == 200 # cropped to fixed height test_container = UIContainer(relative_rect=pygame.Rect(100, 100, 300, 100), manager=default_ui_manager) menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar'], starting_option='eggs', relative_rect=pygame.Rect(10, 10, 200, 30), manager=default_ui_manager, container=test_container) menu.current_state.should_transition = True menu.update(0.01) assert menu.current_state.options_selection_list.rect.height == 63 # cropped to container size by default manager = UIManager((800, 600), os.path.join("tests", "data", "themes", "ui_drop_down_menu_non_default.json")) test_container = UIContainer(relative_rect=pygame.Rect(100, 100, 300, 100), manager=manager) menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar', 'eggs', 'flour', 'sugar'], starting_option='eggs', relative_rect=pygame.Rect(10, 50, 200, 30), manager=manager, container=test_container) menu.current_state.should_transition = True menu.update(0.01) assert menu.current_state.options_selection_list.rect.height == 53 # cropped to container size by default
def test_add_element(self, _init_pygame, default_ui_manager: IUIManagerInterface, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) button = UIButton(relative_rect=pygame.Rect(0, 0, 50, 50), text="", manager=default_ui_manager) default_ui_manager.get_root_container().remove_element(button) container.add_element(button) assert len(container.elements) == 1
def test_set_relative_position(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) container_2 = UIContainer(pygame.Rect(50, 50, 50, 50), manager=default_ui_manager, container=container) container_2.set_relative_position((25, 25)) assert container_2.rect.topleft == (125, 125)
def test_container_hide(self, _init_pygame, default_ui_manager: IUIManagerInterface, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager, visible=1) assert container.visible == 1 container.hide() assert container.visible == 0
def test_visible_container_children_behaviour_on_hide(self, _init_pygame, default_ui_manager: IUIManagerInterface, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager, visible=1) button = UIButton(relative_rect=pygame.Rect(0, 0, 50, 50), text="", manager=default_ui_manager, container=container) assert container.visible == 1 assert button.visible == 1 container.hide() assert container.visible == 0 assert button.visible == 0
def test_change_container_layer(self, _init_pygame, default_ui_manager): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) UIButton(relative_rect=pygame.Rect(0, 0, 50, 50), text="", manager=default_ui_manager, container=container) container.change_container_layer(2) assert container.get_top_layer() == 4
def test_recalculate_container_layer_thickness(self, _init_pygame, default_ui_manager: IUIManagerInterface, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) UIButton(relative_rect=pygame.Rect(0, 0, 50, 50), text="", manager=default_ui_manager, container=container) container.recalculate_container_layer_thickness() assert container.layer_thickness == 2
def clear_and_reset(self): """ Clear all existing windows and the root container, which should get rid of all created UI elements. We then recreate the UIWindowStack and the root container. """ self.root_container.kill() # need to reset to None before recreating otherwise the old container will linger around. self.root_container = None self.root_container = UIContainer(pygame.Rect((0, 0), self.window_resolution), self, starting_height=1, container=None, parent_element=None, object_id='#root_container') self.ui_window_stack = UIWindowStack(self.window_resolution, self.root_container)
def test_update_containing_rect_position(self, _init_pygame, default_ui_manager, _display_surface_return_none): test_container = UIContainer(relative_rect=pygame.Rect(100, 100, 300, 60), manager=default_ui_manager) button = UIButton(relative_rect=pygame.Rect(10, 10, 150, 30), text="Test Button", tool_tip_text="This is a test of the button's tool tip functionality.", container=test_container, manager=default_ui_manager) test_container.set_position((50, 50)) button.update_containing_rect_position() assert button.rect.topleft == (60, 60)
def test_check_hover_when_not_able_to_hover(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) container.hovered = True assert container.check_hover(0.5, True) is True # already hovering container.hovered = True container.kill() assert container.check_hover(0.5, False) is False # dead so can't hover any more
def test_select_option_from_drop_down(self, _init_pygame, default_ui_manager, _display_surface_return_none): test_container = UIContainer(relative_rect=pygame.Rect(0, 0, 300, 300), manager=default_ui_manager) menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'], starting_option='eggs', relative_rect=pygame.Rect(10, 10, 200, 30), manager=default_ui_manager, container=test_container) menu.current_state.should_transition = True menu.update(0.01) assert menu.selected_option == 'eggs' flour_button = menu.current_state.options_selection_list.item_list_container.elements[1] flour_button.process_event(pygame.event.Event(pygame.MOUSEBUTTONDOWN, {'button': pygame.BUTTON_LEFT, 'pos': flour_button.rect.center})) flour_button.process_event(pygame.event.Event(pygame.MOUSEBUTTONUP, {'button': pygame.BUTTON_LEFT, 'pos': flour_button.rect.center})) for event in pygame.event.get(): default_ui_manager.process_events(event) for event in pygame.event.get(): default_ui_manager.process_events(event) assert menu.selected_option == 'flour'
def test_set_relative_position(self, _init_pygame, default_ui_manager, _display_surface_return_none): test_container = UIContainer(relative_rect=pygame.Rect(50, 50, 300, 250), manager=default_ui_manager) scroll_bar = UIVerticalScrollBar(relative_rect=pygame.Rect(80, 100, 30, 200), visible_percentage=0.25, manager=default_ui_manager, container=test_container) scroll_bar.set_relative_position((50, 50)) # try to click on the scroll bar's top button default_ui_manager.process_events(pygame.event.Event(pygame.MOUSEBUTTONDOWN, {'button': 1, 'pos': (115, 105)})) # if we successfully clicked on the moved scroll bar then this button should be True assert scroll_bar.top_button.held is True default_ui_manager.process_events(pygame.event.Event(pygame.MOUSEBUTTONDOWN, {'button': 1, 'pos': (115, 295)})) # if we successfully clicked on the moved scroll bar then this button should be True assert scroll_bar.bottom_button.held is True default_ui_manager.process_events(pygame.event.Event(pygame.MOUSEBUTTONDOWN, {'button': 1, 'pos': (115, 150)})) # if we successfully clicked on the moved scroll bar then this button should be True assert scroll_bar.sliding_button.held is True
def test_kill(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect( 10, 10, 300, 300), manager=default_ui_manager) element = UIElement(relative_rect=pygame.Rect(30, 30, 50, 50), manager=default_ui_manager, container=test_container, starting_height=0, layer_thickness=1, anchors={ 'left': 'left', 'right': 'left', 'top': 'top', 'bottom': 'top' }) assert len(test_container.elements) == 1 assert len(default_ui_manager.ui_group.sprites()) == 3 assert default_ui_manager.ui_group.sprites() == [ default_ui_manager.get_root_container(), test_container, element ] element.kill() assert len(test_container.elements) == 0 assert len(default_ui_manager.ui_group.sprites()) == 2 assert default_ui_manager.ui_group.sprites() == [ default_ui_manager.get_root_container(), test_container ]
def test_set_relative_position(self, _init_pygame, default_ui_manager, _display_surface_return_none): test_container = UIContainer(relative_rect=pygame.Rect( 100, 100, 300, 60), manager=default_ui_manager) menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'], starting_option='eggs', relative_rect=pygame.Rect(100, 100, 200, 30), container=test_container, manager=default_ui_manager) menu.set_relative_position((150.0, 30.0)) # try to click on the menu default_ui_manager.process_events( pygame.event.Event(pygame.MOUSEBUTTONDOWN, { 'button': pygame.BUTTON_LEFT, 'pos': (260, 145) })) assert menu.rect.topleft == ( 250, 130) and menu.current_state.selected_option_button.held is True menu.current_state.should_transition = True menu.update(0.01) menu.set_relative_position((50.0, 20.0)) assert menu.rect.topleft == (150, 120)
def test_hide(self, _init_pygame, default_ui_manager, _display_surface_return_none): test_container = UIContainer(relative_rect=pygame.Rect( 100, 100, 300, 60), manager=default_ui_manager) channel_editor = UIColourChannelEditor(relative_rect=pygame.Rect( 0, 0, 150, 29), manager=default_ui_manager, name='H:', channel_index=0, initial_value=0, value_range=(0, 360), container=test_container, visible=1) channel_editor.set_dimensions((200, 29)) assert channel_editor.visible == 1 assert channel_editor.element_container.visible == 1 assert channel_editor.label.visible == 1 assert channel_editor.entry.visible == 1 assert channel_editor.slider.visible == 1 channel_editor.hide() assert channel_editor.visible == 0 assert channel_editor.element_container.visible == 0 assert channel_editor.label.visible == 0 assert channel_editor.entry.visible == 0 assert channel_editor.slider.visible == 0
def test_container_children_inheriting_hidden_status(self, _init_pygame, default_ui_manager: IUIManagerInterface, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager, visible=0) button = UIButton(relative_rect=pygame.Rect(0, 0, 50, 50), text="", manager=default_ui_manager, container=container, visible=1) assert container.visible == 0 assert button.visible == 0
def test_resizing_with_anchors(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(relative_rect=pygame.Rect(0, 0, 300, 300), manager=default_ui_manager) scroll_bar = UIVerticalScrollBar( relative_rect=pygame.Rect(-20, 0, 20, 300), visible_percentage=0.5, manager=default_ui_manager, container=container, anchors={'left': 'right', 'right': 'right', 'top': 'top', 'bottom': 'bottom'}) assert scroll_bar.top_button.rect.width == 14 container.set_dimensions((400, 400)) assert scroll_bar.top_button.rect.width == 14
def __init__(self, window_resolution: Tuple[int, int], theme_path: str = None, enable_live_theme_updates=True): self.window_resolution = window_resolution self.ui_theme = UIAppearanceTheme() if theme_path is not None: self.ui_theme.load_theme(theme_path) self.universal_empty_surface = pygame.Surface((0, 0), flags=pygame.SRCALPHA, depth=32) self.ui_group = pygame.sprite.LayeredUpdates() self.focused_element = None self.last_focused_vertical_scrollbar = None self.last_focused_horizontal_scrollbar = None self.root_container = None self.root_container = UIContainer(pygame.Rect((0, 0), self.window_resolution), self, starting_height=1, container=None, parent_element=None, object_id='#root_container') self.ui_window_stack = UIWindowStack(self.window_resolution, self.root_container) self.live_theme_updates = enable_live_theme_updates self.theme_update_acc = 0.0 self.theme_update_check_interval = 1.0 self.mouse_double_click_time = 0.5 self.mouse_position = (0, 0) self.mouse_pos_scale_factor = [1.0, 1.0] self.visual_debug_active = False self.resizing_window_cursors = None self._load_default_cursors() self.active_user_cursor = pygame.cursors.arrow self._active_cursor = self.active_user_cursor
def test_update_containing_rect_position(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) container_2 = UIContainer(pygame.Rect(50, 50, 50, 50), manager=default_ui_manager, container=container) button = UIButton(relative_rect=pygame.Rect(20, 20, 30, 20), text="X", manager=default_ui_manager, container=container_2) container.rect.topleft = (0, 0) container.relative_rect.topleft = (0, 0) container_2.update_containing_rect_position() assert button.rect.topleft == (70, 70)
def test_set_relative_position(self, _init_pygame, default_ui_manager): healthy_sprite = HealthySprite() test_container = UIContainer(relative_rect=pygame.Rect(50, 50, 300, 250), manager=default_ui_manager) screen_space_health_bar = UIScreenSpaceHealthBar(relative_rect=pygame.Rect(100, 100, 150, 30), sprite_to_monitor=healthy_sprite, container=test_container, manager=default_ui_manager) screen_space_health_bar.set_relative_position((50.0, 30.0)) assert screen_space_health_bar.rect.topleft == (100, 80)
def test_set_relative_position(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect( 50, 50, 300, 250), manager=default_ui_manager) text_entry = UITextEntryLine(relative_rect=pygame.Rect(0, 0, 150, 30), container=test_container, manager=default_ui_manager) text_entry.set_relative_position((50.0, 30.0)) assert text_entry.rect.topleft == (100, 80)
def test_set_position(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect(100, 100, 300, 60), manager=default_ui_manager) button = UIButton(relative_rect=pygame.Rect(0, 0, 150, 30), text="Test Button", tool_tip_text="This is a test of the button's tool tip functionality.", container=test_container, manager=default_ui_manager) button.set_position(pygame.math.Vector2(150.0, 30.0)) assert button.relative_rect.topleft == (50, -70) and button.drawable_shape.containing_rect.topleft == (150, 30)
def test_set_dimensions(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect( 100, 100, 300, 60), manager=default_ui_manager) text_entry = UITextEntryLine(relative_rect=pygame.Rect(0, 0, 150, 30), container=test_container, manager=default_ui_manager) text_entry.set_dimensions((200, -1)) assert text_entry.rect.right == 300 assert text_entry.drawable_shape.containing_rect.right == 300
def test_set_position(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect( 100, 100, 300, 60), manager=default_ui_manager) text_entry = UITextEntryLine(relative_rect=pygame.Rect(0, 0, 150, 30), container=test_container, manager=default_ui_manager) text_entry.set_position((150.0, 30.0)) assert (text_entry.relative_rect.topleft == (50, -70) and text_entry.drawable_shape.containing_rect.topleft == (150, 30))
def test_set_dimensions(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect( 100, 100, 300, 60), manager=default_ui_manager) label = UILabel(relative_rect=pygame.Rect(100, 100, 150, 30), text="Test Label", container=test_container, manager=default_ui_manager) label.set_dimensions((200, 50)) assert label.rect.size == (200, 50)
def test_set_relative_position(self, _init_pygame, default_ui_manager): test_container = UIContainer(relative_rect=pygame.Rect( 100, 100, 300, 60), manager=default_ui_manager) label = UILabel(relative_rect=pygame.Rect(100, 100, 150, 30), text="Test Label", container=test_container, manager=default_ui_manager) label.set_relative_position((50, 50)) assert label.rect.topleft == (150, 150)
def test_kill(self, _init_pygame, default_ui_manager, _display_surface_return_none): container = UIContainer(pygame.Rect(100, 100, 200, 200), manager=default_ui_manager) container_2 = UIContainer(pygame.Rect(50, 50, 50, 50), manager=default_ui_manager, container=container) button = UIButton(relative_rect=pygame.Rect(20, 20, 30, 20), text="X", manager=default_ui_manager, container=container_2) container.kill() assert not button.alive() assert not container_2.alive() assert not container.alive()