Esempio n. 1
0
class UIResourceList(object):
    def __init__(self, window, batch):
        self.window = window
        self.batch = batch
        self._resource_menu = None

    def render(self):
        self.remove()

        content = Frame(
            Scrollable(
                VerticalContainer(
                    [
                        SectionHeader("Resources"),
                        UIResourceSection("Primary Resources", "primary", is_open=True),
                        UIResourceSection("Processed Material", "processed_material", is_open=False),
                        UIResourceSection("Raw Material", "raw_material", is_open=False),
                        OneTimeButton("Close", self.remove),
                    ],
                    align=HALIGN_LEFT,
                ),
                height=400,
            )
        )

        self._resource_menu = Manager(
            content, window=self.window, batch=self.batch, anchor=ANCHOR_TOP_LEFT, theme=resource_menu_theme
        )

    def remove(self, *args):
        if self._resource_menu:
            self._resource_menu.delete()
Esempio n. 2
0
class VerticalHUD():
    def __init__(self, window, batch, space, level, height, width):
        self.space = space
        self.level = level
        status_text = pyglet.text.decode_attributed('''
Time: 0 sec \n
Points: 0 points \n
FPS: 00.00 FPS
''')
        self.status_doc = Document(status_text, height=height, width=width)
        status_frame = Frame(self.status_doc)
        inv_text = pyglet.text.decode_html("<h4>Inventory</h4>")
        inventory_header = Document(inv_text, width=width)
        self.inventory_container = VerticalContainer([])

        container = VerticalContainer([inventory_header, self.inventory_container])
        self.inventory_frame = Frame(container)
        container = VerticalContainer([status_frame, self.inventory_frame])
        self.manager = Manager(container, window=window, batch=batch,
                group=RenderingOrder.hud, anchor=ANCHOR_TOP_RIGHT, theme=theme,
                is_movable=False)
        self.window = window
        self.window.push_handlers(on_draw=self.on_draw)
        self.tick = 0
        # Currently disabled
        #self.init_effects(space, level)

    def init_effects(self, space, level):
        pos = (self.inventory_frame.x,
               self.inventory_frame.y + self.inventory_frame.height / 2 - 50)
        self.inventory_effect = Effects.Inventory(space, pos, "Inventory",
                self.inventory_frame.width, self.inventory_frame.height + 100,
                ["H2O(l)", "CH4(g)", "NaCl(s)"], gui_container = self.inventory_container)

    def get_effects(self):
        return []
        #currently disabled
        #return [self.inventory_effect]

    def on_draw(self):
        self.tick += 1
        if self.tick > 30:
            return
        self.tick = 0
        self.update_status()

    def update_status(self):
        level_time = self.window.level.get_time()
        points = self.window.level.get_points()
        status_text = '''
Time: %d sec
Points: %d points
FPS: %.2f FPS
''' % (level_time, points, pyglet.clock.get_fps())
        self.status_doc.set_text(status_text)

    def delete(self):
        self.window.remove_handlers(on_draw = self.on_draw)
        self.manager.delete()
class TestContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    a container. We use an empty widgets for this.
    """
    def setUp(self):
        super(TestContainer, self).setUp()

        self.container = Container(
            [Viewer(width=50, height=50),
             Viewer(width=50, height=50)])

        self.manager = Manager(self.container,
                               window=self.window,
                               batch=self.batch,
                               theme=self.theme)

    def test_set_manager(self):
        """
        Tests that the manager is set for every children.
        """
        # manager size is correct
        for item in self.container.content:
            self.assertTrue(item.has_manager())

    def test_deletion(self):
        self.manager.delete()

        # confirm that widget is also deleted
        for item in self.container.content:
            self.assertFalse(item.has_manager())

    def test_add(self):
        """
        Tests that we can add a new item.
        """
        item = Viewer(width=50, height=50)
        self.container.add(item)

        self.assertEqual(item.has_manager(), True)

    def test_remove(self):
        """
        Tests that we can remove a new item.
        """
        item = self.container.content[0]
        self.container.remove(item)

        self.assertEqual(item.has_manager(), False)

    def tearDown(self):
        self.manager.delete()
        super(TestContainer, self).tearDown()
Esempio n. 4
0
class TestContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    a container. We use an empty widgets for this.
    """

    def setUp(self):
        super().setUp()

        self.container = Container([Viewer(width=50, height=50),
                                    Viewer(width=50, height=50)])

        self.manager = Manager(self.container, window=self.window, batch=self.batch, theme=self.theme)

    def test_set_manager(self):
        """
        Tests that the manager is set for every children.
        """
        # manager size is correct
        for item in self.container.content:
            self.assertTrue(item.has_manager())

    def test_deletion(self):
        self.manager.delete()

        # confirm that widget is also deleted
        for item in self.container.content:
            self.assertFalse(item.has_manager())

    def test_add(self):
        """
        Tests that we can add a new item.
        """
        item = Viewer(width=50, height=50)
        self.container.add(item)

        self.assertEqual(item.has_manager(), True)

    def test_remove(self):
        """
        Tests that we can remove a new item.
        """
        item = self.container.content[0]
        self.container.remove(item)

        self.assertEqual(item.has_manager(), False)

    def tearDown(self):
        self.manager.delete()
        super().tearDown()
Esempio n. 5
0
class TestSpacer(TestPygletGUI):
    """
    Tests that the spacer is working correctly
    inside containers.
    """
    def setUp(self):
        TestPygletGUI.setUp(self)

        self.widgets = []
        for i in range(2):
            self.widgets.append(Viewer(width=100, height=50))
        for i in range(2):
            self.widgets.append(Viewer(width=20, height=50))

        self.container = VerticalContainer([
            HorizontalContainer([self.widgets[0], self.widgets[1]], padding=0),
            HorizontalContainer([
                Spacer(), self.widgets[2],
                Spacer(), self.widgets[3],
                Spacer()
            ],
                                padding=0)
        ],
                                           padding=0)

        self.manager = Manager(self.container,
                               window=self.window,
                               batch=self.batch,
                               theme=self.theme)

    def test_initial(self):
        self.assertEqual(self.container.width, 200)

        # space left for the spacers occupy:
        width_left = 200 - 40

        # expected spacer size
        spacer_size = int(width_left / 3.)

        # Spacers should occupy same space
        self.assertEqual(self.widgets[2].x, self.container.x + spacer_size)
        self.assertEqual(
            self.widgets[3].x,
            self.widgets[2].x + self.widgets[2].width + spacer_size)

    def tearDown(self):
        self.manager.delete()
        super(TestSpacer, self).tearDown()
