comparison gamelib/gamescreen.py @ 187:fbfd8e748ac0

Remove screen reference from State.
author Jeremy Thurgood <firxen@gmail.com>
date Wed, 25 Aug 2010 16:45:06 +0200
parents 5845a3ed4dad
children c56a0170f0cb
comparison
equal deleted inserted replaced
186:f15c4f7c24e6 187:fbfd8e748ac0
20 class InventoryView(PaletteView): 20 class InventoryView(PaletteView):
21 21
22 sel_color = Color("yellow") 22 sel_color = Color("yellow")
23 sel_width = 2 23 sel_width = 2
24 24
25 def __init__(self, state, scene_widget): 25 def __init__(self, screen):
26 PaletteView.__init__(self, (BUTTON_SIZE, BUTTON_SIZE), 1, 6, scrolling=True) 26 PaletteView.__init__(self, (BUTTON_SIZE, BUTTON_SIZE), 1, 6, scrolling=True)
27 self.state = state 27 self.state = screen.state
28 self.scene_widget = scene_widget 28 self.state_widget = screen.state_widget
29 29
30 def num_items(self): 30 def num_items(self):
31 return len(self.state.inventory) 31 return len(self.state.inventory)
32 32
33 def draw_item(self, surface, item_no, rect): 33 def draw_item(self, surface, item_no, rect):
39 self.unselect() 39 self.unselect()
40 else: 40 else:
41 if self.state.tool: 41 if self.state.tool:
42 result = self.state.inventory[item_no].interact(self.state.tool, self.state) 42 result = self.state.inventory[item_no].interact(self.state.tool, self.state)
43 if result: 43 if result:
44 result.process(self.scene_widget) 44 result.process(self.state_widget)
45 else: 45 else:
46 self.state.set_tool(self.state.inventory[item_no]) 46 self.state.set_tool(self.state.inventory[item_no])
47 47
48 def item_is_selected(self, item_no): 48 def item_is_selected(self, item_no):
49 return self.state.tool is self.state.inventory[item_no] 49 return self.state.tool is self.state.inventory[item_no]
52 self.state.set_tool(None) 52 self.state.set_tool(None)
53 53
54 54
55 class StateWidget(Widget): 55 class StateWidget(Widget):
56 56
57 def __init__(self, state): 57 def __init__(self, screen):
58 Widget.__init__(self, Rect(0, 0, SCENE_SIZE[0], SCENE_SIZE[1])) 58 Widget.__init__(self, Rect(0, 0, SCENE_SIZE[0], SCENE_SIZE[1]))
59 self.state = state 59 self.screen = screen
60 self.detail = DetailWindow(state) 60 self.state = screen.state
61 self.detail = DetailWindow(screen)
61 62
62 def draw(self, surface): 63 def draw(self, surface):
63 self.state.draw(surface) 64 self.state.draw(surface, self.screen)
64 65
65 def mouse_down(self, event): 66 def mouse_down(self, event):
66 if self.subwidgets: 67 if self.subwidgets:
67 self.remove(self.detail) 68 self.remove(self.detail)
68 self.state.set_current_detail(None) 69 self.state.set_current_detail(None)
76 if self.state.animate(): 77 if self.state.animate():
77 # queue a redraw 78 # queue a redraw
78 self.invalidate() 79 self.invalidate()
79 # We do this here so we can get enter and leave events regardless 80 # We do this here so we can get enter and leave events regardless
80 # of what happens 81 # of what happens
81 result = self.state.check_enter_leave() 82 result = self.state.check_enter_leave(self.screen)
82 if result: 83 if result:
83 result.process(self) 84 result.process(self)
84 85
85 def mouse_move(self, event): 86 def mouse_move(self, event):
86 if not self.subwidgets: 87 if not self.subwidgets:
87 self._mouse_move(event.pos) 88 self._mouse_move(event.pos)
88 89
89 def _mouse_move(self, pos): 90 def _mouse_move(self, pos):
90 self.state.mouse_move(pos) 91 self.state.mouse_move(pos, self.screen)
91 92
92 def show_message(self, message): 93 def show_message(self, message):
93 self.parent.cursor_highlight(False) 94 self.parent.cursor_highlight(False)
94 # Display the message as a modal dialog 95 # Display the message as a modal dialog
95 MessageDialog(message, 60).present() 96 MessageDialog(self.screen, message, 60).present()
96 # queue a redraw to show updated state 97 # queue a redraw to show updated state
97 self.invalidate() 98 self.invalidate()
98 # The cursor could have gone anywhere 99 # The cursor could have gone anywhere
99 if self.subwidgets: 100 if self.subwidgets:
100 self.subwidgets[0]._mouse_move(mouse.get_pos()) 101 self.subwidgets[0]._mouse_move(mouse.get_pos())
107 self.add_centered(self.detail) 108 self.add_centered(self.detail)
108 self.parent.cursor_highlight(False) 109 self.parent.cursor_highlight(False)
109 110
110 111
111 class DetailWindow(Widget): 112 class DetailWindow(Widget):
112 def __init__(self, state): 113 def __init__(self, screen):
113 Widget.__init__(self) 114 Widget.__init__(self)
114 self.state = state 115 self.screen = screen
116 self.state = screen.state
115 self.border_width = 5 117 self.border_width = 5
116 self.border_color = (0, 0, 0) 118 self.border_color = (0, 0, 0)
117 119
118 def set_image_rect(self, rect): 120 def set_image_rect(self, rect):
119 bw = self.border_width 121 bw = self.border_width
120 self.image_rect = rect 122 self.image_rect = rect
121 self.image_rect.topleft = (bw, bw) 123 self.image_rect.topleft = (bw, bw)
122 self.set_rect(rect.inflate(bw*2, bw*2)) 124 self.set_rect(rect.inflate(bw*2, bw*2))
123 125
124 def draw(self, surface): 126 def draw(self, surface):
125 self.state.draw_detail(surface.subsurface(self.image_rect)) 127 self.state.draw_detail(surface.subsurface(self.image_rect), self.screen)
126 128
127 def mouse_down(self, event): 129 def mouse_down(self, event):
128 result = self.state.interact_detail(self.global_to_local(event.pos)) 130 result = self.state.interact_detail(self.global_to_local(event.pos))
129 if result: 131 if result:
130 result.process(self) 132 result.process(self)
131 133
132 def mouse_move(self, event): 134 def mouse_move(self, event):
133 self._mouse_move(event.pos) 135 self._mouse_move(event.pos)
134 136
135 def _mouse_move(self, pos): 137 def _mouse_move(self, pos):
136 self.state.mouse_move_detail(self.global_to_local(pos)) 138 self.state.mouse_move_detail(self.global_to_local(pos), self.screen)
137 139
138 def show_message(self, message): 140 def show_message(self, message):
139 self.parent.show_message(message) 141 self.parent.show_message(message)
140 self.invalidate() 142 self.invalidate()
141 143
147 Row.__init__(self, items, spacing=0, width=SCREEN[0]) 149 Row.__init__(self, items, spacing=0, width=SCREEN[0])
148 150
149 151
150 class GameScreen(Screen, CursorWidget): 152 class GameScreen(Screen, CursorWidget):
151 def __init__(self, shell): 153 def __init__(self, shell):
152 CursorWidget.__init__(self) 154 CursorWidget.__init__(self, self)
153 Screen.__init__(self, shell) 155 Screen.__init__(self, shell)
154 self.running = False 156 self.running = False
155 157
156 def _clear_all(self): 158 def _clear_all(self):
157 for widget in self.subwidgets[:]: 159 for widget in self.subwidgets[:]:
158 self.remove(widget) 160 self.remove(widget)
159 161
160 def start_game(self): 162 def start_game(self):
161 self._clear_all() 163 self._clear_all()
162 # TODO: Randomly plonk the state here for now 164 # TODO: Randomly plonk the state here for now
163 self.state = initial_state(self) 165 self.state = initial_state()
164 self.state_widget = StateWidget(self.state) 166 self.state_widget = StateWidget(self)
165 self.add(self.state_widget) 167 self.add(self.state_widget)
166 168
167 self.popup_menu = PopupMenu(self.shell) 169 self.popup_menu = PopupMenu(self)
168 self.menubutton = PopupMenuButton('Menu', 170 self.menubutton = PopupMenuButton('Menu',
169 action=self.popup_menu.show_menu) 171 action=self.popup_menu.show_menu)
170 172
171 self.handbutton = HandButton(action=self.hand_pressed) 173 self.handbutton = HandButton(action=self.hand_pressed)
172 174
173 self.inventory = InventoryView(self.state, self.state_widget) 175 self.inventory = InventoryView(self)
174 176
175 self.toolbar = ToolBar([ 177 self.toolbar = ToolBar([
176 self.menubutton, 178 self.menubutton,
177 self.handbutton, 179 self.handbutton,
178 self.inventory, 180 self.inventory,