Mercurial > boomslang
annotate pyntnclick/widgets/base.py @ 711:e9265818a96c pyntnclick
Add image widget for rect_drawer
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Sun, 05 Aug 2012 14:54:49 +0200 |
parents | 58d78038a197 |
children | 3b2d1adca59c |
rev | line source |
---|---|
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
1 import collections |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
2 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
3 import pygame |
559
b7d8b89de71a
Rip out keyboard handling
Stefano Rivera <stefano@rivera.za.net>
parents:
558
diff
changeset
|
4 from pygame.locals import (MOUSEBUTTONDOWN, MOUSEBUTTONUP, |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
5 MOUSEMOTION, SRCALPHA, USEREVENT) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
6 |
558 | 7 from pyntnclick.engine import UserEvent |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
8 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
9 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
10 class Widget(object): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
11 |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
12 highlight_cursor = False |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
13 |
639
fdc63049b08c
Add game_description to the widgets,, since it looks a useful thing to do
Neil Muller <neil@dip.sun.ac.za>
parents:
602
diff
changeset
|
14 def __init__(self, rect, gd): |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
15 if not isinstance(rect, pygame.Rect): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
16 rect = pygame.Rect(rect, (0, 0)) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
17 self.rect = rect |
639
fdc63049b08c
Add game_description to the widgets,, since it looks a useful thing to do
Neil Muller <neil@dip.sun.ac.za>
parents:
602
diff
changeset
|
18 self.gd = gd |
fdc63049b08c
Add game_description to the widgets,, since it looks a useful thing to do
Neil Muller <neil@dip.sun.ac.za>
parents:
602
diff
changeset
|
19 self.resource = gd.resource |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
20 self.modal = False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
21 self.parent = None |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
22 self.disabled = False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
23 self.callbacks = collections.defaultdict(list) |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
24 # To track which widget the mouse is over |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
25 self.mouseover_widget = self |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
26 |
694 | 27 def set_parent(self, parent): |
28 self.parent = parent | |
29 | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
30 def add_callback(self, eventtype, callback, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
31 self.callbacks[eventtype].append((callback, args)) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
32 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
33 def event(self, ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
34 "Don't override this without damn good reason" |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
35 if self.disabled: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
36 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
37 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
38 type_ = ev.type |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
39 if type_ == USEREVENT: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
40 for k in self.callbacks.iterkeys(): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
41 if (isinstance(k, type) and issubclass(k, UserEvent) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
42 and k.matches(ev)): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
43 type_ = k |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
44 break |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
45 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
46 for callback, args in self.callbacks[type_]: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
47 if callback(ev, self, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
48 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
49 return False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
50 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
51 def draw(self, surface): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
52 "Override me" |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
53 pass |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
54 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
55 def disable(self): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
56 if not self.disabled: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
57 self.disabled = True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
58 if hasattr(self, 'prepare'): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
59 self.prepare() |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
60 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
61 def enable(self): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
62 if self.disabled: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
63 self.disabled = False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
64 if hasattr(self, 'prepare'): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
65 self.prepare() |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
66 |
652 | 67 def global_to_local(self, pos): |
68 x, y = pos | |
69 return (x - self.rect.left, y - self.rect.top) | |
70 | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
71 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
72 class Button(Widget): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
73 |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
74 highlight_cursor = True |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
75 |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
76 def event(self, ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
77 if super(Button, self).event(ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
78 return True |
559
b7d8b89de71a
Rip out keyboard handling
Stefano Rivera <stefano@rivera.za.net>
parents:
558
diff
changeset
|
79 if ev.type == MOUSEBUTTONDOWN: |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
80 for callback, args in self.callbacks['clicked']: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
81 if callback(ev, self, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
82 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
83 return False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
84 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
85 def forced_click(self): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
86 """Force calling the clicked handler""" |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
87 for callback, args in self.callbacks['clicked']: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
88 if callback(None, self, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
89 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
90 return False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
91 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
92 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
93 class Container(Widget): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
94 |
639
fdc63049b08c
Add game_description to the widgets,, since it looks a useful thing to do
Neil Muller <neil@dip.sun.ac.za>
parents:
602
diff
changeset
|
95 def __init__(self, rect, gd): |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
96 if rect is None: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
97 rect = pygame.Rect(0, 0, 0, 0) |
639
fdc63049b08c
Add game_description to the widgets,, since it looks a useful thing to do
Neil Muller <neil@dip.sun.ac.za>
parents:
602
diff
changeset
|
98 super(Container, self).__init__(rect, gd) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
99 self.children = [] |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
100 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
101 def event(self, ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
102 """Push an event down through the tree, and fire our own event as a |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
103 last resort |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
104 """ |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
105 self.mouseover_widget = self |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
106 if ev.type in (MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
107 for child in self.children[:]: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
108 if child.rect.collidepoint(ev.pos): |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
109 result = child.event(ev) |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
110 self.mouseover_widget = child.mouseover_widget |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
111 if result: |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
112 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
113 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
114 else: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
115 # Other events go to all children first |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
116 for child in self.children[:]: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
117 if child.event(ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
118 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
119 if super(Container, self).event(ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
120 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
121 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
122 def add(self, widget): |
694 | 123 widget.set_parent(self) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
124 self.children.append(widget) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
125 self.rect = self.rect.union(widget.rect) |
672
55d5d384fc16
Widget-based inventory view.
Jeremy Thurgood <firxen@gmail.com>
parents:
670
diff
changeset
|
126 return widget |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
127 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
128 def remove(self, widget): |
694 | 129 widget.set_parent(None) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
130 self.children.remove(widget) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
131 |
682 | 132 def remove_all(self): |
133 for widget in reversed(self.children[:]): | |
134 self.remove(widget) | |
135 | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
136 def draw(self, surface): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
137 for child in self.children: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
138 child.draw(surface) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
139 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
140 |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
141 class ModalStackContainer(Container): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
142 |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
143 def __init__(self, rect, gd, obscure_color=None): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
144 super(ModalStackContainer, self).__init__(rect, gd) |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
145 if obscure_color is None: |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
146 obscure_color = gd.constants.modal_obscure_color |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
147 self.obscure_color = convert_color(obscure_color) |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
148 |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
149 @property |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
150 def top(self): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
151 if self.children: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
152 return self.children[-1] |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
153 return None |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
154 |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
155 def event(self, ev): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
156 """Only the topmost child gets events. |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
157 """ |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
158 self.mouseover_widget = self |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
159 if self.top: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
160 self.mouseover_widget = self.top.mouseover_widget |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
161 if self.top.event(ev): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
162 return True |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
163 |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
164 # We skip Container's event() method and hop straight to its parent's. |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
165 if super(Container, self).event(ev): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
166 return True |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
167 |
679
fa168b5e2624
The return of the message dialog (and there was much rejoicing)
Neil Muller <neil@dip.sun.ac.za>
parents:
678
diff
changeset
|
168 def is_top(self, widget): |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
169 return self.top is widget |
679
fa168b5e2624
The return of the message dialog (and there was much rejoicing)
Neil Muller <neil@dip.sun.ac.za>
parents:
678
diff
changeset
|
170 |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
171 def draw(self, surface): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
172 obscure = pygame.Surface(self.rect.size, SRCALPHA) |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
173 obscure.fill(self.obscure_color) |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
174 for child in self.children: |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
175 surface.blit(obscure, self.rect) |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
176 child.draw(surface) |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
177 |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
178 |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
179 class GridContainer(Container): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
180 """Hacky container that only supports grids, won't work with Container |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
181 children, or modal children. |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
182 """ |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
183 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
184 def __init__(self, width, rect=None): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
185 super(GridContainer, self).__init__(rect) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
186 self.width = width |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
187 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
188 def add(self, widget): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
189 assert not isinstance(widget, Container) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
190 assert not widget.modal |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
191 super(GridContainer, self).add(widget) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
192 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
193 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
194 class Box(Container): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
195 """A container that draws a filled background with a border""" |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
196 padding = 4 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
197 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
198 def draw(self, surface): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
199 expandrect = self.rect.move((-self.padding, -self.padding)) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
200 expandrect.width = self.rect.width + 2 * self.padding |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
201 expandrect.height = self.rect.height + 2 * self.padding |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
202 border = pygame.Surface(expandrect.size, SRCALPHA) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
203 border.fill(pygame.Color('black')) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
204 surface.blit(border, expandrect) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
205 background = pygame.Surface(self.rect.size, SRCALPHA) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
206 background.fill(pygame.Color('gray')) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
207 surface.blit(background, self.rect) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
208 super(Box, self).draw(surface) |
670
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
209 |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
210 |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
211 def convert_color(color): |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
212 """Give me a pygame Color, dammit""" |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
213 if isinstance(color, pygame.Color): |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
214 return color |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
215 if isinstance(color, basestring): |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
216 return pygame.Color(color) |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
217 return pygame.Color(*color) |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
218 |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
219 |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
220 class ModalWrapper(Container): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
221 "A wrapper around a widget that removes itself when a mouse click occurs" |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
222 |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
223 def __init__(self, widget, close_callback=None): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
224 super(ModalWrapper, self).__init__(widget.rect, widget.gd) |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
225 self.close_callback = close_callback |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
226 self.add(widget) |
694 | 227 self.add_callback(MOUSEBUTTONDOWN, self.close) |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
228 widget.add_callback(MOUSEBUTTONDOWN, self.close) |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
229 |
694 | 230 def set_parent(self, parent): |
231 super(ModalWrapper, self).set_parent(parent) | |
232 if parent: | |
233 self.rect = self.parent.rect | |
234 | |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
235 def close(self, ev, widget): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
236 if self.parent: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
237 self.parent.remove(self) |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
238 if self.close_callback: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
239 self.close_callback() |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
240 return True |
711
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
241 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
242 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
243 class Image(Widget): |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
244 """Basic widget that draws an image, with an associated rect""" |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
245 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
246 def __init__(self, rect, gd, image): |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
247 super(Image, self).__init__(rect, gd) |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
248 self.image = image |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
249 self.rect.width = image.get_rect().width |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
250 self.rect.height = image.get_rect().height |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
251 self.visible = True |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
252 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
253 def draw(self, surface): |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
254 if self.visible: |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
255 surface.blit(self.image, self.rect) |