Esempio n. 6
0
class GenericButtonTest(object):
    def setUp(self):
        self.manager = Manager(self.button, window=self.window, batch=self.batch, theme=self.theme)

    def test_creation(self):
        self.assertNotEqual(self.button.width, 0)
        self.assertNotEqual(self.button.height, 0)
        self.assertEqual(self.button.is_loaded, True)

    def test_press(self):
        self.button.on_mouse_press(0, 0, None, None)
        self.assertEqual(self.button.is_pressed, True)

    def test_delete(self):
        self.manager.delete()
        self.assertEqual(self.button.is_loaded, False)
class GenericButtonTest(object):
    def setUp(self):
        self.manager = Manager(self.button, window=self.window, batch=self.batch, theme=self.theme)

    def test_creation(self):
        self.assertNotEqual(self.button.width, 0)
        self.assertNotEqual(self.button.height, 0)
        self.assertEqual(self.button.is_loaded, True)

    def test_press(self):
        self.button.on_mouse_press(0, 0, None, None)
        self.assertEqual(self.button.is_pressed, True)

    def test_delete(self):
        self.manager.delete()
        self.assertEqual(self.button.is_loaded, False)
Esempio n. 8
0
class TestButton(TestPygletGUI):

    def setUp(self):
        TestPygletGUI.setUp(self)
        self.button = Button(label="test")
        self.manager = Manager(self.button, window=self.window, batch=self.batch, theme=self.theme)

    def test_creation(self):
        self.assertNotEqual(self.button.width, 0)
        self.assertNotEqual(self.button.height, 0)
        self.assertEqual(self.button.is_loaded, True)

    def test_press(self):
        self.button.on_mouse_press(0, 0, None, None)
        self.assertEqual(self.button.is_pressed, True)

    def test_delete(self):
        self.manager.delete()

        self.assertEqual(self.button.is_loaded, False)
Esempio n. 9
0
class TestSpacer(TestPygletGUI):
    """
    Tests that the spacer is working correctly
    inside containers.
    """
    def setUp(self):
        TestPygletGUI.setUp(self)

        self.widgets = []
        for i in range(2):
            self.widgets.append(Viewer(width=100, height=50))
        for i in range(2):
            self.widgets.append(Viewer(width=20, height=50))

        self.container = VerticalContainer([HorizontalContainer([self.widgets[0],
                                                           self.widgets[1]], padding=0),
                                         HorizontalContainer([Spacer(),
                                                           self.widgets[2],
                                                           Spacer(),
                                                           self.widgets[3],
                                                           Spacer()], padding=0)], padding=0)

        self.manager = Manager(self.container, window=self.window, batch=self.batch, theme=self.theme)

    def test_initial(self):
        self.assertEqual(self.container.width, 200)

        # space left for the spacers occupy:
        width_left = 200 - 40

        # expected spacer size
        spacer_size = int(width_left/3.)

        # Spacers should occupy same space
        self.assertEqual(self.widgets[2].x, self.container.x + spacer_size)
        self.assertEqual(self.widgets[3].x, self.widgets[2].x + self.widgets[2].width + spacer_size)

    def tearDown(self):
        self.manager.delete()
        super(TestSpacer, self).tearDown()
class TestInput(TestPygletGUI):
    def setUp(self):
        TestPygletGUI.setUp(self)
        self.input = TextInput(text="test")
        self.manager = Manager(self.input,
                               window=self.window,
                               batch=self.batch,
                               theme=self.theme)

    def test_focus(self):
        self.input.on_gain_focus()

        self.assertEqual(self.input.is_focus(), True)

        self.input.on_lose_focus()
        self.assertEqual(self.input.is_focus(), False)

    def test_input(self):
        self.assertEqual(self.input.get_text(), "test")
        self.input.on_gain_focus()
        self.input.on_text("text")
        self.assertEqual(
            self.input.get_text(),
            "text")  # it starts with all text selected, so 'test' is erased.
        self.input.on_text(" text")
        self.assertEqual(self.input.get_text(), "text text")

    def test_motion(self):
        self.input.on_gain_focus()

        self.input.on_text_motion(pyglet.window.key.MOTION_RIGHT)
        # 'test|' where | is the carret.
        self.assertEqual(self.input.get_text(), "test")

        self.input.on_text_motion(pyglet.window.key.MOTION_BACKSPACE)
        # 'tes|'
        self.assertEqual(self.input.get_text(), "tes")

        self.input.on_text_motion(pyglet.window.key.MOTION_LEFT)
        # 't|es'
        self.input.on_text_motion(pyglet.window.key.MOTION_LEFT)

        self.input.on_text_motion(pyglet.window.key.MOTION_DELETE)
        # 't|s'
        self.assertEqual(self.input.get_text(), "ts")

    def test_delete(self):
        self.manager.delete()

    def test_delete_without_focus(self):
        self.input.on_gain_focus()
        self.input.on_lose_focus()
        self.manager.delete()

    def test_delete_with_focus(self):
        self.input.on_gain_focus()
        self.manager.delete()
Esempio n. 11
0
class TestSlider(TestPygletGUI):

    def setUp(self):
        TestPygletGUI.setUp(self)
        self.slider = HorizontalSlider(min_value=0, max_value=10)
        self.manager = Manager(self.slider, window=self.window, batch=self.batch, theme=self.theme)

    def test_set_value(self):
        self.slider.set_knob_pos(0.5)
        self.assertEqual(self.slider.value, 5)

    def test_mouse_slide(self):

        # push the slider to the minimum
        self.slider.on_mouse_press(0, 0, None, None)
        self.assertEqual(self.slider.value, 0)

        # push the slider to the maximum
        self.slider.on_mouse_press(10000, 0, None, None)
        self.assertEqual(self.slider.value, 10)

    def tearDown(self):
        self.manager.delete()
        super(TestSlider, self).tearDown()
