Changeset 157


Ignore:
Timestamp:
06/21/09 15:58:28 (10 years ago)
Author:
tie_parpg
Message:

Some cleanup of the context menu code. A decorator function is now wrapping each context menu action with some generic code (currently, only hiding of the context menu)

Location:
trunk/PARPG
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/PARPG/run.py

    r150 r157  
    2424 
    2525import fife_compat, fife, fifelog 
     26import pychan 
    2627from scripts import world 
    2728from scripts import engine 
     
    8586        self.world.quitFunction = self.listener.quitGame 
    8687        self.model.loadMap(str(TDS.readSetting("MapFile")))    
     88        pychan.init(self.engine, debug = True) 
    8789 
    8890    def loadSettings(self): 
  • trunk/PARPG/scripts/context_menu.py

    r156 r157  
    1717 
    1818import fife, pychan 
    19 from pychan.tools import callbackWithArguments as cbwa 
    2019 
    21 class ContextMenu(): 
     20class ContextMenu(object): 
    2221    def __init__(self, engine, menu_items, pos): 
    2322        """@type engine: ??? 
     
    3029           @param pos: Screen position to use  
    3130           @return: None""" 
    32         pychan.init(engine, debug = True) 
     31 
    3332        self.vbox = pychan.widgets.VBox(position=pos) 
    3433        events_to_map = {} 
     
    3635            p = pychan.widgets.Button(name=item[0], text=unicode(item[1])) 
    3736            self.vbox.addChild(p) 
    38             events_to_map[item[0]+"/mousePressed"] = cbwa(*item[2:]) 
    39             events_to_map[item[0]+"/mouseReleased"] = self.vbox.hide 
     37            events_to_map [item[0]] = self.action_decorator(*item[2:]) 
    4038        self.vbox.mapEvents(events_to_map) 
     39        self.show() 
     40     
     41    def show(self): 
     42        """Shows the context menu""" 
    4143        self.vbox.show() 
     44    def hide(self): 
     45        """Hides the context menu""" 
     46        self.vbox.hide() 
     47         
     48    def action_decorator (self,func, *args, **kwargs): 
     49        """This function is supposed to add some generic that should be 
     50        executed before and/or after an action is fired through the 
     51        context menu. 
     52         
     53        @type func: Any callable 
     54        @param func: The original action function 
     55        @param args: Unpacked list of positional arguments 
     56        @param kwargs: Unpacked list of keyword arguments 
     57        @return: A wrapped version of func 
     58        """ 
     59         
     60        def decorated_func (): 
     61            """ This is the actual wrapped version of func, that is returned. 
     62            It takes no external arguments, so it can safely be passed around 
     63            as a callback.""" 
     64            # some stuff that we do before the actual action is executed 
     65            self.hide() 
     66            # run the action function, and record the return value 
     67            ret_val = func (*args,**kwargs) 
     68            # we can eventually add some post-action code here, if needed (e.g. logging) 
     69            pass         
     70            # return the value, as if the original function was called 
     71            return ret_val 
     72        return decorated_func 
     73         
  • trunk/PARPG/scripts/world.py

    r156 r157  
    8888        # init the sound (don't start playing yet) 
    8989        self.sounds = SoundEngine(self.engine) 
     90         
     91        self.context_menu = ContextMenu (self.engine, [], (0,0)) 
     92        self.context_menu.hide() 
    9093 
    9194    def reset(self): 
     
    282285           @param evt: The event that fife caught 
    283286           @return: None""" 
    284         click = fife.ScreenPoint(evt.getX(), evt.getY()) 
     287        self.context_menu.hide() # hide the context menu in case it is displayed 
     288        scr_point = fife.ScreenPoint(evt.getX(), evt.getY()) 
    285289        if(evt.getButton() == fife.MouseEvent.LEFT): 
    286             self.data.handleMouseClick(self.getCoords(click)) 
    287             self.clearMenu()  
     290            self.data.handleMouseClick(self.getCoords(scr_point))       
    288291        elif(evt.getButton() == fife.MouseEvent.RIGHT): 
    289292            # is there an object here? 
    290             i=self.cameras['main'].getMatchingInstances(click, self.agent_layer) 
     293            instances = self.cameras['main'].getMatchingInstances(scr_point, self.agent_layer) 
    291294            info = None 
    292             if(i != ()): 
    293                 for obj in i: 
    294                     # check to see if this is an active item 
    295                     if(self.data.objectActive(obj.getId())):             
    296                         # yes, get the data 
    297                         info = self.data.getItemActions(obj.getId()) 
    298                         break 
    299             # delete the old context menu 
    300             self.clearMenu() 
    301             if info: 
    302                 # take the menu items returned by the engine 
    303                 data = info 
    304             else: 
    305                 # default menu, could be walk etc. 
    306                 data = [["Walk", "Walk here", self.onWalk, self.getCoords(click)]] 
    307             pos = (evt.getX(), evt.getY()) 
    308             self.context_menu = ContextMenu(self.engine, data, pos) 
     295            for inst in instances: 
     296                # check to see if this is an active item 
     297                if(self.data.objectActive(inst.getId())):             
     298                    # yes, get the data 
     299                    info = self.data.getItemActions(inst.getId()) 
     300                    break 
     301                 
     302            # take the menu items returned by the engine or show a default menu if no items     
     303            data = info or [["Walk", "Walk here", self.onWalk, self.getCoords(scr_point)]] 
     304            # show the menu 
     305            self.context_menu = ContextMenu(self.engine, data, (scr_point.x,scr_point.y)) 
    309306 
    310307    def onWalk(self, click): 
    311308        """Callback sample for the context menu. 
    312309        """ 
     310        self.context_menu.hide() 
    313311        self.data.PC.run(click) 
    314         self.clearMenu() 
    315312 
    316313    def mouseMoved(self, evt): 
Note: See TracChangeset for help on using the changeset viewer.