Files
manual_slop/src/patch_modal.py
T
2026-07-05 13:46:35 -04:00

92 lines
2.4 KiB
Python

from dataclasses import dataclass, field
from typing import Optional, Callable, List
@dataclass
class DiffHunk:
header: str
lines: List[str]
old_start: int
old_count: int
new_start: int
new_count: int
@dataclass
class DiffFile:
old_path: str
new_path: str
hunks: List[DiffHunk] = field(default_factory=list)
@dataclass
class PendingPatch:
patch_text: str = ""
file_paths: List[str] = field(default_factory=list)
generated_by: str = ""
timestamp: float = 0.0
EMPTY_PATCH: PendingPatch = PendingPatch()
class PatchModalManager:
def __init__(self):
self._pending_patch: PendingPatch = EMPTY_PATCH
self._show_modal: bool = False
self._on_apply_callback: Optional[Callable[[str], bool]] = None
self._on_reject_callback: Optional[Callable[[], None]] = None
def request_patch_approval(self, patch_text: str, file_paths: List[str], generated_by: str = "Tier 4 QA") -> bool:
from time import time
self._pending_patch = PendingPatch(
patch_text=patch_text,
file_paths=file_paths,
generated_by=generated_by,
timestamp=time()
)
self._show_modal = True
return True
def get_pending_patch(self) -> "PendingPatch":
return self._pending_patch
def is_modal_shown(self) -> bool:
return self._show_modal
def set_apply_callback(self, callback: Callable[[str], bool]) -> None:
self._on_apply_callback = callback
def set_reject_callback(self, callback: Callable[[], None]) -> None:
self._on_reject_callback = callback
def apply_patch(self, patch_text: str) -> bool:
if self._on_apply_callback:
return self._on_apply_callback(patch_text)
return False
def reject_patch(self) -> None:
self._pending_patch = EMPTY_PATCH
self._show_modal = False
if self._on_reject_callback:
self._on_reject_callback()
def close_modal(self) -> None:
self._show_modal = False
def reset(self) -> None:
self._pending_patch = EMPTY_PATCH
self._show_modal = False
self._on_apply_callback = None
self._on_reject_callback = None
_patch_modal_manager: Optional[PatchModalManager] = None
def get_patch_modal_manager() -> PatchModalManager:
global _patch_modal_manager
if _patch_modal_manager is None:
_patch_modal_manager = PatchModalManager()
return _patch_modal_manager
def reset_patch_modal_manager() -> None:
global _patch_modal_manager
if _patch_modal_manager:
_patch_modal_manager.reset()
_patch_modal_manager = None