diff pyntnclick/gamescreen.py @ 803:bcc9277a23e6 pyntnclick

Refactor widget positioning API. Remove unused widgets
author Stefano Rivera <stefano@rivera.za.net>
date Sun, 27 Jan 2013 14:52:16 +0200
parents bdaffaa8b6bf
children 6f38e20b1417
line wrap: on
line diff
--- a/pyntnclick/gamescreen.py	Sun Jan 27 14:50:33 2013 +0200
+++ b/pyntnclick/gamescreen.py	Sun Jan 27 14:52:16 2013 +0200
@@ -3,7 +3,7 @@
 # Main menu for the game
 
 import pygame.draw
-from pygame import Rect, Surface
+from pygame import Surface
 from pygame.color import Color
 from pygame.locals import MOUSEBUTTONDOWN, MOUSEMOTION, KEYDOWN, K_ESCAPE
 
@@ -20,9 +20,9 @@
     SELECTED_COLOR = Color("yellow")
     SELECTED_WIDTH = 2
 
-    def __init__(self, rect, gd):
+    def __init__(self, pos, gd, size):
         self.item = None
-        super(InventorySlot, self).__init__(rect, gd, None)
+        super(InventorySlot, self).__init__(pos, gd, None, size)
         self.add_callback(MOUSEBUTTONDOWN, self.mouse_down)
 
     def set_item(self, item):
@@ -53,8 +53,9 @@
 
 class UpDownButton(TextButton):
     # TextButton for now.
-    def __init__(self, rect, gd):
-        super(UpDownButton, self).__init__(rect, gd, self.TEXT, padding=3)
+    def __init__(self, pos, gd, size=None):
+        super(UpDownButton, self).__init__(pos, gd, self.TEXT, size=size,
+                                           padding=3)
 
 
 class UpButton(UpDownButton):
@@ -68,9 +69,9 @@
 class InventoryView(Container):
     MIN_UPDOWN_WIDTH = 16
 
-    def __init__(self, rect, gd, screen):
+    def __init__(self, pos, gd, size, screen):
         self.bsize = gd.constants.button_size
-        super(InventoryView, self).__init__(rect, gd)
+        super(InventoryView, self).__init__(pos, gd, size)
         self.screen = screen
         self.game = screen.game
 
@@ -80,22 +81,21 @@
 
         self.updown_width = self.rect.width - slots * self.bsize
         ud_left = self.rect.right - self.updown_width
-        self.up_button = self.add(UpButton(Rect(
-                    (ud_left, self.rect.top),
-                    (self.updown_width, self.rect.height / 2)), gd))
+        self.up_button = self.add(UpButton((ud_left, self.rect.top), gd,
+                    (self.updown_width, self.rect.height / 2)))
         self.up_button.add_callback(MOUSEBUTTONDOWN, self.up_callback)
-        self.down_button = self.add(DownButton(Rect(
-                    (ud_left, self.rect.top + self.rect.height / 2),
-                    (self.updown_width, self.rect.height / 2)), gd))
+        self.down_button = self.add(DownButton(
+                    (ud_left, self.rect.top + self.rect.height / 2), gd,
+                    (self.updown_width, self.rect.height / 2)))
         self.down_button.add_callback(MOUSEBUTTONDOWN, self.down_callback)
 
         self.add_callback(MOUSEBUTTONDOWN, self.mouse_down)
         self.update_slots()
 
     def make_slot(self, slot):
-        rect = Rect((self.rect.left + slot * self.bsize, self.rect.top),
-                    (self.bsize, self.rect.height))
-        return InventorySlot(rect, self.gd)
+        pos = (self.rect.left + slot * self.bsize, self.rect.top)
+        size = (self.bsize, self.rect.height)
+        return InventorySlot(pos, self.gd, size)
 
     def up_callback(self, event, widget):
         self.inv_offset = max(self.inv_offset - len(self.slots), 0)
@@ -138,8 +138,8 @@
     DETAIL_BORDER = 4
     DETAIL_BORDER_COLOR = Color("black")
 
-    def __init__(self, rect, gd, scene, screen, is_detail=False):
-        super(SceneWidget, self).__init__(rect, gd)
+    def __init__(self, pos, gd, size, scene, screen, is_detail=False):
+        super(SceneWidget, self).__init__(pos, gd, size)
         self.name = scene.NAME
         self.scene = scene
         self.screen = screen
@@ -150,6 +150,7 @@
         if is_detail:
             self.close_button = TextButton((0, 0), self.gd, _("Close"))
             self.close_button.do_prepare()
