import omni.ui as ui
from omni.kit.widget.versioning import CheckpointWidget, CheckpointItem
# Create a window for advanced checkpoint widget demo
window = ui.Window("Advanced Checkpoint Widget", width=800, height=600)
with window.frame:
with ui.VStack():
url_field = ui.StringField(height=30)
url_field.model.set_value("omniverse://server-name/path/to/file.usd")
with ui.HStack(height=30, spacing=5):
ui.Button("Load Checkpoints", clicked_fn=lambda: checkpoint_widget.set_url(
url_field.model.get_value_as_string()))
search_field = ui.StringField(placeholder="Search checkpoints...", height=30)
search_field.model.subscribe_value_changed_fn(
lambda model: checkpoint_widget.set_search(model.get_value_as_string()))
# Create checkpoint widget with advanced features
checkpoint_widget = CheckpointWidget(show_none_entry=True)
# Add status label to show selection info
status_label = ui.Label("No checkpoint selected")
# Register selection change callback
def on_selection_changed(checkpoint_item):
if checkpoint_item:
timestamp = CheckpointItem.datetime_to_string(checkpoint_item.entry.modified_time)
size = CheckpointItem.size_to_string(checkpoint_item.entry.size)
status_label.text = f"Selected: {checkpoint_item.get_relative_path()}\nComment: {checkpoint_item.comment}\n" \
f"Modified: {timestamp}, Size: {size}, By: {checkpoint_item.entry.modified_by}"
else:
status_label.text = "No checkpoint selected"
checkpoint_widget.add_on_selection_changed_fn(on_selection_changed)
# Add context menu items - use setattr() for assignment in lambdas
checkpoint_widget.add_context_menu(
"Apply Checkpoint",
"refresh.svg",
lambda name, item: setattr(status_label, "text", f"Applied checkpoint: {item.get_relative_path()}"),
lambda name, item: True
)
checkpoint_widget.add_context_menu(
"View Details",
"info.svg",
lambda name, item: setattr(status_label, "text", f"Details for: {item.get_relative_path()}\n"
f"Comment: {item.comment}\n"
f"Modified by: {item.entry.modified_by}"),
lambda name, item: bool(item)
)
# Set event handlers for mouse interactions using proper functions
def on_mouse_pressed(button, key_mod, item):
if button == 0:
status_label.text = f"Clicked checkpoint: {item.get_relative_path()}"
checkpoint_widget.set_mouse_pressed_fn(on_mouse_pressed)
def on_mouse_double_clicked(button, key_mod, item):
status_label.text = f"Double-clicked checkpoint: {item.get_relative_path()}"
checkpoint_widget.set_mouse_double_clicked_fn(on_mouse_double_clicked)