117 lines
3.7 KiB
Python
117 lines
3.7 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import typing
|
||
|
|
from importlib import import_module
|
||
|
|
|
||
|
|
from textual.case import camel_to_snake
|
||
|
|
|
||
|
|
# For any new built-in Widget we create, not only do we have to import them here and add them to `__all__`,
|
||
|
|
# but also to the `__init__.pyi` file in this same folder - otherwise text editors and type checkers won't
|
||
|
|
# be able to "see" them.
|
||
|
|
if typing.TYPE_CHECKING:
|
||
|
|
from textual.widget import Widget
|
||
|
|
from textual.widgets._button import Button
|
||
|
|
from textual.widgets._checkbox import Checkbox
|
||
|
|
from textual.widgets._collapsible import Collapsible
|
||
|
|
from textual.widgets._content_switcher import ContentSwitcher
|
||
|
|
from textual.widgets._data_table import DataTable
|
||
|
|
from textual.widgets._digits import Digits
|
||
|
|
from textual.widgets._directory_tree import DirectoryTree
|
||
|
|
from textual.widgets._footer import Footer
|
||
|
|
from textual.widgets._header import Header
|
||
|
|
from textual.widgets._help_panel import HelpPanel
|
||
|
|
from textual.widgets._input import Input
|
||
|
|
from textual.widgets._key_panel import KeyPanel
|
||
|
|
from textual.widgets._label import Label
|
||
|
|
from textual.widgets._link import Link
|
||
|
|
from textual.widgets._list_item import ListItem
|
||
|
|
from textual.widgets._list_view import ListView
|
||
|
|
from textual.widgets._loading_indicator import LoadingIndicator
|
||
|
|
from textual.widgets._log import Log
|
||
|
|
from textual.widgets._markdown import Markdown, MarkdownViewer
|
||
|
|
from textual.widgets._masked_input import MaskedInput
|
||
|
|
from textual.widgets._option_list import OptionList
|
||
|
|
from textual.widgets._placeholder import Placeholder
|
||
|
|
from textual.widgets._pretty import Pretty
|
||
|
|
from textual.widgets._progress_bar import ProgressBar
|
||
|
|
from textual.widgets._radio_button import RadioButton
|
||
|
|
from textual.widgets._radio_set import RadioSet
|
||
|
|
from textual.widgets._rich_log import RichLog
|
||
|
|
from textual.widgets._rule import Rule
|
||
|
|
from textual.widgets._select import Select
|
||
|
|
from textual.widgets._selection_list import SelectionList
|
||
|
|
from textual.widgets._sparkline import Sparkline
|
||
|
|
from textual.widgets._static import Static
|
||
|
|
from textual.widgets._switch import Switch
|
||
|
|
from textual.widgets._tabbed_content import TabbedContent, TabPane
|
||
|
|
from textual.widgets._tabs import Tab, Tabs
|
||
|
|
from textual.widgets._text_area import TextArea
|
||
|
|
from textual.widgets._tooltip import Tooltip
|
||
|
|
from textual.widgets._tree import Tree
|
||
|
|
from textual.widgets._welcome import Welcome
|
||
|
|
|
||
|
|
__all__ = [
|
||
|
|
"Button",
|
||
|
|
"Checkbox",
|
||
|
|
"Collapsible",
|
||
|
|
"ContentSwitcher",
|
||
|
|
"DataTable",
|
||
|
|
"Digits",
|
||
|
|
"DirectoryTree",
|
||
|
|
"Footer",
|
||
|
|
"Header",
|
||
|
|
"HelpPanel",
|
||
|
|
"Input",
|
||
|
|
"KeyPanel",
|
||
|
|
"Label",
|
||
|
|
"Link",
|
||
|
|
"ListItem",
|
||
|
|
"ListView",
|
||
|
|
"LoadingIndicator",
|
||
|
|
"Log",
|
||
|
|
"Markdown",
|
||
|
|
"MarkdownViewer",
|
||
|
|
"MaskedInput",
|
||
|
|
"OptionList",
|
||
|
|
"Placeholder",
|
||
|
|
"Pretty",
|
||
|
|
"ProgressBar",
|
||
|
|
"RadioButton",
|
||
|
|
"RadioSet",
|
||
|
|
"RichLog",
|
||
|
|
"Rule",
|
||
|
|
"Select",
|
||
|
|
"SelectionList",
|
||
|
|
"Sparkline",
|
||
|
|
"Static",
|
||
|
|
"Switch",
|
||
|
|
"Tab",
|
||
|
|
"TabbedContent",
|
||
|
|
"TabPane",
|
||
|
|
"Tabs",
|
||
|
|
"TextArea",
|
||
|
|
"Tooltip",
|
||
|
|
"Tree",
|
||
|
|
"Welcome",
|
||
|
|
]
|
||
|
|
|
||
|
|
_WIDGETS_LAZY_LOADING_CACHE: dict[str, type[Widget]] = {}
|
||
|
|
|
||
|
|
|
||
|
|
# Let's decrease startup time by lazy loading our Widgets:
|
||
|
|
def __getattr__(widget_class: str) -> type[Widget]:
|
||
|
|
try:
|
||
|
|
return _WIDGETS_LAZY_LOADING_CACHE[widget_class]
|
||
|
|
except KeyError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
if widget_class not in __all__:
|
||
|
|
raise AttributeError(f"Package 'textual.widgets' has no class '{widget_class}'")
|
||
|
|
|
||
|
|
widget_module_path = f"._{camel_to_snake(widget_class)}"
|
||
|
|
module = import_module(widget_module_path, package="textual.widgets")
|
||
|
|
class_ = getattr(module, widget_class)
|
||
|
|
|
||
|
|
_WIDGETS_LAZY_LOADING_CACHE[widget_class] = class_
|
||
|
|
return class_
|