comparison src/parpg/gui/hud.py @ 12:d60f1dab8469

Fixed resource path dependencies issue that caused PARPG to crash on start. * PARPG should now run without issue (system installation not tested). * Utilized FIFE's VFS module to remove path dependencies from most PARPG modules. * The new parpg.vfs module is a singleton with a single global variable, VFS, which is a reference to the global VFS instance. Although a singleton is not ideal it should be replaced once PARPG's core code is refactored. * The parpg.vfs singleton is initialized in the parpg.applicaiton.PARPGApplication class with the absolute path to the data directory via the parpg.settings module and corresponding configuration file. * A new DataPath entry was added to the default system configuration file template under the [parpg] section to support the new parpg.vfs module. * Updated the parpg-assets subrepo to revision 3 to fix some dialog file format issues (for details see commit message for parpg-assets). * Fixed a few bugs in the parpg.dialogueparsers.YAMLDialogueParser class related to exception handling.
author M. George Hansen <technopolitica@gmail.com>
date Mon, 06 Jun 2011 15:56:14 -1000
parents 1fd2201f5c36
children ad75fa042b99
comparison
equal deleted inserted replaced
11:4706e0194af3 12:d60f1dab8469
17 import logging 17 import logging
18 18
19 from fife.extensions import pychan 19 from fife.extensions import pychan
20 from fife.extensions.pychan.tools import callbackWithArguments as cbwa 20 from fife.extensions.pychan.tools import callbackWithArguments as cbwa
21 21
22 from parpg import vfs
22 from parpg.gui.filebrowser import FileBrowser 23 from parpg.gui.filebrowser import FileBrowser
23 from parpg.gui.menus import ContextMenu, SettingsMenu 24 from parpg.gui.menus import ContextMenu, SettingsMenu
24 from parpg.gui import inventorygui
25 from parpg.gui.popups import ExaminePopup 25 from parpg.gui.popups import ExaminePopup
26 from parpg.gui.containergui import ContainerGUI 26 from parpg.gui.containergui import ContainerGUI
27 from parpg.gui.dialoguegui import DialogueGUI 27 from parpg.gui.dialoguegui import DialogueGUI
28 from parpg.gui import drag_drop_data as data_drag 28 from parpg.gui import drag_drop_data as data_drag
29 from parpg.gui.inventorygui import InventoryGUI
29 from actionsbox import ActionsBox 30 from actionsbox import ActionsBox
30 31
31 logger = logging.getLogger('hud') 32 logger = logging.getLogger('hud')
32 class Hud(object): 33 class Hud(object):
33 """Main Hud class""" 34 """Main Hud class"""
44 loadGame: called when the user clicks on Load 45 loadGame: called when the user clicks on Load
45 quitGame: called when the user clicks on Quit 46 quitGame: called when the user clicks on Quit
46 @return: None""" 47 @return: None"""
47 48
48 # TODO: perhaps this should not be hard-coded here 49 # TODO: perhaps this should not be hard-coded here
50 self.settings = settings
49 pychan.registerWidget(ActionsBox) 51 pychan.registerWidget(ActionsBox)
50 self.hud = pychan.loadXML("gui/hud.xml") 52
53 xml_file = vfs.VFS.open('gui/hud.xml')
54 self.hud = pychan.loadXML(xml_file)
55
51 self.controller = controller 56 self.controller = controller
52 self.engine = controller.engine 57 self.engine = controller.engine
53 self.model = controller.model 58 self.model = controller.model
54 self.settings = settings
55 self.inventory = None 59 self.inventory = None
56 self.character_screen = None 60 self.character_screen = None
57 61
58 self.save_game_callback = callbacks['saveGame'] 62 self.save_game_callback = callbacks['saveGame']
59 self.load_game_callback = callbacks['loadGame'] 63 self.load_game_callback = callbacks['loadGame']
150 self.enabled = False 154 self.enabled = False
151 155
152 def initializeInventory(self): 156 def initializeInventory(self):
153 """Initialize the inventory""" 157 """Initialize the inventory"""
154 if not self.inventory: 158 if not self.inventory:
155 self.inventory = inventorygui.InventoryGUI(self.controller, 159 xml_file = vfs.VFS.open('gui/inventory.xml')
156 None, 160 self.inventory = InventoryGUI(self.controller, xml_file, None)
157 None)
158 # inv_callbacks = { 161 # inv_callbacks = {
159 # 'refreshReadyImages': self.refreshReadyImages, 162 # 'refreshReadyImages': self.refreshReadyImages,
160 # 'toggleInventoryButton': self.toggleInventoryButton, 163 # 'toggleInventoryButton': self.toggleInventoryButton,
161 # } 164 # }
162 # self.inventory_storage = \ 165 # self.inventory_storage = \
171 174
172 def initializeCharacterScreen(self): 175 def initializeCharacterScreen(self):
173 """Initialize the character screen.""" 176 """Initialize the character screen."""
174 # TODO Technomage 2010-12-24: 177 # TODO Technomage 2010-12-24:
175 if not self.character_screen: 178 if not self.character_screen:
176 self.character_screen = pychan.loadXML('gui/character_screen.xml') 179 xml_file = vfs.VFS.open('gui/character_screen.xml')
177 180 self.character_screen = pychan.loadXML(xml_file)
178 181
179 def initializeContextMenu(self): 182 def initializeContextMenu(self):
180 """Initialize the Context Menu 183 """Initialize the Context Menu
181 @return: None""" 184 @return: None"""
182 self.context_menu = ContextMenu (self.engine, [], (0, 0)) 185 self.context_menu = ContextMenu(self.engine, [], (0, 0))
183 186
184 def showContextMenu(self, data, pos): 187 def showContextMenu(self, data, pos):
185 """Display the Context Menu with model at pos 188 """Display the Context Menu with model at pos
186 @type model: list 189 @type model: list
187 @param model: model to pass to context menu 190 @param model: model to pass to context menu
197 self.context_menu.hide() 200 self.context_menu.hide()
198 201
199 def initializeMainMenu(self): 202 def initializeMainMenu(self):
200 """Initalize the main menu. 203 """Initalize the main menu.
201 @return: None""" 204 @return: None"""
202 self.main_menu = pychan.loadXML("gui/hud_pause_menu.xml") 205
206 xml_file = vfs.VFS.open('gui/hud_pause_menu.xml')
207 self.main_menu = pychan.loadXML(xml_file)
208
203 #TODO: find more suitalbe place for onOptilonsPress implementation 209 #TODO: find more suitalbe place for onOptilonsPress implementation
204 self.menu_events = {"resumeButton": self.hideMenu, 210 self.menu_events = {"resumeButton": self.hideMenu,
205 "settingsButton": self.displaySettings, 211 "settingsButton": self.displaySettings,
206 "helpButton": self.displayHelp} 212 "helpButton": self.displayHelp}
207 self.main_menu.mapEvents(self.menu_events) 213 self.main_menu.mapEvents(self.menu_events)
235 self.settings_menu.show() 241 self.settings_menu.show()
236 242
237 def initializeHelpMenu(self): 243 def initializeHelpMenu(self):
238 """Initialize the help menu 244 """Initialize the help menu
239 @return: None""" 245 @return: None"""
240 self.help_dialog = pychan.loadXML("gui/help.xml") 246
247 xml_file = vfs.VFS.open('gui/help.xml')
248 self.help_dialog = pychan.loadXML(xml_file)
249
241 help_events = {"closeButton":self.help_dialog.hide} 250 help_events = {"closeButton":self.help_dialog.hide}
242 self.help_dialog.mapEvents(help_events) 251 self.help_dialog.mapEvents(help_events)
243 main_help_text = u"Welcome to Post-Apocalyptic RPG or PARPG![br][br]"\ 252 main_help_text = u"Welcome to Post-Apocalyptic RPG or PARPG![br][br]"\
244 "This game is still in development, so please expect for there to be "\ 253 "This game is still in development, so please expect for there to be "\
245 "bugs and[br]feel free to tell us about them at "\ 254 "bugs and[br]feel free to tell us about them at "\
271 280
272 def saveGame(self): 281 def saveGame(self):
273 """ Called when the user wants to save the game. 282 """ Called when the user wants to save the game.
274 @return: None""" 283 @return: None"""
275 self.stopActions() 284 self.stopActions()
276 xml_path = os.path.join(self.settings.system_path, 285 xml_path = 'gui/savebrowser.xml'
277 self.settings.parpg.GuiPath,
278 'savebrowser.xml')
279 save_browser = FileBrowser(self.engine, 286 save_browser = FileBrowser(self.engine,
280 self.settings, 287 self.settings,
281 self.save_game_callback, 288 self.save_game_callback,
282 xml_path, 289 xml_path,
283 self.loadsave_close, 290 self.loadsave_close,
316 323
317 def loadGame(self): 324 def loadGame(self):
318 """ Called when the user wants to load a game. 325 """ Called when the user wants to load a game.
319 @return: None""" 326 @return: None"""
320 self.stopActions() 327 self.stopActions()
321 xml_path = os.path.join(self.settings.system_path, 328 xml_path = 'gui/loadbrowser.xml'
322 self.settings.parpg.GuiPath,
323 'loadbrowser.xml')
324 load_browser = FileBrowser(self.engine, 329 load_browser = FileBrowser(self.engine,
325 self.settings, 330 self.settings,
326 self.load_game_callback, 331 self.load_game_callback,
327 xml_path, 332 xml_path,
328 close_callback = self.loadsave_close, 333 close_callback = self.loadsave_close,
378 button.toggled = 0 383 button.toggled = 0
379 384
380 def toggleInventory(self, toggle_image=True): 385 def toggleInventory(self, toggle_image=True):
381 """Displays the inventory screen 386 """Displays the inventory screen
382 @return: None""" 387 @return: None"""
383 if self.inventory == None: 388 if self.inventory is None:
384 self.initializeInventory() 389 self.initializeInventory()
390
385 self.inventory.toggleInventory(toggle_image) 391 self.inventory.toggleInventory(toggle_image)
386 392
387 def toggleCharacterScreen(self): 393 def toggleCharacterScreen(self):
388 if not self.character_screen: 394 if self.characcter_screen is None:
389 self.initializeCharacterScreen() 395 self.initializeCharacterScreen()
396
390 if not self.character_screen.isVisible(): 397 if not self.character_screen.isVisible():
391 self.character_screen.show() 398 self.character_screen.show()
392 else: 399 else:
393 self.character_screen.hide() 400 self.character_screen.hide()
394 401