source: trunk/game/scripts/gui/inventorygui.py @ 596

Revision 596, 9.2 KB checked in by beliar, 10 years ago (diff)

Patch by Beliar.

  • Items can now be dropped and picked up again
  • Added generic image for items (Made by Q_x, he did the other items too).
  • Property svn:eol-style set to native
Line 
1#!/usr/bin/env python
2
3#   This file is part of PARPG.
4
5#   PARPG is free software: you can redistribute it and/or modify
6#   it under the terms of the GNU General Public License as published by
7#   the Free Software Foundation, either version 3 of the License, or
8#   (at your option) any later version.
9
10#   PARPG is distributed in the hope that it will be useful,
11#   but WITHOUT ANY WARRANTY; without even the implied warranty of
12#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13#   GNU General Public License for more details.
14
15#   You should have received a copy of the GNU General Public License
16#   along with PARPG.  If not, see <http://www.gnu.org/licenses/>.
17
18from fife.extensions.pychan.tools import callbackWithArguments as cbwa
19
20from scripts.gui import drag_drop_data as data_drag
21from scripts.objects.base import Container
22from scripts.gui.containergui_base import ContainerGUIBase
23
24class InventoryGUI(ContainerGUIBase):
25    """Inventory GUI class"""
26    def __init__(self, controller, inventory, callbacks):
27        """Initialise the instance.
28           @param controller: Current Controller
29           @type controller: Class derived from ControllerBase
30           @type inventory: Inventory
31           @param inventory: An inventory object to be displayed and manipulated
32           @type callbacks: dict
33           @param callbacks: a dict of callbacks
34               refreshReadyImages:
35                   Function that will make the ready slots on the HUD
36                   reflect those within the inventory
37               toggleInventoryButton:
38                   Function that will toggle the state of the inventory button
39           @return: None"""
40        super(InventoryGUI, self).__init__(controller, "gui/inventory.xml")
41        self.engine = controller.engine
42        self.readyCallback = callbacks['refreshReadyImages']
43        self.toggleInventoryButtonCallback = callbacks['toggleInventoryButton']
44        self.original_cursor_id = self.engine.getCursor().getId()
45
46        self.inventory_shown = False
47        events_to_map = {}
48        self.inventory_storage = inventory
49       
50        # Buttons of inventory arranged by slots
51
52        self.slot_buttons = {'head': ('Head',), 'chest': ('Body',),
53                             'left_arm': ('LeftHand',),
54                             'right_arm': ('RightHand',),
55                             'hips' : ('Belt',), 'left_leg': ('LeftFoot',),
56                             'right_leg': ('RightFoot',),
57                             'left_hand': ('LeftHeld',),
58                             'right_hand': ('RightHeld',),
59                             'backpack': ('A1', 'A2', 'A3', 'A4', 'A5',
60                                          'B1', 'B2', 'B3', 'B4', 'B5',
61                                          'C1', 'C2', 'C3', 'C4', 'C5',
62                                          'D1', 'D2', 'D3', 'D4', 'D5'),
63                             'ready': ('Ready1', 'Ready2', 'Ready3', 'Ready4')
64        }
65        # the images that should be used for the buttons when they are "empty"
66        self.slot_empty_images = {'head':'gui/inv_images/inv_head.png',
67                                  'chest':'gui/inv_images/inv_torso.png',
68                                  'left_arm':'gui/inv_images/inv_lhand.png',
69                                  'right_arm':'gui/inv_images/inv_rhand.png',
70                                  'hips':'gui/inv_images/inv_belt.png',
71                                  'left_leg':'gui/inv_images/inv_lfoot.png',
72                                  'right_leg':'gui/inv_images/inv_rfoot.png',
73                                  'left_hand':'gui/inv_images/inv_litem.png',
74                                  'right_hand':'gui/inv_images/inv_ritem.png',
75                                  'backpack':'gui/inv_images/inv_backpack.png',
76                                  'ready':'gui/inv_images/inv_belt_pouches.png',
77                                  }
78        self.updateInventoryButtons()
79
80        for slot in self.slot_buttons:
81            for _, button in enumerate(self.slot_buttons[slot]):
82                events_to_map[button] = cbwa(self.dragDrop, button)
83                events_to_map[button + "/mouseReleased"] = \
84                                                self.showContextMenu
85        events_to_map['close_button'] = self.closeInventoryAndToggle
86        self.gui.mapEvents(events_to_map)
87        # TODO: Why the commented out code?
88        # self.resetMouseCursor()
89
90    def updateImages(self):
91        self.updateInventoryButtons()
92   
93    def updateInventoryButtons (self):
94        for slot in self.slot_buttons:
95            for index, button in enumerate(self.slot_buttons[slot]):
96                widget = self.gui.findChild(name=button)
97                widget.slot = slot
98                widget.index = index
99                widget.item = self.inventory_storage.getItemsInSlot(widget.slot,
100                                                                   widget.index)
101                self.updateImage(widget)
102               
103    def updateImage(self, button):
104        if (button.item == None):
105            image = self.slot_empty_images[button.slot]
106        else:
107            image = button.item.getInventoryThumbnail()
108        button.up_image = image
109        button.down_image = image
110        button.hover_image = image
111
112    def closeInventory(self):
113        """Close the inventory.
114           @return: None"""
115        self.gui.hide()
116
117    def closeInventoryAndToggle(self):
118        """Close the inventory screen.
119           @return: None"""
120        self.closeInventory()
121        self.toggleInventoryButtonCallback()
122        self.inventory_shown = False
123
124    def toggleInventory(self, toggleImage=True):
125        """Pause the game and enter the inventory screen, or close the
126           inventory screen and resume the game.
127           @type toggleImage: bool
128           @param toggleImage:
129               Call toggleInventoryCallback if True. Toggling via a
130               keypress requires that we toggle the Hud inventory image
131               explicitly. Clicking on the Hud inventory button toggles the
132               image implicitly, so we don't change it.
133           @return: None"""
134        if not self.inventory_shown:
135            self.showInventory()
136            self.inventory_shown = True
137        else:
138            self.closeInventory()
139            self.inventory_shown = False
140
141        if toggleImage:
142            self.toggleInventoryButtonCallback()
143
144    def showInventory(self):
145        """Show the inventory.
146           @return: None"""
147        self.updateInventoryButtons()
148        self.gui.show()               
149               
150    def dragObject(self, obj):
151        """Drag the selected object.
152           @type obj: string
153           @param obj: The name of the object within
154                       the dictionary 'self.buttons'
155           @return: None"""
156        # get the widget from the inventory with the name obj
157        drag_widget = self.gui.findChild(name = obj)
158        drag_item = drag_widget.item
159        # only drag if the widget is not empty
160        if (drag_item != None):
161            # get the item that the widget is 'storing'
162            data_drag.dragged_item = drag_widget.item
163            # get the up and down images of the widget
164            up_image = drag_widget.up_image
165            down_image = drag_widget.down_image
166            # set the mouse cursor to be the widget's image
167            self.setMouseCursor(up_image.source,down_image.source)
168            data_drag.dragged_image = up_image.source
169            data_drag.dragging = True
170            data_drag.dragged_widget = drag_widget
171            data_drag.dragged_container=self.inventory_storage
172            # after dragging the 'item', set the widgets' images
173            # so that it has it's default 'empty' images
174            drag_widget.item = None
175            self.updateImage(drag_widget)
176           
177           
178    def dropObject(self, obj):
179        """Drops the object being dropped
180           @type obj: string
181           @param obj: The name of the object within
182                       the dictionary 'self.buttons'
183           @return: None"""
184        drop_widget = self.gui.findChild(name = obj)
185        try :
186            if drop_widget != data_drag.dragged_widget:
187                if data_drag.dragged_container != self.inventory_storage:
188                    data_drag.dragged_container.takeItem(data_drag.dragged_item)
189                self.inventory_storage.moveItemToSlot(data_drag.dragged_item,
190                                                      drop_widget.slot,
191                                                      drop_widget.index)
192            if drop_widget.slot == 'ready':
193                self.readyCallback()
194            self.resetMouseCursor()
195            data_drag.dragging = False
196        except Container.TooBig :
197            print("%s too big to fit into %s" % (data_drag.dragged_item,
198                                                 drop_widget.slot))
199            data_drag.dragged_container.placeItem(data_drag.dragged_item)
200        self.updateInventoryButtons()
201             
202    def getImage(self, name):
203        """Return a current image from the inventory
204           @type name: string
205           @param name: name of image to get
206           @return: None"""
207        return self.gui.findChild(name = name)
Note: See TracBrowser for help on using the repository browser.