From 3e478cbb170d6f3bdfff3b6cc3f9be1207a21d82 Mon Sep 17 00:00:00 2001 From: Forrest Trepte Date: Wed, 14 Oct 2020 16:21:37 -0700 Subject: [PATCH 1/2] always create menu items and make sure they are submenus as expected --- src/packages/menuhook/menuhook/__init__.py | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/packages/menuhook/menuhook/__init__.py b/src/packages/menuhook/menuhook/__init__.py index 5f6fbe5..6b64d69 100644 --- a/src/packages/menuhook/menuhook/__init__.py +++ b/src/packages/menuhook/menuhook/__init__.py @@ -79,22 +79,29 @@ def deep_menu(menu): """ found = rt.menuman.findMenu(menu[-1]) name = menu[-1] - if found is not None: - return found if len(menu) == 1: inmenu = rt.menuman.getMainMenuBar() else: inmenu = deep_menu(menu[0:-1]) - submenu = rt.menuman.createMenu(name) + if found is not None: + # Although the menu was found, it may be by itself and need to be added to + # it's parent's (inmenu's) items. + is_in_inmenu = False + for item_index in range(1, inmenu.numItems() + 1): + if inmenu.getItem(item_index).getTitle() == found.getTitle(): + is_in_inmenu = True + if is_in_inmenu: + return found + submenu = found or rt.menuman.createMenu(name) submenuitem = rt.menuman.createSubMenuItem(name, submenu) index = inmenu.numItems() - 1 inmenu.addItem(submenuitem, index) return submenu -def add_menu_item(menu, action, category): +def add_menu_item(menu, action, category, text): """ Add a menu item for an action. - The menu item will be re added even if it is already there. + If its text matches an existing menu item in menu then it won't be re-added. """ if not isinstance(menu, list): menu = [menu] @@ -102,6 +109,9 @@ def add_menu_item(menu, action, category): if targetmenu: newaction = rt.menuman.createActionItem(action, category) if newaction: + for item_index in range(1, targetmenu.numItems() + 1): + if targetmenu.getItem(item_index).getTitle() == text: + return targetmenu.addItem(newaction, -1) rt.menuman.updateMenuBar() @@ -117,8 +127,6 @@ def register(action, category, fcn, menu=None, text=None, tooltip=None): - assign the macro function if the macro is already there - create a menu item for the macro if it is not already there """ - defined = macro_defined(action, category) add_macro(action, category, text or action, tooltip or action, fcn) - if not defined and not menu is None: - add_menu_item(menu, action, category) + add_menu_item(menu, action, category, text) #pylint: enable=too-many-arguments From 88128315982d1a67f6c0d62b6ebf214ebf86350d Mon Sep 17 00:00:00 2001 From: Forrest Trepte Date: Wed, 14 Oct 2020 16:56:53 -0700 Subject: [PATCH 2/2] logging for creation and parenting of menus --- src/packages/menuhook/menuhook/__init__.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/packages/menuhook/menuhook/__init__.py b/src/packages/menuhook/menuhook/__init__.py index 6b64d69..ae173d1 100644 --- a/src/packages/menuhook/menuhook/__init__.py +++ b/src/packages/menuhook/menuhook/__init__.py @@ -77,22 +77,24 @@ def deep_menu(menu): like deep_menu(["&Scripting", "Python Developer", "HowTos"]) would make sure there is a "Python Developer -> HowTos" sub menu item under scripting """ - found = rt.menuman.findMenu(menu[-1]) + submenu = rt.menuman.findMenu(menu[-1]) name = menu[-1] if len(menu) == 1: inmenu = rt.menuman.getMainMenuBar() else: inmenu = deep_menu(menu[0:-1]) - if found is not None: + if submenu is None: + submenu = rt.menuman.createMenu(name) + else: # Although the menu was found, it may be by itself and need to be added to - # it's parent's (inmenu's) items. + # its parent's (inmenu's) items. is_in_inmenu = False for item_index in range(1, inmenu.numItems() + 1): - if inmenu.getItem(item_index).getTitle() == found.getTitle(): + if inmenu.getItem(item_index).getTitle() == submenu.getTitle(): is_in_inmenu = True if is_in_inmenu: - return found - submenu = found or rt.menuman.createMenu(name) + return submenu + print(f"adding menu {name} to {inmenu.getTitle()}") submenuitem = rt.menuman.createSubMenuItem(name, submenu) index = inmenu.numItems() - 1 inmenu.addItem(submenuitem, index) @@ -112,6 +114,7 @@ def add_menu_item(menu, action, category, text): for item_index in range(1, targetmenu.numItems() + 1): if targetmenu.getItem(item_index).getTitle() == text: return + print(f"adding menu item {text} to {targetmenu.getTitle()}") targetmenu.addItem(newaction, -1) rt.menuman.updateMenuBar()