Menu Helpers#
Requires omni.kit.menu.utils version 1.5.8 or above
MenuHelperExtension#
This helper assists with menu creation but minimal window creation help, adds menu_startup(), menu_shutdown() & menu_refresh() functions by MenuHelperExtension subclass. Allowing user to control window open/closing. But does require ui.Workspace.set_show_window_fn to be set as it uses this to open/close/get state for the window
NOTE: MenuHelperExtension only supports one window/menu item and no sub-menus, for these features use MenuHelperExtensionFull (see below for usage examples).
from omni.kit.menu.utils import MenuHelperExtension
class ActionsExtension(omni.ext.IExt, MenuHelperExtension):
def on_startup(self):
self._actions_window = None
ui.Workspace.set_show_window_fn(ActionsExtension.WINDOW_NAME, self.show_window)
self.menu_startup(ActionsExtension.WINDOW_NAME, ActionsExtension.WINDOW_NAME, ActionsExtension.MENU_GROUP)
ui.Workspace.show_window(ActionsExtension.WINDOW_NAME, False)
def on_shutdown(self):
self.menu_shutdown()
ui.Workspace.set_show_window_fn(ActionsExtension.WINDOW_NAME, None)
if self._actions_window:
self._actions_window.destroy()
self._actions_window = None
def show_window(self, visible: bool):
if visible:
self._actions_window = ui.Window(ActionsExtension.WINDOW_NAME)
self._actions_window.set_visibility_changed_fn(self._visiblity_changed_fn)
self.menu_refresh()
elif self._actions_window:
self._actions_window.visible = False
def _visiblity_changed_fn(self, visible):
# tell omni.kit.menu.utils that actions window menu open/close state needs updating
self.menu_refresh()
Building window widgets can be done by sub-classing _show function, although it’s recommended that this should be done by sub-classing ui.Window and adding a frame build_fn via self.frame.set_build_fn(self._build_ui)
def _show(self):
super()._show()
if self._window:
with self._window.frame:
with ui.VStack(height=0, spacing=8):
with ui.HStack(height=460):
ui.Label("myWindow")
MenuHelperExtensionFull#
This helper assists with menu creation and window creation, handles show/hide and menu state updating. Adds menu_startup(), menu_shutdown() & menu_refresh() functions by MenuHelperExtensionFull subclass, all user has-to provide a function call to create the window.
from omni.kit.menu.utils import MenuHelperExtensionFull
class OscilloscopeWindowExtension(omni.ext.IExt, MenuHelperExtensionFull):
def on_startup(self):
self.menu_startup(lambda: ui.Window("Audio Oscilloscope", width=512, height=540), "Audio Oscilloscope", "Oscilloscope", "Window")
ui.Workspace.show_window("Audio Oscilloscope", True)
def on_shutdown(self):
self.menu_shutdown()
or
from omni.kit.menu.utils import MenuHelperExtensionFull, MenuHelperWindow
class OscilloscopeWindowExtension(omni.ext.IExt, MenuHelperExtensionFull):
def on_startup(self):
self.menu_startup(lambda: MenuHelperWindow("Audio Oscilloscope", width=512, height=540), "Audio Oscilloscope", "Oscilloscope", "Window")
ui.Workspace.show_window("Audio Oscilloscope", True)
def on_shutdown(self):
self.menu_shutdown()
Example using sub-menu#
from omni.kit.menu.utils import MenuHelperExtensionFull, MenuHelperWindow
class OscilloscopeWindowExtension(omni.ext.IExt, MenuHelperExtensionFull):
def on_startup(self):
self.menu_startup(lambda: MenuHelperWindow("Audio Oscilloscope", width=512, height=540), "Audio Oscilloscope", "Oscilloscope", "Window/Audio")
ui.Workspace.show_window("Audio Oscilloscope", True)
def on_shutdown(self):
self.menu_shutdown()
Example using sub-menus, multiple windows & menus#
import omni.ui as ui
import omni.ext
from omni.kit.menu.utils import MenuHelperExtensionFull, MenuHelperWindow
class OscilloscopeMultiWindowExtension(omni.ext.IExt, MenuHelperExtensionFull):
class MyWindow(MenuHelperWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.frame.set_build_fn(self.__build)
def __build(self):
with ui.VStack(height=0):
with ui.HStack(height=20):
ui.Label(f"Hello world from {self.title}")
def on_startup(self):
for index in range(0,10):
self.menu_startup(lambda i=index: OscilloscopeMultiWindowExtension.MyWindow(f"Audio Oscilloscope {i}", width=300, height=150),
f"Audio Oscilloscope {index}",
f"Audio Oscilloscope {index}",
"Window/Audio",
verbose=True)
ui.Workspace.show_window(f"Audio Oscilloscope 0", True)
def on_shutdown(self):
self.menu_shutdown()
Example using separators - Requires version 2.2.0 or above#
import omni.ext
import omni.ui as ui
import omni.ui as ui
import omni.ext
from omni.kit.menu.utils import MenuHelperExtensionFull, MenuHelperWindow
class ExampleMultiWindowExtension(omni.ext.IExt, MenuHelperExtensionFull):
class MyWindow(MenuHelperWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.frame.set_build_fn(self.__build)
def __build(self):
with ui.VStack(height=0):
with ui.HStack(height=20):
ui.Label(f"Hello world from {self.title}")
def on_startup(self):
menus = [
("", "Actor Simulation and SDG"),
"Actor SDG",
"Command Injection",
"Command Setting",
("", "Object Simulation and SDG"),
"Object SDG",
"Distribution Visualizer",
"VLM Scene Captioning",
("", "Physical Space Event Generation"),
"Event Scene Tagger",
"Event Config File",
]
group = "Window/Simulation"
for index, menu in enumerate(menus):
if isinstance(menu, tuple):
self.menu_startup(None, "", "", group, argv={"header": menu[1]})
else:
self.menu_startup(lambda i=index: ExampleMultiWindowExtension.MyWindow(menu, width=300, height=150),
menu,
menu,
group,
verbose=True)
ui.Workspace.show_window("Command Injection", True)
def on_shutdown(self):
self.menu_shutdown()