# -*- mode: python; coding: utf-8 -*- import logging import gtk import formulator import util # Where the item can be TOOLBAR, MOUSE, MENUBAR = [2**x for x in range(3)] # What type of item is MENUITEM, TOOLITEM, SEPARATOR = [x**2 for x in range(3)] class ActionManager: "Gestiona un gtk.ActionGroup para desacoplar el inspector del UI" def __init__(self, ui_name): self.ui_name = ui_name self.actions = [] self.group = gtk.ActionGroup(ui_name) self.locations = util.SortedDict() # action(string):(where(flag),type(menu.TYPE)) self.merge_ids = [] self.desc = '' self.auto_desc = '' self.__getitem__ = self.group.get_action #self.__affected_cb = None self.uimgr = None self.ui_layout = None def __repr__(self): return "" % self.ui_name def add_desc(self, desc): self.desc += desc def add_menu(self, values, desc): #print 'ADD_MENU', values, desc self.group.add_actions([values]) self.desc += desc def append_action_with_desc(self, defin, arg, desc): #print 'ADD_ACTION_WITH_DESC', defin, desc self.group.add_actions([defin], arg) self.desc += desc def add_action(self, name, icon=None, label='', accel='', tip=None, form=None, callback=None, location=0, code=None, arg=(), is_toggle=False, itype=None): def without_action(func): def decorated(action, *args): func(*args) return decorated self.locations[name] = (location, itype) if not label: label = name callback = formulator.UI_FormAction(callback, form, code) action_def = [(name, icon, label, accel, tip, without_action(callback))] if is_toggle: self.group.add_toggle_actions(action_def, *arg) else: self.group.add_actions(action_def, *arg) def add_separator(self, name, location): self.locations[name] = (location, SEPARATOR) # defs: (name, stock, label, accel, tip, callbak, location, type) def add_actions(self, defs, arg=None): block = [] for action in defs: assert len(action) == 8 name = action[0] self.locations[name] = (action[6],action[7]) block.append(action[:6]) self.group.add_actions(block, arg) self.auto_desc = '' def gen_desc(self): "Automatic UI descriptions" TOOLBAR_ITEM = ''' ''' TOOLBAR_SEPARATOR = ''' ''' POPUP_ITEM = ''' ''' POPUP_SEPARATOR = ''' ''' MENUBAR_ITEM = ''' ''' MENUBAR_SEPARATOR = ''' ''' for name in self.locations: loc, itype = self.locations[name] if itype == SEPARATOR: if loc & TOOLBAR: self.auto_desc += TOOLBAR_SEPARATOR % self.ui_name if loc & MOUSE: self.auto_desc += POPUP_SEPARATOR % self.ui_name if loc & MENUBAR: self.auto_desc += MENUBAR_SEPARATOR % self.ui_name else: if loc & TOOLBAR: self.auto_desc += TOOLBAR_ITEM % (self.ui_name, name) if loc & MOUSE: self.auto_desc += POPUP_ITEM % (self.ui_name, name) if loc & MENUBAR: self.auto_desc += MENUBAR_ITEM % name def insert_ui(self, uimgr, priority=1): self.uimgr = uimgr if self.group in uimgr.get_action_groups(): return uimgr.insert_action_group(self.group, priority) if self.auto_desc == '': self.gen_desc() self.merge_ids.append(uimgr.add_ui_from_string(self.desc + self.auto_desc)) uimgr.ensure_update() def remove_ui(self, uimgr): for id in self.merge_ids: uimgr.remove_ui(id) uimgr.remove_action_group(self.group)