from __future__ import annotations


class tkEventManager:
    """Own Matplotlib callback IDs and prevent accidental duplicate registration."""

    def __init__(self):
        self._connections = {}

    def connect(self, fig, event_name, callback, key=None):
        if key is None:
            key = (id(fig), event_name, id(callback))
        self.disconnect(key)
        cid = fig.canvas.mpl_connect(event_name, callback)
        self._connections[key] = (fig, cid)
        return cid

    def disconnect(self, key):
        item = self._connections.pop(key, None)
        if item is not None:
            fig, cid = item
            fig.canvas.mpl_disconnect(cid)

    def disconnect_figure(self, fig):
        keys = [k for k, (f, _) in self._connections.items() if f is fig]
        for key in keys:
            self.disconnect(key)

    def disconnect_all(self):
        for key in list(self._connections):
            self.disconnect(key)
