1"""
2Data structures for the selection.
3"""
4
5from __future__ import annotations
6
7from enum import Enum
8
9__all__ = [
10 "SelectionType",
11 "PasteMode",
12 "SelectionState",
13]
14
15
16class SelectionType(Enum):
17 """
18 Type of selection.
19 """
20
21 #: Characters. (Visual in Vi.)
22 CHARACTERS = "CHARACTERS"
23
24 #: Whole lines. (Visual-Line in Vi.)
25 LINES = "LINES"
26
27 #: A block selection. (Visual-Block in Vi.)
28 BLOCK = "BLOCK"
29
30
31class PasteMode(Enum):
32 EMACS = "EMACS" # Yank like emacs.
33 VI_AFTER = "VI_AFTER" # When pressing 'p' in Vi.
34 VI_BEFORE = "VI_BEFORE" # When pressing 'P' in Vi.
35
36
37class SelectionState:
38 """
39 State of the current selection.
40
41 :param original_cursor_position: int
42 :param type: :class:`~.SelectionType`
43 """
44
45 def __init__(
46 self,
47 original_cursor_position: int = 0,
48 type: SelectionType = SelectionType.CHARACTERS,
49 ) -> None:
50 self.original_cursor_position = original_cursor_position
51 self.type = type
52 self.shift_mode = False
53
54 def enter_shift_mode(self) -> None:
55 self.shift_mode = True
56
57 def __repr__(self) -> str:
58 return f"{self.__class__.__name__}(original_cursor_position={self.original_cursor_position!r}, type={self.type!r})"