Usage Examples#

Create a Basic Search Field#

import omni.ui as ui
from omni.kit.widget.search_delegate import SearchField

# Callback function to process search results
def on_search_results(results_model):
    if results_model:
        # Get search result items
        items = results_model.get_item_children(None)
        print(f"Found {len(items)} search results")
        for item in items:
            print(f"- {item.path}")
    else:
        print("No search results found")

# Create a window for the search field
window = ui.Window("Search Example", width=400, height=100)
with window.frame:
    # Create the search field with our callback
    search_field = SearchField(on_search_results)
    
    # Build the UI components
    search_field.build_ui()
    
    # Set the search directory
    search_field.search_dir = "/path/to/search"

Implement a Custom Search Delegate#

import omni.ui as ui
from omni.kit.widget.search_delegate import SearchDelegate

class CustomSearchDelegate(SearchDelegate):
    def __init__(self):
        super().__init__()
        self._container = None
        self._search_field = None
        self._is_visible = True
        self._is_enabled = True
        self._search_directory = "/default/path"
    
    @property
    def visible(self):
        return self._is_visible
    
    @property
    def enabled(self):
        return self._is_enabled
    
    @property
    def search_dir(self):
        return self._search_directory
    
    @search_dir.setter
    def search_dir(self, search_dir):
        self._search_directory = search_dir
        print(f"Search directory set to: {search_dir}")
    
    def build_ui(self):
        # Create UI components for the search delegate
        self._container = ui.VStack(height=0)
        with self._container:
            with ui.HStack(height=0):
                # Create the search input field
                self._search_field = ui.StringField()
                
                # Add a search button
                ui.Button(
                    "Search",
                    clicked_fn=lambda: print(f"Searching in: {self._search_directory}")
                )
    
    def destroy(self):
        # Clean up resources
        self._container = None
        self._search_field = None

# Create a window with our custom search delegate
window = ui.Window("Custom Search", width=400, height=100)
with window.frame:
    custom_search = CustomSearchDelegate()
    custom_search.build_ui()
    custom_search.search_dir = "/my/search/directory"

Complete Search Implementation#

import omni.ui as ui
from omni.kit.widget.search_delegate import SearchField, SearchResultsModel
from omni.kit.search_core import SearchEngineRegistry, AbstractSearchModel, AbstractSearchItem
from datetime import datetime
from typing import List

# Create a mock search engine for demonstration
class MockSearchItem(AbstractSearchItem):
    def __init__(self, name, path, is_folder=False):
        self.name = name
        self.path = path
        self.is_folder = is_folder
        self.date = datetime.now()
        self.size = 1024  # Mock file size in bytes

class MockSearchModel(AbstractSearchModel):
    def __init__(self, search_text="", current_dir=""):
        self._items = []
        
        # Create mock search results based on search text
        if search_text:
            for word in search_text.split():
                self._items.append(
                    MockSearchItem(word, f"{current_dir}/{word}.usd")
                )
    
    @property
    def items(self) -> List[AbstractSearchItem]:
        return self._items

# Create the main window
window = ui.Window("Search Integration Example", width=600, height=400)

# Variables to store UI elements
tree_view = None
result_label = None

# Callback to handle search results
def on_search_results(results_model):
    global tree_view, result_label
    
    if results_model:
        items = results_model.get_item_children(None)
        result_label.text = f"Found {len(items)} results"
        
        # Update the tree view with new results
        tree_view.model = results_model
    else:
        result_label.text = "No results found"
        tree_view.model = None

# Register our mock search engine
search_registry = SearchEngineRegistry()
subscription = search_registry.register_search_model("MOCK_SEARCH", MockSearchModel)

# Create the UI layout
with window.frame:
    with ui.VStack():
        # Create a search field at the top
        search_field = SearchField(on_search_results)
        search_field.build_ui()
        search_field.search_dir = "/example/search/directory"
        
        # Label to show number of results
        result_label = ui.Label("Enter search terms above")
        
        # Tree view to display search results
        tree_view = ui.TreeView(None, root_visible=False)

# Note: Remember to call these when you're done with the search functionality:
# search_field.destroy()
# subscription = None

Screenshot:#

_images/complete_search_implementation.png

Work with SearchResultsModel and Items#

import omni.ui as ui
from omni.kit.widget.search_delegate import SearchResultsModel, SearchResultsItem
from omni.kit.search_core import AbstractSearchModel, AbstractSearchItem
from omni.kit.widget.filebrowser import FileBrowserItemFields
from datetime import datetime
from typing import List

# Create a simple event subscription class
class EventSubscription:
    def __init__(self, signal, callback):
        self.signal = signal
        self.callback = callback
        self.active = True
    
    def unsubscribe(self):
        if self.active:
            self.active = False
            if self.signal and hasattr(self.signal, "subscribers"):
                if self.callback in self.signal.subscribers:
                    self.signal.subscribers.remove(self.callback)

# Create a simple search item implementation
class SimpleSearchItem(AbstractSearchItem):
    def __init__(self, name, path, is_folder=False):
        super().__init__()
        # Store values in protected attributes and use property getters
        self._name = name
        self._path = path
        self._is_folder = is_folder
        self._date = datetime.now()
        self._size = 1024  # Mock file size in bytes
    
    # Override the properties to provide getters
    @property
    def name(self):
        return self._name
    
    @property
    def path(self):
        return self._path
    
    @property
    def is_folder(self):
        return self._is_folder
    
    @property
    def date(self):
        return self._date
    
    @property
    def size(self):
        return self._size

# Create a simple search model implementation
class SimpleSearchModel(AbstractSearchModel):
    def __init__(self, search_text="", current_dir=""):
        self._items = []
        # Add a signal for item changed events with subscribers list
        self.__on_item_changed = type("Signal", (), {"subscribers": []})()
        
        # Create some mock search results based on search text
        if search_text:
            for word in search_text.split():
                self._items.append(
                    SimpleSearchItem(f"{word}_file", f"{current_dir}/{word}.usd")
                )
    
    @property
    def items(self) -> List[AbstractSearchItem]:
        return self._items
    
    # Implement the subscribe_item_changed method
    def subscribe_item_changed(self, fn):
        if not hasattr(self.__on_item_changed, "subscribers"):
            self.__on_item_changed.subscribers = []
        self.__on_item_changed.subscribers.append(fn)
        return EventSubscription(self.__on_item_changed, fn)

# Use a simplified example that doesn't require the TreeView
window = ui.Window("Search Results Example", width=500, height=300)
with window.frame:
    with ui.VStack():
        # Create a search model with mock data
        search_model = SimpleSearchModel("material texture lighting", "/path/to/search")
        
        # Display search terms directly instead of using SearchResultsModel
        ui.Label("Search terms: material, texture, lighting")
        
        # Display the items directly from the search model
        for item in search_model.items:
            ui.Label(f"Result: {item.name} - {item.path}")

Screenshot:#

_images/work_with_searchresultsmodel_and_items.png