コード例 #1
0
ファイル: hotkey.py プロジェクト: RN3ARA/TheQube
class Hotkey (Configuration, Interface, Gui):
 """A generic session providing global hotkey support"""

 def __init__(self, keymap={}, *args, **kwargs):
  super(Hotkey, self).__init__(*args, **kwargs)
  if 'keymap' not in self.config:
   self.config['keymap'] = dict()
  self.keymap = self.config['keymap']
  #Load any keys passed in.
  self.update_dict(self.keymap, keymap)
  #Load default app-wide keystrokes.
  self.update_dict(self.keymap, configuration.main['keymap'])
  self.keyboard_handler = WXKeyboardHandler(application.main_frame)  
  new = self.keyboard_handler.standardize_keymap(self.keymap)
  self.keymap.clear()
  self.keymap.update(new)
  self.active_keymap = dict()
  self.replaced_keys = {}
  self.modifiers_locked = False

 def activate(self):
  if self.active: return
  self.set_active_keymap(self.keymap)
  super(Hotkey, self).activate()

 def deactivate (self):
  self.unlock_modifiers()
  self.unregister_hotkeys()
  super(Hotkey, self).deactivate()

 def set_active_keymap(self, keymap):
  working = dict(keymap)
  keymap = {}
  for func in working:
   try:
    function = self._find_interface_function(func)
   except NotImplementedError:
    continue
   key = working[func]
   keymap[key] = function
  self.register_hotkeys(keymap)

 @always_call_after
 def register_hotkeys(self, keymap):
  self.keyboard_handler.register_keys(keymap)
  self.active_keymap = keymap

 def _find_interface_function(self, func):
  function = getattr(self.interface, func, None)
  if function is None:
   raise NotImplementedError
  new_func = partial(self.call_interface_function, function)
  return new_func

 @always_call_after
 def unregister_hotkeys(self):
  self.keyboard_handler.unregister_all_keys()

 def call_interface_function(self, function):
  if not self.active:
   return
  if global_vars.KeyboardHelp:
   try:
    output.speak(function.__doc__)
   finally:
    if function.func_name == "ToggleKeyboardHelp":
     self.execute_interface_function(function)
  else:
   self.execute_interface_function(function)
 
 def execute_interface_function(self, func):
  try:
   func()
  except:
   logging.exception("Error executing function %r")
   raise

 def key_description(self, func):
  return getattr(getattr(self.interface, func, None), '__doc__', None)
  
 def replace_active_keymap(self, new_keymap):
  self.unregister_hotkeys()
  self.register_hotkeys(new_keymap)

 def lock_modifiers(self, modifiers='control+win'):
  new_keymap = {}
  if not modifiers.endswith('+'):
   modifiers = '%s+' % modifiers
  for key in self.active_keymap:
   if modifiers in key:
    new_key = key.replace(modifiers, "")
    new_keymap[new_key] = self.active_keymap[key]
   else:
    new_keymap[key] = self.active_keymap[key]
  self.replace_active_keymap(new_keymap)
  self.modifiers_locked = True

 def unlock_modifiers(self):
  self.unregister_hotkeys()
  self.set_active_keymap(self.keymap)
  self.modifiers_locked = False
コード例 #2
0
class Hotkey(Configuration, Interface, Gui):
    """A generic session providing global hotkey support"""
    def __init__(self, keymap={}, *args, **kwargs):
        super(Hotkey, self).__init__(*args, **kwargs)
        if 'keymap' not in self.config:
            self.config['keymap'] = dict()
        self.keymap = self.config['keymap']
        #Load any keys passed in.
        self.update_dict(self.keymap, keymap)
        #Load default app-wide keystrokes.
        self.update_dict(self.keymap, configuration.main['keymap'])
        self.keyboard_handler = WXKeyboardHandler(application.main_frame)
        new = self.keyboard_handler.standardize_keymap(self.keymap)
        self.keymap.clear()
        self.keymap.update(new)
        self.active_keymap = dict()
        self.replaced_keys = {}
        self.modifiers_locked = False

    def activate(self):
        if self.active: return
        self.set_active_keymap(self.keymap)
        super(Hotkey, self).activate()

    def deactivate(self):
        self.unlock_modifiers()
        self.unregister_hotkeys()
        super(Hotkey, self).deactivate()

    def set_active_keymap(self, keymap):
        working = dict(keymap)
        keymap = {}
        for func in working:
            try:
                function = self._find_interface_function(func)
            except NotImplementedError:
                continue
            key = working[func]
            keymap[key] = function
        self.register_hotkeys(keymap)

    @always_call_after
    def register_hotkeys(self, keymap):
        self.keyboard_handler.register_keys(keymap)
        self.active_keymap = keymap

    def _find_interface_function(self, func):
        function = getattr(self.interface, func, None)
        if function is None:
            raise NotImplementedError
        new_func = partial(self.call_interface_function, function)
        return new_func

    @always_call_after
    def unregister_hotkeys(self):
        self.keyboard_handler.unregister_all_keys()

    def call_interface_function(self, function):
        if not self.active:
            return
        if global_vars.KeyboardHelp:
            try:
                output.speak(function.__doc__)
            finally:
                if function.func_name == "ToggleKeyboardHelp":
                    self.execute_interface_function(function)
        else:
            self.execute_interface_function(function)

    def execute_interface_function(self, func):
        func()

    def key_description(self, func):
        return getattr(getattr(self.interface, func, None), '__doc__', None)

    def replace_active_keymap(self, new_keymap):
        self.unregister_hotkeys()
        self.register_hotkeys(new_keymap)

    def lock_modifiers(self, modifiers='control+win'):
        new_keymap = {}
        if not modifiers.endswith('+'):
            modifiers = '%s+' % modifiers
        for key in self.active_keymap:
            if modifiers in key:
                new_key = key.replace(modifiers, "")
                new_keymap[new_key] = self.active_keymap[key]
            else:
                new_keymap[key] = self.active_keymap[key]
        self.replace_active_keymap(new_keymap)
        self.modifiers_locked = True

    def unlock_modifiers(self):
        self.unregister_hotkeys()
        self.set_active_keymap(self.keymap)
        self.modifiers_locked = False