1
2
3
4
5
6
7
8
9
10
11
12
13
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
|
"""
The BufferMapping contains all the buffers for a command line interface, and it
keeps track of which buffer gets the focus.
"""
from __future__ import unicode_literals
from .enums import DEFAULT_BUFFER, SEARCH_BUFFER, SYSTEM_BUFFER, DUMMY_BUFFER
from .buffer import Buffer, AcceptAction
from .history import InMemoryHistory
import six
__all__ = (
'BufferMapping',
)
class BufferMapping(dict):
"""
Dictionary that maps the name of the buffers to the
:class:`~prompt_toolkit.buffer.Buffer` instances.
This mapping also keeps track of which buffer currently has the focus.
(Some methods receive a 'cli' parameter. This is useful for applications
where this `BufferMapping` is shared between several applications.)
"""
def __init__(self, buffers=None, initial=DEFAULT_BUFFER):
assert buffers is None or isinstance(buffers, dict)
# Start with an empty dict.
super(BufferMapping, self).__init__()
# Add default buffers.
self.update({
# For the 'search' and 'system' buffers, 'returnable' is False, in
# order to block normal Enter/ControlC behaviour.
DEFAULT_BUFFER: Buffer(accept_action=AcceptAction.RETURN_DOCUMENT),
SEARCH_BUFFER: Buffer(history=InMemoryHistory(), accept_action=AcceptAction.IGNORE),
SYSTEM_BUFFER: Buffer(history=InMemoryHistory(), accept_action=AcceptAction.IGNORE),
DUMMY_BUFFER: Buffer(read_only=True),
})
# Add received buffers.
if buffers is not None:
self.update(buffers)
# Focus stack.
self.focus_stack = [initial or DEFAULT_BUFFER]
def current(self, cli):
"""
The active :class:`.Buffer`.
"""
return self[self.focus_stack[-1]]
def current_name(self, cli):
"""
The name of the active :class:`.Buffer`.
"""
return self.focus_stack[-1]
def previous(self, cli):
"""
Return the previously focussed :class:`.Buffer` or `None`.
"""
if len(self.focus_stack) > 1:
try:
return self[self.focus_stack[-2]]
except KeyError:
pass
def focus(self, cli, buffer_name):
"""
Focus the buffer with the given name.
"""
assert isinstance(buffer_name, six.text_type)
self.focus_stack = [buffer_name]
def push_focus(self, cli, buffer_name):
"""
Push buffer on the focus stack.
"""
assert isinstance(buffer_name, six.text_type)
self.focus_stack.append(buffer_name)
def pop_focus(self, cli):
"""
Pop buffer from the focus stack.
"""
if len(self.focus_stack) > 1:
self.focus_stack.pop()
else:
raise IndexError('Cannot pop last item from the focus stack.')
|