Mercurial > pyntnclick
annotate pyntnclick/widgets/base.py @ 849:547021cd0afa pyntnclick
Disabled widgets should *not* claim to have handled events.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sun, 15 Dec 2013 12:44:20 +0200 |
parents | 9f542ef6e498 |
children |
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, |
717
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
5 MOUSEMOTION, SRCALPHA, USEREVENT, |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
6 BLEND_RGBA_MIN) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
7 |
558 | 8 from pyntnclick.engine import UserEvent |
824 | 9 from pyntnclick.utils import convert_color |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
10 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
11 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
12 class Widget(object): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
13 |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
14 highlight_cursor = False |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
15 |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
16 def __init__(self, pos, gd, size): |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
17 self.pos = pos |
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 |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
20 self.size = size |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
21 self.rect = pygame.Rect(pos, size if size else (0, 0)) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
22 self.modal = False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
23 self.parent = None |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
24 self.disabled = False |
813 | 25 self.visible = True |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
26 self.callbacks = collections.defaultdict(list) |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
27 # To track which widget the mouse is over |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
28 self.mouseover_widget = self |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
29 self.is_prepared = False |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
30 |
694 | 31 def set_parent(self, parent): |
32 self.parent = parent | |
33 | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
34 def add_callback(self, eventtype, callback, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
35 self.callbacks[eventtype].append((callback, args)) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
36 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
37 def event(self, ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
38 "Don't override this without damn good reason" |
813 | 39 if self.disabled or not self.visible: |
849
547021cd0afa
Disabled widgets should *not* claim to have handled events.
Jeremy Thurgood <firxen@gmail.com>
parents:
824
diff
changeset
|
40 return False |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
41 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
42 type_ = ev.type |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
43 if type_ == USEREVENT: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
44 for k in self.callbacks.iterkeys(): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
45 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
|
46 and k.matches(ev)): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
47 type_ = k |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
48 break |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
49 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
50 for callback, args in self.callbacks[type_]: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
51 if callback(ev, self, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
52 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
53 return False |
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 draw(self, surface): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
56 "Override me" |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
57 pass |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
58 |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
59 def prepare(self): |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
60 """Override me""" |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
61 pass |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
62 |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
63 def do_prepare(self): |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
64 if not self.is_prepared: |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
65 self.prepare() |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
66 self.is_prepared = True |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
67 |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
68 def disable(self): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
69 if not self.disabled: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
70 self.disabled = True |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
71 self.prepare() |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
72 self.is_prepared = True |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
73 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
74 def enable(self): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
75 if self.disabled: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
76 self.disabled = False |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
77 self.prepare() |
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
78 self.is_prepared = True |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
79 |
813 | 80 def set_visible(self, visible): |
81 if self.visible != visible: | |
82 self.visible = visible | |
83 self.prepare() | |
84 self.is_prepared = True | |
85 | |
652 | 86 def global_to_local(self, pos): |
87 x, y = pos | |
88 return (x - self.rect.left, y - self.rect.top) | |
89 | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
90 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
91 class Button(Widget): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
92 |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
93 highlight_cursor = True |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
94 |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
95 def event(self, ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
96 if super(Button, self).event(ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
97 return True |
559
b7d8b89de71a
Rip out keyboard handling
Stefano Rivera <stefano@rivera.za.net>
parents:
558
diff
changeset
|
98 if ev.type == MOUSEBUTTONDOWN: |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
99 for callback, args in self.callbacks['clicked']: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
100 if callback(ev, self, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
101 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
102 return False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
103 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
104 def forced_click(self): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
105 """Force calling the clicked handler""" |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
106 for callback, args in self.callbacks['clicked']: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
107 if callback(None, self, *args): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
108 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
109 return False |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
110 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
111 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
112 class Container(Widget): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
113 |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
114 def __init__(self, pos, gd, size=None): |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
115 super(Container, self).__init__(pos, gd, size) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
116 self.children = [] |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
117 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
118 def event(self, ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
119 """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
|
120 last resort |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
121 """ |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
122 self.mouseover_widget = self |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
123 if ev.type in (MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
124 for child in self.children[:]: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
125 if child.rect.collidepoint(ev.pos): |
692
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
126 result = child.event(ev) |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
127 self.mouseover_widget = child.mouseover_widget |
d6ded808cc33
Much scene management refactoring.
Jeremy Thurgood <firxen@gmail.com>
parents:
682
diff
changeset
|
128 if result: |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
129 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
130 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
131 else: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
132 # Other events go to all children first |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
133 for child in self.children[:]: |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
134 if child.event(ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
135 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
136 if super(Container, self).event(ev): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
137 return True |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
138 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
139 def add(self, widget): |
694 | 140 widget.set_parent(self) |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
141 widget.prepare() |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
142 self.children.append(widget) |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
143 if not self.size: |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
144 self.rect = self.rect.union(widget.rect) |
672
55d5d384fc16
Widget-based inventory view.
Jeremy Thurgood <firxen@gmail.com>
parents:
670
diff
changeset
|
145 return widget |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
146 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
147 def remove(self, widget): |
694 | 148 widget.set_parent(None) |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
149 self.children.remove(widget) |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
150 |
682 | 151 def remove_all(self): |
152 for widget in reversed(self.children[:]): | |
153 self.remove(widget) | |
154 | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
155 def draw(self, surface): |
813 | 156 if self.visible: |
157 self.do_prepare() | |
158 for child in self.children: | |
159 child.draw(surface) | |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
160 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
161 |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
162 class ModalStackContainer(Container): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
163 |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
164 def __init__(self, pos, gd, size, obscure_color=None): |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
165 super(ModalStackContainer, self).__init__(pos, gd, size) |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
166 if obscure_color is None: |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
167 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
|
168 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
|
169 |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
170 @property |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
171 def top(self): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
172 if self.children: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
173 return self.children[-1] |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
174 return None |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
175 |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
176 def event(self, ev): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
177 """Only the topmost child gets events. |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
178 """ |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
179 self.mouseover_widget = self |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
180 if self.top: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
181 self.mouseover_widget = self.top.mouseover_widget |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
182 if self.top.event(ev): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
183 return True |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
184 |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
185 # 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
|
186 if super(Container, self).event(ev): |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
187 return True |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
188 |
679
fa168b5e2624
The return of the message dialog (and there was much rejoicing)
Neil Muller <neil@dip.sun.ac.za>
parents:
678
diff
changeset
|
189 def is_top(self, widget): |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
190 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
|
191 |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
192 def draw(self, surface): |
813 | 193 if self.visible: |
194 self.do_prepare() | |
195 obscure = pygame.Surface(self.rect.size, SRCALPHA) | |
196 obscure.fill(self.obscure_color) | |
197 for child in self.children: | |
198 surface.blit(obscure, self.rect) | |
199 child.draw(surface) | |
678
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
200 |
36d7f7e9650e
Modal magic. (And yes, it is quite magical.)
Jeremy Thurgood <firxen@gmail.com>
parents:
672
diff
changeset
|
201 |
555
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
202 class Box(Container): |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
203 """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
|
204 padding = 4 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
205 |
c0474fe18b96
Copy in widgets from mamba (currently unused)
Stefano Rivera <stefano@rivera.za.net>
parents:
diff
changeset
|
206 def draw(self, surface): |
813 | 207 if self.visible: |
208 self.do_prepare() | |
209 # TODO: Why isn't this done in prepare? | |
210 expandrect = self.rect.move((-self.padding, -self.padding)) | |
211 expandrect.width = self.rect.width + 2 * self.padding | |
212 expandrect.height = self.rect.height + 2 * self.padding | |
213 border = pygame.Surface(expandrect.size, SRCALPHA) | |
214 border.fill(pygame.Color('black')) | |
215 surface.blit(border, expandrect) | |
216 background = pygame.Surface(self.rect.size, SRCALPHA) | |
217 background.fill(pygame.Color('gray')) | |
218 surface.blit(background, self.rect) | |
219 super(Box, self).draw(surface) | |
670
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
220 |
fe7023750b20
Add convert_color function
Stefano Rivera <stefano@rivera.za.net>
parents:
652
diff
changeset
|
221 |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
222 class ModalWrapper(Container): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
223 "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
|
224 |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
225 def __init__(self, widget, close_callback=None): |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
226 super(ModalWrapper, self).__init__(widget.rect.topleft, widget.gd, |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
227 widget.rect.size) |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
228 self.close_callback = close_callback |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
229 self.add(widget) |
694 | 230 self.add_callback(MOUSEBUTTONDOWN, self.close) |
693
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
231 widget.add_callback(MOUSEBUTTONDOWN, self.close) |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
232 |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
233 def close(self, ev, widget): |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
234 if self.parent: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
235 self.parent.remove(self) |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
236 if self.close_callback: |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
237 self.close_callback() |
c8b683dd56d3
Better modal message and result handling.
Jeremy Thurgood <firxen@gmail.com>
parents:
692
diff
changeset
|
238 return True |
711
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
239 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
240 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
241 class Image(Widget): |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
242 """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
|
243 |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
244 def __init__(self, pos, gd, image, size=None): |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
245 super(Image, self).__init__(pos, gd, size) |
711
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
246 self.image = image |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
247 if not size: |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
248 self.rect.size = image.get_rect().size |
711
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
249 self.visible = True |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
250 |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
251 def draw(self, surface): |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
252 self.do_prepare() |
711
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
253 if self.visible: |
e9265818a96c
Add image widget for rect_drawer
Neil Muller <neil@dip.sun.ac.za>
parents:
694
diff
changeset
|
254 surface.blit(self.image, self.rect) |
717
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
255 |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
256 |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
257 class TranslucentImage(Image): |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
258 """Image that can also be translucent""" |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
259 |
803
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
260 def __init__(self, pos, gd, image, size=None): |
bcc9277a23e6
Refactor widget positioning API. Remove unused widgets
Stefano Rivera <stefano@rivera.za.net>
parents:
726
diff
changeset
|
261 super(TranslucentImage, self).__init__(pos, gd, image, size) |
717
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
262 self.translucent = False |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
263 surf = pygame.surface.Surface((self.rect.width, self.rect.height), |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
264 SRCALPHA).convert_alpha() |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
265 surf.fill(pygame.color.Color(255, 255, 255, 96)) |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
266 surf.blit(self.image, (0, 0), None, BLEND_RGBA_MIN) |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
267 self.trans_image = surf |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
268 |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
269 def draw(self, surface): |
726
efa58c92b304
Move prepare out of __init__ and into everywhere else
Neil Muller <neil@dip.sun.ac.za>
parents:
717
diff
changeset
|
270 self.do_prepare() |
717
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
271 if self.visible: |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
272 if self.translucent: |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
273 surface.blit(self.trans_image, self.rect) |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
274 else: |
3b2d1adca59c
Pull a bunch of draw logic out of rect_drawer and over to the widgets
Neil Muller <neil@dip.sun.ac.za>
parents:
711
diff
changeset
|
275 surface.blit(self.image, self.rect) |