Esempio n. 12
0
class TestInput(TestPygletGUI):

    def setUp(self):
        TestPygletGUI.setUp(self)
        self.input = TextInput(text="test")
        self.manager = Manager(self.input, window=self.window, batch=self.batch, theme=self.theme)

    def test_focus(self):
        self.input.on_gain_focus()

        self.assertEqual(self.input.is_focus(), True)

        self.input.on_lose_focus()
        self.assertEqual(self.input.is_focus(), False)

    def test_input(self):
        self.assertEqual(self.input.get_text(), "test")
        self.input.on_gain_focus()
        self.input.on_text("text")
        self.assertEqual(self.input.get_text(), "text")  # it starts with all text selected, so 'test' is erased.
        self.input.on_text(" text")
        self.assertEqual(self.input.get_text(), "text text")

    def test_motion(self):
        self.input.on_gain_focus()

        self.input.on_text_motion(pyglet.window.key.MOTION_RIGHT)
        # 'test|' where | is the carret.
        self.assertEqual(self.input.get_text(), "test")

        self.input.on_text_motion(pyglet.window.key.MOTION_BACKSPACE)
        # 'tes|'
        self.assertEqual(self.input.get_text(), "tes")

        self.input.on_text_motion(pyglet.window.key.MOTION_LEFT)
        # 't|es'
        self.input.on_text_motion(pyglet.window.key.MOTION_LEFT)

        self.input.on_text_motion(pyglet.window.key.MOTION_DELETE)
        # 't|s'
        self.assertEqual(self.input.get_text(), "ts")

    def test_delete(self):
        self.manager.delete()

    def test_delete_without_focus(self):
        self.input.on_gain_focus()
        self.input.on_lose_focus()
        self.manager.delete()

    def test_delete_with_focus(self):
        self.input.on_gain_focus()
        self.manager.delete()
Esempio n. 13
0
class HorizontalHUD:
    def __init__(self, window, batch, space, level, height, width):
        self.space = space
        self.level = level
        self.height = height
        self.width = width
        progress_text = "Progress: ..."
        self.progress_doc = Document(progress_text, width = width/2)
        objective_doc = Document(level.objective, width = width/2)
        left_frame = Frame(VerticalContainer([objective_doc, None,
            self.progress_doc]), is_expandable = True)
        self.left_container = VerticalContainer([left_frame])
        victory_formula = level.victory_condition[0]
        info_frame = self.create_info_frame(victory_formula)
        self.info_container = VerticalContainer([info_frame])
        container = HorizontalContainer([self.left_container, self.info_container])
        self.manager = Manager(container, window=window, batch=batch,
                group=RenderingOrder.hud, anchor=ANCHOR_BOTTOM_LEFT,
                theme=theme, is_movable=False)
        self.window = window
        self.window.push_handlers(on_draw=self.on_draw)
        self.tick = 0
        self.init_effects(space, level)

    def init_effects(self, space, level):
        pos = (self.left_container.x + self.left_container.width / 2,
               self.left_container.y + self.left_container.height / 2 - 50)
        self.victory = Effects.VictoryInventory(space, pos, "Victory Inventory",
                self.left_container.width, self.left_container.height + 100,
                level.victory_condition)

    def get_effects(self):
        return [self.victory]

    def update_info_text(self, formula):
        info_frame = self.create_info_frame(formula)
        for content in self.info_container.content:
            self.info_container.remove(content)
        self.info_container.add(info_frame)

    def create_info_frame(self, formula):
        cml = CachedCml.getMolecule(formula)
        info_text = pyglet.text.decode_html("<b>%s</b><br> %s" %
                ( cml.property.get("Name", "Undefined"),
                  cml.property.get("Description", "No Description Available")
                ))
        info_doc = Document(info_text, height=self.height, width=self.width/2,
                is_fixed_size = True)
        info_frame = Frame(info_doc)
        return info_frame


    def on_draw(self):
        self.tick += 1
        if self.tick > 30:
            return
        self.tick = 0
        self.update_progress()

    def update_progress(self):
        progress_text = self.victory.progress_text()
        self.progress_doc.set_text("Progress: " + progress_text)

    def delete(self):
        self.window.remove_handlers(on_draw = self.on_draw)
        self.manager.delete()
Esempio n. 14
0
class HorizontalHUD:
    def __init__(self, window, batch, space, level, height, width):
        self.space = space
        self.level = level
        self.height = height
        self.width = width
        progress_text = "Progress: ..."
        self.progress_doc = Document(progress_text, width=width / 2)
        objective_doc = Document(level.objective, width=width / 2)
        left_frame = Frame(VerticalContainer(
            [objective_doc, None, self.progress_doc]),
                           is_expandable=True)
        self.left_container = VerticalContainer([left_frame])
        victory_formula = level.victory_condition[0]
        info_frame = self.create_info_frame(victory_formula)
        self.info_container = VerticalContainer([info_frame])
        container = HorizontalContainer(
            [self.left_container, self.info_container])
        self.manager = Manager(container,
                               window=window,
                               batch=batch,
                               group=RenderingOrder.hud,
                               anchor=ANCHOR_BOTTOM_LEFT,
                               theme=theme,
                               is_movable=False)
        self.window = window
        self.window.push_handlers(on_draw=self.on_draw)
        self.tick = 0
        self.init_effects(space, level)

    def init_effects(self, space, level):
        pos = (self.left_container.x + self.left_container.width / 2,
               self.left_container.y + self.left_container.height / 2 - 50)
        self.victory = Effects.VictoryInventory(
            space, pos, "Victory Inventory", self.left_container.width,
            self.left_container.height + 100, level.victory_condition)

    def get_effects(self):
        return [self.victory]

    def update_info_text(self, formula):
        info_frame = self.create_info_frame(formula)
        for content in self.info_container.content:
            self.info_container.remove(content)
        self.info_container.add(info_frame)

    def create_info_frame(self, formula):
        cml = CachedCml.getMolecule(formula)
        info_text = pyglet.text.decode_html(
            "<b>%s</b><br> %s" %
            (cml.property.get("Name", "Undefined"),
             cml.property.get("Description", "No Description Available")))
        info_doc = Document(info_text,
                            height=self.height,
                            width=self.width / 2,
                            is_fixed_size=True)
        info_frame = Frame(info_doc)
        return info_frame

    def on_draw(self):
        self.tick += 1
        if self.tick > 30:
            return
        self.tick = 0
        self.update_progress()

    def update_progress(self):
        progress_text = self.victory.progress_text()
        self.progress_doc.set_text("Progress: " + progress_text)

    def delete(self):
        self.window.remove_handlers(on_draw=self.on_draw)
        self.manager.delete()
