diff --git a/dev/unimenu_samples/menu_config_unreal_append_existing_menu.yaml b/dev/unimenu_samples/menu_config_unreal_append_existing_menu.yaml new file mode 100644 index 0000000..aad692e --- /dev/null +++ b/dev/unimenu_samples/menu_config_unreal_append_existing_menu.yaml @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +parent_path: ContentBrowser.FolderContextMenu + + +label: ContentBrowser.FolderContextMenu +items: +- label: Example + separator: True + +- label: SyncToAssetByPath + command: print("SyncToAssetByPath") + kwargs: + section_name: Example_section + +- label: CheckAssets + command: print("CheckAssets") + kwargs: + section_name: Example_section \ No newline at end of file diff --git a/dev/unimenu_samples/menu_screen_unreal_append_existing_menu.jpg b/dev/unimenu_samples/menu_screen_unreal_append_existing_menu.jpg new file mode 100644 index 0000000..a155a2c Binary files /dev/null and b/dev/unimenu_samples/menu_screen_unreal_append_existing_menu.jpg differ diff --git a/unimenu/apps/_abstract.py b/unimenu/apps/_abstract.py index b2885df..14658c6 100644 --- a/unimenu/apps/_abstract.py +++ b/unimenu/apps/_abstract.py @@ -228,9 +228,13 @@ def setup(self, parent_app_node=None, backlink=True): self.app_node = self._setup_menu_item(parent_app_node=parent_app_node) elif self.items: # submenu - self.app_node = self._setup_sub_menu(parent_app_node=parent_app_node) - for item in self.items: - item.setup(parent_app_node=self.app_node) + if self.label == self._get_parent_app_node_name(parent_app_node=parent_app_node): + for item in self.items: + item.setup(parent_app_node=parent_app_node) + else: + self.app_node = self._setup_sub_menu(parent_app_node=parent_app_node) + for item in self.items: + item.setup(parent_app_node=self.app_node) else: logging.warning("Can not create a MenuNode that has no command or children: " + self.label) @@ -250,6 +254,11 @@ def setup(self, parent_app_node=None, backlink=True): def _default_root_parent(self): """get the default parent for the root node, optional method""" return None + + @abstractmethod + def _get_parent_app_node_name(self, parent_app_node=None): + """get the default parent name for the root node, optional method""" + pass @abstractmethod def _setup_sub_menu(self, parent_app_node=None): diff --git a/unimenu/apps/unreal.py b/unimenu/apps/unreal.py index f115a18..6f09a2d 100644 --- a/unimenu/apps/unreal.py +++ b/unimenu/apps/unreal.py @@ -23,6 +23,9 @@ def setup(self, parent_app_node: unreal.ToolMenu = None, backlink=True) -> unrea unreal_menus.refresh_all_widgets() return app_node + + def _get_parent_app_node_name(self, parent_app_node: unreal.ToolMenu = None) -> str: + return unreal.StringLibrary.conv_name_to_string(parent_app_node.menu_name) if parent_app_node else "" def _setup_sub_menu(self, parent_app_node: unreal.ToolMenu = None) -> unreal.ToolMenu: """ @@ -91,7 +94,7 @@ def _setup_separator(self, parent_app_node: unreal.ToolMenu = None) -> None: # see https://docs.unrealengine.com/4.27/en-US/PythonAPI/class/ToolMenu.html # todo what is diff with dynamic section? - return parent_app_node.add_section(section_name=self.label + "_section", label=self.label + "_label", **self.kwargs) + return parent_app_node.add_section(section_name=self.label + "_section", label=self.label, **self.kwargs) def teardown(self): """remove from menu"""