1from __future__ import annotations
2
3from collections import deque
4
5from .base import Clipboard, ClipboardData
6
7__all__ = [
8 "InMemoryClipboard",
9]
10
11
12class InMemoryClipboard(Clipboard):
13 """
14 Default clipboard implementation.
15 Just keep the data in memory.
16
17 This implements a kill-ring, for Emacs mode.
18 """
19
20 def __init__(self, data: ClipboardData | None = None, max_size: int = 60) -> None:
21 assert max_size >= 1
22
23 self.max_size = max_size
24 self._ring: deque[ClipboardData] = deque()
25
26 if data is not None:
27 self.set_data(data)
28
29 def set_data(self, data: ClipboardData) -> None:
30 self._ring.appendleft(data)
31
32 while len(self._ring) > self.max_size:
33 self._ring.pop()
34
35 def get_data(self) -> ClipboardData:
36 if self._ring:
37 return self._ring[0]
38 else:
39 return ClipboardData()
40
41 def rotate(self) -> None:
42 if self._ring:
43 # Add the very first item at the end.
44 self._ring.append(self._ring.popleft())