Esempio n. 15
0
class VerticalHUD():
    def __init__(self, window, batch, space, level, height, width):
        self.space = space
        self.level = level
        status_text = pyglet.text.decode_attributed('''
Time: 0 sec \n
Points: 0 points \n
FPS: 00.00 FPS
''')
        self.status_doc = Document(status_text, height=height, width=width)
        status_frame = Frame(self.status_doc)
        inv_text = pyglet.text.decode_html("<h4>Inventory</h4>")
        inventory_header = Document(inv_text, width=width)
        self.inventory_container = VerticalContainer([])

        container = VerticalContainer(
            [inventory_header, self.inventory_container])
        self.inventory_frame = Frame(container)
        container = VerticalContainer([status_frame, self.inventory_frame])
        self.manager = Manager(container,
                               window=window,
                               batch=batch,
                               group=RenderingOrder.hud,
                               anchor=ANCHOR_TOP_RIGHT,
                               theme=theme,
                               is_movable=False)
        self.window = window
        self.window.push_handlers(on_draw=self.on_draw)
        self.tick = 0
        # Currently disabled
        #self.init_effects(space, level)

    def init_effects(self, space, level):
        pos = (self.inventory_frame.x,
               self.inventory_frame.y + self.inventory_frame.height / 2 - 50)
        self.inventory_effect = Effects.Inventory(
            space,
            pos,
            "Inventory",
            self.inventory_frame.width,
            self.inventory_frame.height + 100, ["H2O(l)", "CH4(g)", "NaCl(s)"],
            gui_container=self.inventory_container)

    def get_effects(self):
        return []
        #currently disabled
        #return [self.inventory_effect]

    def on_draw(self):
        self.tick += 1
        if self.tick > 30:
            return
        self.tick = 0
        self.update_status()

    def update_status(self):
        level_time = self.window.level.get_time()
        points = self.window.level.get_points()
        status_text = '''
Time: %d sec
Points: %d points
FPS: %.2f FPS
''' % (level_time, points, pyglet.clock.get_fps())
        self.status_doc.set_text(status_text)

    def delete(self):
        self.window.remove_handlers(on_draw=self.on_draw)
        self.manager.delete()
Esempio n. 16
0
class TestDialog(TestPygletGUI):
    """
    This test case tests basic functionality of
    widget+manager. We use an empty widget for this.
    """

    def setUp(self):
        super(TestDialog, self).setUp()

        self.widget = Viewer(width=50, height=50)
        self.manager = Manager(self.widget, window=self.window, batch=self.batch, theme=self.theme)

    def test_top_down_draw(self):
        """
        Tests that the manager's size was set
        according to the child size.
        """
        # manager size is correct
        self.assertEqual(self.manager.width, 50)
        self.assertEqual(self.manager.height, 50)

        # widget is centered in the window
        self.assertEqual(self.widget.x, self.window.width/2 - self.widget.width/2)
        self.assertEqual(self.widget.y, self.window.height/2 - self.widget.height/2)

    def test_bottom_up_draw(self):
        """
        Tests that the manager's size is modified
        if we set a new size to the widget.
        """
        self.widget.width = 60
        self.widget.parent.reset_size()

        # manager size was reset
        self.assertEqual(self.manager.width, self.widget.width)

        # widget and manager were re-centered in the window
        self.assertEqual(self.widget.x, self.window.width/2 - self.widget.width/2)
        self.assertEqual(self.manager.x, self.window.width/2 - self.manager.width/2)

    def test_substitute_widget(self):
        """
        Tests substitution of manager's content
        by other widget.
        """
        self.new_widget = Viewer(width=60, height=50)

        self.manager.content = self.new_widget

        self.assertTrue(not self.widget.has_manager())
        self.assertFalse(self.widget.is_loaded)

        self.assertTrue(self.new_widget.has_manager())
        self.assertTrue(self.new_widget.is_loaded)

        # manager size was reset, new widget position is correct
        self.assertEqual(self.manager.width, self.new_widget.width)
        self.assertEqual(self.new_widget.x, self.window.width/2 - self.new_widget.width/2)

    def test_window_resize(self):
        self.window.width = 100
        self.manager.on_resize(self.window.width, self.window.height)

        # manager size didn't changed.
        self.assertEqual(self.manager.width, 50)

        # manager is still centered.
        self.assertEqual(self.manager.x, self.window.width/2 - self.manager.width/2)

    def test_change_offset(self):
        self.manager.offset = (10, 0)

        # manager is centered with an offset.
        self.assertEqual(self.manager.x - 10, self.window.width/2 - self.manager.width/2)

    def test_change_anchor(self):
        self.manager.anchor = pyglet_gui.constants.ANCHOR_TOP_LEFT

        # manager is in correct position.
        self.assertEqual(self.manager.x, 0)

    def test_new_manager_is_on_top(self):
        other_manager = Manager(Viewer(width=50, height=50), window=self.window,
                              batch=self.batch,
                              theme=self.theme)

        # confirm that a new manager starts always on top
        self.assertTrue(other_manager.root_group.is_on_top())

    def test_new_manager_without_window(self):
        other_manager = Manager(Viewer(width=50, height=50),
                              batch=self.batch,
                              theme=self.theme)

        # confirm that a new manager without window starts
        # with no size
        self.assertTrue(other_manager.width, 0)

        # change the manager's window
        other_manager.window = self.window

        # confirm it has a size.
        self.assertEqual(self.manager.width, 50)

        # confirm it is in the correct position
        self.assertEqual(self.manager.x, self.window.width/2 - self.manager.width/2)

    def test_deletion(self):
        self.manager.delete()

        # confirm that widget is also deleted
        self.assertTrue(not self.widget.has_manager())

    def tearDown(self):
        self.manager.delete()
        super(TestDialog, self).tearDown()
