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