def test_update_closed(self, _init_pygame, default_ui_manager, _display_surface_return_none):
     menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                           starting_option='eggs',
                           relative_rect=pygame.Rect(100, 100, 200, 30),
                           manager=default_ui_manager)
     menu.update(0.01)
     assert menu.image is not None
Beispiel #2
0
    def test_hide_of_expanded_dropdown(self, _init_pygame, default_ui_manager,
                                       _display_surface_return_none):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(10, 10, 200, 30),
                              manager=default_ui_manager)

        menu.process_event(
            pygame.event.Event(
                pygame.USEREVENT, {
                    'user_type': pygame_gui.UI_BUTTON_PRESSED,
                    'ui_element': menu.menu_states['closed'].open_button
                }))
        menu.update(0.01)

        assert menu.visible == 1
        assert menu.current_state == menu.menu_states['expanded']

        menu.hide()
        menu.update(0.01)

        assert menu.visible == 0
        assert menu.current_state == menu.menu_states['closed']
        assert menu.menu_states["closed"].visible == 0
        assert menu.menu_states["closed"].selected_option_button.visible == 0
        assert menu.menu_states["closed"].open_button.visible == 0
    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_on_fresh_drawable_shape_ready(self, _init_pygame, default_ui_manager):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=default_ui_manager)

        assert not menu.on_fresh_drawable_shape_ready()
    def test_hover_point(self, _init_pygame, default_ui_manager):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=default_ui_manager)

        assert not menu.hover_point(0, 0)
        assert menu.hover_point(150, 115)
    def test_kill(self, _init_pygame, default_ui_manager, _display_surface_return_none):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=default_ui_manager)
        menu.kill()

        assert menu.alive() is False
 def test_update_state_transition(self, _init_pygame, default_ui_manager,
                                  _display_surface_return_none):
     menu = UIDropDownMenu(options_list=['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)
     menu.current_state.options_selection_list.item_list[0]['button_element'].pressed = True
     default_ui_manager.update(0.01)
     assert menu.image is not None
    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_set_dimensions(self, _init_pygame, default_ui_manager, _display_surface_return_none):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=default_ui_manager)
        menu.set_dimensions((300, 50))

        assert (menu.current_state.open_button.relative_rect.right ==
                (100 + 300) - (menu.border_width + menu.shadow_width))

        assert (menu.current_state.open_button.relative_rect.bottom ==
                (100 + 50) - (menu.border_width + menu.shadow_width))

        # try to click on the menu
        default_ui_manager.process_events(pygame.event.Event(pygame.MOUSEBUTTONDOWN,
                                                             {'button': pygame.BUTTON_LEFT,
                                                              'pos': (390, 125)}))
        # if we successfully clicked on the moved menu then this button should be True
        assert menu.current_state.open_button.held is True

        menu.current_state.should_transition = True
        menu.update(0.01)

        menu.set_dimensions((200, 30))

        # try to click on the menu
        default_ui_manager.process_events(pygame.event.Event(pygame.MOUSEBUTTONDOWN,
                                                             {'button': 1,
                                                              'pos': (290, 115)}))
        # if we successfully clicked on the moved menu then this button should be True
        assert menu.current_state.close_button.held is True
    def test_enable(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.current_state == menu.menu_states['expanded']
        assert menu.selected_option == 'eggs'

        menu.disable()
        assert menu.is_enabled is False

        menu.enable()
        assert menu.is_enabled is True
        assert menu.current_state == menu.menu_states['closed']

        expand_button = menu.current_state.open_button

        expand_button.process_event(
            pygame.event.Event(pygame.MOUSEBUTTONDOWN, {
                'button': pygame.BUTTON_LEFT,
                'pos': expand_button.rect.center
            }))

        expand_button.process_event(
            pygame.event.Event(pygame.MOUSEBUTTONUP, {
                'button': pygame.BUTTON_LEFT,
                'pos': expand_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.current_state.should_transition is True

        menu.update(0.01)

        assert menu.current_state == menu.menu_states['expanded']
        assert menu.selected_option == 'eggs'
Beispiel #11
0
    def test_get_top_layer(self, _init_pygame, default_ui_manager,
                           _display_surface_return_none):
        window = UIWindow(pygame.Rect(0, 0, 400, 300),
                          window_display_title="Test Window",
                          manager=default_ui_manager)

        button_rect = pygame.Rect(0, 0, 150, 30)
        button_rect.topright = (-10, 10)
        button = UIButton(
            relative_rect=button_rect,
            text="Test Button",
            tool_tip_text=
            "This is a test of the button's tool tip functionality.",
            manager=default_ui_manager,
            container=window,
            anchors={
                'left': 'right',
                'right': 'right',
                'top': 'top',
                'bottom': 'top'
            })

        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(10, 10, 150, 30),
                              manager=default_ui_manager,
                              container=window)

        assert window.get_top_layer() == 4
        window.update(0.05)
        assert window.get_top_layer() == 6
Beispiel #12
0
    def __init__(self, pos, manager):
        super().__init__(
            pygame.Rect(pos, (630, 490)),
            manager=manager,
            window_display_title="help",
            object_id="#help",
            resizable=False,
        )

        self.files = gethelp()
        self.last = self.files[0][0]

        self.menu = UIDropDownMenu(
            options_list=[p for p, q in self.files],
            starting_option=self.last,
            relative_rect=pygame.Rect(100, 0, 400, 30),
            manager=manager,
            container=self,
        )

        self.menu.current_state.should_transition = True

        self.textbox = pygame_gui.elements.UITextBox(
            "",
            relative_rect=pygame.Rect(0, 31, 600, 400),
            manager=manager,
            container=self,
            anchors={
                "left": "left",
                "right": "right",
                "top": "top",
                "bottom": "bottom",
            },
        )
        self.last = 0
    def test_class_theming_id(self, _init_pygame,
                              _display_surface_return_none):
        manager = UIManager(
            (800, 600),
            PackageResource('tests.data.themes',
                            'appearance_theme_class_id_test.json'))

        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(10, 10, 200, 30),
                              manager=manager,
                              object_id=pygame_gui.core.ObjectID(
                                  object_id=None, class_id='@test_class'))

        assert menu.combined_element_ids == ['@test_class', 'drop_down_menu']

        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(10, 10, 200, 30),
                              manager=manager,
                              object_id=pygame_gui.core.ObjectID(
                                  object_id='#test_object_1',
                                  class_id='@test_class'))

        assert menu.combined_element_ids == [
            '#test_object_1', '@test_class', 'drop_down_menu'
        ]

        test_container = UIContainer(relative_rect=pygame.Rect(
            100, 100, 300, 60),
                                     manager=manager)

        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(10, 10, 200, 30),
                              container=test_container,
                              manager=manager,
                              object_id=pygame_gui.core.ObjectID(
                                  object_id='#test_object_1',
                                  class_id='@test_class'))

        assert menu.combined_element_ids == [
            'container.#test_object_1', 'container.@test_class',
            'container.drop_down_menu', '#test_object_1', '@test_class',
            'drop_down_menu'
        ]
 def test_update_open_state_finish(self, _init_pygame, default_ui_manager):
     menu = UIDropDownMenu(options_list=['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)
     menu.current_state.should_transition = True
     menu.update(0.01)
     menu.current_state.open_button.pressed = True
     menu.update(0.01)
     assert menu.image is not None
    def test_rebuild_from_theme_data_bad_values(self, _init_pygame,
                                                _display_surface_return_none):
        manager = UIManager((800, 600), os.path.join("tests", "data",
                                                     "themes", "ui_drop_down_menu_bad_values.json"))

        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=manager)
        assert menu.image is not None
    def test_hide_of_closed_dropdown(self, _init_pygame, default_ui_manager,
                                     _display_surface_return_none):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(10, 10, 200, 30),
                              manager=default_ui_manager)

        assert menu.visible == 1
        assert menu.current_state == menu.menu_states['closed']
        assert menu.menu_states["closed"].visible == 1
        assert menu.menu_states["closed"].selected_option_button.visible == 1
        assert menu.menu_states["closed"].open_button.visible == 1

        menu.hide()
        assert menu.visible == 0
        assert menu.current_state == menu.menu_states['closed']
        assert menu.menu_states["closed"].visible == 0
        assert menu.menu_states["closed"].selected_option_button.visible == 0
        assert menu.menu_states["closed"].open_button.visible == 0
    def test_show_of_dropdown(self, _init_pygame, 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,
                              visible=0)

        assert menu.visible == 0
        assert menu.current_state == menu.menu_states['closed']
        assert menu.menu_states["closed"].visible == 0
        assert menu.menu_states["closed"].selected_option_button.visible == 0
        assert menu.menu_states["closed"].open_button.visible == 0

        menu.show()

        assert menu.visible == 1
        assert menu.current_state == menu.menu_states['closed']
        assert menu.menu_states["closed"].visible == 1
        assert menu.menu_states["closed"].selected_option_button.visible == 1
        assert menu.menu_states["closed"].open_button.visible == 1
    def test_show_hide_rendering(self, _init_pygame, default_ui_manager,
                                 _display_surface_return_none):
        resolution = (400, 400)
        empty_surface = pygame.Surface(resolution)
        empty_surface.fill(pygame.Color(0, 0, 0))

        surface = empty_surface.copy()
        manager = pygame_gui.UIManager(resolution)
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(25, 25, 375, 150),
                              manager=manager,
                              visible=0)
        manager.update(0.01)
        manager.draw_ui(surface)
        assert compare_surfaces(empty_surface, surface)

        surface.fill(pygame.Color(0, 0, 0))
        menu.show()
        manager.update(0.01)
        manager.draw_ui(surface)
        assert not compare_surfaces(empty_surface, surface)

        surface.fill(pygame.Color(0, 0, 0))
        menu.hide()
        manager.update(0.01)
        manager.draw_ui(surface)
        assert compare_surfaces(empty_surface, surface)
    def recreate_ui(self):
        self.ui_manager.set_window_resolution(self.options.resolution)
        self.ui_manager.clear_and_reset()

        self.background_surface = pygame.Surface(self.options.resolution)
        self.background_surface.fill(self.ui_manager.get_theme().get_colour(None, None, 'dark_bg'))

        self.test_button = UIButton(pygame.Rect((int(self.options.resolution[0] / 2),
                                                 int(self.options.resolution[1] * 0.90)),
                                                (100, 40)),
                                    '',
                                    self.ui_manager,
                                    tool_tip_text="<font face=fira_code color=normal_text size=2>"
                                                  "<b><u>Test Tool Tip</u></b>"
                                                  "<br><br>"
                                                  "A little <i>test</i> of the "
                                                  "<font color=#FFFFFF><b>tool tip</b></font>"
                                                  " functionality."
                                                  "<br><br>"
                                                  "Unleash the Kraken!"
                                                  "</font>",
                                    object_id='#hover_me_button')

        self.test_button_2 = UIButton(pygame.Rect((int(self.options.resolution[0] / 3),
                                                   int(self.options.resolution[1] * 0.90)),
                                                  (100, 40)),
                                      'EVERYTHING',
                                      self.ui_manager,
                                      object_id='#everything_button')

        self.test_slider = UIHorizontalSlider(pygame.Rect((int(self.options.resolution[0] / 2),
                                                           int(self.options.resolution[1] * 0.70)),
                                                          (240, 25)),
                                              100.0,
                                              (0.0, 100.0),
                                              self.ui_manager,
                                              object_id='#cool_slider')

        self.test_text_entry = UITextEntryLine(pygame.Rect((int(self.options.resolution[0] / 2),
                                                            int(self.options.resolution[1] * 0.50)),
                                                           (200, -1)),
                                               self.ui_manager,
                                               object_id='#main_text_entry')

        current_resolution_string = str(self.options.resolution[0]) + 'x' + str(self.options.resolution[1])
        self.test_drop_down_menu = UIDropDownMenu(['640x480', '800x600', '1024x768'],
                                                  current_resolution_string,
                                                  pygame.Rect((int(self.options.resolution[0] / 2),
                                                               int(self.options.resolution[1] * 0.3)),
                                                              (200, 25)),
                                                  self.ui_manager)
    def test_rebuild_from_theme_data_non_default(self, _init_pygame,
                                                 _display_surface_return_none):
        manager = UIManager((800, 600), os.path.join("tests", "data",
                                                     "themes", "ui_drop_down_menu_non_default.json"))

        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=manager)
        menu.current_state.should_transition = True
        menu.update(0.01)
        menu.current_state.should_transition = True
        menu.update(0.01)
        manager.ui_theme.ui_element_misc_data['drop_down_menu']['expand_direction'] = 'down'
        menu.rebuild_from_changed_theme_data()
        assert menu.image is not None
