annotate gamelib/widgets.py @ 358:760f6a318d2e

Moved some widgets around.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 28 Aug 2010 16:50:37 +0200
parents 92cc50d7ce7a
children 277a7a0c2cea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
79
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
1 # widgets.py
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
2 # Copyright Boomslang team, 2010 (see COPYING File)
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
3
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
4 """Custom Albow widgets"""
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
5
122
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
6 import textwrap
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
7
79
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
8 import albow.controls
358
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
9 import albow.menu
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
10 from albow.resource import get_font, get_image
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
11 from pygame.color import Color
358
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
12 from pygame.rect import Rect
79
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
13
358
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
14 from constants import BUTTON_SIZE
122
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
15 from cursor import CursorWidget
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
16
79
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
17
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
18 class BoomLabel(albow.controls.Label):
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
19
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
20 def set_margin(self, margin):
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
21 """Add a set_margin method that recalculates the label size"""
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
22 old_margin = self.margin
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
23 w, h = self.size
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
24 d = margin - old_margin
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
25 self.margin = margin
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
26 self.size = (w + 2 * d, h + 2 * d)
d7c0a702a0b4 Factor label width setting method out into a custom class (BoomLabel).
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff changeset
27
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
28 def draw_all(self, surface):
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
29 bg_color = self.bg_color
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
30 self.bg_color = None
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
31 if bg_color is not None:
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
32 new_surface = surface.convert_alpha()
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
33 new_surface.fill(bg_color)
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
34 surface.blit(new_surface, surface.get_rect())
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
35 albow.controls.Label.draw_all(self, surface)
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
36 self._draw_all_no_bg(surface)
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
37 self.bg_color = bg_color
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
38
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
39 def _draw_all_no_bg(self, surface):
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
40 pass
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
41
358
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
42
217
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
43 class BoomButton(BoomLabel):
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
44
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
45 def __init__(self, text, action, screen):
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
46 super(BoomLabel, self).__init__(text, font=get_font(20, 'Vera.ttf'))
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
47 self.bg_color = (0, 0, 0)
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
48 self.action = action
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
49 self.screen = screen
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
50
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
51 def mouse_down(self, event):
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
52 self.action()
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
53 self.screen.state_widget.mouse_move(event)
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
54
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
55 def mouse_move(self, event):
324
3476e8f3b100 Fixed mouse and cursor handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 313
diff changeset
56 self.screen.state.highlight_override = True
217
146cec58ddd8 Highlight detailed view close button
Neil Muller <neil@dip.sun.ac.za>
parents: 213
diff changeset
57
124
97322b78d1c1 Minor style cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 122
diff changeset
58
122
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
59 class MessageDialog(BoomLabel, CursorWidget):
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
60
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
61 def __init__(self, screen, text, wrap_width, style=None, **kwds):
187
fbfd8e748ac0 Remove screen reference from State.
Jeremy Thurgood <firxen@gmail.com>
parents: 124
diff changeset
62 CursorWidget.__init__(self, screen)
313
40dd77f71e11 Computer typeface for JIM.
Jeremy Thurgood <firxen@gmail.com>
parents: 264
diff changeset
63 self.set_style(style)
122
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
64 paras = text.split("\n\n")
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
65 text = "\n".join([textwrap.fill(para, wrap_width) for para in paras])
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
66 albow.controls.Label.__init__(self, text, **kwds)
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
67
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
68 def set_style(self, style):
122
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
69 self.set_margin(5)
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
70 self.border_width = 1
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
71 self.border_color = (0, 0, 0)
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
72 self.bg_color = (127, 127, 127)
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
73 self.fg_color = (0, 0, 0)
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
74 if style == "JIM":
356
92cc50d7ce7a New (Fontforge) Monospace font for JIM
Stefano Rivera <stefano@rivera.za.net>
parents: 351
diff changeset
75 self.set(font=get_font(20, "Monospace.ttf"))
213
20998c650ce1 Fixed rect_drawer tool and adjusted JIM message background.
Jeremy Thurgood <firxen@gmail.com>
parents: 210
diff changeset
76 self.bg_color = Color(255, 127, 127, 207)
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
77 self.fg_color = (0, 0, 0)
213
20998c650ce1 Fixed rect_drawer tool and adjusted JIM message background.
Jeremy Thurgood <firxen@gmail.com>
parents: 210
diff changeset
78 self.border_color = (127, 0, 0)
210
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
79
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
80 def draw_all(self, surface):
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
81 BoomLabel.draw_all(self, surface)
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
82
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
83 def _draw_all_no_bg(self, surface):
eb101b6fb3dd Transparent message dialogs.
Jeremy Thurgood <firxen@gmail.com>
parents: 187
diff changeset
84 CursorWidget.draw_all(self, surface)
122
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
85
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
86 def mouse_down(self, event):
d2f84f22def0 Move MessageDialog to widgets
Neil Muller <neil@dip.sun.ac.za>
parents: 79
diff changeset
87 self.dismiss()
324
3476e8f3b100 Fixed mouse and cursor handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 313
diff changeset
88
3476e8f3b100 Fixed mouse and cursor handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 313
diff changeset
89 def cursor_highlight(self):
3476e8f3b100 Fixed mouse and cursor handling.
Jeremy Thurgood <firxen@gmail.com>
parents: 313
diff changeset
90 return False
358
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
91
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
92
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
93 class HandButton(albow.controls.Image):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
94 """The fancy hand button for the widget"""
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
95
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
96 def __init__(self, action):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
97 # FIXME: Yes, please.
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
98 this_image = get_image('items', 'hand.png')
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
99 albow.controls.Image.__init__(self, image=this_image)
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
100 self.action = action
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
101 self.set_rect(Rect(0, 0, BUTTON_SIZE, BUTTON_SIZE))
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
102
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
103 def mouse_down(self, event):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
104 self.action()
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
105
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
106
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
107 class PopupMenuButton(albow.controls.Button):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
108
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
109 def __init__(self, text, action):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
110 albow.controls.Button.__init__(self, text, action)
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
111
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
112 self.font = get_font(16, 'Vera.ttf')
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
113 self.set_rect(Rect(0, 0, BUTTON_SIZE, BUTTON_SIZE))
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
114 self.margin = (BUTTON_SIZE - self.font.get_linesize()) / 2
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
115
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
116
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
117 class PopupMenu(albow.menu.Menu, CursorWidget):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
118
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
119 def __init__(self, screen):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
120 CursorWidget.__init__(self, screen)
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
121 self.screen = screen
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
122 self.shell = screen.shell
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
123 items = [
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
124 ('Resume Game', 'hide'),
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
125 ('Quit Game', 'quit'),
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
126 ('Exit to Main Menu', 'main_menu'),
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
127 ]
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
128 # albow.menu.Menu ignores title string
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
129 albow.menu.Menu.__init__(self, None, items)
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
130 self.font = get_font(16, 'Vera.ttf')
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
131
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
132 def show_menu(self):
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
133 """Call present, with the correct position"""
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
134 item_height = self.font.get_linesize()
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
135 menu_top = 600 - (len(self.items) * item_height + BUTTON_SIZE)
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
136 item = self.present(self.shell, (0, menu_top))
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
137 if item > -1:
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
138 # A menu item needs to be invoked
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
139 self.invoke_item(item)
760f6a318d2e Moved some widgets around.
Jeremy Thurgood <firxen@gmail.com>
parents: 356
diff changeset
140