| """ |
| Clipboard for command line interface. |
| """ |
| from __future__ import annotations |
|
|
| from abc import ABCMeta, abstractmethod |
| from typing import Callable |
|
|
| from prompt_toolkit.selection import SelectionType |
|
|
| __all__ = [ |
| "Clipboard", |
| "ClipboardData", |
| "DummyClipboard", |
| "DynamicClipboard", |
| ] |
|
|
|
|
| class ClipboardData: |
| """ |
| Text on the clipboard. |
| |
| :param text: string |
| :param type: :class:`~prompt_toolkit.selection.SelectionType` |
| """ |
|
|
| def __init__( |
| self, text: str = "", type: SelectionType = SelectionType.CHARACTERS |
| ) -> None: |
| self.text = text |
| self.type = type |
|
|
|
|
| class Clipboard(metaclass=ABCMeta): |
| """ |
| Abstract baseclass for clipboards. |
| (An implementation can be in memory, it can share the X11 or Windows |
| keyboard, or can be persistent.) |
| """ |
|
|
| @abstractmethod |
| def set_data(self, data: ClipboardData) -> None: |
| """ |
| Set data to the clipboard. |
| |
| :param data: :class:`~.ClipboardData` instance. |
| """ |
|
|
| def set_text(self, text: str) -> None: |
| """ |
| Shortcut for setting plain text on clipboard. |
| """ |
| self.set_data(ClipboardData(text)) |
|
|
| def rotate(self) -> None: |
| """ |
| For Emacs mode, rotate the kill ring. |
| """ |
|
|
| @abstractmethod |
| def get_data(self) -> ClipboardData: |
| """ |
| Return clipboard data. |
| """ |
|
|
|
|
| class DummyClipboard(Clipboard): |
| """ |
| Clipboard implementation that doesn't remember anything. |
| """ |
|
|
| def set_data(self, data: ClipboardData) -> None: |
| pass |
|
|
| def set_text(self, text: str) -> None: |
| pass |
|
|
| def rotate(self) -> None: |
| pass |
|
|
| def get_data(self) -> ClipboardData: |
| return ClipboardData() |
|
|
|
|
| class DynamicClipboard(Clipboard): |
| """ |
| Clipboard class that can dynamically returns any Clipboard. |
| |
| :param get_clipboard: Callable that returns a :class:`.Clipboard` instance. |
| """ |
|
|
| def __init__(self, get_clipboard: Callable[[], Clipboard | None]) -> None: |
| self.get_clipboard = get_clipboard |
|
|
| def _clipboard(self) -> Clipboard: |
| return self.get_clipboard() or DummyClipboard() |
|
|
| def set_data(self, data: ClipboardData) -> None: |
| self._clipboard().set_data(data) |
|
|
| def set_text(self, text: str) -> None: |
| self._clipboard().set_text(text) |
|
|
| def rotate(self) -> None: |
| self._clipboard().rotate() |
|
|
| def get_data(self) -> ClipboardData: |
| return self._clipboard().get_data() |
|
|