Beispiel #21
0
ZOOM = 15
json = geocoder_request("Пермь, Революции 21")
ll, _ = get_ll_spn(json)
pt = ll.copy()

pygame.init()
screen = pygame.display.set_mode((600, 450))

background = pygame.Surface((800, 600))
background.fill(pygame.Color("#000000"))

manager = pygame_gui.UIManager((600, 450))

menu = UIDropDownMenu(
    options_list=["схема", "спутник", "гибрид"],
    starting_option="схема",
    relative_rect=pygame.Rect(0, 0, 200, 30),
    manager=manager,
)

label = UILabel(relative_rect=pygame.Rect(0, 420, 600, 30),
                text=full_adress(json),
                manager=manager)

text_entry = UITextEntryLine(relative_rect=pygame.Rect(0, 30, 150, 30),
                             manager=manager)

search_button = pygame_gui.elements.UIButton(relative_rect=pygame.Rect(
    (150, 30), (50, 30)),
                                             text="find",
                                             manager=manager)
    def __init__(self):
        windowWidth = 1340
        windowHeight = 600
        super().__init__(pygame.Rect(
            SCREEN_WIDTH * 0.5 - windowWidth * 0.5,
            SCREEN_HEIGHT * 0.5 - windowHeight * 0.5,
            windowWidth,
            windowHeight,
        ),
                         ui_manager,
                         window_display_title="Settings",
                         resizable=False)

        UILabel(pygame.Rect(0, 0, 80, 30),
                "General",
                ui_manager,
                container=self)

        general_panel = UIPanel(pygame.Rect(10, 30, 250, 600 - 100),
                                starting_layer_height=4,
                                manager=ui_manager,
                                container=self,
                                object_id="#thicker_panel")
        UILabel(pygame.Rect(10, 10, 80, 30),
                "Start Gold",
                ui_manager,
                container=general_panel)

        self.start_gold_text_line = UITextEntryLine(
            pygame.Rect(100, 10, 60, 20),
            manager=ui_manager,
            container=general_panel,
            #object_id='#file_path_text_line',
            anchors={
                'left': 'left',
                'right': 'left',
                'top': 'top',
                'bottom': 'bottom'
            })

        register_ui_callback(self.start_gold_text_line,
                             pygame_gui.UI_TEXT_ENTRY_CHANGED,
                             lambda e: self.on_start_gold_text_changed(e))

        UILabel(pygame.Rect(10, 40, 80, 30),
                "Start Mana",
                ui_manager,
                container=general_panel)
        self.start_mana_text_line = UITextEntryLine(
            pygame.Rect(100, 40, 60, 20),
            manager=ui_manager,
            container=general_panel,
            #object_id='#file_path_text_line',
            anchors={
                'left': 'left',
                'right': 'left',
                'top': 'top',
                'bottom': 'bottom'
            })

        register_ui_callback(self.start_mana_text_line,
                             pygame_gui.UI_TEXT_ENTRY_CHANGED,
                             lambda e: self.on_start_mana_text_changed(e))

        UILabel(pygame.Rect(10, 70, 80, 30),
                "Max Tower",
                ui_manager,
                container=general_panel)

        self.max_tower_text_line = UITextEntryLine(
            pygame.Rect(100, 70, 60, 20),
            manager=ui_manager,
            container=general_panel,
            #object_id='#file_path_text_line',
            anchors={
                'left': 'left',
                'right': 'left',
                'top': 'top',
                'bottom': 'bottom'
            })

        register_ui_callback(self.max_tower_text_line,
                             pygame_gui.UI_TEXT_ENTRY_CHANGED,
                             lambda e: self.on_max_tower_text_changed(e))

        UILabel(pygame.Rect(10, 100, 80, 30),
                "Max Spell",
                ui_manager,
                container=general_panel)

        self.max_spell_text_line = UITextEntryLine(
            pygame.Rect(100, 100, 60, 20),
            manager=ui_manager,
            container=general_panel,
            #object_id='#file_path_text_line',
            anchors={
                'left': 'left',
                'right': 'left',
                'top': 'top',
                'bottom': 'bottom'
            })

        register_ui_callback(self.max_spell_text_line,
                             pygame_gui.UI_TEXT_ENTRY_CHANGED,
                             lambda e: self.on_max_spell_text_changed(e))

        # ---------------------------- falls

        UILabel(pygame.Rect(250, 0, 80, 30),
                "Falls",
                ui_manager,
                container=self)

        self.falls_list = ["Dummy", "Dummy"]
        self.current_selected_fall = 0
        self.falls_ui_list = UISelectionList(
            pygame.Rect(270, 30, 250, 220),
            item_list=self.falls_list,
            manager=ui_manager,
            container=self,
            object_id="#thicker_panel",
        )

        register_ui_callback(self.falls_ui_list,
                             pygame_gui.UI_SELECTION_LIST_NEW_SELECTION,
                             lambda e: self.on_fall_list_item_select())

        self.fall_add_btn = UIButton(pygame.Rect(270, 250, 125, 30),
                                     "Add Fall",
                                     ui_manager,
                                     container=self)
        self.fall_remove_btn = UIButton(pygame.Rect(395, 250, 125, 30),
                                        "Remove Fall",
                                        ui_manager,
                                        container=self)

        register_ui_callback(self.fall_add_btn, pygame_gui.UI_BUTTON_PRESSED,
                             lambda e: self.on_fall_add_btn_click())
        register_ui_callback(self.fall_remove_btn,
                             pygame_gui.UI_BUTTON_PRESSED,
                             lambda e: self.on_fall_remove_btn_click())

        UILabel(pygame.Rect(262, 290, 120, 30),
                "Fall Settings",
                ui_manager,
                container=self)

        self.fall_settings_panel = UIPanel(pygame.Rect(270, 320, 250, 210),
                                           starting_layer_height=4,
                                           object_id="#thicker_panel",
                                           manager=ui_manager,
                                           container=self)

        # gold reward

        UILabel(pygame.Rect(5, 10, 100, 30),
                "Gold Reward",
                ui_manager,
                container=self.fall_settings_panel)

        self.fall_gold_reward = UITextEntryLine(
            pygame.Rect(105, 10, 60, 20),
            manager=ui_manager,
            container=self.fall_settings_panel,
        )

        register_ui_callback(self.fall_gold_reward,
                             pygame_gui.UI_TEXT_ENTRY_CHANGED,
                             lambda e: self.on_fall_gold_text_changed(e))

        # ---------------------------- groups

        UILabel(pygame.Rect(515, 0, 80, 30),
                "Groups",
                ui_manager,
                container=self)

        self.groups_list = []
        self.current_selected_group = 0
        self.groups_ui_list = UISelectionList(
            pygame.Rect(530, 30, 380, 220),
            item_list=self.groups_list,
            manager=ui_manager,
            container=self,
            object_id="#thicker_panel",
        )

        register_ui_callback(self.groups_ui_list,
                             pygame_gui.UI_SELECTION_LIST_NEW_SELECTION,
                             lambda e: self.on_group_list_item_select(e))

        self.group_add_btn = UIButton(pygame.Rect(530, 250, 380 * 0.5, 30),
                                      "Add Group",
                                      ui_manager,
                                      container=self)
        self.group_remove_btn = UIButton(pygame.Rect(530 + 380 * 0.5, 250,
                                                     380 * 0.5, 30),
                                         "Remove Group",
                                         ui_manager,
                                         container=self)

        register_ui_callback(self.group_add_btn, pygame_gui.UI_BUTTON_PRESSED,
                             lambda e: self.on_group_add_btn_click())
        register_ui_callback(self.group_remove_btn,
                             pygame_gui.UI_BUTTON_PRESSED,
                             lambda e: self.on_group_remove_btn_click())

        UILabel(pygame.Rect(530, 290, 120, 30),
                "Group Settings",
                ui_manager,
                container=self)

        group_settings_panel = UIPanel(pygame.Rect(530, 320, 380, 210),
                                       starting_layer_height=4,
                                       object_id="#thicker_panel",
                                       manager=ui_manager,
                                       container=self)

        UILabel(pygame.Rect(5, 10, 100, 30),
                "Spawn After",
                ui_manager,
                container=group_settings_panel)

        self.group_spawn_mode_dropdown = UIDropDownMenu(
            ["End Of Previous Group Spawn", "Previous Group Destruction"],
            "End Of Previous Group Spawn",
            pygame.Rect(105, 15, 250, 20),
            ui_manager,
            container=group_settings_panel)

        # spawn delay

        UILabel(pygame.Rect(5, 45, 100, 30),
                "Spawn Delay",
                ui_manager,
                container=group_settings_panel)
        self.spawn_delay_entry_line = UITextEntryLine(
            pygame.Rect(105, 45, 40, 20),
            manager=ui_manager,
            container=group_settings_panel)
        UILabel(pygame.Rect(150, 45, 60, 30),
                "seconds",
                ui_manager,
                container=group_settings_panel)

        register_ui_callback(self.spawn_delay_entry_line,
                             pygame_gui.UI_TEXT_ENTRY_CHANGED,
                             lambda e: self.on_group_spawn_delay_changed(e))

        # interval

        UILabel(pygame.Rect(-2, 80, 100, 30),
                "Interval:",
                ui_manager,
                container=group_settings_panel)
        UILabel(pygame.Rect(2, 115, 50, 30),
                "From",
                ui_manager,
                container=group_settings_panel)
        self.interval_from_entry_line = UITextEntryLine(
            pygame.Rect(50, 115, 40, 20),
            manager=ui_manager,
            container=group_settings_panel)
        UILabel(pygame.Rect(95, 115, 20, 30),
                "To",
                ui_manager,
                container=group_settings_panel)
        self.interval_to_entry_line = UITextEntryLine(
            pygame.Rect(120, 115, 40, 20),
            manager=ui_manager,
            container=group_settings_panel)
        UILabel(pygame.Rect(165, 115, 60, 30),
                "seconds",
                ui_manager,
                container=group_settings_panel)

        register_ui_callback(
            self.interval_from_entry_line, pygame_gui.UI_TEXT_ENTRY_CHANGED,
            lambda e: self.on_group_spawn_interval_left_changed(e))

        register_ui_callback(
            self.interval_to_entry_line, pygame_gui.UI_TEXT_ENTRY_CHANGED,
            lambda e: self.on_group_spawn_interval_right_changed(e))

        # ---------------------------- enemies

        self.enemies_label = UILabel(pygame.Rect(910, 0, 80, 30),
                                     "Enemies",
                                     ui_manager,
                                     container=self)

        self.enemies_view_panel = UIPanel(relative_rect=pygame.Rect(
            920, 30, 385, 505),
                                          starting_layer_height=4,
                                          object_id="#thicker_panel",
                                          manager=ui_manager,
                                          container=self)
        #self.enemies_view_panel.hide()
        #self.enemies_label.hide()

        #250, 600 - 100
        self.enemy_container = UIScrollingContainer(
            pygame.Rect(0, 0, 380, 500),
            ui_manager,
            container=self.enemies_view_panel,
            object_id="#enemy_scrolling_container",
            starting_height=4)

        item_height = 165
        self.enemy_container.set_scrollable_area_dimensions(
            (360, 5 + len(enemy.enemies_definitions) * item_height + 10))
        """
        for n in range(0, 24):
            UIButton(
                pygame.Rect(5, 5 + 50 * n, 370, 45),
                "hi",
                ui_manager,
                self.enemy_container
            )
        """

        self.enemies_counts_entry_lines = []
        for n in range(0, len(enemy.enemies_definitions)):
            enemy_panel = UIPanel(relative_rect=pygame.Rect(
                5, 5 + item_height * n, 350, item_height),
                                  starting_layer_height=4,
                                  manager=ui_manager,
                                  container=self.enemy_container,
                                  object_id="#thicker_panel")
            enemy_stats_panel = UIPanel(relative_rect=pygame.Rect(
                10, 35, 325, 80),
                                        starting_layer_height=4,
                                        manager=ui_manager,
                                        container=enemy_panel)

            UITextBox(
                "<b>" + enemy.enemies_definitions[n].name + "</b>",
                pygame.Rect(5, 5, 340, 30),
                ui_manager,
                container=enemy_panel,
                object_id="#no_border_textbox",
            )
            definition = enemy.enemies_definitions[n]
            preview_sprite_path = ENEMIES_PATH + definition.sprites_directory + "/" + definition.preview_sprite + ".png"
            image_size = (720 * 0.15, 480 * 0.15)
            UIImage(relative_rect=pygame.Rect(5, 5, image_size[0],
                                              image_size[1]),
                    image_surface=resource_cache.get_resource(
                        preview_sprite_path,
                        resource_cache.SurfaceType,
                        alpha=True),
                    manager=ui_manager,
                    container=enemy_stats_panel)
            UITextBox("<font color=#00FF00><b>Health: </b></font>" +
                      str(definition.health) + "<br><br>"
                      "<font color=#BB0000><b>Damage: </b></font>" +
                      str(definition.damages) + "</br></br>" +
                      "<font color=#4488FF><b>Speed: </b></font>" +
                      str(definition.speed),
                      pygame.Rect(5 + image_size[0] + 5, 5, 120, 140),
                      ui_manager,
                      container=enemy_stats_panel,
                      object_id="#no_border_textbox")
            UITextBox("Count: ",
                      pygame.Rect(5, item_height - 45, 80, 30),
                      ui_manager,
                      container=enemy_panel,
                      object_id="#no_border_textbox")
            self.enemies_counts_entry_lines.append(
                UITextEntryLine(
                    pygame.Rect(65, item_height - 45, 50, 25),
                    manager=ui_manager,
                    container=enemy_panel,
                ))

            register_ui_callback(
                self.enemies_counts_entry_lines[n],
                pygame_gui.UI_TEXT_ENTRY_CHANGED,
                lambda e, i=n: self.on_change_enemy_count(e, i))

        self.set_blocking(True)
        self.update_settings()
    def __init__(self, rect, ui_manager):

        element_ids = ['everything_window']

        super().__init__(rect, ui_manager, element_ids=element_ids)

        # create shadow
        shadow_padding = (2, 2)

        self.image = self.ui_manager.get_shadow(self.rect.size)
        self.image.fill(self.ui_manager.get_theme().get_colour(self.object_ids, self.element_ids, 'dark_bg'),
                        pygame.Rect(shadow_padding,
                                    (self.rect.width - shadow_padding[0] * 2,
                                     self.rect.height - shadow_padding[1] * 2)
                                    ))

        self.get_container().relative_rect.width = self.rect.width - shadow_padding[0] * 2
        self.get_container().relative_rect.height = self.rect.height - shadow_padding[1] * 2
        self.get_container().relative_rect.x = self.get_container().relative_rect.x + shadow_padding[0]
        self.get_container().relative_rect.y = self.get_container().relative_rect.y + shadow_padding[1]
        self.get_container().update_containing_rect_position()

        self.close_window_button = UIButton(relative_rect=pygame.Rect((self.get_container().rect.width-20, 0),
                                                                      (20, 20)),
                                            text='╳',
                                            manager=ui_manager,
                                            container=self.get_container(),
                                            parent_element=self
                                            )
        self.menu_bar = UIButton(relative_rect=pygame.Rect((0, 0),
                                                           (self.get_container().rect.width-20, 20)),
                                 text='Everything Container',
                                 manager=ui_manager,
                                 container=self.get_container(),
                                 parent_element=self,
                                 object_id='#message_window_title_bar'
                                 )
        self.menu_bar.set_hold_range((100, 100))

        self.grabbed_window = False
        self.starting_grab_difference = (0, 0)

        self.test_slider = UIHorizontalSlider(pygame.Rect((int(self.rect.width / 2),
                                                           int(self.rect.height * 0.70)),
                                                          (240, 25)),
                                              50.0,
                                              (0.0, 100.0),
                                              self.ui_manager,
                                              container=self.get_container(),
                                              parent_element=self)

        self.slider_label = UILabel(pygame.Rect((int(self.rect.width / 2) + 250,
                                                 int(self.rect.height * 0.70)),
                                                (27, 25)),
                                    str(int(self.test_slider.get_current_value())),
                                    self.ui_manager,
                                    container=self.get_container(),
                                    parent_element=self)

        self.test_text_entry = UITextEntryLine(pygame.Rect((int(self.rect.width / 2),
                                                            int(self.rect.height * 0.50)),
                                                           (200, -1)),
                                               self.ui_manager,
                                               container=self.get_container(),
                                               parent_element=self)
        self.test_text_entry.set_forbidden_characters('numbers')

        current_resolution_string = 'Item 1'
        self.test_drop_down_menu = UIDropDownMenu(['Item 1',
                                                   'Item 2',
                                                   'Item 3',
                                                   'Item 4',
                                                   'Item 5',
                                                   'Item 6'],
                                                  current_resolution_string,
                                                  pygame.Rect((int(self.rect.width / 2),
                                                               int(self.rect.height * 0.3)),
                                                              (200, 25)),
                                                  self.ui_manager,
                                                  container=self.get_container(),
                                                  parent_element=self)

        self.health_bar = UIScreenSpaceHealthBar(pygame.Rect((int(self.rect.width / 9),
                                                              int(self.rect.height * 0.7)),
                                                             (200, 20)),
                                                 self.ui_manager,
                                                 container=self.get_container(),
                                                 parent_element=self)

        loaded_test_image = pygame.image.load('data/images/splat.png').convert_alpha()

        self.test_image = UIImage(pygame.Rect((int(self.rect.width / 9),
                                               int(self.rect.height * 0.3)),
                                              loaded_test_image.get_rect().size),
                                  loaded_test_image, self.ui_manager,
                                  container=self.get_container(),
                                  parent_element=self)
        self.is_selected = False
    def test_cropping_size_of_drop_down(self, _init_pygame, default_ui_manager,
                                        _display_surface_return_none):
        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_set_position(self, _init_pygame, default_ui_manager,
                          _display_surface_return_none):
        test_container = UIContainer(relative_rect=pygame.Rect(
            10, 10, 300, 300),
                                     manager=default_ui_manager)
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=default_ui_manager)

        menu.set_position((0, 0))
        menu.current_state.should_transition = True
        menu.update(0.01)
        menu.set_position((200, 200))

        # try to click on the menu
        default_ui_manager.process_events(
            pygame.event.Event(pygame.MOUSEBUTTONDOWN, {
                'button': 1,
                'pos': (250, 215)
            }))
        # if we successfully clicked on the moved menu then this button should be True
        assert menu.current_state.selected_option_button.held is True

        drop_down_anchor_bottom_right = UIDropDownMenu(
            relative_rect=pygame.Rect(0, 0, 50, 50),
            options_list=['eggs', 'flour', 'sugar'],
            starting_option='eggs',
            manager=default_ui_manager,
            container=test_container,
            anchors={
                'left': 'right',
                'right': 'right',
                'top': 'bottom',
                'bottom': 'bottom'
            })

        drop_down_anchor_bottom_right.current_state.should_transition = True
        drop_down_anchor_bottom_right.update(0.01)

        drop_down_anchor_bottom_right.set_position((230, 230))
        assert drop_down_anchor_bottom_right.relative_rect.topleft == (-80,
                                                                       -80)
        assert drop_down_anchor_bottom_right.relative_rect.size == (50, 50)
        assert drop_down_anchor_bottom_right.relative_rect.bottomright == (-30,
                                                                           -30)
    def test_process_event(self, _init_pygame, default_ui_manager,
                           _display_surface_return_none):
        menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                              starting_option='eggs',
                              relative_rect=pygame.Rect(100, 100, 200, 30),
                              manager=default_ui_manager)

        # process a mouse button down event
        menu.process_event(
            pygame.event.Event(
                pygame_gui.UI_BUTTON_PRESSED,
                {'ui_element': menu.menu_states['closed'].open_button}))

        assert menu.current_state.should_transition

        menu.update(0.01)

        assert not menu.current_state.should_transition

        menu.process_event(
            pygame.event.Event(
                pygame_gui.UI_BUTTON_PRESSED,
                {'ui_element': menu.menu_states['expanded'].close_button}))

        assert menu.current_state.should_transition

        menu.update(0.01)

        assert not menu.current_state.should_transition

        menu.process_event(
            pygame.event.Event(pygame_gui.UI_BUTTON_PRESSED, {
                'ui_element':
                menu.menu_states['closed'].selected_option_button
            }))

        assert menu.current_state.should_transition

        menu.update(0.01)

        assert not menu.current_state.should_transition

        menu.process_event(
            pygame.event.Event(pygame_gui.UI_SELECTION_LIST_NEW_SELECTION, {
                'ui_element':
                menu.menu_states['expanded'].options_selection_list
            }))

        confirm_drop_down_changed_event_fired = False
        for event in pygame.event.get():
            if (event.type == pygame_gui.UI_DROP_DOWN_MENU_CHANGED
                    and event.ui_element == menu):
                confirm_drop_down_changed_event_fired = True

        assert confirm_drop_down_changed_event_fired
 def test_creation(self, _init_pygame, default_ui_manager):
     menu = UIDropDownMenu(options_list=['eggs', 'flour', 'sugar'],
                           starting_option='eggs',
                           relative_rect=pygame.Rect(100, 100, 200, 30),
                           manager=default_ui_manager)
     assert menu.image is not None