{"id":16589038,"url":"https://github.com/hannesdelbeke/unimenu","last_synced_at":"2025-05-12T03:31:47.389Z","repository":{"id":67889243,"uuid":"543767679","full_name":"hannesdelbeke/unimenu","owner":"hannesdelbeke","description":"easy consistent menus across apps: unreal, blender, maya, krita, substance painter, Katana, marmoset, 3ds max, cry-engine, FreeCAD, Hero, Nuke, Qt,... ","archived":false,"fork":false,"pushed_at":"2025-02-20T14:49:16.000Z","size":563,"stargazers_count":92,"open_issues_count":13,"forks_count":9,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-24T06:18:47.109Z","etag":null,"topics":["3dsmax","blender","freecad","katana","krita","marmoset","maya","menu","nuke","python","substance-painter","unreal","unreal-engine"],"latest_commit_sha":null,"homepage":"https://github.com/hannesdelbeke/unimenu/wiki/features-overview","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hannesdelbeke.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-30T19:54:34.000Z","updated_at":"2025-03-28T20:38:42.000Z","dependencies_parsed_at":"2024-03-14T18:42:27.576Z","dependency_job_id":"e26df142-75f3-496c-8304-f78130ebad67","html_url":"https://github.com/hannesdelbeke/unimenu","commit_stats":{"total_commits":255,"total_committers":1,"mean_commits":255.0,"dds":0.0,"last_synced_commit":"7507e2a663ccca0bbace39f035e344ef3d79d483"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hannesdelbeke%2Funimenu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hannesdelbeke%2Funimenu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hannesdelbeke%2Funimenu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hannesdelbeke%2Funimenu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hannesdelbeke","download_url":"https://codeload.github.com/hannesdelbeke/unimenu/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253668065,"owners_count":21944971,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3dsmax","blender","freecad","katana","krita","marmoset","maya","menu","nuke","python","substance-painter","unreal","unreal-engine"],"created_at":"2024-10-11T23:07:39.707Z","updated_at":"2025-05-12T03:31:47.377Z","avatar_url":"https://github.com/hannesdelbeke.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# UniMenu (Universal Menu)\n\n\u003c!---[![Coverage Status](https://coveralls.io/repos/github/hannesdelbeke/unimenu/badge.svg?branch=main)](https://coveralls.io/github/hannesdelbeke/unimenu?branch=main)--\u003e\n\n[![PyPI Downloads](https://img.shields.io/pypi/v/unimenu)](https://pypi.org/project/unimenu/)\n[![Wiki](https://img.shields.io/badge/wiki-documentation-0)](https://github.com/hannesdelbeke/unimenu/wiki)\n\nA pure python module to add python commands to the menu.\n\nSupports Unreal Engine, Blender, Marmoset\u003cbr\u003e\nand any app that uses QT: Maya, Krita, Substance Painter, 3ds Max, FreeCAD, CryEngine ...\n\nFor more info read the [wiki](https://github.com/hannesdelbeke/unimenu/wiki)\n\nIf you use Blender, you can try the [unimenu_addon](https://github.com/hannesdelbeke/unimenu_addon)\n\n\u003cimg src=\"dev/unimenu_samples/menu_screen_maya.jpg\" width=\"400\"/\u003e \u003cimg src=\"dev/unimenu_samples/menu_screen_unreal5.jpg\" width=\"400\"/\u003e \u003cimg src=\"dev/unimenu_samples/menu_screen_krita.jpg\" width=\"400\"/\u003e \u003cimg src=\"dev/unimenu_samples/menu_screen_substance_painter.jpg\" width=\"400\"/\u003e\n\u003cimg src=\"dev/unimenu_samples/menu_screen_nuke.jpg\" width=\"400\"/\u003e \u003cimg src=\"dev/unimenu_samples/menu_screen_katana.jpg\" width=\"400\"/\u003e\n\u003cimg src=\"dev/unimenu_samples/menu_screen_mari.jpg\" width=\"400\"/\u003e\n\n# how to use\n\n### load from config (YAML \u0026 JSON)\n```yaml\nitems:\n  - label: my menu\n    items:\n      - label: my item\n        command: print(\"Hello World\")\n      - label: my multiline command\n        command: |\n          from importlib import reload\n          print(reload)\n```\n```python\nimport unimenu\nconfig_path = \"path/to/config.yaml\"\nunimenu.setup(config_path)\n```\n\n\n\n### load from a dict\n\n```python\nimport unimenu\ndata = {\"items\": [{\"label\": \"test\",\"command\": 'print(\"hello world\")'}]}\nunimenu.setup(data)\n```\n\n\n\n### with code\n\n```python\nimport unimenu\nmenu = unimenu.Node(label=\"my menu\")  # create a menu\nitem = unimenu.Node(label=\"hi\", command='print(\"hi\")')  # create a menu item\nmenu.items.append(item)  # add the item to the menu\nmenu.setup()  # setup the menu in the app, parented by default to the main menu bar\n```\n\n### from a folder of scripts (or a Python module)\n\nTo auto construct a menu from a folder, with a menu entry for every tool in a folder:\n1. ensure the folder is importable (in the sys.path)\n2. create a menthod in all submodules with the same name, e.g. def show()\n```python\nimport unimenu\nunimenu.module_setup('name_of_folder', function_name='show', menu_name=\"My tools\")\n```\n\n\n## When to use\n\nsome software e.g. Unity \u0026 Maya already have good ways to make custom menus. If you only use 1 software and find it easy to make a menu, you don't need unimenu.\n\nThe power of this module comes from standardising menu creation across multiple software. Great for studio-pipelines with several programs.\nUnimenu makes menu creation less complex, e.g. in Blender.\n\n## Notes\n- support loading multiple configs. Great for a single studio config and several project configs. Or a team config.\n- support creating another config to a previously created menu, or submenu!\n\n## Supports\nunimenu was tested in the following versions, and might work in other versions.\n- Unreal 5.0.2\n- Blender 3.2, 2.93, 2.8 (minimum)\n- Maya 2023, 2022 (minimum)\n- Substance Painter 8.2.0\n- Max 2024\n- Marmoset 3.08\n- Nuke 13 (minimum)\n- Hiero 13 (minimum)\n- Katana 5 (minimum)\n- Mari 6.0 (minimum)\n\npython 3.7+ due to f-strings and pathlib\n\n## Development\n\nmain platform is windows, would be interested to hear from mac \u0026 linux users.\n\nfeel free to create a PR to help out.\n\nto add support for your favorite software, add a python module named after the software with a setup_menu function\nwhere possible stick to the windows menu [design guidelines](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/bb226797(v=vs.85))\n\n- [ ] add editable install instructions\n\n### samples\nYou can install the unimenu samples with\n```bash\npip install git+https://github.com/hannesdelbeke/unimenu@main#subdirectory=dev\n```\nthen you can run them with e.g.\n```python\nimport unimenu_samples.any_dcc_test\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhannesdelbeke%2Funimenu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhannesdelbeke%2Funimenu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhannesdelbeke%2Funimenu/lists"}