
from pymol import cmd

class Wizard:

    event_mask_pick    = 1
    event_mask_select  = 2
    event_mask_key     = 4
    event_mask_special = 8
    event_mask_scene   = 16 # scene changed
    event_mask_state   = 32 # state changed
    event_mask_frame   = 64 # frame changed
    event_mask_dirty   = 128 # anything changed (BEWARE FEEDBACK!)
    event_mask_view    = 256 # view (matrix) changed
    event_mask_position = 512 # center of the view changed

    def migrate_session(self, version):
        '''A derived class might convert the pickled state from
        an older version here.'''
        pass

    def __init__(self,_self=cmd):
        self.menu = {}
        self.prompt = None
        self.panel = None
        self.cmd = _self
        self._validate_instance()

    def __getstate__(self):
        d = self.__dict__.copy()
        d.pop('cmd', None)
        return d

    def __reduce__(self):
        # for loading Python 3 (new-style class) pickle with Python 2
        return (self.__class__, (), self.__getstate__())

    def _validate_instance(self):
        _pymol = self.cmd._pymol
        if not hasattr(_pymol.session, 'wizard_storage'):
            _pymol.session.wizard_storage = {}
        wizard_storage = _pymol.session.wizard_storage
        class_key = str(self.__class__)
        self.session = wizard_storage.get(class_key,{})
        # create a dictionary for per-class storage in session
        if not self.session:
            wizard_storage[class_key] = self.session

    def get_prompt(self):
        return self.prompt

    def get_panel(self):
        return self.panel

    def get_event_mask(self):
        return Wizard.event_mask_pick + Wizard.event_mask_select

    def do_scene(self):
        return None

    def do_view(self):
        return None

    def do_position(self):
        return None

    def do_state(self,state):
        return None

    def do_frame(self,frame):
        return None

    def do_dirty(self):
        return None

    def do_pick(self,bondFlag):
        return None

    def do_select(self,name):
        return None

    def do_key(self,k,x,y,mod):
        return None

    def do_special(self,k,x,y,mod):
        return None

    def cleanup(self):
        pass

    def get_menu(self,tag):
        result = None
        if tag in self.menu:
            result = self.menu[tag]
        return result
