urwid 2.6.0.post0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of urwid might be problematic. Click here for more details.
- urwid/__init__.py +333 -0
- urwid/canvas.py +1413 -0
- urwid/command_map.py +137 -0
- urwid/container.py +59 -0
- urwid/decoration.py +65 -0
- urwid/display/__init__.py +97 -0
- urwid/display/_posix_raw_display.py +413 -0
- urwid/display/_raw_display_base.py +914 -0
- urwid/display/_web.css +12 -0
- urwid/display/_web.js +462 -0
- urwid/display/_win32.py +171 -0
- urwid/display/_win32_raw_display.py +269 -0
- urwid/display/common.py +1219 -0
- urwid/display/curses.py +690 -0
- urwid/display/escape.py +624 -0
- urwid/display/html_fragment.py +251 -0
- urwid/display/lcd.py +518 -0
- urwid/display/raw.py +37 -0
- urwid/display/web.py +636 -0
- urwid/event_loop/__init__.py +55 -0
- urwid/event_loop/abstract_loop.py +175 -0
- urwid/event_loop/asyncio_loop.py +231 -0
- urwid/event_loop/glib_loop.py +294 -0
- urwid/event_loop/main_loop.py +721 -0
- urwid/event_loop/select_loop.py +230 -0
- urwid/event_loop/tornado_loop.py +206 -0
- urwid/event_loop/trio_loop.py +302 -0
- urwid/event_loop/twisted_loop.py +269 -0
- urwid/event_loop/zmq_loop.py +275 -0
- urwid/font.py +695 -0
- urwid/graphics.py +96 -0
- urwid/highlight.css +19 -0
- urwid/listbox.py +1899 -0
- urwid/monitored_list.py +522 -0
- urwid/numedit.py +376 -0
- urwid/signals.py +330 -0
- urwid/split_repr.py +130 -0
- urwid/str_util.py +358 -0
- urwid/text_layout.py +632 -0
- urwid/treetools.py +515 -0
- urwid/util.py +557 -0
- urwid/version.py +16 -0
- urwid/vterm.py +1806 -0
- urwid/widget/__init__.py +181 -0
- urwid/widget/attr_map.py +161 -0
- urwid/widget/attr_wrap.py +140 -0
- urwid/widget/bar_graph.py +649 -0
- urwid/widget/big_text.py +77 -0
- urwid/widget/box_adapter.py +126 -0
- urwid/widget/columns.py +1145 -0
- urwid/widget/constants.py +574 -0
- urwid/widget/container.py +227 -0
- urwid/widget/divider.py +110 -0
- urwid/widget/edit.py +718 -0
- urwid/widget/filler.py +403 -0
- urwid/widget/frame.py +539 -0
- urwid/widget/grid_flow.py +539 -0
- urwid/widget/line_box.py +194 -0
- urwid/widget/overlay.py +829 -0
- urwid/widget/padding.py +597 -0
- urwid/widget/pile.py +971 -0
- urwid/widget/popup.py +170 -0
- urwid/widget/progress_bar.py +141 -0
- urwid/widget/scrollable.py +597 -0
- urwid/widget/solid_fill.py +44 -0
- urwid/widget/text.py +354 -0
- urwid/widget/widget.py +852 -0
- urwid/widget/widget_decoration.py +166 -0
- urwid/widget/wimp.py +792 -0
- urwid/wimp.py +23 -0
- urwid-2.6.0.post0.dist-info/COPYING +504 -0
- urwid-2.6.0.post0.dist-info/METADATA +332 -0
- urwid-2.6.0.post0.dist-info/RECORD +75 -0
- urwid-2.6.0.post0.dist-info/WHEEL +5 -0
- urwid-2.6.0.post0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
import warnings
|
|
5
|
+
|
|
6
|
+
from urwid.canvas import CompositeCanvas
|
|
7
|
+
|
|
8
|
+
from .widget import Widget, WidgetError, WidgetWarning, delegate_to_widget_mixin
|
|
9
|
+
|
|
10
|
+
if typing.TYPE_CHECKING:
|
|
11
|
+
from typing_extensions import Literal
|
|
12
|
+
|
|
13
|
+
from .constants import Sizing
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = (
|
|
17
|
+
"WidgetDecoration",
|
|
18
|
+
"WidgetDisable",
|
|
19
|
+
"WidgetError",
|
|
20
|
+
"WidgetPlaceholder",
|
|
21
|
+
"WidgetWarning",
|
|
22
|
+
"delegate_to_widget_mixin",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
WrappedWidget = typing.TypeVar("WrappedWidget")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disable=abstract-method
|
|
29
|
+
"""
|
|
30
|
+
original_widget -- the widget being decorated
|
|
31
|
+
|
|
32
|
+
This is a base class for decoration widgets,
|
|
33
|
+
widgets that contain one or more widgets and only ever have a single focus.
|
|
34
|
+
This type of widget will affect the display or behaviour of the original_widget,
|
|
35
|
+
but it is not part of determining a chain of focus.
|
|
36
|
+
|
|
37
|
+
Don't actually do this -- use a WidgetDecoration subclass instead, these are not real widgets:
|
|
38
|
+
|
|
39
|
+
>>> from urwid import Text
|
|
40
|
+
>>> WidgetDecoration(Text(u"hi"))
|
|
41
|
+
<WidgetDecoration fixed/flow widget <Text fixed/flow widget 'hi'>>
|
|
42
|
+
|
|
43
|
+
.. Warning:
|
|
44
|
+
WidgetDecoration do not implement ``render`` method.
|
|
45
|
+
Implement it or forward to the widget in the subclass.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
def __init__(self, original_widget: WrappedWidget) -> None:
|
|
49
|
+
# TODO(Aleksei): reduce amount of multiple inheritance usage
|
|
50
|
+
# Special case: subclasses with multiple inheritance causes `super` call wrong way
|
|
51
|
+
# Call parent __init__ explicit
|
|
52
|
+
Widget.__init__(self)
|
|
53
|
+
if not isinstance(original_widget, Widget):
|
|
54
|
+
obj_class_path = f"{original_widget.__class__.__module__}.{original_widget.__class__.__name__}"
|
|
55
|
+
warnings.warn(
|
|
56
|
+
f"{obj_class_path} is not subclass of Widget",
|
|
57
|
+
DeprecationWarning,
|
|
58
|
+
stacklevel=2,
|
|
59
|
+
)
|
|
60
|
+
self._original_widget = original_widget
|
|
61
|
+
|
|
62
|
+
def _repr_words(self) -> list[str]:
|
|
63
|
+
return [*super()._repr_words(), repr(self._original_widget)]
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def original_widget(self) -> WrappedWidget:
|
|
67
|
+
return self._original_widget
|
|
68
|
+
|
|
69
|
+
@original_widget.setter
|
|
70
|
+
def original_widget(self, original_widget: WrappedWidget) -> None:
|
|
71
|
+
self._original_widget = original_widget
|
|
72
|
+
self._invalidate()
|
|
73
|
+
|
|
74
|
+
def _get_original_widget(self) -> WrappedWidget:
|
|
75
|
+
warnings.warn(
|
|
76
|
+
f"Method `{self.__class__.__name__}._get_original_widget` is deprecated, "
|
|
77
|
+
f"please use property `{self.__class__.__name__}.original_widget`",
|
|
78
|
+
DeprecationWarning,
|
|
79
|
+
stacklevel=2,
|
|
80
|
+
)
|
|
81
|
+
return self.original_widget
|
|
82
|
+
|
|
83
|
+
def _set_original_widget(self, original_widget: WrappedWidget) -> None:
|
|
84
|
+
warnings.warn(
|
|
85
|
+
f"Method `{self.__class__.__name__}._set_original_widget` is deprecated, "
|
|
86
|
+
f"please use property `{self.__class__.__name__}.original_widget`",
|
|
87
|
+
DeprecationWarning,
|
|
88
|
+
stacklevel=2,
|
|
89
|
+
)
|
|
90
|
+
self.original_widget = original_widget
|
|
91
|
+
|
|
92
|
+
@property
|
|
93
|
+
def base_widget(self) -> Widget:
|
|
94
|
+
"""
|
|
95
|
+
Return the widget without decorations. If there is only one
|
|
96
|
+
Decoration then this is the same as original_widget.
|
|
97
|
+
|
|
98
|
+
>>> from urwid import Text
|
|
99
|
+
>>> t = Text('hello')
|
|
100
|
+
>>> wd1 = WidgetDecoration(t)
|
|
101
|
+
>>> wd2 = WidgetDecoration(wd1)
|
|
102
|
+
>>> wd3 = WidgetDecoration(wd2)
|
|
103
|
+
>>> wd3.original_widget is wd2
|
|
104
|
+
True
|
|
105
|
+
>>> wd3.base_widget is t
|
|
106
|
+
True
|
|
107
|
+
"""
|
|
108
|
+
w = self
|
|
109
|
+
while hasattr(w, "_original_widget"):
|
|
110
|
+
w = w._original_widget
|
|
111
|
+
return w
|
|
112
|
+
|
|
113
|
+
def _get_base_widget(self) -> Widget:
|
|
114
|
+
warnings.warn(
|
|
115
|
+
f"Method `{self.__class__.__name__}._get_base_widget` is deprecated, "
|
|
116
|
+
f"please use property `{self.__class__.__name__}.base_widget`",
|
|
117
|
+
DeprecationWarning,
|
|
118
|
+
stacklevel=2,
|
|
119
|
+
)
|
|
120
|
+
return self.base_widget
|
|
121
|
+
|
|
122
|
+
def selectable(self) -> bool:
|
|
123
|
+
return self._original_widget.selectable()
|
|
124
|
+
|
|
125
|
+
def sizing(self) -> frozenset[Sizing]:
|
|
126
|
+
return self._original_widget.sizing()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class WidgetPlaceholder(delegate_to_widget_mixin("_original_widget"), WidgetDecoration[WrappedWidget]):
|
|
130
|
+
"""
|
|
131
|
+
This is a do-nothing decoration widget that can be used for swapping
|
|
132
|
+
between widgets without modifying the container of this widget.
|
|
133
|
+
|
|
134
|
+
This can be useful for making an interface with a number of distinct
|
|
135
|
+
pages or for showing and hiding menu or status bars.
|
|
136
|
+
|
|
137
|
+
The widget displayed is stored as the self.original_widget property and
|
|
138
|
+
can be changed by assigning a new widget to it.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class WidgetDisable(WidgetDecoration[WrappedWidget]):
|
|
143
|
+
"""
|
|
144
|
+
A decoration widget that disables interaction with the widget it
|
|
145
|
+
wraps. This widget always passes focus=False to the wrapped widget,
|
|
146
|
+
even if it somehow does become the focus.
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
no_cache: typing.ClassVar[list[str]] = ["rows"]
|
|
150
|
+
ignore_focus = True
|
|
151
|
+
|
|
152
|
+
def selectable(self) -> Literal[False]:
|
|
153
|
+
return False
|
|
154
|
+
|
|
155
|
+
def rows(self, size: tuple[int], focus: bool = False) -> int:
|
|
156
|
+
return self._original_widget.rows(size, False)
|
|
157
|
+
|
|
158
|
+
def sizing(self) -> frozenset[Sizing]:
|
|
159
|
+
return self._original_widget.sizing()
|
|
160
|
+
|
|
161
|
+
def pack(self, size, focus: bool = False) -> tuple[int, int]:
|
|
162
|
+
return self._original_widget.pack(size, False)
|
|
163
|
+
|
|
164
|
+
def render(self, size, focus: bool = False) -> CompositeCanvas:
|
|
165
|
+
canv = self._original_widget.render(size, False)
|
|
166
|
+
return CompositeCanvas(canv)
|