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.

Files changed (75) hide show
  1. urwid/__init__.py +333 -0
  2. urwid/canvas.py +1413 -0
  3. urwid/command_map.py +137 -0
  4. urwid/container.py +59 -0
  5. urwid/decoration.py +65 -0
  6. urwid/display/__init__.py +97 -0
  7. urwid/display/_posix_raw_display.py +413 -0
  8. urwid/display/_raw_display_base.py +914 -0
  9. urwid/display/_web.css +12 -0
  10. urwid/display/_web.js +462 -0
  11. urwid/display/_win32.py +171 -0
  12. urwid/display/_win32_raw_display.py +269 -0
  13. urwid/display/common.py +1219 -0
  14. urwid/display/curses.py +690 -0
  15. urwid/display/escape.py +624 -0
  16. urwid/display/html_fragment.py +251 -0
  17. urwid/display/lcd.py +518 -0
  18. urwid/display/raw.py +37 -0
  19. urwid/display/web.py +636 -0
  20. urwid/event_loop/__init__.py +55 -0
  21. urwid/event_loop/abstract_loop.py +175 -0
  22. urwid/event_loop/asyncio_loop.py +231 -0
  23. urwid/event_loop/glib_loop.py +294 -0
  24. urwid/event_loop/main_loop.py +721 -0
  25. urwid/event_loop/select_loop.py +230 -0
  26. urwid/event_loop/tornado_loop.py +206 -0
  27. urwid/event_loop/trio_loop.py +302 -0
  28. urwid/event_loop/twisted_loop.py +269 -0
  29. urwid/event_loop/zmq_loop.py +275 -0
  30. urwid/font.py +695 -0
  31. urwid/graphics.py +96 -0
  32. urwid/highlight.css +19 -0
  33. urwid/listbox.py +1899 -0
  34. urwid/monitored_list.py +522 -0
  35. urwid/numedit.py +376 -0
  36. urwid/signals.py +330 -0
  37. urwid/split_repr.py +130 -0
  38. urwid/str_util.py +358 -0
  39. urwid/text_layout.py +632 -0
  40. urwid/treetools.py +515 -0
  41. urwid/util.py +557 -0
  42. urwid/version.py +16 -0
  43. urwid/vterm.py +1806 -0
  44. urwid/widget/__init__.py +181 -0
  45. urwid/widget/attr_map.py +161 -0
  46. urwid/widget/attr_wrap.py +140 -0
  47. urwid/widget/bar_graph.py +649 -0
  48. urwid/widget/big_text.py +77 -0
  49. urwid/widget/box_adapter.py +126 -0
  50. urwid/widget/columns.py +1145 -0
  51. urwid/widget/constants.py +574 -0
  52. urwid/widget/container.py +227 -0
  53. urwid/widget/divider.py +110 -0
  54. urwid/widget/edit.py +718 -0
  55. urwid/widget/filler.py +403 -0
  56. urwid/widget/frame.py +539 -0
  57. urwid/widget/grid_flow.py +539 -0
  58. urwid/widget/line_box.py +194 -0
  59. urwid/widget/overlay.py +829 -0
  60. urwid/widget/padding.py +597 -0
  61. urwid/widget/pile.py +971 -0
  62. urwid/widget/popup.py +170 -0
  63. urwid/widget/progress_bar.py +141 -0
  64. urwid/widget/scrollable.py +597 -0
  65. urwid/widget/solid_fill.py +44 -0
  66. urwid/widget/text.py +354 -0
  67. urwid/widget/widget.py +852 -0
  68. urwid/widget/widget_decoration.py +166 -0
  69. urwid/widget/wimp.py +792 -0
  70. urwid/wimp.py +23 -0
  71. urwid-2.6.0.post0.dist-info/COPYING +504 -0
  72. urwid-2.6.0.post0.dist-info/METADATA +332 -0
  73. urwid-2.6.0.post0.dist-info/RECORD +75 -0
  74. urwid-2.6.0.post0.dist-info/WHEEL +5 -0
  75. 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)