| from __future__ import annotations | |
| from collections import deque | |
| from .base import Clipboard, ClipboardData | |
| __all__ = [ | |
| "InMemoryClipboard", | |
| ] | |
| class InMemoryClipboard(Clipboard): | |
| """ | |
| Default clipboard implementation. | |
| Just keep the data in memory. | |
| This implements a kill-ring, for Emacs mode. | |
| """ | |
| def __init__(self, data: ClipboardData | None = None, max_size: int = 60) -> None: | |
| assert max_size >= 1 | |
| self.max_size = max_size | |
| self._ring: deque[ClipboardData] = deque() | |
| if data is not None: | |
| self.set_data(data) | |
| def set_data(self, data: ClipboardData) -> None: | |
| self._ring.appendleft(data) | |
| while len(self._ring) > self.max_size: | |
| self._ring.pop() | |
| def get_data(self) -> ClipboardData: | |
| if self._ring: | |
| return self._ring[0] | |
| else: | |
| return ClipboardData() | |
| def rotate(self) -> None: | |
| if self._ring: | |
| # Add the very first item at the end. | |
| self._ring.append(self._ring.popleft()) | |