Import jumpnbump_menu
[jumpnbump.git] / contrib / jumpnbump_menu / jumpnbump_menu.py
blobd9e25ce3b5402ee1d994274e787decebd6c39c04
1 #!/usr/bin/env python
3 # Author: Martin Willemoes Hansen
4 # License: Gnu GPL
6 # Next two lines are a workaround for Debian bug 163794
7 import sys
9 import pygtk
10 pygtk.require('2.0')
11 import gtk
12 import gtk.glade
13 import gtk.gdk
14 import gobject
15 import os
16 import tempfile
17 import shutil
19 RESOURCE_DIR='/usr/share/games/jumpnbump'
20 BINARY_DIR='/usr/games'
22 def populate_treeview():
23 levels = []
24 for file in os.listdir (RESOURCE_DIR):
25 if (file.endswith ('.dat')):
26 levels.append (file)
28 levels.sort()
30 COLUMN_LEVEL = 0
31 store = gtk.ListStore (gobject.TYPE_STRING)
33 for level in levels:
34 iter = store.append()
35 store.set (iter, COLUMN_LEVEL, level)
37 treeview.set_model (store)
39 renderer = gtk.CellRendererText()
40 treeview.append_column (gtk.TreeViewColumn ('Level', renderer, text=COLUMN_LEVEL))
42 def standalone_mode (widget):
43 disable_enable_level (1)
44 disable_enable_server (0)
45 num_clients.set_sensitive (0)
46 nogore.set_sensitive (1)
47 noflies.set_sensitive (1)
49 def client_mode (widget):
50 disable_enable_level (1)
51 disable_enable_server (1)
52 num_clients.set_sensitive (0)
53 nogore.set_sensitive (1)
54 noflies.set_sensitive (1)
56 def server_mode (widget):
57 disable_enable_level (1)
58 disable_enable_server (0)
59 num_clients.set_sensitive (1)
60 nogore.set_sensitive (1)
61 noflies.set_sensitive (1)
63 def fireworks_mode (widget):
64 disable_enable_level (0)
65 disable_enable_server (0)
66 nogore.set_sensitive (0)
67 nogore.set_active (0)
68 noflies.set_sensitive (0)
69 noflies.set_active (0)
71 def disable_enable_server (setting):
72 server_entry.set_sensitive (setting)
73 player_num.set_sensitive (setting)
75 def disable_enable_level (setting):
76 treeview.set_sensitive (setting)
77 mirror.set_sensitive (setting)
78 if (not setting):
79 mirror.set_active (setting)
81 def level_changed (widget):
82 model, iter = treeview.get_selection().get_selected()
83 global choosen_level
84 choosen_level = '%s/%s' % (RESOURCE_DIR, model.get_value (iter, 0))
85 unpackdir = None
86 try:
87 unpackdir = tempfile.mkdtemp ("", "jumpnbump-menu-")
88 os.chdir (unpackdir)
89 os.spawnlp (os.P_WAIT, 'jumpnbump-unpack', 'jumpnbump', choosen_level)
90 os.spawnlp (os.P_WAIT, 'convert', 'convert', '-scale', '50%', 'level.pcx', 'level_scaled.pcx')
91 os.spawnlp (os.P_WAIT, 'convert', 'convert', 'level_scaled.pcx', 'level.png')
92 image.set_from_file ('level.png')
93 except Exception, err:
94 print err
95 if unpackdir != None:
96 shutil.rmtree (unpackdir)
98 image.show()
100 def about (widget):
101 global about_dialog
103 if (not about_dialog):
104 gui = gtk.glade.XML (gladefile, 'about')
105 about_dialog = gui.get_widget ('about')
106 gui.signal_connect ('ok', about_close)
108 def about_close (widget):
109 global about_dialog
111 about_dialog.destroy()
112 about_dialog = None
114 def run (widget):
115 if (standalone.get_active()):
116 execute (*get_level()+common_options())
117 elif (fireworks.get_active()):
118 execute ('-fireworks', *common_options())
119 elif (client.get_active()):
120 execute ('-player', str (player_num.get_value_as_int()),
121 '-connect', server_entry.get_text(),
122 *get_level() + common_options())
123 else:
124 execute ('-server', str (num_clients.get_value_as_int()),
125 *get_level() + common_options())
127 def get_level():
128 level = []
129 if (mirror.get_active()):
130 level.append ('-mirror')
131 else:
132 level.append ('-dat')
133 level.append (choosen_level)
135 return level
137 def common_options():
138 options = []
140 if (fullscreen.get_active()):
141 options.append ('-fullscreen')
142 if (nogore.get_active()):
143 options.append ('-nogore')
144 if (double_res.get_active()):
145 options.append ('-scaleup')
146 if (nosound.get_active()):
147 options.append ('-nosound')
148 if (noflies.get_active()):
149 options.append ('-noflies')
150 if (withmusic.get_active()):
151 options.append ('-musicnosound')
152 if (mirror.get_active()):
153 options.append ('-mirror')
155 return options
157 def execute (*cmd):
158 try:
159 os.spawnl (os.P_NOWAIT, BINARY_DIR + '/jumpnbump', 'jumpnbump', *cmd)
160 except Exception, err:
161 print err
163 def main():
164 global gladefile
166 global_gladefile = RESOURCE_DIR + '/jumpnbump_menu.glade'
167 local_gladefile = './jumpnbump_menu.glade'
169 if (os.access (global_gladefile, os.R_OK)):
170 gladefile = global_gladefile
171 del local_gladefile
172 elif (os.access (local_gladefile, os.R_OK)):
173 gladefile = local_gladefile
174 del global_gladefile
175 else:
176 print 'Could not find the glade file'
177 return 0
179 gui = gtk.glade.XML (gladefile, 'main')
181 global about_dialog, choosen_level, standalone, fireworks, client, server, treeview, \
182 mirror, num_clients, server_entry, player_num, fullscreen, \
183 nogore, double_res, nosound, noflies, withmusic, image
185 about_dialog = None
186 choosen_level = ''
187 standalone = gui.get_widget ('standalone')
188 fireworks = gui.get_widget ('fireworks')
189 client = gui.get_widget ('client')
190 server = gui.get_widget ('server')
191 treeview = gui.get_widget ('level_treeview')
192 populate_treeview()
193 mirror = gui.get_widget ('mirror')
194 num_clients = gui.get_widget ('num_of_clients')
195 server_entry = gui.get_widget ('server_entry')
196 player_num = gui.get_widget ('player_num')
197 fullscreen = gui.get_widget ('fullscreen')
198 nogore = gui.get_widget ('nogore')
199 double_res = gui.get_widget ('double_res')
200 nosound = gui.get_widget ('nosound')
201 noflies = gui.get_widget ('noflies')
202 withmusic = gui.get_widget ('withmusic')
203 image = gui.get_widget ('image')
205 gui.signal_autoconnect ({'standalone_mode': standalone_mode,
206 'client_mode': client_mode,
207 'server_mode': server_mode,
208 'fireworks_mode': fireworks_mode,
209 'level_changed': level_changed,
210 'quit': lambda *args: gtk.main_quit(),
211 'run': run,
212 'about': about})
214 gtk.main()
216 if __name__ == '__main__':
217 main()