diff src/parpg/gui/containergui.py @ 0:1fd2201f5c36

Initial commit of parpg-core.
author M. George Hansen <technopolitica@gmail.com>
date Sat, 14 May 2011 01:12:35 -0700
parents
children 140e5e93f026
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parpg/gui/containergui.py	Sat May 14 01:12:35 2011 -0700
@@ -0,0 +1,139 @@
+#   This program is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License, or
+#   (at your option) any later version.
+
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+from fife.extensions.pychan.tools import callbackWithArguments as cbwa
+
+from parpg.gui.containergui_base import ContainerGUIBase
+from parpg.gui import drag_drop_data as data_drag
+from parpg.objects.base import Container
+
+class ContainerGUI(ContainerGUIBase):
+    def __init__(self, controller, title, container):
+        """A class to create a window showing the contents of a container.
+           @param controller: The current Controller
+           @type controller: Class derived from ControllerBase
+           @param title: The title of the window
+           @type title: string
+           @param container: A container to represent
+           @type container: Container
+           @return: None"""
+        super(ContainerGUI, self).__init__(controller, "gui/container_base.xml")
+        self.gui.findChild(name="topWindow").title = title
+        
+        self.empty_images = dict()
+        self.container = container
+        self.events_to_map = {}        
+        self.buttons = ("Slot1", "Slot2", "Slot3",
+                        "Slot4", "Slot5", "Slot6",
+                        "Slot7", "Slot8", "Slot9")         
+    
+    def updateImages(self):
+        for index, button in enumerate(self.buttons):
+            widget = self.gui.findChild(name=button)
+            widget.item = self.container.getItemAt(index)
+            self.updateImage(widget) 
+               
+    def updateImage(self, button):
+        if (button.item == None):
+            image = self.empty_images[button.name]
+        else:
+            image = button.item.getInventoryThumbnail()
+        button.up_image = image
+        button.down_image = image
+        button.hover_image = image
+
+    def dragObject(self, obj):
+        """Drag the selected object.
+           @type obj: string
+           @param obj: The name of the object within
+                       the dictionary 'self.buttons'
+           @return: None"""
+        # get the widget from the gui with the name obj
+        drag_widget = self.gui.findChild(name = obj)
+        drag_item = drag_widget.item
+        # only drag if the widget is not empty
+        if (drag_item != None):
+            # get the item that the widget is 'storing'
+            data_drag.dragged_item = drag_widget.item
+            # get the up and down images of the widget
+            up_image = drag_widget.up_image
+            down_image = drag_widget.down_image
+            # set the mouse cursor to be the widget's image
+            self.controller.setMouseCursor(up_image.source, down_image.source)
+            data_drag.dragged_image = up_image.source
+            data_drag.dragging = True
+            data_drag.dragged_widget = drag_widget
+            data_drag.source_container = self.container
+
+            self.container.takeItem(drag_widget.item)
+            
+            # after dragging the 'item', set the widgets' images
+            # so that it has it's default 'empty' images
+            drag_widget.item = None
+            self.updateImage(drag_widget)
+            
+    def dropObject(self, obj):
+        """Drops the object being dropped
+           @type obj: string
+           @param obj: The name of the object within
+                       the dictionary 'self.buttons' 
+           @return: None"""
+        try:
+            drop_widget = self.gui.findChild(name = obj)
+            drop_index = drop_widget.index
+            replace_item = drop_widget.item
+    
+            if data_drag.dragging:
+                container = self.container
+                drag_item = data_drag.dragged_item
+                #this will get the replacement item and the data for drag_drop if
+                ## there is an item all ready occupying the slot
+                if replace_item != None:
+                    self.dragObject(obj)
+                container.placeItem(drag_item, drop_index)
+                
+            drop_widget.item = drag_item
+            self.updateImage(drop_widget)
+            #if there was no item the stop dragging and reset cursor
+            if replace_item == None:
+                data_drag.dragging = False
+                #reset the mouse cursor to the normal cursor
+                self.controller.resetMouseCursor()
+        except (Container.SlotBusy, Container.TooBig, Container.ItemSelf):
+            #Do we want to notify the player why the item can't be dropped?
+            pass
+        
+    def showContainer(self):
+        """Show the container
+           @return: None"""
+        # Prepare slots 1 through 9
+        empty_image = "gui/inv_images/inv_backpack.png"
+        slot_count = 9
+        for counter in range(1, slot_count+1):
+            slot_name = "Slot%i" % counter
+            self.empty_images[slot_name] = empty_image
+            widget = self.gui.findChild(name=slot_name)
+            widget.item = self.container.items.get(counter-1)
+            widget.index = counter-1
+            self.updateImage(widget)
+            self.events_to_map[slot_name] = cbwa(self.dragDrop, slot_name)
+            self.events_to_map[slot_name + "/mouseReleased"] = \
+                                            self.showContextMenu
+
+        self.gui.mapEvents(self.events_to_map)
+        self.gui.show()
+        
+    def hideContainer(self):
+        """Hide the container
+           @return: None"""
+        if self.gui.isVisible():
+            self.gui.hide()