From 6dab9ffd5a49eef2925d411d85332729a302db7b Mon Sep 17 00:00:00 2001 From: El Mau Date: Sat, 5 Mar 2022 13:20:21 -0600 Subject: [PATCH] Doc for menus --- docs/source/application.rst | 6 ++ source/easymacro.py | 121 ++++++++++++++++++++++++++++++++++-- 2 files changed, 122 insertions(+), 5 deletions(-) diff --git a/docs/source/application.rst b/docs/source/application.rst index 973b925..4a38924 100644 --- a/docs/source/application.rst +++ b/docs/source/application.rst @@ -270,5 +270,11 @@ All methods some the same. For other applications: `writer`, `draw`, `impress`, `math` +Menus +----- + + + + .. _dispatch command: https://wiki.documentfoundation.org/Development/DispatchCommands .. _support filters: https://help.libreoffice.org/latest/en-US/text/shared/guide/convertfilters.html diff --git a/source/easymacro.py b/source/easymacro.py index af0a817..2bb7e41 100644 --- a/source/easymacro.py +++ b/source/easymacro.py @@ -2169,25 +2169,35 @@ class LOShortCuts(object): class LOMenu(object): + + def __init__(self, app, menu, config): + self._app = app + self._menu = menu + self._config = config + + +class LOMenuApp(object): NODE = 'private:resource/menubar/menubar' MENUS = { 'file': '.uno:PickList', + 'picklist': '.uno:PickList', 'tools': '.uno:ToolsMenu', 'help': '.uno:HelpMenu', - 'windows': '.uno:WindowList', + 'window': '.uno:WindowList', 'edit': '.uno:EditMenu', 'view': '.uno:ViewMenu', 'insert': '.uno:InsertMenu', 'format': '.uno:FormatMenu', 'styles': '.uno:FormatStylesMenu', + 'formatstyles': '.uno:FormatStylesMenu', 'sheet': '.uno:SheetMenu', 'data': '.uno:DataMenu', 'table': '.uno:TableMenu', - 'form': '.uno:FormatFormMenu', + 'formatform': '.uno:FormatFormMenu', 'page': '.uno:PageMenu', 'shape': '.uno:ShapeMenu', 'slide': '.uno:SlideMenu', - 'show': '.uno:SlideShowMenu', + 'slideshow': '.uno:SlideShowMenu', } def __init__(self, app): @@ -2202,8 +2212,108 @@ class LOMenu(object): config = manager.getUIConfigurationManager(type_app) return config - def debug(self): + def _get_info(self, menu): + line = menu.get('CommandURL', '') + line += self._get_submenus(menu['ItemDescriptorContainer']) + return line + def _get_submenus(self, menu, level=1): + line = '' + for i, v in enumerate(menu): + data = data_to_dict(v) + cmd = data.get('CommandURL', '----------') + line += f'\n{" " * level}├─ ({i}) {cmd}' + submenu = data.get('ItemDescriptorContainer', None) + if not submenu is None: + line += self._get_submenus(submenu, level + 1) + return line + + def debug(self): + for m in self._menus: + menu = data_to_dict(m) + print(self._get_info(menu)) + return + + def __contains__(self, name): + exists = False + for m in self._menus: + menu = data_to_dict(m) + cmd = menu.get('CommandURL', '') + if name == cmd: + exists = True + break + return exists + + def __getitem__(self, index): + if isinstance(index, int): + menu = self._menus[index] + else: + for m in self._menus: + menu = data_to_dict(m) + cmd = menu.get('CommandURL', '') + if self.MENUS[index.lower()] == cmd: + break + return LOMenu(self._app, m, self._config) + + @property + def count(self): + return len(self._menus) + + def _get_index(self, name): + index = -1 + for i, m in enumerate(self._menus): + menu = data_to_dict(m) + if menu['CommandURL'] == self.MENUS[name]: + index = i + break + return index + + def _get_command_url(self, menu: dict): + shortcut = menu.pop('ShortCut', '') + command = menu['CommandURL'] + url = LOShortCuts.get_url_script(command) + if shortcut: + LOShortCuts(self._app).set(shortcut, command) + return url + + def _insert_submenu(self, parent: Any, menus: list): + for i, menu in enumerate(menus): + submenu = menu.pop('Submenu', False) + if submenu: + idc = self._config.createSettings() + menu['ItemDescriptorContainer'] = idc + menu['Type'] = 0 + if menu['Label'][0] == '-': + menu['Type'] = 1 + else: + menu['CommandURL'] = self._get_command_url(menu) + self._save(parent, menu, i) + if submenu: + self._insert_submenu(idc, submenu) + return + + def _save(self, parent: Any, menu: dict, index: int): + # ~ Some day + # ~ self._menus.insertByIndex(index, new_menu) + properties = dict_to_property(menu, True) + uno.invoke(parent, 'insertByIndex', (index, properties)) + self._config.replaceSettings(self.NODE, self._menus) + return + + def insert(self, menu, after: str='', save: bool=True): + if after: + index = self._get_index(after) + 1 + else: + index = self.count + + submenu = menu.pop('Submenu', False) + menu['Type'] = menu.get('Type', 0) + menu['ItemDescriptorContainer'] = self._config.createSettings() + self._save(self._menus, menu, index) + self._insert_submenu(menu['ItemDescriptorContainer'], submenu) + + if save: + self._config.store() return @@ -2211,7 +2321,7 @@ class LOMenus(object): """Classe for manager menus""" def __getitem__(self, index): - return LOMenu(index) + return LOMenuApp(index) class LOMain(): @@ -2857,6 +2967,7 @@ def __getattr__(name): 'io': IOStream, 'clipboard': ClipBoard, 'shortcuts': LOShortCuts(), + 'menus': LOMenus(), 'lo': LOMain, 'command': LOMain.cmd, 'docs': LODocuments(),