LineEditor

Bases: ActionsHandler

Source code in pzp/line_editor.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class LineEditor(ActionsHandler):
    def __init__(self, line: Optional[str] = None, keys_handler: Optional[KeysHandler] = None) -> None:
        """
        Line editor

        Args:
            line: Initial value
            keys_handler: Keys handler
        """
        super().__init__(keys_handler=keys_handler)
        self.line = line or ""
        self.cursor_pos: int = len(self.line)

    def set_cursor_pos(self, cursor_pos: int) -> None:
        "Set cursor position (absolute)"
        self.cursor_pos = max(min(cursor_pos, len(self.line)), 0)

    def adj_cursor_pos(self, characters: int) -> None:
        "Set cursor position (relative to current position)"
        self.cursor_pos = max(min(self.cursor_pos + characters, len(self.line)), 0)

    def insert(self, ch: str) -> None:
        "Insert characters at the current cursor position"
        if ch >= SPACE:  # Add the character to line
            self.line = self.line[0 : self.cursor_pos] + ch + self.line[self.cursor_pos :]
            self.adj_cursor_pos(len(ch))

    @Action("backward-char", keys=["ctrl-b", "left"])
    def backward_char(self) -> None:
        "Move the cursor back one character"
        self.set_cursor_pos(self.cursor_pos - 1)

    @Action("forward-char", keys=["ctrl-f", "right"])
    def forward_char(self) -> None:
        "Move the cursor forward one character"
        self.set_cursor_pos(self.cursor_pos + 1)

    @Action("beginning-of-line", keys=["ctrl-a", "home"])
    def beginning_of_line(self) -> None:
        "Move the cursor to the line start"
        self.set_cursor_pos(0)

    @Action("end-of-line", keys=["ctrl-e", "end"])
    def end_of_line(self) -> None:
        "Move the cursor to the line end"
        self.set_cursor_pos(len(self))

    @Action("backward-delete-char", keys=["ctrl-h", "bspace"])
    def delete_backward_char(self) -> None:
        "Delete the previous character"
        if self.cursor_pos > 0:
            self.line = self.line[: self.cursor_pos - 1] + self.line[self.cursor_pos :]
        self.adj_cursor_pos(-1)

    @Action("delete-char", keys=["ctrl-d", "del"])
    def delete_char(self) -> None:
        "Delete the current character"
        self.line = self.line[: self.cursor_pos] + self.line[self.cursor_pos + 1 :]
        self.adj_cursor_pos(0)

    @Action("default")
    def default(self, key_event: KeyEvent) -> None:
        self.insert(key_event.ch)

    def print(self, screen: "Screen") -> None:
        """
        Print the line and set the cursor position

        Args:
            screen: Screen instance
        """
        screen.write(self.line).move_left(len(self) - self.cursor_pos)

    def __len__(self) -> int:
        "Return line length"
        return len(self.line)

    def __str__(self) -> str:
        "Return the line"
        return self.line

__init__(line=None, keys_handler=None)

Line editor

Parameters:

Name Type Description Default
line Optional[str]

Initial value

None
keys_handler Optional[KeysHandler]

Keys handler

None
Source code in pzp/line_editor.py
15
16
17
18
19
20
21
22
23
24
25
def __init__(self, line: Optional[str] = None, keys_handler: Optional[KeysHandler] = None) -> None:
    """
    Line editor

    Args:
        line: Initial value
        keys_handler: Keys handler
    """
    super().__init__(keys_handler=keys_handler)
    self.line = line or ""
    self.cursor_pos: int = len(self.line)

__len__()

Return line length

Source code in pzp/line_editor.py
87
88
89
def __len__(self) -> int:
    "Return line length"
    return len(self.line)

__str__()

Return the line

Source code in pzp/line_editor.py
91
92
93
def __str__(self) -> str:
    "Return the line"
    return self.line

adj_cursor_pos(characters)

Set cursor position (relative to current position)

Source code in pzp/line_editor.py
31
32
33
def adj_cursor_pos(self, characters: int) -> None:
    "Set cursor position (relative to current position)"
    self.cursor_pos = max(min(self.cursor_pos + characters, len(self.line)), 0)

backward_char()

Move the cursor back one character

Source code in pzp/line_editor.py
41
42
43
44
@Action("backward-char", keys=["ctrl-b", "left"])
def backward_char(self) -> None:
    "Move the cursor back one character"
    self.set_cursor_pos(self.cursor_pos - 1)

beginning_of_line()

Move the cursor to the line start

Source code in pzp/line_editor.py
51
52
53
54
@Action("beginning-of-line", keys=["ctrl-a", "home"])
def beginning_of_line(self) -> None:
    "Move the cursor to the line start"
    self.set_cursor_pos(0)

delete_backward_char()

Delete the previous character

Source code in pzp/line_editor.py
61
62
63
64
65
66
@Action("backward-delete-char", keys=["ctrl-h", "bspace"])
def delete_backward_char(self) -> None:
    "Delete the previous character"
    if self.cursor_pos > 0:
        self.line = self.line[: self.cursor_pos - 1] + self.line[self.cursor_pos :]
    self.adj_cursor_pos(-1)

delete_char()

Delete the current character

Source code in pzp/line_editor.py
68
69
70
71
72
@Action("delete-char", keys=["ctrl-d", "del"])
def delete_char(self) -> None:
    "Delete the current character"
    self.line = self.line[: self.cursor_pos] + self.line[self.cursor_pos + 1 :]
    self.adj_cursor_pos(0)

end_of_line()

Move the cursor to the line end

Source code in pzp/line_editor.py
56
57
58
59
@Action("end-of-line", keys=["ctrl-e", "end"])
def end_of_line(self) -> None:
    "Move the cursor to the line end"
    self.set_cursor_pos(len(self))

forward_char()

Move the cursor forward one character

Source code in pzp/line_editor.py
46
47
48
49
@Action("forward-char", keys=["ctrl-f", "right"])
def forward_char(self) -> None:
    "Move the cursor forward one character"
    self.set_cursor_pos(self.cursor_pos + 1)

insert(ch)

Insert characters at the current cursor position

Source code in pzp/line_editor.py
35
36
37
38
39
def insert(self, ch: str) -> None:
    "Insert characters at the current cursor position"
    if ch >= SPACE:  # Add the character to line
        self.line = self.line[0 : self.cursor_pos] + ch + self.line[self.cursor_pos :]
        self.adj_cursor_pos(len(ch))

print(screen)

Print the line and set the cursor position

Parameters:

Name Type Description Default
screen Screen

Screen instance

required
Source code in pzp/line_editor.py
78
79
80
81
82
83
84
85
def print(self, screen: "Screen") -> None:
    """
    Print the line and set the cursor position

    Args:
        screen: Screen instance
    """
    screen.write(self.line).move_left(len(self) - self.cursor_pos)

set_cursor_pos(cursor_pos)

Set cursor position (absolute)

Source code in pzp/line_editor.py
27
28
29
def set_cursor_pos(self, cursor_pos: int) -> None:
    "Set cursor position (absolute)"
    self.cursor_pos = max(min(cursor_pos, len(self.line)), 0)