+            # TODO: Don't muck around with close_button's rect
             self.close_button.rect.midbottom = self.rect.midbottom
             self.close_button.add_callback('clicked', self.close)
             self.add(self.close_button)
@@ -194,35 +195,32 @@
 
 
 class ToolBar(Container):
-    def __init__(self, rect, gd, screen):
+    def __init__(self, pos, gd, size, screen):
         self.screen = screen
-        button_size = gd.constants.button_size
 
-        if not isinstance(rect, Rect):
-            rect = Rect(rect, (gd.constants.scene_size[0], button_size))
-        super(ToolBar, self).__init__(rect, gd)
+        super(ToolBar, self).__init__(pos, gd, size)
 
         self.bg_color = (31, 31, 31)
         self.left = self.rect.left
 
         self.menu_button = self.add_tool(
-            0, TextButton, gd, _("Menu"), fontname=gd.constants.bold_font,
+            None, TextButton, _("Menu"), fontname=gd.constants.bold_font,
             color="red", padding=1, border=0, bg_color="black")
         self.menu_button.add_callback(MOUSEBUTTONDOWN, self.menu_callback)
 
         hand_image = gd.resource.get_image('items', 'hand.png')
         self.hand_button = self.add_tool(
-            None, ImageButtonWidget, gd, hand_image)
+            None, ImageButtonWidget, hand_image)
         self.hand_button.add_callback(MOUSEBUTTONDOWN, self.hand_callback)
 
         self.inventory = self.add_tool(
-            self.rect.width - self.left, InventoryView, gd, screen)
+            self.rect.width - self.left, InventoryView, screen=screen)
 
     def add_tool(self, width, cls, *args, **kw):
-        rect = (self.left, self.rect.top)
+        pos = (self.left, self.rect.top)
         if width is not None:
-            rect = Rect(rect, (width, self.rect.height))
-        tool = cls(rect, *args, **kw)
+            kw['size'] = (width, self.rect.height)
+        tool = cls(pos, self.gd, *args, **kw)
         self.add(tool)
         tool.do_prepare()
         self.left += tool.rect.width
@@ -278,18 +276,19 @@
         self.game = self.create_initial_state(game_state)
 
         self.screen_modal = self.container.add(
-            ModalStackContainer(self.container.rect.copy(), self.gd))
+            ModalStackContainer(self.container.pos, self.gd,
+                                self.container.size))
         self.inner_container = self.screen_modal.add(
-            Container(self.container.rect.copy(), self.gd))
+            Container(self.container.pos, self.gd, self.container.size))
 
         toolbar_height = self.gd.constants.button_size
-        rect = Rect(0, 0, self.surface_size[0],
-                    self.surface_size[1] - toolbar_height)
 
         self.scene_modal = self.inner_container.add(
-            ModalStackContainer(rect, self.gd))
+            ModalStackContainer((0, 0), self.gd,
+                (self.surface_size[0], self.surface_size[1] - toolbar_height)))
         self.toolbar = self.inner_container.add(
-            ToolBar((0, rect.height), self.gd, self))
+            ToolBar((0, self.surface_size[1] - toolbar_height), self.gd,
+                (self.surface_size[0], toolbar_height), self))
         self.inventory = self.toolbar.inventory
 
         self.gd.running = True
@@ -315,12 +314,15 @@
         self._add_scene(self.game.detail_views[detail_name], True)
 
     def _add_scene(self, scene, detail=False):
-        rect = self.scene_modal.rect.copy()
+        pos = self.scene_modal.rect.topleft
+        size = self.scene_modal.rect.size
         if detail:
-            rect = Rect((0, 0), scene.get_detail_size())
-            rect.center = self.scene_modal.rect.center
+            size = scene.get_detail_size()
+            pos = ((self.scene_modal.rect.width - size[0]) / 2,
+                   (self.scene_modal.rect.height - size[1]) / 2)
 
-        self.scene_modal.add(SceneWidget(rect, self.gd, scene, self, detail))
+        self.scene_modal.add(SceneWidget(pos, self.gd, size, scene, self,
+                                         detail))
         self.handle_result(scene.enter())
 
     def close_detail(self, detail=None):
@@ -354,10 +356,11 @@
         self.show_queued_widget()
 
     def show_message(self, message):
-        rect = Rect((0, 0), (1, 1))
         max_width = self.gd.constants.screen[0] - 100
-        widget = WrappedTextLabel(rect, self.gd, message, max_width=max_width)
+        widget = WrappedTextLabel((0, 0), self.gd, message,
+                                  max_width=max_width)
         widget.do_prepare()
+        # TODO: Use the centering API when it exists
         widget.rect.center = self.container.rect.center
         self.queue_widget(widget)