Source code for phenotypic.gui

"""PhenoTypic GUI components for interactive pipeline building.

This module provides Panel-based interactive interfaces for building and testing
ImagePipelines in Jupyter notebooks.

Requires optional dependencies:
    pip install phenotypic[gui]

or with uv:
    uv sync --extra gui

Components:
- PipelineBuilder: Main GUI for building pipelines interactively
- InstanceManager: Workspace manager for saving/loading pipelines
- OperationRegistry: Metadata registry for discovering operations

Global session management (like napari):
- get_global_manager(): Get or create global InstanceManager
- reset_global_manager(): Reset with new workspace

Examples:
    Basic usage (no pn.extension() needed in Jupyter):

    >>> from phenotypic.gui import PipelineBuilder
    >>> from phenotypic.data import load_synth_yeast_plate
    >>>
    >>> image = load_synth_yeast_plate()
    >>> builder = PipelineBuilder(image=image)  # Auto-uses global manager
    >>> builder.panel()  # Auto-initializes Panel in Jupyter

    Manual manager (advanced):

    >>> from phenotypic.gui import PipelineBuilder, InstanceManager
    >>> manager = InstanceManager(workspace="./my_pipelines")
    >>> builder = PipelineBuilder(manager=manager, image=image)
    >>> builder.panel()
"""

from __future__ import annotations


def _check_gui_deps() -> bool:
    """Check if GUI dependencies are available.

    Returns:
        True if panel and param are installed, False otherwise
    """
    import importlib.util

    return all(
        importlib.util.find_spec(pkg) is not None for pkg in ["panel", "param"]
    )


GUI_AVAILABLE = _check_gui_deps()


[docs] def __getattr__(name: str): """Lazy import with helpful error message for missing dependencies. Args: name: Attribute name to import Returns: Requested module/class Raises: ImportError: If GUI dependencies not installed AttributeError: If attribute doesn't exist """ # Core GUI components (require panel/param) if name in ("PipelineBuilder", "InstanceManager", "OperationRegistry", "get_global_manager", "reset_global_manager"): if not GUI_AVAILABLE and name == "PipelineBuilder": raise ImportError( f"GUI component '{name}' requires optional dependencies. " "Install with: pip install phenotypic[gui]" ) if name == "PipelineBuilder": from ._pipeline_builder import PipelineBuilder return PipelineBuilder elif name == "InstanceManager": from ._instance_manager import InstanceManager return InstanceManager elif name == "OperationRegistry": from ._operation_registry import OperationRegistry return OperationRegistry elif name == "get_global_manager": from ._global_session import get_global_manager return get_global_manager elif name == "reset_global_manager": from ._global_session import reset_global_manager return reset_global_manager # Napari sweep viewer (requires napari, no Panel needed) if name in ("NapariSweepViewer", "launch_sweep_viewer"): if name == "NapariSweepViewer": from .sweep import NapariSweepViewer return NapariSweepViewer elif name == "launch_sweep_viewer": from .sweep import launch_sweep_viewer return launch_sweep_viewer raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
__all__ = [ # Core GUI components "PipelineBuilder", "InstanceManager", "OperationRegistry", "GUI_AVAILABLE", "get_global_manager", "reset_global_manager", # Napari sweep viewer "NapariSweepViewer", "launch_sweep_viewer", ]