"""Drag-reorder workflow for manager widgets."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any
from objectstate import ObjectStateRegistry
[docs]
@dataclass(frozen=True)
class ManagerReorderOperations:
"""Nominal operation port consumed by ManagerReorderController."""
list_widget: Any
item_from_list_item: Callable[[Any], Any]
item_id: Callable[[Any], str]
item_name_singular: str
item_name_plural: str
reorder_items: Callable[[int, int], None]
emit_items_changed: Callable[[], None]
update_item_list: Callable[[], None]
emit_status: Callable[[str], None]
[docs]
class ManagerReorderController:
"""Owns reorder mutation sequencing and user-facing status text."""
[docs]
def handle_reordered(
self,
operations: ManagerReorderOperations,
from_index: int,
to_index: int,
) -> None:
list_item = operations.list_widget.item(from_index)
item = operations.item_from_list_item(list_item)
item_id = operations.item_id(item) if item else "Unknown"
with ObjectStateRegistry.atomic(f"reorder {operations.item_name_plural}"):
operations.reorder_items(from_index, to_index)
operations.emit_items_changed()
operations.update_item_list()
direction = "up" if to_index < from_index else "down"
operations.emit_status(
f"Moved {operations.item_name_singular} '{item_id}' {direction}"
)