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()) | |