# HG changeset patch # User KarstenBock@gmx.net # Date 1317812362 -7200 # Node ID 3fc7cfa80771ac62e9419c1e5aaf87fb5c5b7e24 # Parent eab3e1e52497841ceebf03c591e508ee33724766 Modified InventoryGrid to set a name for each slot containing the index. Added getSlot method to InventoryGrid. Renamed InventoryGUI class to CharacterGUI. Added InventoryGUI class which handles the inventory part of the CharacterGUI. An InventoryGUI instance is now created in CharacterGUI. diff -r eab3e1e52497 -r 3fc7cfa80771 src/parpg/gui/hud.py --- a/src/parpg/gui/hud.py Wed Oct 05 11:04:39 2011 +0200 +++ b/src/parpg/gui/hud.py Wed Oct 05 12:59:22 2011 +0200 @@ -26,7 +26,7 @@ from parpg.gui.containergui import ContainerGUI from parpg.gui.dialoguegui import DialogueGUI from parpg.gui import drag_drop_data as data_drag -from parpg.gui.inventorygui import InventoryGUI +from parpg.gui.inventorygui import CharacterGUI from actionsbox import ActionsBox from parpg.components import container logger = logging.getLogger('hud') @@ -158,7 +158,7 @@ if not self.inventory: xml_file = vfs.VFS.open('gui/inventory.xml') player = self.model.game_state.getObjectById("PlayerCharacter") - self.inventory = InventoryGUI(self.controller, xml_file, + self.inventory = CharacterGUI(self.controller, xml_file, player.container, player.equip, None) # inv_callbacks = { # 'refreshReadyImages': self.refreshReadyImages, diff -r eab3e1e52497 -r 3fc7cfa80771 src/parpg/gui/inventorygui.py --- a/src/parpg/gui/inventorygui.py Wed Oct 05 11:04:39 2011 +0200 +++ b/src/parpg/gui/inventorygui.py Wed Oct 05 12:59:22 2011 +0200 @@ -13,13 +13,13 @@ # You should have received a copy of the GNU General Public License # along with PARPG. If not, see . import logging +from types import StringTypes from fife.extensions.pychan.tools import callbackWithArguments as cbwa from fife.extensions import pychan from fife.extensions.pychan.attrs import UnicodeAttr from parpg.gui import drag_drop_data as data_drag -#from parpg.objects.base import Container from parpg.gui.containergui_base import ContainerGUIBase from parpg.objects.action import ACTIONS from parpg.components import equip @@ -73,15 +73,16 @@ def _setGridSize(self, grid_size): n_columns, n_rows = grid_size self.removeAllChildren() - for row_n in range(n_rows): + for row_n in xrange(n_rows): row_size = (n_columns * 50, 50) row = pychan.HBox(min_size=row_size, max_size=row_size, padding=self.padding) row.border_size = 1 row.opaque = 0 - for column_n in range(n_columns): + for column_n in xrange(n_columns): slot = pychan.Icon(min_size=(50, 50), max_size=(50, 50)) slot.border_size = 1 + slot.name = "Slot_%d" % (row_n * n_columns + column_n) row.addChild(slot) self.addChild(row) self.min_size = ((n_columns * 50) + 2, (n_rows * 50) + 2) @@ -93,6 +94,13 @@ return (n_rows, n_columns) grid_size = property(fget=_getGridSize, fset=_setGridSize) + def getSlot(self, row_or_index, col=None): + if col: + index = row * self.n_columns + col + else: + index = row_or_index + return self.findChildByName("Slot_%d" % index) + def __init__(self, grid_size=(2, 2), padding=0, **kwargs): pychan.VBox.__init__(self, padding=padding, **kwargs) self.opaque = 0 @@ -100,7 +108,7 @@ self.border_size = 1 -class EquipmentGui(ContainerGUIBase): +class EquipmentGUI(ContainerGUIBase): def __init__(self, controller, gui, equip, callbacks): ContainerGUIBase.__init__(self, controller, gui) self.equip = equip @@ -131,10 +139,41 @@ slot.image = image class InventoryGUI(ContainerGUIBase): + def __init__(self, controller, gui, container, callbacks): + ContainerGUIBase.__init__(self, controller, gui) + self.container = container + + def updateImages(self): + grid = self.gui.findChildByName("Grid") + assert(isinstance(grid, InventoryGrid)) + for index, child in enumerate(self.container.children): + slot = grid.getSlot(index) + if child: + slot.item = child.entity + else: + slot.item = None + self.updateImage(slot) + + def updateImage(self, slot): + assert(isinstance(slot, pychan.Icon)) + if (slot.item): + image = slot.item.containable.image + else: + image = None + slot.image = image + +class CharacterGUI(object): def __init__(self, controller, gui, container, equip, callbacks): - super(InventoryGUI, self).__init__(controller, gui) self.engine = controller.engine self.inventory_shown = False + if isinstance(gui, pychan.Widget): + self.gui = gui + elif isinstance(gui, StringTypes): + xml_file = vfs.VFS.open(gui) + self.gui = pychan.loadXML(xml_file) + else: + self.gui = pychan.loadXML(gui) + render_backend = self.engine.getRenderBackend() screen_mode = render_backend.getCurrentScreenMode() screen_width, screen_height = (screen_mode.getWidth(), @@ -142,11 +181,16 @@ widget_width, widget_height = self.gui.size self.gui.position = ((screen_width - widget_width) / 2, (screen_height - widget_height) / 2) - self.equip_gui = EquipmentGui( + self.equip_gui = EquipmentGUI( controller, self.gui.findChildByName("equipmentPage"), equip, callbacks ) + self.inv_gui = InventoryGUI( + controller, + self.gui.findChildByName("inventoryPage"), + container, callbacks + ) def toggleInventory(self, toggleImage=True): """Pause the game and enter the inventory screen, or close the @@ -167,6 +211,7 @@ def showInventory(self): self.equip_gui.updateImages() + self.inv_gui.updateImages() self.gui.show() def closeInventory(self):