Esempio n. 17
0
class TestGridContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    a grid container.
    """

    def setUp(self):
        super().setUp()

        self.container = GridContainer([[Viewer(width=50, height=50), Viewer(width=50, height=50)],
                                     [Viewer(width=50, height=50), Viewer(width=50, height=50)]])

        self.manager = Manager(self.container, window=self.window, batch=self.batch, theme=self.theme)

    def test_top_down_draw(self):
        """
        Tests that the container's size was set correctly
        and the positions of its content is correct.
        """
        # manager size is correct
        self.assertEqual(self.container.width, 100 + self.container.padding)
        self.assertEqual(self.container.height, 100 + self.container.padding)

        # widget is centered in the window
        self.assertEqual(self.container.x, self.window.width // 2 - self.container.width // 2)
        self.assertEqual(self.container.y, self.window.height // 2 - self.container.height // 2)

    def test_bottom_up_draw(self):
        """
        Tests that the manager's size is modified
        if we set a new size to the widget.
        """
        self.container.content[0][0].width = 60
        self.container.content[0][0].height = 60
        self.container.content[0][0].parent.reset_size()

        # container width was set
        self.assertEqual(self.container.width, 110 + self.container.padding)
        # container height was set
        self.assertEqual(self.container.height, 110 + self.container.padding)

        # container was re-centered in the window
        self.assertEqual(self.container.x, self.window.width // 2 - self.container.width // 2)
        self.assertEqual(self.container.y, self.window.height // 2 - self.container.height // 2)

    def test_add_row(self):
        """
        Tests that if we add a row with 3 columns,
        we have the correct sizes.
        """
        self.container.add_row([Viewer(width=50, height=50),
                                Viewer(width=50, height=50),
                                Viewer(width=50, height=50)])

        self.assertEqual(self.container.width, 150 + 2 * self.container.padding)
        self.assertEqual(self.container.height, 150 + 2 * self.container.padding)

    def test_add_column(self):
        """
        Tests that if we add a column with 3 rows,
        we have the correct sizes.
        """
        self.container.add_column([Viewer(width=50, height=50),
                                   Viewer(width=50, height=50),
                                   Viewer(width=50, height=50)])

        self.assertEqual(self.container.width, 150 + 2 * self.container.padding)
        self.assertEqual(self.container.height, 150 + 2 * self.container.padding)

    def test_substitute_element(self):
        self.container.set(1, 1, Viewer(width=100, height=50))

        self.assertEqual(self.container.width, 150 + self.container.padding)
        self.assertEqual(self.container.height, 100 + self.container.padding)

    def tearDown(self):
        self.manager.delete()
        super().tearDown()
Esempio n. 18
0
class TestHorizontalContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    an horizontal container.
    """

    def setUp(self):
        super(TestHorizontalContainer, self).setUp()

        self.container = HorizontalContainer([Viewer(width=50, height=50),
                                           Viewer(width=50, height=50)])

        self.manager = Manager(self.container, window=self.window, batch=self.batch, theme=self.theme)

    def _test_content_position(self):
        """
        Tests the position of the two widgets within the container.
        """
        # first widget x is the left x (container.x)
        self.assertEqual(self.container.content[0].x,
                         self.container.x)

        # second widget x is the left x (container.x + container.content[0].width)
        # plus the padding (self.container.padding)
        self.assertEqual(self.container.content[1].x,
                         self.container.x + self.container.content[0].width
                         + self.container.padding)

    def test_top_down_draw(self):
        """
        Tests that the manager's size was set according to the child size.
        """
        # manager size is correct
        self.assertEqual(self.manager.width, 100 + self.container.padding)
        self.assertEqual(self.manager.height, 50)

        # widget is centered in the window
        self.assertEqual(self.container.x, self.window.width//2 - self.container.width//2)
        self.assertEqual(self.container.y, self.window.height//2 - self.container.height//2)

        self._test_content_position()

    def test_bottom_up_draw(self):
        """
        Tests that the manager's size is modified
        if we set a new size to the widget.
        """
        self.container.content[0].width = 60
        self.container.content[0].height = 60
        self.container.content[0].parent.reset_size()

        # manager width was set
        self.assertEqual(self.manager.width, 110 + self.container.padding)
        # container height was set
        self.assertEqual(self.container.height, 60)

        # container and manager were re-centered in the window
        self.assertEqual(self.container.x, self.window.width//2 - self.container.width//2)
        self.assertEqual(self.manager.y, self.window.height//2 - self.manager.height//2)

        self._test_content_position()

    def test_add_widget(self):
        self.container.add(Viewer(width=50, height=50))

        self.assertEqual(self.manager.width, 150 + 2*self.container.padding)
        self.assertEqual(self.manager.height, 50)

        self._test_content_position()

    def test_remove_widget(self):
        self.container.remove(self.container.content[0])

        self.assertEqual(self.manager.width, 50 + self.container.padding)
        self.assertEqual(self.manager.height, 50)

    def tearDown(self):
        self.manager.delete()
        super(TestHorizontalContainer, self).tearDown()
Esempio n. 19
0
class loginMenu():
    def __init__(self, screen):
        self.screen = screen
        self.username = ""
        self.password = ""
        self.loadedMap = False
        self.charSprite = None
        self.changing = False
        self.naming = False
        self.ready = False
        self.menename = ""
        self.bgImg = pyglet.image.load(g.dataPath + '/login/bg_menu.png')
        self.skyImg = pyglet.image.load(g.dataPath + '/login/bg_sky1.png')
        self.ukkeli = pyglet.image.load(g.dataPath + '/login/bg_ukkeli1.png')
        self.ukkeli2 = pyglet.image.load(g.dataPath + '/login/bg_ukkeli2.png')
        self.l1 = pyglet.resource.image(g.dataPath + '/login/logo.png')
        self.ukkeliSprite = pyglet.sprite.Sprite(self.ukkeli,
                                                 x=0.5 * self.screen.width,
                                                 y=30)
        #self.ukkeliSprite._set_scale(self.screen.width/1920.0)

        self.ukkeliSprite2 = pyglet.sprite.Sprite(self.ukkeli2,
                                                  x=0.5 * self.screen.width,
                                                  y=30)
        #self.ukkeliSprite2._set_scale(self.screen.width/1920.0)
        self.logo = pyglet.sprite.Sprite(self.l1, x=0, y=0)
        #self.logo._set_scale(self.screen.width/1920.0)
        self.initManagers()
        self.startTick = int(
            (datetime.datetime.utcnow() -
             datetime.datetime(1970, 1, 1)).total_seconds() * 1000)
        #g.gameEngine.musicManager.queue(pyglet.media.load(g.dataPath+'/sounds/pokemon.mp3'))
        #if g.MUSIC:
        #    g.gameEngine.musicManager.play()
    def exit(self, event):
        g.gameState = GAMESTATE_EXIT

    def tryLogin(self, event):
        if not self.button.disabled:
            #self.username=self.logininput.get_text()
            #self.password=self.passwordinput.get_text()
            #if self.logininput.get_text() != "":
            #    if self.logininput.get_text() == '1':
            #        self.username='******'
            #        self.password='******'
            #    else:
            self.username = self.logininput.get_text()
            #self.username = "******"
            self.password = self.passwordinput.get_text()
            g.gameEngine.initConnection()
            self.button.disabled = True
            l = reactor.callLater(1, self.f)

    def removeCharCreating(self):
        self.charMan.delete()
        del self.charMan
        self.charSprite = None

    def initNameMene(self):
        def sendMeneName(event):
            self.menename = self.nameInput.get_text()
            if len(self.menename) > 0:
                self.saveBtn.disabled = True

        self.naming = True
        label = Label("Name Your Mene",
                      color=g.postColor,
                      font_size=18,
                      bold=True)
        #meneTheme = Theme({g.spriteName: {
        #                "image": {
        #                    "source": g.spriteName+'_front.png'
        #                },
        #                "gui_color": [255,255,255,255]
        #            }
        #        },resources_path=g.dataPath+'/menes/'
        #)
        #picture = Graphic(g.spriteName,alternative=meneTheme)
        picture = Graphic(
            texture=g.gameEngine.resManager.meneSprites[g.spriteName]['front'])
        self.nameInput = TextInput(text="",
                                   padding=2,
                                   length=12,
                                   max_length=12,
                                   width=200,
                                   font_size=16)
        self.saveBtn = HighlightedButton(label="Save",
                                         on_release=sendMeneName,
                                         width=100,
                                         height=40,
                                         font_size=16)
        frame = Frame(VerticalContainer(content=[
            label, picture,
            HorizontalContainer([self.nameInput, self.saveBtn])
        ]),
                      path='frame_npc_talk')
        self.meneMan = Manager(frame,
                               window=self.screen,
                               batch=g.guiBatch,
                               theme=g.theme,
                               offset=(0, 0),
                               is_movable=False)

    def removeMenenaming(self):
        self.meneMan.delete()

    def initCreateChar(self):
        def checkClothingOk():
            found = 0
            #print g.clothingPairs
            for clothes in g.clothingPairs:
                found = 0
                if clothes["type"] == 'exclude':
                    if 'shirt' in clothes and clothes[
                            'shirt'] == myPlayer.shirt:
                        found += 1
                    if 'hat' in clothes and clothes['hat'] == myPlayer.hat:
                        found += 1
                    if 'face' in clothes and clothes['face'] == myPlayer.face:
                        found += 1
                    if 'shoes' in clothes and clothes[
                            'shoes'] == myPlayer.shoes:
                        found += 1
                    if found >= 2:
                        return False
            return True

        def hatLeft(event):
            myPlayer.hat -= 1
            if myPlayer.hat < 0:
                myPlayer.hat = g.MAX_HAT - 1
            if not checkClothingOk():
                hatLeft(None)
            self.changing = True

        def hatRight(event):
            myPlayer.hat += 1
            if myPlayer.hat >= g.MAX_HAT:
                myPlayer.hat = 0
            if not checkClothingOk():
                hatRight(None)
            self.changing = True

        def faceLeft(event):
            myPlayer.face -= 1
            if myPlayer.face < 0:
                myPlayer.face = g.MAX_FACE - 1
            if not checkClothingOk():
                faceLeft(None)
            self.changing = True

        def faceRight(event):
            myPlayer.face += 1
            if myPlayer.face >= g.MAX_FACE:
                myPlayer.face = 0
            if not checkClothingOk():
                faceRight(None)
            self.changing = True

        def shirtLeft(event):
            myPlayer.shirt -= 1
            if myPlayer.shirt < 0:
                myPlayer.shirt = g.MAX_SHIRT - 1
            if not checkClothingOk():
                shirtLeft(None)
            self.changing = True

        def shirtRight(event):
            myPlayer.shirt += 1
            if myPlayer.shirt >= g.MAX_SHIRT:
                myPlayer.shirt = 0
            if not checkClothingOk():
                shirtRight(None)
            self.changing = True

        def shoesLeft(event):
            myPlayer.shoes -= 1
            if myPlayer.shoes < 0:
                myPlayer.shoes = g.MAX_SHOES - 1
            if not checkClothingOk():
                shoesLeft(None)
            self.changing = True

        def shoesRight(event):
            myPlayer.shoes += 1
            if myPlayer.shoes >= g.MAX_SHOES:
                myPlayer.shoes = 0
            if not checkClothingOk():
                shoesRight(None)
            self.changing = True

        def facingLeft(event):
            myPlayer.dir -= 1
            if myPlayer.dir < DIR_DOWN:
                myPlayer.dir = DIR_RIGHT
                myPlayer.tmpPlayer.spriteFacing = 8
            elif myPlayer.dir == DIR_UP:
                myPlayer.tmpPlayer.spriteFacing = 5
            elif myPlayer.dir == DIR_LEFT:
                myPlayer.tmpPlayer.spriteFacing = 3
            elif myPlayer.dir == DIR_DOWN:
                myPlayer.tmpPlayer.spriteFacing = 0

            #myPlayer.tmpPlayer.spriteFacing-=1
            #if myPlayer.tmpPlayer.spriteFacing<0:
            #    myPlayer.tmpPlayer.spriteFacing=9
        def facingRight(event):
            myPlayer.dir += 1
            if myPlayer.dir > DIR_RIGHT:
                myPlayer.dir = DIR_DOWN
                myPlayer.tmpPlayer.spriteFacing = 0
            elif myPlayer.dir == DIR_UP:
                myPlayer.tmpPlayer.spriteFacing = 5
            elif myPlayer.dir == DIR_LEFT:
                myPlayer.tmpPlayer.spriteFacing = 3
            elif myPlayer.dir == DIR_RIGHT:
                myPlayer.tmpPlayer.spriteFacing = 8

        def saveClothes(event):
            self.ready = True
            saveBtn.disabled = True

        self.changing = True
        label = Label("Create Character", color=g.postColor, font_size=18)
        name = Label(myPlayer.name, bold=True, color=g.nameColor, font_size=18)
        hatBtnLeft = HighlightedButton(label="<-",
                                       on_release=hatLeft,
                                       width=25,
                                       height=25,
                                       font_size=13)
        hatBtnRight = HighlightedButton(label="->",
                                        on_release=hatRight,
                                        width=25,
                                        height=25,
                                        font_size=13)
        hatHorz = HorizontalContainer(
            content=[hatBtnLeft,
                     Spacer(256 - TILESIZE * 2, 0), hatBtnRight])

        faceBtnLeft = HighlightedButton(label="<-",
                                        on_release=faceLeft,
                                        width=25,
                                        height=25,
                                        font_size=13)
        faceBtnRight = HighlightedButton(label="->",
                                         on_release=faceRight,
                                         width=25,
                                         height=25,
                                         font_size=13)
        faceHorz = HorizontalContainer(
            content=[faceBtnLeft,
                     Spacer(256 - TILESIZE * 2, 0), faceBtnRight])

        shirtBtnLeft = HighlightedButton(label="<-",
                                         on_release=shirtLeft,
                                         width=25,
                                         height=25,
                                         font_size=13)
        shirtBtnRight = HighlightedButton(label="->",
                                          on_release=shirtRight,
                                          width=25,
                                          height=25,
                                          font_size=13)
        shirtHorz = HorizontalContainer(content=[
            shirtBtnLeft,
            Spacer(256 - TILESIZE * 2, 0), shirtBtnRight
        ])

        shoesBtnLeft = HighlightedButton(label="<-",
                                         on_release=shoesLeft,
                                         width=25,
                                         height=25,
                                         font_size=13)
        shoesBtnRight = HighlightedButton(label="->",
                                          on_release=shoesRight,
                                          width=25,
                                          height=25,
                                          font_size=13)
        shoesHorz = HorizontalContainer(content=[
            shoesBtnLeft,
            Spacer(256 - TILESIZE * 2, 0), shoesBtnRight
        ])

        facingBtnLeft = HighlightedButton(label="<---",
                                          on_release=facingLeft,
                                          width=30,
                                          height=30,
                                          font_size=13)
        facingBtnRight = HighlightedButton(label="--->",
                                           on_release=facingRight,
                                           width=30,
                                           height=30,
                                           font_size=13)
        facingHorz = HorizontalContainer(
            content=[facingBtnLeft, facingBtnRight])

        saveBtn = HighlightedButton(label="Save",
                                    on_release=saveClothes,
                                    width=100,
                                    height=40,
                                    font_size=16)

        frame = Frame(VerticalContainer(content=[
            label,
            Spacer(256 - TILESIZE, TILESIZE / 4), name,
            Spacer(0, 8), hatHorz, faceHorz, shirtHorz, shoesHorz, facingHorz,
            Spacer(0, 8), saveBtn
        ]),
                      path='frame_npc_talk')
        self.charMan = Manager(frame,
                               window=self.screen,
                               batch=g.guiBatch,
                               theme=g.theme,
                               offset=(0, 0),
                               is_movable=False)

    def removeManagers(self):
        self.man1.delete()
        self.man2.delete()
        del self.man1
        del self.man2

    def initManagers(self):
        g.gameEngine.changeMusicSong(LOGINMENUSONG)
        g.gameEngine.musicManager.volume = g.MUSICVOLUME
        self.skyHeight = int(0.4592592 * g.SCREEN_HEIGHT)
        self.skyWidth = int(1.625 * g.SCREEN_WIDTH)
        self.ukkeliSprite._set_scale(self.screen.width / 1920.0)
        #self.ukkeliSprite.anchor_x=self.ukkeliSprite.width//2
        #self.ukkeliSprite.anchor_y=self.ukkeliSprite.height//2

        self.ukkeliSprite.x = 0.5 * self.screen.width
        self.ukkeliSprite2._set_scale(self.screen.width / 1920.0)
        self.ukkeliSprite2.x = 0.5 * self.screen.width
        #self.ukkeliSprite2.anchor_x=self.ukkeliSprite2.width//2
        #self.ukkeliSprite2.anchor_y=self.ukkeliSprite2.height//2
        self.logo._set_scale(self.screen.width / 1920.0)
        self.logo.x = (self.screen.width - self.l1.width *
                       (self.screen.width / 1920.0)) / 2
        self.logo.y = (self.screen.height - 350) * (1080.0 /
                                                    self.screen.height)

        self.charTick = int(
            (datetime.datetime.utcnow() -
             datetime.datetime(1970, 1, 1)).total_seconds() * 1000)

        label = Label("Username", color=g.loginFontColor, font_size=18)
        label1 = Label("Password", color=g.loginFontColor, font_size=18)
        self.logininput = TextInput(text="",
                                    padding=2,
                                    length=16,
                                    max_length=16,
                                    width=220,
                                    font_size=18)
        self.passwordinput = TextInput(text="",
                                       font=g.defaultPWFont.name,
                                       padding=0,
                                       length=21.5,
                                       width=220,
                                       font_size=18)

        self.button = HighlightedButton(label="Login",
                                        on_release=self.tryLogin,
                                        width=210,
                                        height=50,
                                        font_size=16)

        vertCont = VerticalContainer([
            label, self.logininput,
            Spacer(min_height=10), label1, self.passwordinput,
            Spacer(min_height=40), self.button
        ])

        versionInfo = Label("Version: " + GAME_VERSION,
                            color=(0, 0, 0, 255),
                            font_size=10)
        self.exitButton = HighlightedButton(label="Exit",
                                            on_release=self.exit,
                                            width=100,
                                            height=40,
                                            font_size=14)
        vertCont2 = VerticalContainer([versionInfo, self.exitButton])
        self.man1 = Manager(vertCont,
                            window=self.screen,
                            batch=g.guiBatch,
                            theme=g.theme,
                            offset=(0, -50),
                            is_movable=False)
        self.man2 = Manager(vertCont2,
                            window=self.screen,
                            batch=g.guiBatch,
                            theme=g.theme,
                            anchor=ANCHOR_BOTTOM_RIGHT,
                            offset=(-50, 50),
                            is_movable=False)
        self.man1.set_focus(self.logininput)

    def f(self):
        self.button.disabled = False

    def update(self):
        #print g.dx
        if g.currTick:
            g.dx = int((g.currTick - self.startTick) * 0.025)
        if g.dx >= self.skyWidth:
            g.dx = 0
            self.startTick = g.currTick
        self.bgImg.blit(0,
                        0,
                        width=self.screen.width,
                        height=self.screen.height)
        self.skyImg.blit(g.dx,
                         self.screen.height - self.skyHeight,
                         width=self.skyWidth,
                         height=self.skyHeight)
        self.skyImg.blit(g.dx - self.skyWidth,
                         self.screen.height - self.skyHeight,
                         width=self.skyWidth,
                         height=self.skyHeight)
        #print self.ukkeliSprite._texture.__dict__
        if g.currTick - self.charTick > 500:
            self.ukkeliSprite.draw()
            if g.currTick - self.charTick > 1000:
                self.charTick = g.currTick
        else:
            self.ukkeliSprite2.draw()

        #self.loadedMap = True
        g.FPS = True
        #print g.alertGroup.__dict__
        self.logo.draw()
        g.guiBatch.draw()
        #
        if self.charSprite is not None:
            self.charSprite[myPlayer.tmpPlayer.spriteFacing].blit(
                (g.screen.width - TILESIZE * 4) / 2,
                (g.screen.height - TILESIZE * 4) / 2)
class TestVerticalContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    a vertical container.
    """

    def setUp(self):
        super(TestVerticalContainer, self).setUp()

        self.container = VerticalContainer([Viewer(width=50, height=50),
                                         Viewer(width=50, height=50)])

        self.manager = Manager(self.container, window=self.window, batch=self.batch, theme=self.theme)

    def _test_content_position(self):
        """
        Tests the position of the two widgets within the container.
        """
        # first widget y is the top y (container.y + container.height) minus its size (container.content[0].height)
        self.assertEqual(self.container.content[0].y,
                         self.container.y + self.container.height - self.container.content[0].height)

        # second widget y is the top y (container.y + container.height - container.content[0].height) minus its size
        # (container.content[1].height) minus the padding (self.container.padding)
        self.assertEqual(self.container.content[1].y,
                         self.container.y + self.container.height
                         - self.container.content[0].height - self.container.content[1].height
                         - self.container.padding)

    def test_top_down_draw(self):
        """
        Tests that the container's size was set correctly
        and the positions of its content is correct.
        """
        # manager size is correct
        self.assertEqual(self.container.width, 50)
        self.assertEqual(self.container.height, 100 + self.container.padding)

        # widget is centered in the window
        self.assertEqual(self.container.x, self.window.width // 2 - self.container.width // 2)
        self.assertEqual(self.container.y, self.window.height // 2 - self.container.height // 2)

        self._test_content_position()

    def test_bottom_up_draw(self):
        """
        Tests that the manager's size is modified
        if we set a new size to the widget.
        """
        self.container.content[0].width = 60
        self.container.content[0].height = 60
        self.container.content[0].parent.reset_size()

        # container width was set
        self.assertEqual(self.container.width, 60)
        # container height was set
        self.assertEqual(self.container.height, 110 + self.container.padding)

        # container was re-centered in the window
        self.assertEqual(self.container.x, self.window.width // 2 - self.container.width // 2)
        self.assertEqual(self.container.y, self.window.height // 2 - self.container.height // 2)

        self._test_content_position()

    def test_add_widget(self):
        self.container.add(Viewer(width=50, height=50))

        self.assertEqual(self.manager.width, 50)
        self.assertEqual(self.manager.height, 150 + 2 * self.container.padding)

        self._test_content_position()

    def test_remove_widget(self):
        self.container.remove(self.container.content[0])

        self.assertEqual(self.manager.width, 50)
        self.assertEqual(self.manager.height, 50 + self.container.padding)

    def tearDown(self):
        self.manager.delete()
        super(TestVerticalContainer, self).tearDown()
class TestGridContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    a grid container.
    """
    def setUp(self):
        super(TestGridContainer, self).setUp()

        self.container = GridContainer(
            [[Viewer(width=50, height=50),
              Viewer(width=50, height=50)],
             [Viewer(width=50, height=50),
              Viewer(width=50, height=50)]])

        self.manager = Manager(self.container,
                               window=self.window,
                               batch=self.batch,
                               theme=self.theme)

    def test_top_down_draw(self):
        """
        Tests that the container's size was set correctly
        and the positions of its content is correct.
        """
        # manager size is correct
        self.assertEqual(self.container.width, 100 + self.container.padding)
        self.assertEqual(self.container.height, 100 + self.container.padding)

        # widget is centered in the window
        self.assertEqual(self.container.x,
                         self.window.width // 2 - self.container.width // 2)
        self.assertEqual(self.container.y,
                         self.window.height // 2 - self.container.height // 2)

    def test_bottom_up_draw(self):
        """
        Tests that the manager's size is modified
        if we set a new size to the widget.
        """
        self.container.content[0][0].width = 60
        self.container.content[0][0].height = 60
        self.container.content[0][0].parent.reset_size()

        # container width was set
        self.assertEqual(self.container.width, 110 + self.container.padding)
        # container height was set
        self.assertEqual(self.container.height, 110 + self.container.padding)

        # container was re-centered in the window
        self.assertEqual(self.container.x,
                         self.window.width // 2 - self.container.width // 2)
        self.assertEqual(self.container.y,
                         self.window.height // 2 - self.container.height // 2)

    def test_add_row(self):
        """
        Tests that if we add a row with 3 columns,
        we have the correct sizes.
        """
        self.container.add_row([
            Viewer(width=50, height=50),
            Viewer(width=50, height=50),
            Viewer(width=50, height=50)
        ])

        self.assertEqual(self.container.width,
                         150 + 2 * self.container.padding)
        self.assertEqual(self.container.height,
                         150 + 2 * self.container.padding)

    def test_add_column(self):
        """
        Tests that if we add a column with 3 rows,
        we have the correct sizes.
        """
        self.container.add_column([
            Viewer(width=50, height=50),
            Viewer(width=50, height=50),
            Viewer(width=50, height=50)
        ])

        self.assertEqual(self.container.width,
                         150 + 2 * self.container.padding)
        self.assertEqual(self.container.height,
                         150 + 2 * self.container.padding)

    def test_substitute_element(self):
        self.container.set(1, 1, Viewer(width=100, height=50))

        self.assertEqual(self.container.width, 150 + self.container.padding)
        self.assertEqual(self.container.height, 100 + self.container.padding)

    def tearDown(self):
        self.manager.delete()
        super(TestGridContainer, self).tearDown()
class TestHorizontalContainer(TestPygletGUI):
    """
    This test case tests basic functionality of
    an horizontal container.
    """

    def setUp(self):
        super().setUp()

        self.container = HorizontalContainer([Viewer(width=50, height=50),
                                           Viewer(width=50, height=50)])

        self.manager = Manager(self.container, window=self.window, batch=self.batch, theme=self.theme)

    def _test_content_position(self):
        """
        Tests the position of the two widgets within the container.
        """
        # first widget x is the left x (container.x)
        self.assertEqual(self.container.content[0].x,
                         self.container.x)

        # second widget x is the left x (container.x + container.content[0].width)
        # plus the padding (self.container.padding)
        self.assertEqual(self.container.content[1].x,
                         self.container.x + self.container.content[0].width
                         + self.container.padding)

    def test_top_down_draw(self):
        """
        Tests that the manager's size was set according to the child size.
        """
        # manager size is correct
        self.assertEqual(self.manager.width, 100 + self.container.padding)
        self.assertEqual(self.manager.height, 50)

        # widget is centered in the window
        self.assertEqual(self.container.x, self.window.width/2 - self.container.width/2)
        self.assertEqual(self.container.y, self.window.height/2 - self.container.height/2)

        self._test_content_position()

    def test_bottom_up_draw(self):
        """
        Tests that the manager's size is modified
        if we set a new size to the widget.
        """
        self.container.content[0].width = 60
        self.container.content[0].height = 60
        self.container.content[0].parent.reset_size()

        # manager width was set
        self.assertEqual(self.manager.width, 110 + self.container.padding)
        # container height was set
        self.assertEqual(self.container.height, 60)

        # container and manager were re-centered in the window
        self.assertEqual(self.container.x, self.window.width/2 - self.container.width/2)
        self.assertEqual(self.manager.y, self.window.height/2 - self.manager.height/2)

        self._test_content_position()

    def test_add_widget(self):
        self.container.add(Viewer(width=50, height=50))

        self.assertEqual(self.manager.width, 150 + 2*self.container.padding)
        self.assertEqual(self.manager.height, 50)

        self._test_content_position()

    def test_remove_widget(self):
        self.container.remove(self.container.content[0])

        self.assertEqual(self.manager.width, 50 + self.container.padding)
        self.assertEqual(self.manager.height, 50)

    def tearDown(self):
        self.manager.delete()
        super().tearDown()