Mercurial > rinkhals
annotate gamelib/loadlevel.py @ 553:7963fc09fac2
Make checkdialog take strings to show as input. Add possiblity of 3rd button on dialog
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Sat, 28 Nov 2009 17:45:28 +0000 |
parents | 0667189a5973 |
children |
rev | line source |
---|---|
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
1 """Help screen.""" |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
2 |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
3 from pgu import gui |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
4 import os |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
5 import pygame |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
6 import level |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
7 import data |
424
fbef17cab632
Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents:
421
diff
changeset
|
8 import gameboard |
433
8643893635e7
Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
424
diff
changeset
|
9 import constants |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
10 |
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
11 |
532 | 12 class LoadLevelDialog(gui.Dialog): |
13 """Load level dialog.""" | |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
14 |
532 | 15 def __init__(self, curr_level, load_func, cls="dialog"): |
16 self.value = None | |
17 self.levels = self._populate_levels() | |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
18 |
532 | 19 self.main_style = { |
20 'width': 300, 'height': 350 | |
21 } | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
22 |
532 | 23 td_style = { |
24 'padding_left': 4, | |
25 'padding_right': 4, | |
26 'padding_top': 2, | |
27 'padding_bottom': 2, | |
28 } | |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
29 |
532 | 30 self.level_list = gui.List(**self.main_style) |
31 level_names = self.levels.keys() | |
32 level_names.sort() | |
33 for name in level_names: | |
34 self.level_list.add(name, value=name) | |
35 self.level_list.set_vertical_scroll(0) | |
36 self.level_list.connect(gui.CHANGE, self._level_list_change) | |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
37 |
532 | 38 self.image_container = gui.Container() |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
39 |
532 | 40 button_ok = gui.Button("Load Level") |
41 button_ok.connect(gui.CLICK, self._click_ok) | |
42 | |
43 button_cancel = gui.Button("Cancel") | |
44 button_cancel.connect(gui.CLICK, self._click_cancel) | |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
45 |
532 | 46 body = gui.Table() |
47 body.tr() | |
48 list_style = dict(self.main_style) | |
49 list_style.update(td_style) | |
50 body.td(self.level_list, style=list_style, valign=-1, rowspan=2) | |
51 body.td(self.image_container, style=td_style, colspan=2) | |
52 body.tr() | |
53 # putting in the extra spacer squashes the ok and cancel button | |
54 # up nicely | |
55 body.td(gui.Spacer(0, 0), style=td_style) | |
56 body.td(button_ok, style=td_style, align=1) | |
57 body.td(button_cancel, style=td_style, align=1) | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
58 |
532 | 59 title = gui.Label("Load Level ...", cls=cls + ".title.label") |
60 gui.Dialog.__init__(self, title, body) | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
61 |
532 | 62 if curr_level.level_name in self.levels: |
63 self.level_list.group.value = curr_level.level_name | |
64 elif level_names: | |
65 self.level_list.group.value = level_names[0] | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
66 |
532 | 67 self.connect(gui.CHANGE, self._load_level, load_func) |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
68 |
532 | 69 def _populate_levels(self): |
70 """Read list of levels from disk.""" | |
71 levels = {} | |
72 for name in os.listdir(data.filepath('levels/')): | |
73 if not name.endswith('.conf'): | |
74 continue | |
75 try: | |
76 this_level = level.Level(name) | |
77 except RuntimeError: | |
78 # Skip levels that fail to load | |
79 continue | |
80 if not os.path.exists(this_level.map): | |
81 # Skip level if we can't see the map | |
82 continue | |
83 levels[this_level.level_name] = (this_level, None) | |
84 return levels | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
85 |
532 | 86 def _create_image_widget(self, curr_level): |
87 """Create an image showing the contents of level file.""" | |
88 board = gameboard.GameBoard(None, curr_level) | |
424
fbef17cab632
Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents:
421
diff
changeset
|
89 w, h = board.tv.size |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
90 |
433
8643893635e7
Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
424
diff
changeset
|
91 map_image = pygame.Surface((constants.TILE_DIMENSIONS[0] * w, |
8643893635e7
Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents:
424
diff
changeset
|
92 constants.TILE_DIMENSIONS[1] * h)) |
424
fbef17cab632
Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents:
421
diff
changeset
|
93 board.tv.loop() |
fbef17cab632
Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents:
421
diff
changeset
|
94 board.tv.paint(map_image) |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
95 |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
96 style = { |
532 | 97 'width' : min(300, 7*w), |
98 'height' : min(300, 7*h), | |
99 } | |
100 | |
101 doc = gui.Document(style=self.main_style) | |
102 space = doc.style.font.size(" ") | |
103 | |
104 doc.block(align=0) | |
105 doc.add(gui.Image(map_image, style=style)) | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
106 |
532 | 107 doc.block(align=0) |
108 doc.add(gui.Label(curr_level.level_name, style={ | |
109 'border_bottom': 1, | |
110 'margin_bottom': 5, | |
111 'margin_top': 5, | |
112 })) | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
113 |
532 | 114 doc.block(align=0) |
115 for word in curr_level.goal.split(): | |
116 doc.add(gui.Label(word)) | |
117 doc.space(space) | |
118 | |
119 return doc | |
120 | |
121 def _level_list_change(self): | |
122 for w in self.image_container.widgets: | |
123 self.image_container.remove(w) | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
124 |
532 | 125 name = self.level_list.value |
126 curr_level, widget = self.levels[name] | |
127 if widget is None: | |
128 widget = self._create_image_widget(curr_level) | |
129 self.levels[name] = (curr_level, widget) | |
130 | |
131 self.image_container.add(widget, 0, 0) | |
132 | |
133 def _click_ok(self): | |
134 self.value = self.level_list.value | |
135 if self.value: | |
136 self.send(gui.CHANGE) | |
137 self.close() | |
412
1e24eedbf40f
Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
138 |
532 | 139 def _click_cancel(self): |
140 self.value = None | |
141 self.send(gui.CHANGE) | |
142 self.close() | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
143 |
532 | 144 def _load_level(self, load_func): |
145 level = self.get_level() | |
146 if level is not None: | |
147 load_func(level) | |
148 | |
149 def get_level(self): | |
150 if self.value is None: | |
151 return None | |
152 return self.levels[self.value][0] | |
416
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
153 |
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
154 |
c6dd21b75bf5
The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents:
412
diff
changeset
|
155 |