Source code for diplomat.wx_gui.identity_swapper

"""
Includes history-based event for swapping part tracks. Used in stripped down (aka. cli:`diplomat tweak`) UI.
"""

from typing import List, Tuple, Any, Callable, Iterable
from diplomat.predictors.supervised_fpe.labelers import EditableFramePassEngine


def _invert(order: List[int]) -> List[int]:
    lst = [None] * len(order)

    for i in range(len(order)):
        lst[order[i]] = i

    return lst


[docs] class IdentitySwapper: """ Swaps tracks to match a new ordering. Can be added to UI history and undone/redone. """
[docs] def __init__(self, frame_engine: EditableFramePassEngine): self._frame_engine = frame_engine self._extra_hook = None self._progress_handler = None
def set_extra_hook(self, hook: Callable[[int, List[int]], None]): self._extra_hook = hook def set_progress_handler(self, handler: Callable[[str, Iterable], Iterable]): self._progress_handler = handler def do(self, frame_idx: int, order: List[int]) -> Tuple[int, List[int]]: progress_hdlr = self._progress_handler if(progress_hdlr is None): def progress_hdlr(msg, gen): yield from gen for f_i in progress_hdlr("Updating Track Identities", range(frame_idx, self._frame_engine.frame_data.num_frames)): frame = self._frame_engine.frame_data.frames[f_i] for idx, val in enumerate([frame[idx] for idx in order]): frame[idx] = val swap_keys = [(key, val) for key, val in self._frame_engine.changed_frames.items() if(key[0] >= frame_idx)] for (f_i, bp_i), val in swap_keys: del self._frame_engine.changed_frames[(f_i, bp_i)] self._frame_engine.changed_frames[(f_i, order[bp_i])] = val if(self._extra_hook is not None): self._extra_hook(frame_idx, order) return (frame_idx, _invert(order)) def undo(self, data: Any) -> Any: return self.do(*data) def redo(self, data: Any) -> Any: return self.do(*data)