Mercurial > sypikslang
annotate gamelib/gui_base.py @ 62:38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Tue, 08 May 2012 17:29:02 +0200 |
parents | 86d83dcb7d42 |
children | 24f0707695b4 |
rev | line source |
---|---|
37 | 1 import pygame |
39
d82d3e54a4ef
fixed more pep8 issues
Rizmari Versfeld <rizziepit@gmail.com>
parents:
38
diff
changeset
|
2 from pygame import Surface, Rect |
37 | 3 from pygame.font import Font |
4 | |
5 from gamelib import data | |
6 | |
7 | |
8 # different font sizes | |
9 pygame.font.init() | |
10 font_small = Font(data.filepath('fonts/DejaVuSans.ttf'), 10) | |
11 font_medium = Font(data.filepath('fonts/DejaVuSans.ttf'), 14) | |
12 font_large = Font(data.filepath('fonts/DejaVuSans.ttf'), 18) | |
13 | |
14 | |
15 class Drawable(object): | |
38 | 16 |
17 def __init__(self, rect): | |
18 if isinstance(rect, Rect): | |
19 self.rect = rect | |
20 else: | |
21 self.rect = Rect(rect[0], rect[1], rect[2], rect[3]) | |
22 | |
23 def draw(self, surface): | |
24 pass | |
25 | |
26 | |
37 | 27 class Clickable(object): |
38 | 28 |
29 def on_mouse_down(self, pos): | |
30 pass | |
31 | |
32 def on_mouse_up(self, pos): | |
33 pass | |
34 | |
35 def on_mouse_move(self, pos): | |
36 pass | |
37 | |
38 def on_mouse_cancel(self): | |
39 pass | |
40 | |
41 def on_click(self): | |
42 pass | |
43 | |
37 | 44 |
45 class ContainerView(Drawable): | |
38 | 46 |
47 def __init__(self): | |
48 self.children = [] | |
49 | |
50 def add_child(self, child): | |
51 self.children.append(child) | |
52 | |
53 def remove_child(self, child): | |
54 self.children.remove(child) | |
55 | |
56 def get_child_by_pos(self, pos): | |
57 for child in self.children: | |
58 if child.rect.collidepoint(pos): | |
59 if isinstance(child, ContainerView): | |
60 # calculates position relative to child | |
61 x = pos[0] - child.rect[0] | |
62 y = pos[1] - child.rect[1] | |
63 return child.get_child_by_pos((x, y)) | |
64 else: | |
65 return child | |
66 | |
67 def draw_children(self, surface): | |
68 for child in self.children: | |
69 child.draw(surface) | |
70 | |
71 | |
37 | 72 class Window(Clickable, ContainerView): |
38 | 73 |
74 def __init__(self, screen): | |
75 super(Window, self).__init__() | |
76 self.surface = Surface((screen.get_width(), screen.get_height())) | |
77 self.background_colour = None | |
78 self.background_image = None | |
79 self.pressed_child = None | |
80 | |
81 def on_mouse_down(self, pos): | |
82 child = self.get_child_by_pos(pos) | |
83 if isinstance(child, Clickable): | |
84 # calculates position relative to child | |
85 x = pos[0] - child.rect[0] | |
86 y = pos[1] - child.rect[1] | |
87 child.on_mouse_down((x, y)) | |
88 self.pressed_child = child | |
89 | |
90 def on_mouse_up(self, pos): | |
91 if self.pressed_child: | |
92 child = self.pressed_child | |
93 x = pos[0] - child.rect[0] | |
94 y = pos[1] - child.rect[1] | |
95 child.on_mouse_up((x, y)) | |
96 self.pressed_child = None | |
97 | |
98 def on_mouse_move(self, pos): | |
99 if self.pressed_child: | |
100 if self.pressed_child != self.get_child_by_pos(pos): | |
101 self.pressed_child.on_mouse_cancel() | |
102 self.pressed_child = None | |
103 | |
104 def draw(self, screen): | |
105 if self.background_colour: | |
106 self.surface.fill(self.background_colour) | |
107 if self.background_image: | |
108 self.surface.blit(self.background_image, (0, 0)) | |
109 self.draw_children(self.surface) | |
110 screen.blit(self.surface, (0, 0)) | |
111 | |
37 | 112 |
113 class StateDrawable(Drawable): | |
38 | 114 |
115 def __init__(self, rect): | |
116 super(StateDrawable, self).__init__(rect) | |
117 self.state = -1 | |
118 self.states = {} | |
119 self.drawables = [] | |
120 self.surface = Surface((self.rect[2], self.rect[3])) | |
121 | |
122 def draw(self, surface): | |
123 if self.state != -1 and self.drawables[self.state]: | |
124 self.drawables[self.state].draw(surface) | |
125 | |
126 def add_state(self, state_name, drawable): | |
127 self.states[state_name] = len(self.drawables) | |
128 self.drawables.append(drawable) | |
129 | |
130 def set_state(self, state_name): | |
131 self.state = self.states[state_name] | |
132 | |
133 | |
37 | 134 class Button(Clickable, StateDrawable): |
38 | 135 |
136 def __init__(self, rect, normal_drawable, down_drawable): | |
137 super(Button, self).__init__(rect) | |
138 self.add_state('NORMAL', normal_drawable) | |
139 self.add_state('DOWN', down_drawable) | |
140 self.set_state('NORMAL') | |
141 | |
142 def on_mouse_down(self, pos): | |
143 self.set_state('DOWN') | |
144 | |
145 def on_mouse_up(self, pos): | |
146 self.set_state('NORMAL') | |
147 self.on_click() | |
148 | |
149 def on_mouse_cancel(self): | |
150 self.set_state('NORMAL') | |
151 | |
152 | |
37 | 153 class TextButton(Button): |
154 | |
62
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
155 def __init__(self, rect, normal_drawable, down_drawable, text, font, |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
156 shadow): |
38 | 157 super(TextButton, self).__init__(rect, normal_drawable, down_drawable) |
158 self.surface = Surface((rect[2], rect[3])) | |
159 self.text = text | |
62
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
160 self.font = font |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
161 self.shadow = shadow |
55
86d83dcb7d42
Make text drawing easier to poke at for subclasses
Neil Muller <drnlmuller@gmail.com>
parents:
39
diff
changeset
|
162 self._draw_text() |
86d83dcb7d42
Make text drawing easier to poke at for subclasses
Neil Muller <drnlmuller@gmail.com>
parents:
39
diff
changeset
|
163 |
86d83dcb7d42
Make text drawing easier to poke at for subclasses
Neil Muller <drnlmuller@gmail.com>
parents:
39
diff
changeset
|
164 def _draw_text(self): |
62
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
165 self.font.set_bold(True) |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
166 self.text_surface = self.font.render(self.text, True, (128, 128, 128)) |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
167 if self.shadow: |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
168 shadow = self.font.render(self.text, True, (0, 0, 0)) |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
169 self.text_surface.blit(shadow, (-2, -2)) |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
170 self.font.set_bold(False) |
38f41d046c6f
Make button font a parameter. Tweak indication of points to be spent
Neil Muller <drnlmuller@gmail.com>
parents:
55
diff
changeset
|
171 size = self.font.size(self.text) |
55
86d83dcb7d42
Make text drawing easier to poke at for subclasses
Neil Muller <drnlmuller@gmail.com>
parents:
39
diff
changeset
|
172 self.text_offset = ((self.rect[2] - size[0]) / 2, |
86d83dcb7d42
Make text drawing easier to poke at for subclasses
Neil Muller <drnlmuller@gmail.com>
parents:
39
diff
changeset
|
173 (self.rect[3] - size[1]) / 2) |
37 | 174 |
38 | 175 def draw(self, surface): |
176 self.surface.fill((0, 0, 0, 0)) | |
177 super(TextButton, self).draw(self.surface) | |
178 self.surface.blit(self.text_surface, self.text_offset) | |
179 surface.blit(self.surface, self.rect) |