Source code for physicsnemo_curator.dashboard.widgets

# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES.
# SPDX-FileCopyrightText: All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Widget registry for filter-specific artifact visualizations."""

from __future__ import annotations

import logging
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from physicsnemo_curator.dashboard.widgets.base import WidgetProvider

logger = logging.getLogger(__name__)


[docs] class WidgetRegistry: """Registry mapping filter names to their visualization widgets. Built-in widgets are auto-discovered on construction. Additional widgets can be registered at runtime via :meth:`register`. """ def __init__(self) -> None: """Initialize the registry and discover built-in widgets.""" self._providers: dict[str, WidgetProvider] = {} self._auto_discover()
[docs] def register(self, provider: WidgetProvider) -> None: """Register a widget provider for a filter name. Parameters ---------- provider : WidgetProvider Widget provider instance to register. """ self._providers[provider.filter_name] = provider
[docs] def get(self, filter_name: str) -> WidgetProvider | None: """Look up a widget provider by filter name. Parameters ---------- filter_name : str The filter class name (e.g. ``'MeanFilter'``). Returns ------- WidgetProvider or None The registered provider, or ``None`` if not found. """ return self._providers.get(filter_name)
[docs] def list_providers(self) -> dict[str, str]: """Return a mapping of filter name to widget display name. Returns ------- dict[str, str] ``{filter_name: widget.name}`` for all registered widgets. """ return {k: v.name for k, v in self._providers.items()}
def _auto_discover(self) -> None: """Register built-in widgets. Imports are deferred so the registry works even when optional domain dependencies are not installed. """ try: from physicsnemo_curator.dashboard.widgets.mesh import MeanFilterWidget self.register(MeanFilterWidget()) except Exception: # noqa: BLE001 logger.debug("MeanFilterWidget not available", exc_info=True)