"""
Widget ABC contracts for OpenHCS UI frameworks.
Defines explicit contracts that all widgets must implement, eliminating duck typing
in favor of fail-loud inheritance-based architecture.
Design Philosophy:
- Explicit inheritance over duck typing
- Fail-loud over fail-silent
- Discoverable over scattered
- Multiple inheritance for composable capabilities
Inspired by OpenHCS patterns:
- StorageBackendMeta: Metaclass auto-registration
- MemoryTypeConverter: ABC contracts with adapters
- LibraryRegistryBase: Centralized operations
"""
from abc import ABC, abstractmethod
from typing import Any, Callable
[docs]
class ValueGettable(ABC):
"""
ABC for widgets that can return a value.
All input widgets must implement this to participate in form value extraction.
"""
[docs]
@abstractmethod
def get_value(self) -> Any:
"""
Get the current value from the widget.
Returns:
The widget's current value. None if no value set.
"""
pass
[docs]
class ValueSettable(ABC):
"""
ABC for widgets that can accept a value.
All input widgets must implement this to participate in form value updates.
"""
[docs]
@abstractmethod
def set_value(self, value: Any) -> None:
"""
Set the widget's value.
Args:
value: The value to set. None clears the widget.
"""
pass
[docs]
class PlaceholderCapable(ABC):
"""
ABC for widgets that can display placeholder text.
Placeholders show inherited/default values without setting actual values.
"""
[docs]
@abstractmethod
def set_placeholder(self, text: str) -> None:
"""
Set placeholder text for the widget.
Args:
text: Placeholder text to display (e.g., "Pipeline default: 42")
"""
pass
[docs]
class RangeConfigurable(ABC):
"""
ABC for widgets that support numeric range configuration.
Typically implemented by numeric input widgets (spinboxes, sliders).
"""
[docs]
class EnumSelectable(ABC):
"""
ABC for widgets that can select from enum values.
Typically implemented by dropdowns and radio button groups.
"""
[docs]
@abstractmethod
def set_enum_options(self, enum_type: type) -> None:
"""
Configure widget with enum options.
Args:
enum_type: The Enum class to populate options from
"""
pass
[docs]
@abstractmethod
def get_selected_enum(self) -> Any:
"""
Get the currently selected enum value.
Returns:
The selected enum member, or None if no selection
"""
pass
[docs]
class ChangeSignalEmitter(ABC):
"""
ABC for widgets that emit change signals.
Provides explicit contract for signal connection, eliminating duck typing
of signal names (textChanged vs valueChanged vs currentIndexChanged).
"""
[docs]
@abstractmethod
def connect_change_signal(self, callback: Callable[[Any], None]) -> None:
"""
Connect callback to widget's change signal.
The callback will be invoked whenever the widget's value changes,
receiving the new value as its argument.
Args:
callback: Function to call when widget value changes.
Signature: callback(new_value: Any) -> None
"""
pass
[docs]
@abstractmethod
def disconnect_change_signal(self, callback: Callable[[Any], None]) -> None:
"""
Disconnect callback from widget's change signal.
Args:
callback: The callback function to disconnect
"""
pass