Example #1
0
    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))
Example #2
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
Example #3
0
    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
Example #5
0
    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
Example #6
0
    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
Example #8
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
Example #10
0
    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
Example #11
0
 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)
Example #13
0
 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'
Example #15
0
    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
Example #16
0
    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)
Example #18
0
    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
Example #19
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
Example #20
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
Example #21
0
    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
Example #22
0
    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)
Example #23
0
    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)
Example #25
0
    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))
Example #28
0
    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)
Example #29
0
    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)
Example #30
0
    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()